Merge "Upgrade guava to v30.0"
diff --git a/.travis.yml b/.travis.yml
index 435138f..fac7af9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,14 +3,13 @@
 language: java
 
 jdk:
-  - oraclejdk8
+  - openjdk8
   - openjdk11
 
-# https://github.com/travis-ci/travis-ci/issues/3259#issuecomment-130860338
 addons:
   apt:
     packages:
-      - oracle-java8-installer
+      - openjdk-8-source
 
 install: mvn -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn install -U -DskipTests=true -f $ROOT_POM
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8acd79c..8e54c6f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -42,8 +42,8 @@
 Guidelines for any code contributions:
 
   1. Any significant changes should be accompanied by tests. The project already
-     has good test coverage, so look at some of the existing tests if you're
-     unsure how to go about it.
+     has good test coverage, so look at some existing tests if you're unsure
+     how to go about it.
   2. All contributions must be licensed Apache 2.0 and all files must have a
      copy of the boilerplate license comment (can be copied from an existing
      file).
diff --git a/README.md b/README.md
index c063aec..f95062c 100644
--- a/README.md
+++ b/README.md
@@ -3,10 +3,11 @@
 [![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)
 
-Guava is a set of core libraries that includes new collection types (such as
-multimap and multiset), immutable collections, a graph library, functional
-types, an in-memory cache, and APIs/utilities for concurrency, I/O, hashing,
-primitives, reflection, string processing, and much more!
+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
+utilities for concurrency, I/O, hashing, caching, primitives, strings, and more! It
+is widely used on most Java projects within Google, and widely used by many
+other companies as well.
 
 Guava comes in two flavors.
 
@@ -18,12 +19,12 @@
 
 ## Adding Guava to your build
 
-Guava's Maven group ID is `com.google.guava` and its artifact ID is `guava`.
+Guava's Maven group ID is `com.google.guava`, and its artifact ID is `guava`.
 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 `27.1-jre` or `27.1-android`. For more about depending on
-Guava, see [using Guava in your build].
+either `30.0-jre` or `30.0-android`. For more about depending on Guava, see
+[using Guava in your build].
 
 To add a dependency on Guava using Maven, use the following:
 
@@ -31,9 +32,9 @@
 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
-  <version>27.1-jre</version>
+  <version>30.0-jre</version>
   <!-- or, for Android: -->
-  <version>27.1-android</version>
+  <version>30.0-android</version>
 </dependency>
 ```
 
@@ -41,68 +42,82 @@
 
 ```gradle
 dependencies {
-  compile 'com.google.guava:guava:27.1-jre'
-  // or, for Android:
-  api 'com.google.guava:guava:27.1-android'
+  // Pick one:
+
+  // 1. Use Guava in your implementation only:
+  implementation("com.google.guava:guava:30.0-jre")
+
+  // 2. Use Guava types in your public API:
+  api("com.google.guava:guava:30.0-jre")
+
+  // 3. Android - Use Guava in your implementation only:
+  implementation("com.google.guava:guava:30.0-android")
+
+  // 4. Android - Use Guava types in your public API:
+  api("com.google.guava:guava:30.0-android")
 }
 ```
 
-## Snapshots
+For more information on when to use `api` and when to use `implementation`,
+consult the
+[Gradle documentation on API and implementation separation](https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation).
+
+## Snapshots and Documentation
 
 Snapshots of Guava built from the `master` branch are available through Maven
 using version `HEAD-jre-SNAPSHOT`, or `HEAD-android-SNAPSHOT` for the Android
 flavor.
 
-- Snapshot API Docs: [guava][guava-snapshot-api-docs]
-- Snapshot API Diffs: [guava][guava-snapshot-api-diffs]
+-   Snapshot API Docs: [guava][guava-snapshot-api-docs]
+-   Snapshot API Diffs: [guava][guava-snapshot-api-diffs]
 
 ## Learn about Guava
 
-- Our users' guide, [Guava Explained]
-- [A nice collection](http://www.tfnico.com/presentations/google-guava) of other helpful links
+-   Our users' guide, [Guava Explained]
+-   [A nice collection](http://www.tfnico.com/presentations/google-guava) of
+    other helpful links
 
 ## Links
 
-- [GitHub project](https://github.com/google/guava)
-- [Issue tracker: Report a defect or feature request](https://github.com/google/guava/issues/new)
-- [StackOverflow: Ask "how-to" and "why-didn't-it-work" questions](https://stackoverflow.com/questions/ask?tags=guava+java)
-- [guava-discuss: For open-ended questions and discussion](http://groups.google.com/group/guava-discuss)
+-   [GitHub project](https://github.com/google/guava)
+-   [Issue tracker: Report a defect or feature request](https://github.com/google/guava/issues/new)
+-   [StackOverflow: Ask "how-to" and "why-didn't-it-work" questions](https://stackoverflow.com/questions/ask?tags=guava+java)
+-   [guava-announce: Announcements of releases and upcoming significant changes](http://groups.google.com/group/guava-announce)
+-   [guava-discuss: For open-ended questions and discussion](http://groups.google.com/group/guava-discuss)
 
 ## IMPORTANT WARNINGS
 
-1. APIs marked with the `@Beta` annotation at the class or method level
-are subject to change. They can be modified in any way, or even
-removed, at any time. If your code is a library itself (i.e. it is
-used on the CLASSPATH of users outside your own control), you should
-not use beta APIs, unless you [repackage] them. **If your
-code is a library, we strongly recommend using the [Guava Beta Checker] to
-ensure that you do not use any `@Beta` APIs!**
+1.  APIs marked with the `@Beta` annotation at the class or method level are
+    subject to change. They can be modified in any way, or even removed, at any
+    time. If your code is a library itself (i.e., it is used on the CLASSPATH of
+    users outside your own control), you should not use beta APIs unless you
+    [repackage] them. **If your code is a library, we strongly recommend using
+    the [Guava Beta Checker] to ensure that you do not use any `@Beta` APIs!**
 
-2. APIs without `@Beta` will remain binary-compatible for the indefinite
-future. (Previously, we sometimes removed such APIs after a deprecation period.
-The last release to remove non-`@Beta` APIs was Guava 21.0.) Even `@Deprecated`
-APIs will remain (again, unless they are `@Beta`). We have no plans to start
-removing things again, but officially, we're leaving our options open in case
-of surprises (like, say, a serious security problem).
+2.  APIs without `@Beta` will remain binary-compatible for the indefinite
+    future. (Previously, we sometimes removed such APIs after a deprecation
+    period. The last release to remove non-`@Beta` APIs was Guava 21.0.) Even
+    `@Deprecated` APIs will remain (again, unless they are `@Beta`). We have no
+    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`
+3.  Guava has one dependency that is needed at runtime:
+    `com.google.guava:failureaccess:1.0.1`
 
-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 version of the library.
+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
+    version of the library.
 
-5. Our classes are not designed to protect against a malicious caller.
-You should not use them for communication between trusted and
-untrusted code.
+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 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).
 
-[guava-snapshot-api-docs]: https://google.github.io/guava/releases/snapshot-jre/api/docs/
-[guava-snapshot-api-diffs]: https://google.github.io/guava/releases/snapshot-jre/api/diffs/
+[guava-snapshot-api-docs]: https://guava.dev/releases/snapshot-jre/api/docs/
+[guava-snapshot-api-diffs]: https://guava.dev/releases/snapshot-jre/api/diffs/
 [Guava Explained]: https://github.com/google/guava/wiki/Home
 [Guava Beta Checker]: https://github.com/google/guava-beta-checker
 
diff --git a/android/guava-bom/pom.xml b/android/guava-bom/pom.xml
index 7c2bdad..cbb2fda 100644
--- a/android/guava-bom/pom.xml
+++ b/android/guava-bom/pom.xml
@@ -8,7 +8,7 @@
 
   <groupId>com.google.guava</groupId>
   <artifactId>guava-bom</artifactId>
-  <version>27.1-android</version>
+  <version>30.0-android</version>
   <packaging>pom</packaging>
   
   <parent>
@@ -29,7 +29,7 @@
 
   <licenses>
     <license>
-      <name>The Apache Software License, Version 2.0</name>
+      <name>Apache License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
       <distribution>repo</distribution>
     </license>
diff --git a/android/guava-testlib/pom.xml b/android/guava-testlib/pom.xml
index 2b0ba53..ed18b46 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>27.1-android</version>
+    <version>30.0-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 c2d9542..cf1ed23 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
@@ -91,8 +91,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedCollectionFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(SERIALIZABLE);
     derivedFeatures.remove(SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java b/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
index af50129..3588e85 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
@@ -375,8 +375,7 @@
 
     @Override
     public SortedSet<E> create(Object... elements) {
-      @SuppressWarnings("unchecked") // set generators must pass SampleElements values
-      List<E> normalValues = (List) Arrays.asList(elements);
+      List<?> normalValues = (List<?>) Arrays.asList(elements);
       List<E> extremeValues = new ArrayList<>();
 
       // nulls are usually out of bounds for a subset, so ban them altogether
@@ -399,12 +398,12 @@
       }
 
       // the regular values should be visible after filtering
-      List<E> allEntries = new ArrayList<>();
+      List<Object> allEntries = new ArrayList<>();
       allEntries.addAll(extremeValues);
       allEntries.addAll(normalValues);
-      SortedSet<E> map = delegate.create(allEntries.toArray());
+      SortedSet<E> set = delegate.create(allEntries.toArray());
 
-      return createSubSet(map, firstExclusive, lastExclusive);
+      return createSubSet(set, firstExclusive, lastExclusive);
     }
 
     /** Calls the smallest subSet overload that filters out the extreme values. */
@@ -474,8 +473,6 @@
 
     @Override
     public SortedMap<K, V> create(Object... entries) {
-      @SuppressWarnings("unchecked") // map generators must past entry objects
-      List<Entry<K, V>> normalValues = (List) Arrays.asList(entries);
       List<Entry<K, V>> extremeValues = new ArrayList<>();
 
       // prepare extreme values to be filtered out of view
@@ -491,12 +488,12 @@
       }
 
       // the regular values should be visible after filtering
-      List<Entry<K, V>> allEntries = new ArrayList<>();
+      List<Entry<?, ?>> allEntries = new ArrayList<>();
       allEntries.addAll(extremeValues);
-      allEntries.addAll(normalValues);
-      SortedMap<K, V> map =
-          (SortedMap<K, V>)
-              delegate.create((Object[]) allEntries.toArray(new Entry<?, ?>[allEntries.size()]));
+      for (Object entry : entries) {
+        allEntries.add((Entry<?, ?>) entry);
+      }
+      SortedMap<K, V> map = (SortedMap<K, V>) delegate.create(allEntries.toArray());
 
       return createSubMap(map, firstExclusive, lastExclusive);
     }
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java b/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java
index 5023d39..8efafc3 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/Helpers.java
@@ -169,8 +169,7 @@
   }
 
   public static void assertContainsAllOf(Iterable<?> actual, Object... expected) {
-    List<Object> expectedList = new ArrayList<>();
-    expectedList.addAll(Arrays.asList(expected));
+    List<Object> expectedList = new ArrayList<>(Arrays.asList(expected));
 
     for (Object o : actual) {
       expectedList.remove(o);
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java b/android/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java
index fd1643b..fdc418a 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java
@@ -50,6 +50,36 @@
  * verify() method, which is called <em>after</em> each sequence and is guaranteed to be called
  * using the latest values obtained from {@link IteratorTester#newTargetIterator()}.
  *
+ * <p>The value you pass to the parameter {@code steps} should be greater than the length of your
+ * iterator, so that this class can check that your iterator behaves correctly when it is exhausted.
+ *
+ * <p>For example, to test {@link java.util.Collections#unmodifiableList(java.util.List)
+ * Collections.unmodifiableList}'s iterator:
+ *
+ * <pre>{@code
+ * List<String> expectedElements =
+ *     Arrays.asList("a", "b", "c", "d", "e");
+ * List<String> actualElements =
+ *     Collections.unmodifiableList(
+ *         Arrays.asList("a", "b", "c", "d", "e"));
+ * IteratorTester<String> iteratorTester =
+ *     new IteratorTester<String>(
+ *         6,
+ *         IteratorFeature.UNMODIFIABLE,
+ *         expectedElements,
+ *         IteratorTester.KnownOrder.KNOWN_ORDER) {
+ *       @Override
+ *       protected Iterator<String> newTargetIterator() {
+ *         return actualElements.iterator();
+ *       }
+ *     };
+ * iteratorTester.test();
+ * iteratorTester.testForEachRemaining();
+ * }</pre>
+ *
+ * <p><b>Note</b>: It is necessary to use {@code IteratorTester.KnownOrder} as shown above, rather
+ * than {@code KnownOrder} directly, because otherwise the code cannot be compiled.
+ *
  * @author Kevin Bourrillion
  * @author Chris Povirk
  */
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 144428e..e010564 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
@@ -146,8 +146,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedCollectionFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(SERIALIZABLE);
     derivedFeatures.remove(SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java b/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
index c8053b1..b8b5c28 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
@@ -301,10 +301,10 @@
     }
     assertTrue(map.containsKey(map.keySet().iterator().next()));
     if (allowsNullKeys) {
-      map.containsKey(null);
+      boolean unused = map.containsKey(null);
     } else {
       try {
-        map.containsKey(null);
+        boolean unused2 = map.containsKey(null);
       } catch (NullPointerException optional) {
       }
     }
@@ -323,10 +323,10 @@
     assertFalse(map.containsValue(unmappedValue));
     assertTrue(map.containsValue(map.values().iterator().next()));
     if (allowsNullValues) {
-      map.containsValue(null);
+      boolean unused = map.containsValue(null);
     } else {
       try {
-        map.containsKey(null);
+        boolean unused2 = map.containsKey(null);
       } catch (NullPointerException optional) {
       }
     }
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 042ba9d..26a2870 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
@@ -112,8 +112,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedCollectionFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(SERIALIZABLE);
     derivedFeatures.remove(SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
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 ce01adb..e97b08f 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
@@ -86,8 +86,7 @@
     final TestSortedSetGenerator<E> delegate =
         (TestSortedSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
-    List<Feature<?>> features = new ArrayList<>();
-    features.addAll(parentBuilder.getFeatures());
+    List<Feature<?>> features = new ArrayList<>(parentBuilder.getFeatures());
     features.remove(CollectionFeature.ALLOWS_NULL_VALUES);
     features.add(CollectionFeature.SUBSET_VIEW);
 
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 e60ccf8..266daa4 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
@@ -88,8 +88,7 @@
   }
 
   private static Set<Feature<?>> computeEntrySetFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(CollectionFeature.GENERAL_PURPOSE);
     derivedFeatures.remove(CollectionFeature.SUPPORTS_ADD);
     derivedFeatures.remove(CollectionFeature.ALLOWS_NULL_VALUES);
@@ -101,8 +100,7 @@
   }
 
   static Set<Feature<?>> computeElementSetFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(CollectionFeature.GENERAL_PURPOSE);
     derivedFeatures.remove(CollectionFeature.SUPPORTS_ADD);
     if (!derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS)) {
@@ -112,8 +110,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedMultisetFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(CollectionFeature.SERIALIZABLE);
     derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
index f763dcc..dafd521 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
@@ -168,10 +168,10 @@
               public SortedMultiset<E> create(Object... entries) {
                 @SuppressWarnings("unchecked")
                 // we dangerously assume E is a string
-                List<E> extremeValues = (List) getExtremeValues();
+                List<E> extremeValues = (List<E>) getExtremeValues();
                 @SuppressWarnings("unchecked")
                 // map generators must past entry objects
-                List<E> normalValues = (List) Arrays.asList(entries);
+                List<E> normalValues = (List<E>) Arrays.asList(entries);
 
                 // prepare extreme values to be filtered out of view
                 Collections.sort(extremeValues, comparator);
@@ -266,8 +266,7 @@
     final TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
-    Set<Feature<?>> features = new HashSet<>();
-    features.addAll(parentBuilder.getFeatures());
+    Set<Feature<?>> features = new HashSet<>(parentBuilder.getFeatures());
     features.remove(SERIALIZABLE);
     features.remove(SERIALIZABLE_INCLUDING_VIEWS);
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java b/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
index 89e0662..b170497 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
@@ -19,9 +19,11 @@
 import static com.google.common.collect.testing.Helpers.mapEntry;
 import static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
 import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
+import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
 import static com.google.common.collect.testing.features.CollectionFeature.KNOWN_ORDER;
 import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
+import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.testing.AbstractCollectionTester;
@@ -66,6 +68,17 @@
     assertEquals("Different ordered iteration", expected, iteratorElements);
   }
 
+  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
+  @CollectionSize.Require(absent = ZERO)
+  public void testIterator_nullElement() {
+    initCollectionWithNullElement();
+    List<E> iteratorElements = new ArrayList<E>();
+    for (E element : collection) { // uses iterator()
+      iteratorElements.add(element);
+    }
+    Helpers.assertEqualIgnoringOrder(asList(createArrayWithNullElement()), iteratorElements);
+  }
+
   @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
   @CollectionSize.Require(absent = ZERO)
   public void testIterator_removeAffectsBackingCollection() {
diff --git a/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java b/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
index 906c1c5..01904d6 100644
--- a/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
+++ b/android/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
@@ -123,6 +123,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import java.util.UUID;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -205,6 +206,7 @@
           .put(Charset.class, Charsets.UTF_8)
           .put(Currency.class, Currency.getInstance(Locale.US))
           .put(Locale.class, Locale.US)
+          .put(UUID.class, UUID.randomUUID())
           // common.base
           .put(CharMatcher.class, CharMatcher.none())
           .put(Joiner.class, Joiner.on(','))
@@ -369,7 +371,14 @@
     constructor.setAccessible(true); // accessibility check is too slow
     try {
       return constructor.newInstance();
-    } catch (InstantiationException | IllegalAccessException impossible) {
+      /*
+       * Do not merge the 2 catch blocks below. javac would infer a type of
+       * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
+       * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
+       */
+    } catch (InstantiationException impossible) {
+      throw new AssertionError(impossible);
+    } catch (IllegalAccessException impossible) {
       throw new AssertionError(impossible);
     } catch (InvocationTargetException e) {
       logger.log(Level.WARNING, "Exception while invoking default constructor.", e.getCause());
diff --git a/android/guava-testlib/src/com/google/common/testing/ClusterException.java b/android/guava-testlib/src/com/google/common/testing/ClusterException.java
index 5f50ff8..7665ab1 100644
--- a/android/guava-testlib/src/com/google/common/testing/ClusterException.java
+++ b/android/guava-testlib/src/com/google/common/testing/ClusterException.java
@@ -67,8 +67,7 @@
     super(
         exceptions.size() + " exceptions were thrown. The first exception is listed as a cause.",
         exceptions.iterator().next());
-    ArrayList<Throwable> temp = new ArrayList<>();
-    temp.addAll(exceptions);
+    ArrayList<Throwable> temp = new ArrayList<>(exceptions);
     this.exceptions = Collections.unmodifiableCollection(temp);
   }
 
diff --git a/android/guava-testlib/src/com/google/common/testing/EqualsTester.java b/android/guava-testlib/src/com/google/common/testing/EqualsTester.java
index dc2d197..2c8e08b 100644
--- a/android/guava-testlib/src/com/google/common/testing/EqualsTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/EqualsTester.java
@@ -127,6 +127,11 @@
           "the Object#hashCode of " + item + " must be consistent",
           item.hashCode(),
           item.hashCode());
+      if (!(item instanceof String)) {
+        assertTrue(
+            item + " must not be Object#equals to its Object#toString representation",
+            !item.equals(item.toString()));
+      }
     }
   }
 
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 d6b329d..21e25cb 100644
--- a/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
+++ b/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
@@ -508,7 +508,14 @@
       @SuppressWarnings("unchecked") // getAvailableCurrencies() returns Set<Currency>.
       Set<Currency> currencies = (Set<Currency>) method.invoke(null);
       return pickInstance(currencies, Currency.getInstance(Locale.US));
-    } catch (NoSuchMethodException | InvocationTargetException notJava7) {
+      /*
+       * Do not merge the 2 catch blocks below. javac would infer a type of
+       * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
+       * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
+       */
+    } catch (NoSuchMethodException notJava7) {
+      return preJava7FreshCurrency();
+    } catch (InvocationTargetException notJava7) {
       return preJava7FreshCurrency();
     } catch (IllegalAccessException impossible) {
       throw new AssertionError(impossible);
diff --git a/android/guava-testlib/src/com/google/common/testing/GcFinalization.java b/android/guava-testlib/src/com/google/common/testing/GcFinalization.java
index 92394f1..015afea 100644
--- a/android/guava-testlib/src/com/google/common/testing/GcFinalization.java
+++ b/android/guava-testlib/src/com/google/common/testing/GcFinalization.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.j2objc.annotations.J2ObjCIncompatible;
 import java.lang.ref.WeakReference;
 import java.util.Locale;
@@ -241,6 +242,7 @@
    *   <li>enqueuing weak references to unreachable referents in their reference queue
    * </ul>
    */
+  @DoNotMock("Implement with a lambda")
   public interface FinalizationPredicate {
     boolean isDone();
   }
diff --git a/android/guava-testlib/src/com/google/common/testing/TearDownAccepter.java b/android/guava-testlib/src/com/google/common/testing/TearDownAccepter.java
index a1d1f00..bad1f19 100644
--- a/android/guava-testlib/src/com/google/common/testing/TearDownAccepter.java
+++ b/android/guava-testlib/src/com/google/common/testing/TearDownAccepter.java
@@ -17,6 +17,7 @@
 package com.google.common.testing;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.common.annotations.GwtCompatible;
 
 /**
@@ -26,6 +27,7 @@
  * @since 10.0
  */
 @Beta
+@DoNotMock("Implement with a lambda")
 @GwtCompatible
 public interface TearDownAccepter {
   /**
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractCheckedFutureTest.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractCheckedFutureTest.java
deleted file mode 100755
index 5c2ce32..0000000
--- a/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractCheckedFutureTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2007 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.testing;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.GwtIncompatible;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Test case to make sure the {@link CheckedFuture#checkedGet()} and {@link
- * CheckedFuture#checkedGet(long, TimeUnit)} methods work correctly.
- *
- * @author Sven Mawson
- * @since 10.0
- */
-@Beta
-@GwtIncompatible
-public abstract class AbstractCheckedFutureTest extends AbstractListenableFutureTest {
-
-  /** More specific type for the create method. */
-  protected abstract <V> CheckedFuture<V, ?> createCheckedFuture(
-      V value, Exception except, CountDownLatch waitOn);
-
-  /** Checks that the exception is the correct type of cancellation exception. */
-  protected abstract void checkCancelledException(Exception e);
-
-  /** Checks that the exception is the correct type of execution exception. */
-  protected abstract void checkExecutionException(Exception e);
-
-  /** Checks that the exception is the correct type of interruption exception. */
-  protected abstract void checkInterruptedException(Exception e);
-
-  @Override
-  protected <V> ListenableFuture<V> createListenableFuture(
-      V value, Exception except, CountDownLatch waitOn) {
-    return createCheckedFuture(value, except, waitOn);
-  }
-
-  /**
-   * Tests that the {@link CheckedFuture#checkedGet()} method throws the correct type of
-   * cancellation exception when it is cancelled.
-   */
-  public void testCheckedGetThrowsApplicationExceptionOnCancellation() {
-
-    final CheckedFuture<Boolean, ?> future = createCheckedFuture(Boolean.TRUE, null, latch);
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-
-    new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                future.cancel(true);
-              }
-            })
-        .start();
-
-    try {
-      future.checkedGet();
-      fail("RPC Should have been cancelled.");
-    } catch (Exception e) {
-      checkCancelledException(e);
-    }
-
-    assertTrue(future.isDone());
-    assertTrue(future.isCancelled());
-  }
-
-  public void testCheckedGetThrowsApplicationExceptionOnInterruption() throws InterruptedException {
-
-    final CheckedFuture<Boolean, ?> future = createCheckedFuture(Boolean.TRUE, null, latch);
-
-    final CountDownLatch startingGate = new CountDownLatch(1);
-    final CountDownLatch successLatch = new CountDownLatch(1);
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-
-    Thread getThread =
-        new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                startingGate.countDown();
-
-                try {
-                  future.checkedGet();
-                } catch (Exception e) {
-                  checkInterruptedException(e);
-
-                  // This only gets hit if the original call throws an exception and
-                  // the check call above passes.
-                  successLatch.countDown();
-                }
-              }
-            });
-    getThread.start();
-
-    assertTrue(startingGate.await(500, TimeUnit.MILLISECONDS));
-    getThread.interrupt();
-
-    assertTrue(successLatch.await(500, TimeUnit.MILLISECONDS));
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-  }
-
-  public void testCheckedGetThrowsApplicationExceptionOnError() {
-    final CheckedFuture<Boolean, ?> future =
-        createCheckedFuture(Boolean.TRUE, new Exception("Error"), latch);
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-
-    new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                latch.countDown();
-              }
-            })
-        .start();
-
-    try {
-      future.checkedGet();
-      fail();
-    } catch (Exception e) {
-      checkExecutionException(e);
-    }
-
-    assertTrue(future.isDone());
-    assertFalse(future.isCancelled());
-  }
-}
diff --git a/android/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java b/android/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java
index 666d726..cb6ba6a 100644
--- a/android/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java
@@ -72,7 +72,7 @@
     assertThat(findClassesToTest(ImmutableList.of(Foo.class))).contains(Foo.class);
   }
 
-  public void testFindClassesToTeset_ignoreUnderscores() {
+  public void testFindClassesToTest_ignoreUnderscores() {
     assertThat(findClassesToTest(ImmutableList.of(Foo.class, Foo_Bar.class)))
         .containsExactly(Foo.class, Foo_Bar.class);
     sanityTests.ignoreClasses(AbstractPackageSanityTests.UNDERSCORE_IN_NAME);
diff --git a/android/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java b/android/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
index 3664b23..b47672f 100644
--- a/android/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
@@ -109,6 +109,7 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.UUID;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentMap;
@@ -163,6 +164,7 @@
     assertNotNull(ArbitraryInstances.get(Object.class));
     assertEquals(0, ArbitraryInstances.get(Number.class));
     assertEquals(Charsets.UTF_8, ArbitraryInstances.get(Charset.class));
+    assertNotNull(ArbitraryInstances.get(UUID.class));
   }
 
   public void testGet_collections() {
diff --git a/android/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java b/android/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java
index b992f1b..d615af6 100644
--- a/android/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java
@@ -272,6 +272,15 @@
         .testEquals();
   }
 
+  public void testEqualityBasedOnToString() {
+    try {
+      new EqualsTester().addEqualityGroup(new EqualsBasedOnToString("foo")).testEquals();
+      fail();
+    } catch (AssertionFailedError e) {
+      assertTrue(e.getMessage().contains("toString representation"));
+    }
+  }
+
   private static void assertErrorMessage(Throwable e, String message) {
     // TODO(kevinb): use a Truth assertion here
     if (!e.getMessage().contains(message)) {
@@ -422,4 +431,27 @@
       return name;
     }
   }
+
+  private static final class EqualsBasedOnToString {
+    private final String s;
+
+    private EqualsBasedOnToString(String s) {
+      this.s = s;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      return obj != null && obj.toString().equals(toString());
+    }
+
+    @Override
+    public int hashCode() {
+      return s.hashCode();
+    }
+
+    @Override
+    public String toString() {
+      return s;
+    }
+  }
 }
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 28cdca2..99f01d6 100644
--- a/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
@@ -339,21 +339,25 @@
     }
 
     /** Two-arg method with no Nullable params. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void normalNormal(String first, Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the second param Nullable. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void normalNullable(String first, @NullableDecl Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the first param Nullable. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void nullableNormal(@NullableDecl String first, Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the both params Nullable. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void nullableNullable(@NullableDecl String first, @NullableDecl Integer second) {
       reactToNullParameters(first, second);
     }
diff --git a/android/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java b/android/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java
index 24d75b9..43fc75c 100644
--- a/android/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java
@@ -35,6 +35,7 @@
   private ReferenceEntry<Object, Object> head;
   private ReferenceEntry<Object, Object> chain;
 
+  @SuppressWarnings("GuardedBy")
   @BeforeExperiment
   void setUp() {
     LocalCache<Object, Object> cache =
@@ -43,6 +44,8 @@
     chain = null;
     for (int i = 0; i < length; i++) {
       Object key = new Object();
+      // TODO(b/145386688): This access should be guarded by 'this.segment', which is not currently
+      // held
       chain = segment.newEntry(key, cache.hash(key), chain);
       if (i == 0) {
         head = chain;
@@ -50,10 +53,13 @@
     }
   }
 
+  @SuppressWarnings("GuardedBy")
   @Benchmark
   int time(int reps) {
     int dummy = 0;
     for (int i = 0; i < reps; i++) {
+      // TODO(b/145386688): This access should be guarded by 'this.segment', which is not currently
+      // held
       segment.removeEntryFromChain(chain, head);
       dummy += segment.count;
     }
diff --git a/android/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java b/android/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java
index 5b82f83..a473d75 100644
--- a/android/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java
@@ -50,11 +50,14 @@
     checkState(segment.table.length() == capacity);
   }
 
+  @SuppressWarnings("GuardedBy")
   @Benchmark
   int time(int reps) {
     int dummy = 0;
     AtomicReferenceArray<ReferenceEntry<Object, Object>> oldTable = segment.table;
     for (int i = 0; i < reps; i++) {
+      // TODO(b/145386688): This access should be guarded by 'this.segment', which is not currently
+      // held
       segment.expand();
       segment.table = oldTable;
       dummy += segment.count;
diff --git a/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java b/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
index fb8a26e..f10b94e 100644
--- a/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
@@ -26,7 +26,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 
@@ -224,12 +223,24 @@
   }
 
   @Benchmark
+  boolean createPopulateAndRemove(int reps) {
+    boolean dummy = false;
+    for (int i = 1; i < reps; i++) {
+      Map<Element, Element> map = impl.create(values);
+      for (Element value : values) {
+        dummy |= map.remove(value) == null;
+      }
+    }
+    return dummy;
+  }
+
+  @Benchmark
   boolean iterateWithEntrySet(int reps) {
     Map<Element, Element> map = mapToTest;
 
     boolean dummy = false;
     for (int i = 0; i < reps; i++) {
-      for (Entry<Element, Element> entry : map.entrySet()) {
+      for (Map.Entry<Element, Element> entry : map.entrySet()) {
         dummy ^= entry.getKey() != entry.getValue();
       }
     }
diff --git a/android/guava-tests/benchmark/com/google/common/collect/MapsMemoryBenchmark.java b/android/guava-tests/benchmark/com/google/common/collect/MapsMemoryBenchmark.java
index f13d9b7..b834846 100644
--- a/android/guava-tests/benchmark/com/google/common/collect/MapsMemoryBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/collect/MapsMemoryBenchmark.java
@@ -45,6 +45,8 @@
     "HashMapImpl",
     "LinkedHashMapImpl",
     "ConcurrentHashMapImpl",
+    "CompactHashMapImpl",
+    "CompactLinkedHashMapImpl",
     "ImmutableMapImpl",
     "TreeMapImpl",
     "ImmutableSortedMapImpl",
diff --git a/android/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java b/android/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java
index e8616ee..be387f7 100644
--- a/android/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java
@@ -88,4 +88,14 @@
     }
     return tmp;
   }
+
+  @Benchmark
+  long roundToDouble(int reps) {
+    long tmp = 0;
+    for (int i = 0; i < reps; i++) {
+      int j = i & ARRAY_MASK;
+      tmp += Double.doubleToRawLongBits(BigIntegerMath.roundToDouble(nonzero1[j], mode));
+    }
+    return tmp;
+  }
 }
diff --git a/android/guava-tests/pom.xml b/android/guava-tests/pom.xml
index 223fc49..5191c8e 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>27.1-android</version>
+    <version>30.0-android</version>
   </parent>
   <artifactId>guava-tests</artifactId>
   <name>Guava Unit Tests</name>
diff --git a/android/guava-tests/test/com/google/common/base/CharMatcherTest.java b/android/guava-tests/test/com/google/common/base/CharMatcherTest.java
index db56260..5412882 100644
--- a/android/guava-tests/test/com/google/common/base/CharMatcherTest.java
+++ b/android/guava-tests/test/com/google/common/base/CharMatcherTest.java
@@ -727,12 +727,9 @@
     Set<Character> chars = new HashSet<>(size);
     for (int i = 0; i < size; i++) {
       char c;
-      while (true) {
+      do {
         c = (char) rand.nextInt(Character.MAX_VALUE - Character.MIN_VALUE + 1);
-        if (!chars.contains(c)) {
-          break;
-        }
-      }
+      } while (chars.contains(c));
       chars.add(c);
     }
     char[] retValue = new char[chars.size()];
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 5bfe3be..35de2d4 100644
--- a/android/guava-tests/test/com/google/common/base/OptionalTest.java
+++ b/android/guava-tests/test/com/google/common/base/OptionalTest.java
@@ -246,7 +246,7 @@
     List<Optional<? extends Number>> optionals =
         ImmutableList.<Optional<? extends Number>>of(Optional.<Double>absent(), Optional.of(2));
     Iterable<Number> onlyPresent = Optional.presentInstances(optionals);
-    assertThat(onlyPresent).containsExactly(2).inOrder();
+    assertThat(onlyPresent).containsExactly(2);
   }
 
   private static Optional<Integer> getSomeOptionalInt() {
@@ -288,7 +288,7 @@
     // Sadly, the following is what users will have to do in some circumstances.
 
     @SuppressWarnings("unchecked") // safe covariant cast
-    Optional<Number> first = (Optional) numbers.first();
+    Optional<Number> first = (Optional<Number>) numbers.first();
     Number value = first.or(0.5); // fine
   }
 
diff --git a/android/guava-tests/test/com/google/common/base/SplitterTest.java b/android/guava-tests/test/com/google/common/base/SplitterTest.java
index 6b3d861..46928aa 100644
--- a/android/guava-tests/test/com/google/common/base/SplitterTest.java
+++ b/android/guava-tests/test/com/google/common/base/SplitterTest.java
@@ -758,6 +758,18 @@
     }
   }
 
+  /**
+   * Testing the behavior in https://github.com/google/guava/issues/1900 - this behavior may want to
+   * be changed?
+   */
+  public void testMapSplitter_extraValueDelimiter() {
+    try {
+      COMMA_SPLITTER.withKeyValueSeparator("=").split("a=1,c=2=");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testMapSplitter_orderedResults() {
     Map<String, String> m =
         COMMA_SPLITTER.withKeyValueSeparator(":").split("boy:tom,girl:tina,cat:kitty,dog:tommy");
diff --git a/android/guava-tests/test/com/google/common/base/ThrowablesTest.java b/android/guava-tests/test/com/google/common/base/ThrowablesTest.java
index 076f899..e4c64aa 100644
--- a/android/guava-tests/test/com/google/common/base/ThrowablesTest.java
+++ b/android/guava-tests/test/com/google/common/base/ThrowablesTest.java
@@ -575,7 +575,7 @@
       Throwables.getRootCause(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(cause);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(cause);
     }
   }
 
@@ -675,7 +675,7 @@
       Throwables.getCausalChain(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(cause);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(cause);
     }
   }
 
@@ -684,15 +684,15 @@
     SomeCheckedException cause = new SomeCheckedException();
     SomeChainingException thrown = new SomeChainingException(cause);
 
-    assertThat(thrown).hasCauseThat().isSameAs(cause);
-    assertThat(Throwables.getCauseAs(thrown, SomeCheckedException.class)).isSameAs(cause);
-    assertThat(Throwables.getCauseAs(thrown, Exception.class)).isSameAs(cause);
+    assertThat(thrown).hasCauseThat().isSameInstanceAs(cause);
+    assertThat(Throwables.getCauseAs(thrown, SomeCheckedException.class)).isSameInstanceAs(cause);
+    assertThat(Throwables.getCauseAs(thrown, Exception.class)).isSameInstanceAs(cause);
 
     try {
       Throwables.getCauseAs(thrown, IllegalStateException.class);
       fail("Should have thrown CCE");
     } catch (ClassCastException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(thrown);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(thrown);
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/cache/AbstractCacheTest.java b/android/guava-tests/test/com/google/common/cache/AbstractCacheTest.java
index a9dcbfb..13ef33d 100644
--- a/android/guava-tests/test/com/google/common/cache/AbstractCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/AbstractCacheTest.java
@@ -146,6 +146,14 @@
     assertEquals(27, stats.evictionCount());
   }
 
+  public void testSimpleStatsOverflow() {
+    StatsCounter counter = new SimpleStatsCounter();
+    counter.recordLoadSuccess(Long.MAX_VALUE);
+    counter.recordLoadSuccess(1);
+    CacheStats stats = counter.snapshot();
+    assertEquals(Long.MAX_VALUE, stats.totalLoadTime());
+  }
+
   public void testSimpleStatsIncrementBy() {
     long totalLoadTime = 0;
 
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 bc2cbd3..ba3e7e9 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
@@ -91,7 +91,7 @@
   }
 
   private void checkLoggedCause(Throwable t) {
-    assertThat(popLoggedThrowable()).hasCauseThat().isSameAs(t);
+    assertThat(popLoggedThrowable()).hasCauseThat().isSameInstanceAs(t);
   }
 
   private void checkLoggedInvalidLoad() {
@@ -889,7 +889,7 @@
       cache.get(new Object());
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -901,7 +901,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(2, stats.missCount());
@@ -929,7 +929,7 @@
           });
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableError);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableError);
     }
     stats = cache.stats();
     assertEquals(3, stats.missCount());
@@ -941,7 +941,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(4, stats.missCount());
@@ -1122,7 +1122,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1145,7 +1145,7 @@
       cache.get(new Object());
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1157,7 +1157,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(2, stats.missCount());
@@ -1178,7 +1178,7 @@
       cache.get(new Object(), throwing(callableException));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableException);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableException);
     }
     stats = cache.stats();
     assertEquals(3, stats.missCount());
@@ -1190,7 +1190,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(4, stats.missCount());
@@ -1216,7 +1216,7 @@
       cache.get(new Object());
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1229,7 +1229,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1252,7 +1252,7 @@
       cache.get(new Object(), throwing(callableException));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableException);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableException);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1265,7 +1265,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1447,7 +1447,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1471,7 +1471,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1495,7 +1495,7 @@
       cache.get(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1507,7 +1507,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(2, stats.missCount());
@@ -1528,7 +1528,7 @@
       cache.get(new Object(), throwing(callableException));
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableException);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableException);
     }
     stats = cache.stats();
     assertEquals(3, stats.missCount());
@@ -1540,7 +1540,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(4, stats.missCount());
@@ -1721,7 +1721,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1752,7 +1752,7 @@
       cache.getUnchecked(1);
       fail();
     } catch (UncheckedExecutionException ue) {
-      assertThat(ue).hasCauseThat().isSameAs(e);
+      assertThat(ue).hasCauseThat().isSameInstanceAs(e);
     }
 
     assertEquals("1", cache.getUnchecked(1));
@@ -1866,14 +1866,14 @@
     } catch (ExecutionException e) {
       fail();
     } catch (UncheckedExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(uee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(uee);
     }
 
     try {
       cacheUnchecked.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException caughtUee) {
-      assertThat(caughtUee).hasCauseThat().isSameAs(uee);
+      assertThat(caughtUee).hasCauseThat().isSameInstanceAs(uee);
     }
 
     cacheUnchecked.refresh(new Object());
@@ -1885,21 +1885,21 @@
     } catch (ExecutionException e) {
       fail();
     } catch (UncheckedExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(uee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(uee);
     }
 
     try {
       cacheChecked.get(new Object());
       fail();
     } catch (ExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(ee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(ee);
     }
 
     try {
       cacheChecked.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException caughtUee) {
-      assertThat(caughtUee).hasCauseThat().isSameAs(ee);
+      assertThat(caughtUee).hasCauseThat().isSameInstanceAs(ee);
     }
 
     cacheChecked.refresh(new Object());
@@ -1909,7 +1909,7 @@
       cacheChecked.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(ee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(ee);
     }
   }
 
@@ -1929,14 +1929,14 @@
     } catch (ExecutionException e) {
       fail();
     } catch (UncheckedExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(uee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(uee);
     }
 
     try {
       cacheChecked.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(ee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(ee);
     }
   }
 
@@ -2057,7 +2057,7 @@
       // doConcurrentGet alternates between calling getUnchecked and calling get, but an unchecked
       // exception thrown by the loader is always wrapped as an UncheckedExecutionException.
       assertThat(result.get(i)).isInstanceOf(UncheckedExecutionException.class);
-      assertThat(((UncheckedExecutionException) result.get(i))).hasCauseThat().isSameAs(e);
+      assertThat(((UncheckedExecutionException) result.get(i))).hasCauseThat().isSameInstanceAs(e);
     }
 
     // subsequent calls should call the loader again, not get the old exception
@@ -2103,10 +2103,10 @@
       int mod = i % 3;
       if (mod == 0 || mod == 2) {
         assertThat(result.get(i)).isInstanceOf(ExecutionException.class);
-        assertThat((ExecutionException) result.get(i)).hasCauseThat().isSameAs(e);
+        assertThat((ExecutionException) result.get(i)).hasCauseThat().isSameInstanceAs(e);
       } else {
         assertThat(result.get(i)).isInstanceOf(UncheckedExecutionException.class);
-        assertThat((UncheckedExecutionException) result.get(i)).hasCauseThat().isSameAs(e);
+        assertThat((UncheckedExecutionException) result.get(i)).hasCauseThat().isSameInstanceAs(e);
       }
     }
 
diff --git a/android/guava-tests/test/com/google/common/cache/CacheStatsTest.java b/android/guava-tests/test/com/google/common/cache/CacheStatsTest.java
index f029d37..3e715f1 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheStatsTest.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheStatsTest.java
@@ -98,4 +98,32 @@
 
     assertEquals(sum, one.plus(two));
   }
+
+  public void testPlusLarge() {
+    CacheStats maxCacheStats =
+        new CacheStats(
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE);
+    CacheStats smallCacheStats = new CacheStats(1, 1, 1, 1, 1, 1);
+
+    CacheStats sum = smallCacheStats.plus(maxCacheStats);
+    assertEquals(Long.MAX_VALUE, sum.requestCount());
+    assertEquals(Long.MAX_VALUE, sum.hitCount());
+    assertEquals(1.0, sum.hitRate());
+    assertEquals(Long.MAX_VALUE, sum.missCount());
+    assertEquals(1.0, sum.missRate());
+    assertEquals(Long.MAX_VALUE, sum.loadSuccessCount());
+    assertEquals(Long.MAX_VALUE, sum.loadExceptionCount());
+    assertEquals(1.0, sum.loadExceptionRate());
+    assertEquals(Long.MAX_VALUE, sum.loadCount());
+    assertEquals(Long.MAX_VALUE, sum.totalLoadTime());
+    assertEquals(1.0, sum.averageLoadPenalty());
+    assertEquals(Long.MAX_VALUE, sum.evictionCount());
+
+    assertEquals(sum, maxCacheStats.plus(smallCacheStats));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/cache/CacheTesting.java b/android/guava-tests/test/com/google/common/cache/CacheTesting.java
index d7a3b4a..255a894 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheTesting.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheTesting.java
@@ -393,7 +393,7 @@
 
       ReferenceEntry<?, ?> originalHead = segment.accessQueue.peek();
       @SuppressWarnings("unchecked")
-      ReferenceEntry<Integer, Integer> entry = (ReferenceEntry) originalHead;
+      ReferenceEntry<Integer, Integer> entry = (ReferenceEntry<Integer, Integer>) originalHead;
       operation.accept(entry);
       drainRecencyQueue(segment);
 
diff --git a/android/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java b/android/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java
index 127b3c5..412ff78 100644
--- a/android/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java
@@ -34,7 +34,7 @@
   private Cache<String, Boolean> forward;
   private Cache<String, Boolean> mock;
 
-  @SuppressWarnings("unchecked") // mock
+  @SuppressWarnings({"unchecked", "DoNotMock"}) // mock
   @Override
   public void setUp() throws Exception {
     super.setUp();
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 01704ef..c5681d2 100644
--- a/android/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
@@ -34,7 +34,7 @@
   private LoadingCache<String, Boolean> forward;
   private LoadingCache<String, Boolean> mock;
 
-  @SuppressWarnings("unchecked") // mock
+  @SuppressWarnings({"unchecked", "DoNotMock"}) // mock
   @Override
   public void setUp() throws Exception {
     super.setUp();
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 da2224e..667ea93 100644
--- a/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
@@ -2413,7 +2413,7 @@
         ReferenceEntry<Object, Object> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -2443,7 +2443,7 @@
         ValueReference<Object, Object> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -2471,7 +2471,7 @@
         ReferenceEntry<Object, Object> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
@@ -2502,7 +2502,7 @@
         ValueReference<Object, Object> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
diff --git a/android/guava-tests/test/com/google/common/cache/LongAdderTest.java b/android/guava-tests/test/com/google/common/cache/LongAdderTest.java
index 78f6edc..876f907 100644
--- a/android/guava-tests/test/com/google/common/cache/LongAdderTest.java
+++ b/android/guava-tests/test/com/google/common/cache/LongAdderTest.java
@@ -14,11 +14,27 @@
 
 package com.google.common.cache;
 
-/**
- * No-op null-pointer test for {@link LongAdder} to override the {@link PackageSanityTests} version,
- * which checks package-private methods that we don't want to have to annotate as {@code Nullable}
- * because we don't want diffs from jsr166e.
- */
-public class LongAdderTest {
+import static com.google.common.truth.Truth.assertThat;
+
+import junit.framework.TestCase;
+
+/** Unit tests for {@link LongAdder}. */
+public class LongAdderTest extends TestCase {
+
+  /**
+   * No-op null-pointer test for {@link LongAdder} to override the {@link PackageSanityTests}
+   * version, which checks package-private methods that we don't want to have to annotate as {@code
+   * Nullable} because we don't want diffs from jsr166e.
+   */
   public void testNulls() {}
+
+  public void testOverflows() {
+    LongAdder longAdder = new LongAdder();
+    longAdder.add(Long.MAX_VALUE);
+    assertThat(longAdder.sum()).isEqualTo(Long.MAX_VALUE);
+    longAdder.add(1);
+    // silently overflows; is this a bug?
+    // See https://github.com/google/guava/issues/3503
+    assertThat(longAdder.sum()).isEqualTo(-9223372036854775808L);
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/cache/NullCacheTest.java b/android/guava-tests/test/com/google/common/cache/NullCacheTest.java
index e418f6c..89dc3fb 100644
--- a/android/guava-tests/test/com/google/common/cache/NullCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/NullCacheTest.java
@@ -123,7 +123,7 @@
       map.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException uee) {
-      assertThat(uee).hasCauseThat().isSameAs(e);
+      assertThat(uee).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(listener.isEmpty());
     checkEmpty(map);
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 06f0d27..1e71b63 100644
--- a/android/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
+++ b/android/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
@@ -237,21 +237,15 @@
     }
   }
 
-  @SuppressWarnings("unchecked") // generic array creation
-
   public void testEntrySet_populated() {
     for (LoadingCache<Object, Object> cache : caches()) {
       Set<Entry<Object, Object>> entries = cache.asMap().entrySet();
       List<Entry<Object, Object>> warmed = warmUp(cache, WARMUP_MIN, WARMUP_MAX);
 
       Set<?> expected = Maps.newHashMap(cache.asMap()).entrySet();
-      assertThat(entries).containsExactlyElementsIn((Collection<Entry<Object, Object>>) expected);
-      assertThat(entries.toArray())
-          .asList()
-          .containsExactlyElementsIn((Collection<Object>) expected);
-      assertThat(entries.toArray(new Entry[0]))
-          .asList()
-          .containsExactlyElementsIn((Collection<Entry>) expected);
+      assertThat(entries).containsExactlyElementsIn(expected);
+      assertThat(entries.toArray()).asList().containsExactlyElementsIn(expected);
+      assertThat(entries.toArray(new Object[0])).asList().containsExactlyElementsIn(expected);
 
       new EqualsTester()
           .addEqualityGroup(cache.asMap().entrySet(), entries)
diff --git a/android/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java b/android/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java
index 55a455b..e430f0e 100644
--- a/android/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java
@@ -28,6 +28,7 @@
 
   // The next two tests verify that map entries are not accessed after they're
   // removed, since IdentityHashMap throws an exception when that occurs.
+  @SuppressWarnings("IdentityHashMapBoxing") // explicitly testing IdentityHashMap
   public void testIdentityKeySetIteratorRemove() {
     BiMap<Integer, String> bimap =
         new AbstractBiMap<Integer, String>(
@@ -45,6 +46,7 @@
     assertEquals(1, bimap.inverse().size());
   }
 
+  @SuppressWarnings("IdentityHashMapBoxing") // explicitly testing IdentityHashMap
   public void testIdentityEntrySetIteratorRemove() {
     BiMap<Integer, String> bimap =
         new AbstractBiMap<Integer, String>(
diff --git a/android/guava-tests/test/com/google/common/collect/BenchmarkHelpers.java b/android/guava-tests/test/com/google/common/collect/BenchmarkHelpers.java
index 4d13736..65d2ef6 100644
--- a/android/guava-tests/test/com/google/common/collect/BenchmarkHelpers.java
+++ b/android/guava-tests/test/com/google/common/collect/BenchmarkHelpers.java
@@ -107,21 +107,7 @@
         return ContiguousSet.copyOf(contents);
       }
     },
-  //    @GoogleInternal
-  //    CompactHashSetImpl {
-  //      @Override
-  //      public <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
-  //        return CompactHashSet.create(contents);
-  //      }
-  //    },
-  //    @GoogleInternal
-  //    CompactLinkedHashSetImpl {
-  //      @Override
-  //      public <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
-  //        return CompactLinkedHashSet.create(contents);
-  //      }
-  //    },
-  ;
+    ;
   }
 
   public enum ListMultimapImpl {
@@ -217,24 +203,6 @@
         return new ConcurrentHashMap<>(map);
       }
     },
-    //    @GoogleInternal
-    //    CompactHashmapImpl {
-    //      @Override
-    //      public <K extends Comparable<K>, V> Map<K, V> create(Map<K, V> map) {
-    //        Map<K, V> result = CompactHashMap.createWithExpectedSize(map.size());
-    //        result.putAll(map);
-    //        return result;
-    //      }
-    //    },
-    //    @GoogleInternal
-    //    CompactLinkedHashmapImpl {
-    //      @Override
-    //      public <K extends Comparable<K>, V> Map<K, V> create(Map<K, V> map) {
-    //        Map<K, V> result = CompactLinkedHashMap.createWithExpectedSize(map.size());
-    //        result.putAll(map);
-    //        return result;
-    //      }
-    //    },
     ImmutableMapImpl {
       @Override
       public <K extends Comparable<K>, V> Map<K, V> create(Map<K, V> map) {
diff --git a/android/guava-tests/test/com/google/common/collect/CompactHashMapTest.java b/android/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
index 33e6015..52c9bed 100644
--- a/android/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
@@ -13,6 +13,7 @@
  * 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.Iterables.getOnlyElement;
@@ -85,4 +86,35 @@
     entry.setValue("one");
     assertThat(map).containsEntry(1, "one");
   }
+
+  public void testAllocArraysDefault() {
+    CompactHashMap<Integer, String> map = CompactHashMap.create();
+    assertThat(map.needsAllocArrays()).isTrue();
+    assertThat(map.entries).isNull();
+    assertThat(map.keys).isNull();
+    assertThat(map.values).isNull();
+
+    map.put(1, "1");
+    assertThat(map.needsAllocArrays()).isFalse();
+    assertThat(map.entries).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.keys).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.values).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactHashMap<Integer, String> map = CompactHashMap.createWithExpectedSize(i);
+      assertThat(map.needsAllocArrays()).isTrue();
+      assertThat(map.entries).isNull();
+      assertThat(map.keys).isNull();
+      assertThat(map.values).isNull();
+
+      map.put(1, "1");
+      assertThat(map.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(map.entries).hasLength(expectedSize);
+      assertThat(map.keys).hasLength(expectedSize);
+      assertThat(map.values).hasLength(expectedSize);
+    }
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/CompactHashSetTest.java b/android/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
index e5c3a45..0f0216f 100644
--- a/android/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
@@ -16,6 +16,9 @@
 
 package com.google.common.collect;
 
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.*;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.testing.SetTestSuiteBuilder;
 import com.google.common.collect.testing.TestStringSetGenerator;
@@ -83,7 +86,26 @@
     return suite;
   }
 
-  public void testDummyMethod() {
-    // Just make sure the test runner doesn't complain about no test methods.
+  public void testAllocArraysDefault() {
+    CompactHashSet<Integer> set = CompactHashSet.create();
+    assertThat(set.needsAllocArrays()).isTrue();
+    assertThat(set.elements).isNull();
+
+    set.add(1);
+    assertThat(set.needsAllocArrays()).isFalse();
+    assertThat(set.elements).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactHashSet<Integer> set = CompactHashSet.createWithExpectedSize(i);
+      assertThat(set.needsAllocArrays()).isTrue();
+      assertThat(set.elements).isNull();
+
+      set.add(1);
+      assertThat(set.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(set.elements).hasLength(expectedSize);
+    }
   }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java b/android/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
index f7e2857..d1363bc 100644
--- a/android/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
@@ -11,6 +11,7 @@
  * 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.truth.Truth.assertThat;
@@ -96,8 +97,8 @@
     map.put(4, "b");
     map.put(3, "d");
     map.put(2, "c");
-    map.remove(3);
-    testHasMapEntriesInOrder(map, 1, "a", 4, "b", 2, "c");
+    map.remove(4);
+    testHasMapEntriesInOrder(map, 1, "a", 3, "d", 2, "c");
   }
 
   public void testInsertionOrderAfterRemoveLastEntry() {
@@ -141,4 +142,39 @@
       assertEquals(expectedValue, values.get(i));
     }
   }
+
+  public void testAllocArraysDefault() {
+    CompactLinkedHashMap<Integer, String> map = CompactLinkedHashMap.create();
+    assertThat(map.needsAllocArrays()).isTrue();
+    assertThat(map.entries).isNull();
+    assertThat(map.keys).isNull();
+    assertThat(map.values).isNull();
+    assertThat(map.links).isNull();
+
+    map.put(1, Integer.toString(1));
+    assertThat(map.needsAllocArrays()).isFalse();
+    assertThat(map.entries).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.keys).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.values).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.links).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactLinkedHashMap<Integer, String> map = CompactLinkedHashMap.createWithExpectedSize(i);
+      assertThat(map.needsAllocArrays()).isTrue();
+      assertThat(map.entries).isNull();
+      assertThat(map.keys).isNull();
+      assertThat(map.values).isNull();
+      assertThat(map.links).isNull();
+
+      map.put(1, Integer.toString(1));
+      assertThat(map.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(map.entries).hasLength(expectedSize);
+      assertThat(map.keys).hasLength(expectedSize);
+      assertThat(map.values).hasLength(expectedSize);
+      assertThat(map.links).hasLength(expectedSize);
+    }
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java b/android/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
index a95e486..299503e 100644
--- a/android/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
@@ -16,6 +16,8 @@
 
 package com.google.common.collect;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.testing.SetTestSuiteBuilder;
 import com.google.common.collect.testing.TestStringSetGenerator;
@@ -65,7 +67,26 @@
     return suite;
   }
 
-  public void testDummyMethod() {
-    // Just make sure the test runner doesn't complain about no test methods.
+  public void testAllocArraysDefault() {
+    CompactHashSet<Integer> set = CompactHashSet.create();
+    assertThat(set.needsAllocArrays()).isTrue();
+    assertThat(set.elements).isNull();
+
+    set.add(1);
+    assertThat(set.needsAllocArrays()).isFalse();
+    assertThat(set.elements).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactHashSet<Integer> set = CompactHashSet.createWithExpectedSize(i);
+      assertThat(set.needsAllocArrays()).isTrue();
+      assertThat(set.elements).isNull();
+
+      set.add(1);
+      assertThat(set.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(set.elements).hasLength(expectedSize);
+    }
   }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ComparatorsTest.java b/android/guava-tests/test/com/google/common/collect/ComparatorsTest.java
index d5f8801..b30cb76 100644
--- a/android/guava-tests/test/com/google/common/collect/ComparatorsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ComparatorsTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.collect;
 
+import static com.google.common.truth.Truth.assertThat;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -71,4 +72,59 @@
     assertTrue(Comparators.isInStrictOrder(Collections.singleton(1), Ordering.natural()));
     assertTrue(Comparators.isInStrictOrder(Collections.<Integer>emptyList(), Ordering.natural()));
   }
+
+  public void testMinMaxNatural() {
+    assertThat(Comparators.min(1, 2)).isEqualTo(1);
+    assertThat(Comparators.min(2, 1)).isEqualTo(1);
+    assertThat(Comparators.max(1, 2)).isEqualTo(2);
+    assertThat(Comparators.max(2, 1)).isEqualTo(2);
+  }
+
+  public void testMinMaxNatural_equalInstances() {
+    Foo a = new Foo(1);
+    Foo b = new Foo(1);
+    assertThat(Comparators.min(a, b)).isSameInstanceAs(a);
+    assertThat(Comparators.max(a, b)).isSameInstanceAs(a);
+  }
+
+  public void testMinMaxComparator() {
+    Comparator<Integer> natural = Ordering.natural();
+    Comparator<Integer> reverse = Collections.reverseOrder(natural);
+    assertThat(Comparators.min(1, 2, reverse)).isEqualTo(2);
+    assertThat(Comparators.min(2, 1, reverse)).isEqualTo(2);
+    assertThat(Comparators.max(1, 2, reverse)).isEqualTo(1);
+    assertThat(Comparators.max(2, 1, reverse)).isEqualTo(1);
+  }
+
+  public void testMinMaxComparator_equalInstances() {
+    Comparator<Foo> natural = Ordering.natural();
+    Comparator<Foo> reverse = Collections.reverseOrder(natural);
+    Foo a = new Foo(1);
+    Foo b = new Foo(1);
+    assertThat(Comparators.min(a, b, reverse)).isSameInstanceAs(a);
+    assertThat(Comparators.max(a, b, reverse)).isSameInstanceAs(a);
+  }
+
+  private static class Foo implements Comparable<Foo> {
+    final Integer value;
+
+    Foo(int value) {
+      this.value = value;
+    }
+
+    @Override
+    public int hashCode() {
+      return value.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return (o instanceof Foo) && ((Foo) o).value.equals(value);
+    }
+
+    @Override
+    public int compareTo(Foo other) {
+      return value.compareTo(other.value);
+    }
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java b/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java
index 592a1c7..1d38c86 100644
--- a/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java
@@ -20,8 +20,8 @@
 import static com.google.common.collect.MapMakerInternalMap.Strength.WEAK;
 import static com.google.common.testing.SerializableTester.reserializeAndAssert;
 import static java.util.Arrays.asList;
+import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.isA;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
diff --git a/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java b/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
index 6ca5b8c..cc5d739 100644
--- a/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
@@ -17,7 +17,7 @@
 package com.google.common.collect;
 
 import static java.lang.reflect.Modifier.STATIC;
-import static org.mockito.Mockito.anyObject;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -231,10 +231,10 @@
 
     // These are the methods specified by StandardEntrySet
     verify(map, atLeast(0)).clear();
-    verify(map, atLeast(0)).containsKey(anyObject());
-    verify(map, atLeast(0)).get(anyObject());
+    verify(map, atLeast(0)).containsKey(any());
+    verify(map, atLeast(0)).get(any());
     verify(map, atLeast(0)).isEmpty();
-    verify(map, atLeast(0)).remove(anyObject());
+    verify(map, atLeast(0)).remove(any());
     verify(map, atLeast(0)).size();
     verifyNoMoreInteractions(map);
   }
@@ -259,9 +259,9 @@
 
     // These are the methods specified by StandardKeySet
     verify(map, atLeast(0)).clear();
-    verify(map, atLeast(0)).containsKey(anyObject());
+    verify(map, atLeast(0)).containsKey(any());
     verify(map, atLeast(0)).isEmpty();
-    verify(map, atLeast(0)).remove(anyObject());
+    verify(map, atLeast(0)).remove(any());
     verify(map, atLeast(0)).size();
     verify(map, atLeast(0)).entrySet();
     verifyNoMoreInteractions(map);
@@ -287,7 +287,7 @@
 
     // These are the methods specified by StandardValues
     verify(map, atLeast(0)).clear();
-    verify(map, atLeast(0)).containsValue(anyObject());
+    verify(map, atLeast(0)).containsValue(any());
     verify(map, atLeast(0)).isEmpty();
     verify(map, atLeast(0)).size();
     verify(map, atLeast(0)).entrySet();
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 f1f59c5..cb23f3e 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
@@ -575,4 +575,7 @@
       assertEquals(alternatingKeysAndValues[i++], entry.getValue());
     }
   }
+
+  /** No-op test so that the class has at least one method, making Maven's test runner happy. */
+  public void testNoop() {}
 }
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 e6569b0..2cf43ef 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import static com.google.common.testing.SerializableTester.reserialize;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -45,12 +46,15 @@
 import com.google.common.testing.EqualsTester;
 import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.SerializableTester;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -647,6 +651,37 @@
       assertMapEquals(copy, "one", 1, "two", 2, "three", 3);
       assertSame(copy, ImmutableMap.copyOf(copy));
     }
+
+    public static void hashtableTestHelper(ImmutableList<Integer> sizes) {
+      for (int size : sizes) {
+        Builder<Integer, Integer> builder = ImmutableMap.builderWithExpectedSize(size);
+        for (int i = 0; i < size; i++) {
+          Integer integer = i;
+          builder.put(integer, integer);
+        }
+        ImmutableMap<Integer, Integer> map = builder.build();
+        assertEquals(size, map.size());
+        int entries = 0;
+        for (Integer key : map.keySet()) {
+          assertEquals(entries, key.intValue());
+          assertSame(key, map.get(key));
+          entries++;
+        }
+        assertEquals(size, entries);
+      }
+    }
+
+    public void testByteArrayHashtable() {
+      hashtableTestHelper(ImmutableList.of(2, 89));
+    }
+
+    public void testShortArrayHashtable() {
+      hashtableTestHelper(ImmutableList.of(90, 22937));
+    }
+
+    public void testIntArrayHashtable() {
+      hashtableTestHelper(ImmutableList.of(22938));
+    }
   }
 
   public void testNullGet() {
@@ -737,6 +772,58 @@
     assertTrue(reserializedValues instanceof ImmutableCollection);
   }
 
+  @GwtIncompatible // SerializableTester
+  public void testKeySetIsSerializable_regularImmutableMap() {
+    class NonSerializableClass {}
+
+    Map<String, NonSerializableClass> map =
+        RegularImmutableMap.create(1, new Object[] {"one", new NonSerializableClass()});
+    Set<String> set = map.keySet();
+
+    LenientSerializableTester.reserializeAndAssertLenient(set);
+  }
+
+  @GwtIncompatible // SerializableTester
+  public void testValuesCollectionIsSerializable_regularImmutableMap() {
+    class NonSerializableClass {}
+
+    Map<NonSerializableClass, String> map =
+        RegularImmutableMap.create(1, new Object[] {new NonSerializableClass(), "value"});
+    Collection<String> collection = map.values();
+
+    LenientSerializableTester.reserializeAndAssertElementsEqual(collection);
+  }
+
+  // TODO: Re-enable this test after moving to new serialization format in ImmutableMap.
+  @GwtIncompatible // SerializableTester
+  @SuppressWarnings("unchecked")
+  public void ignore_testSerializationNoDuplication_regularImmutableMap() throws Exception {
+    // Tests that searializing a map, its keySet, and values only writes the underlying data once.
+
+    Object[] entries = new Object[2000];
+    for (int i = 0; i < entries.length; i++) {
+      entries[i] = i;
+    }
+
+    ImmutableMap<Integer, Integer> map = RegularImmutableMap.create(entries.length / 2, entries);
+    Set<Integer> keySet = map.keySet();
+    Collection<Integer> values = map.values();
+
+    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+    ObjectOutputStream oos = new ObjectOutputStream(bytes);
+    oos.writeObject(map);
+    oos.flush();
+
+    int mapSize = bytes.size();
+    oos.writeObject(keySet);
+    oos.writeObject(values);
+    oos.close();
+
+    int finalSize = bytes.size();
+
+    assertThat(finalSize - mapSize).isLessThan(100);
+  }
+
   public void testEquals() {
     new EqualsTester()
         .addEqualityGroup(ImmutableMap.of(), ImmutableMap.builder().build())
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 8a984c9..6dc6f22 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
@@ -366,4 +366,12 @@
     builder.add("baz");
     assertTrue(set.elements != builder.contents);
   }
+
+  public void testReuseBuilderReducingHashTableSizeWithPowerOfTwoTotalElements() {
+    ImmutableSet.Builder<Object> builder = ImmutableSet.builderWithExpectedSize(6);
+    builder.add(0);
+    ImmutableSet<Object> unused = builder.build();
+    ImmutableSet<Object> subject = builder.add(1).add(2).add(3).build();
+    assertFalse(subject.contains(4));
+  }
 }
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 520ba65..cf2f5aa 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
@@ -1005,6 +1005,44 @@
     }
   }
 
+  public void testFloor_emptySet() {
+    ImmutableSortedSet<String> set = ImmutableSortedSet.copyOf(new String[] {});
+    assertThat(set.floor("f")).isNull();
+  }
+
+  public void testFloor_elementPresent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "a", "e", "f", "b", "i", "d", "a", "c", "k"});
+    assertThat(set.floor("f")).isEqualTo("f");
+    assertThat(set.floor("j")).isEqualTo("i");
+    assertThat(set.floor("q")).isEqualTo("k");
+  }
+
+  public void testFloor_elementAbsent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "e", "f", "b", "i", "d", "c", "k"});
+    assertThat(set.floor("a")).isNull();
+  }
+
+  public void testCeiling_emptySet() {
+    ImmutableSortedSet<String> set = ImmutableSortedSet.copyOf(new String[] {});
+    assertThat(set.ceiling("f")).isNull();
+  }
+
+  public void testCeiling_elementPresent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "e", "f", "f", "i", "d", "c", "k", "p", "c"});
+    assertThat(set.ceiling("f")).isEqualTo("f");
+    assertThat(set.ceiling("h")).isEqualTo("i");
+    assertThat(set.ceiling("a")).isEqualTo("c");
+  }
+
+  public void testCeiling_elementAbsent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "a", "e", "f", "b", "i", "d", "a", "c", "k"});
+    assertThat(set.ceiling("l")).isNull();
+  }
+
   public void testSubSetExclusiveExclusive() {
     String[] strings = NUMBER_NAMES.toArray(new String[0]);
     ImmutableSortedSet<String> set = ImmutableSortedSet.copyOf(strings);
diff --git a/android/guava-tests/test/com/google/common/collect/IteratorsTest.java b/android/guava-tests/test/com/google/common/collect/IteratorsTest.java
index afe22b8..15f7ccc 100644
--- a/android/guava-tests/test/com/google/common/collect/IteratorsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/IteratorsTest.java
@@ -1279,8 +1279,7 @@
   }
 
   private static Enumeration<Integer> enumerate(Integer... ints) {
-    Vector<Integer> vector = new Vector<>();
-    vector.addAll(asList(ints));
+    Vector<Integer> vector = new Vector<>(asList(ints));
     return vector.elements();
   }
 
diff --git a/android/guava-tests/test/com/google/common/collect/LenientSerializableTester.java b/android/guava-tests/test/com/google/common/collect/LenientSerializableTester.java
index 03b35e0..ce3ec9d 100644
--- a/android/guava-tests/test/com/google/common/collect/LenientSerializableTester.java
+++ b/android/guava-tests/test/com/google/common/collect/LenientSerializableTester.java
@@ -24,6 +24,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.testing.SerializableTester;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.Collection;
 import java.util.Set;
 
 /**
@@ -60,5 +61,14 @@
     return copy;
   }
 
+  @CanIgnoreReturnValue
+  @GwtIncompatible // SerializableTester
+  static <E> Collection<E> reserializeAndAssertElementsEqual(Collection<E> original) {
+    Collection<E> copy = reserialize(original);
+    assertTrue(Iterables.elementsEqual(original, copy));
+    assertTrue(copy instanceof ImmutableCollection);
+    return copy;
+  }
+
   private LenientSerializableTester() {}
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ListsImplTest.java b/android/guava-tests/test/com/google/common/collect/ListsImplTest.java
index 69d19ba..2d18f5a 100644
--- a/android/guava-tests/test/com/google/common/collect/ListsImplTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ListsImplTest.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 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;
@@ -138,7 +139,7 @@
     List<Object> unEqualItems =
         Arrays.asList(outOfOrder, diffValue, diffLength, empty, null, new Object());
     for (Object other : unEqualItems) {
-      assertThat(Lists.equalsImpl(base, other)).named("%s", other).isFalse();
+      assertWithMessage("%s", other).that(Lists.equalsImpl(base, other)).isFalse();
     }
   }
 
@@ -167,11 +168,11 @@
       int index = indexes.get(i);
       Iterable<String> iterableToAdd = toAdd.get(i);
       boolean expectedChanged = iterableToAdd.iterator().hasNext();
-      assertThat(Lists.addAllImpl(toTest, index, iterableToAdd))
-          .named(format, iterableToAdd, index)
+      assertWithMessage(format, iterableToAdd, index)
+          .that(Lists.addAllImpl(toTest, index, iterableToAdd))
           .isEqualTo(expectedChanged);
-      assertThat(toTest)
-          .named(format, iterableToAdd, index)
+      assertWithMessage(format, iterableToAdd, index)
+          .that(toTest)
           .containsExactlyElementsIn(expected.get(i));
     }
   }
@@ -216,7 +217,7 @@
     int index = 0;
     for (Object obj : toTest) {
       String name = "toTest[" + index + "] (" + obj + ")";
-      assertThat(Lists.indexOfImpl(toTest, obj)).named(name).isEqualTo(expected[index]);
+      assertWithMessage(name).that(Lists.indexOfImpl(toTest, obj)).isEqualTo(expected[index]);
       index++;
     }
   }
@@ -225,7 +226,7 @@
     int index = 0;
     for (Object obj : toTest) {
       String name = "toTest[" + index + "] (" + obj + ")";
-      assertThat(Lists.lastIndexOfImpl(toTest, obj)).named(name).isEqualTo(expected[index]);
+      assertWithMessage(name).that(Lists.lastIndexOfImpl(toTest, obj)).isEqualTo(expected[index]);
       index++;
     }
   }
diff --git a/android/guava-tests/test/com/google/common/collect/ListsTest.java b/android/guava-tests/test/com/google/common/collect/ListsTest.java
index 0d0e6f2..ef90e54 100644
--- a/android/guava-tests/test/com/google/common/collect/ListsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ListsTest.java
@@ -629,6 +629,16 @@
     assertEquals(actual.indexOf(list(1, 1, 1)), -1);
   }
 
+  public void testCartesianProduct_lastIndexOf() {
+    List<List<Integer>> actual = Lists.cartesianProduct(list(1, 1), list(2, 3));
+    assertThat(actual.lastIndexOf(list(1, 2))).isEqualTo(2);
+    assertThat(actual.lastIndexOf(list(1, 3))).isEqualTo(3);
+    assertThat(actual.lastIndexOf(list(1, 1))).isEqualTo(-1);
+
+    assertThat(actual.lastIndexOf(list(1))).isEqualTo(-1);
+    assertThat(actual.lastIndexOf(list(1, 1, 1))).isEqualTo(-1);
+  }
+
   @SuppressWarnings("unchecked") // varargs!
   public void testCartesianProduct_unrelatedTypes() {
     List<Integer> x = list(1, 2);
diff --git a/android/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java b/android/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java
index 535eed4..47fc74c 100644
--- a/android/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java
@@ -604,6 +604,7 @@
     assertNull(segment.get(key, hash));
   }
 
+  @SuppressWarnings("GuardedBy")
   public void testExpand() {
     MapMakerInternalMap<Object, Object, ?, ?> map =
         makeMap(createMapMaker().concurrencyLevel(1).initialCapacity(1));
@@ -629,6 +630,8 @@
 
     for (int i = 1; i <= originalCount * 2; i *= 2) {
       if (i > 1) {
+        // TODO(b/145386688): This access should be guarded by 'segment', which is not currently
+        // held
         segment.expand();
       }
       assertEquals(i, segment.table.length());
@@ -687,6 +690,7 @@
     assertNull(newFirst.getNext());
   }
 
+  @SuppressWarnings("GuardedBy")
   public void testExpand_cleanup() {
     MapMakerInternalMap<Object, Object, ?, ?> map =
         makeMap(createMapMaker().concurrencyLevel(1).initialCapacity(1));
@@ -719,6 +723,8 @@
 
     for (int i = 1; i <= originalCount * 2; i *= 2) {
       if (i > 1) {
+        // TODO(b/145386688): This access should be guarded by 'segment', which is not currently
+        // held
         segment.expand();
       }
       assertEquals(i, segment.table.length());
@@ -845,7 +851,7 @@
         InternalEntry<Object, Object, ?> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -877,7 +883,7 @@
         WeakValueReference<Object, Object, ?> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -905,7 +911,7 @@
         InternalEntry<Object, Object, ?> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
@@ -938,7 +944,7 @@
         WeakValueReference<Object, Object, ?> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
diff --git a/android/guava-tests/test/com/google/common/collect/MapsTest.java b/android/guava-tests/test/com/google/common/collect/MapsTest.java
index 8ea3475..76394c8 100644
--- a/android/guava-tests/test/com/google/common/collect/MapsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/MapsTest.java
@@ -21,6 +21,7 @@
 import static com.google.common.collect.Maps.unmodifiableNavigableMap;
 import static com.google.common.collect.testing.Helpers.mapEntry;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -155,8 +156,8 @@
     for (int i = 1; i < size; i++) {
       map1.put(i, null);
     }
-    assertThat(bucketsOf(map1))
-        .named("table size after adding " + size + " elements")
+    assertWithMessage("table size after adding " + size + " elements")
+        .that(bucketsOf(map1))
         .isEqualTo(initialBuckets);
 
     /*
@@ -164,8 +165,8 @@
      * once; make sure that passes too.
      */
     map2.putAll(map1);
-    assertThat(bucketsOf(map1))
-        .named("table size after adding " + size + " elements")
+    assertWithMessage("table size after adding " + size + " elements")
+        .that(bucketsOf(map1))
         .isEqualTo(initialBuckets);
   }
 
@@ -244,6 +245,8 @@
     assertEquals(original, map);
   }
 
+  // Intentionally using IdentityHashMap to test creation.
+  @SuppressWarnings("IdentityHashMapBoxing")
   public void testIdentityHashMap() {
     IdentityHashMap<Integer, Integer> map = Maps.newIdentityHashMap();
     assertEquals(Collections.emptyMap(), map);
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 e85051b..66d99fe 100644
--- a/android/guava-tests/test/com/google/common/collect/QueuesTest.java
+++ b/android/guava-tests/test/com/google/common/collect/QueuesTest.java
@@ -77,7 +77,7 @@
   @Override
   public void tearDown() throws InterruptedException {
     threadPool.shutdown();
-    assertTrue("Some worker didn't finish in time", threadPool.awaitTermination(1, SECONDS));
+    assertTrue("Some worker didn't finish in time", threadPool.awaitTermination(10, SECONDS));
   }
 
   private static <T> int drain(
diff --git a/android/guava-tests/test/com/google/common/collect/RangeTest.java b/android/guava-tests/test/com/google/common/collect/RangeTest.java
index d76b96f..9a2cd74 100644
--- a/android/guava-tests/test/com/google/common/collect/RangeTest.java
+++ b/android/guava-tests/test/com/google/common/collect/RangeTest.java
@@ -23,6 +23,7 @@
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Predicate;
 import com.google.common.collect.testing.Helpers;
 import com.google.common.testing.EqualsTester;
@@ -37,7 +38,7 @@
  *
  * @author Kevin Bourrillion
  */
-@GwtCompatible
+@GwtCompatible(emulated = true)
 public class RangeTest extends TestCase {
   public void testOpen() {
     Range<Integer> range = Range.open(4, 8);
@@ -118,6 +119,8 @@
 
   public void testIsConnected() {
     assertTrue(Range.closed(3, 5).isConnected(Range.open(5, 6)));
+    assertTrue(Range.closed(3, 5).isConnected(Range.closed(5, 6)));
+    assertTrue(Range.closed(5, 6).isConnected(Range.closed(3, 5)));
     assertTrue(Range.closed(3, 5).isConnected(Range.openClosed(5, 5)));
     assertTrue(Range.open(3, 5).isConnected(Range.closed(5, 6)));
     assertTrue(Range.closed(3, 7).isConnected(Range.open(6, 8)));
@@ -471,6 +474,32 @@
     }
   }
 
+  public void testGap_invalidRangesWithInfinity() {
+    try {
+      Range.atLeast(1).gap(Range.atLeast(2));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    try {
+      Range.atLeast(2).gap(Range.atLeast(1));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    try {
+      Range.atMost(1).gap(Range.atMost(2));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    try {
+      Range.atMost(2).gap(Range.atMost(1));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testGap_connectedAdjacentYieldsEmpty() {
     Range<Integer> range = Range.open(3, 4);
 
@@ -499,6 +528,8 @@
     assertEquals(Range.open(2, 4), closedRange.gap(Range.atMost(2)));
   }
 
+  // TODO(cpovirk): More extensive testing of gap().
+
   public void testSpan_general() {
     Range<Integer> range = Range.closed(4, 8);
 
@@ -568,6 +599,7 @@
         .testEquals();
   }
 
+  @GwtIncompatible // TODO(b/148207871): Restore once Eclipse compiler no longer flakes for this.
   public void testLegacyComparable() {
     Range<LegacyComparable> range = Range.closed(LegacyComparable.X, LegacyComparable.Y);
   }
diff --git a/android/guava-tests/test/com/google/common/collect/SetsTest.java b/android/guava-tests/test/com/google/common/collect/SetsTest.java
index 1873a14..8aa8d83 100644
--- a/android/guava-tests/test/com/google/common/collect/SetsTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SetsTest.java
@@ -24,6 +24,7 @@
 import static com.google.common.collect.Sets.unmodifiableNavigableSet;
 import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.io.ObjectStreamConstants.TC_REFERENCE;
 import static java.io.ObjectStreamConstants.baseWireHandle;
 import static java.util.Collections.emptySet;
@@ -948,6 +949,13 @@
     }
   }
 
+  public void testPowerSetEquals_independentOfOrder() {
+    ImmutableSet<Integer> elements = ImmutableSet.of(1, 2, 3, 4);
+    Set<Set<Integer>> forward = powerSet(elements);
+    Set<Set<Integer>> reverse = powerSet(ImmutableSet.copyOf(elements.asList().reverse()));
+    new EqualsTester().addEqualityGroup(forward, reverse).testEquals();
+  }
+
   /**
    * Test that a hash code miscomputed by "input.hashCode() * tooFarValue / 2" is correct under our
    * {@code hashCode} implementation.
@@ -1032,8 +1040,8 @@
                     return input.size() == size;
                   }
                 });
-        assertThat(Sets.combinations(sampleSet, k))
-            .named("Sets.combinations(%s, %s)", sampleSet, k)
+        assertWithMessage("Sets.combinations(%s, %s)", sampleSet, k)
+            .that(Sets.combinations(sampleSet, k))
             .containsExactlyElementsIn(expected)
             .inOrder();
       }
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 1c8de93..0a11b27 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
@@ -263,8 +263,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    create().contains("foo");
-    create().containsAll(ImmutableList.of("foo"));
+    boolean unused = create().contains("foo");
+    boolean unused2 = 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 140720c..34d1c6f 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
@@ -175,11 +175,11 @@
   }
 
   public void testContainsKey() {
-    create().containsKey(null);
+    boolean unused = create().containsKey(null);
   }
 
   public void testContainsValue() {
-    create().containsValue(null);
+    boolean unused = create().containsValue(null);
   }
 
   public void testGet() {
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 a29c00f..70ff774 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
@@ -161,8 +161,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    create().contains("foo");
-    create().containsAll(ImmutableList.of("foo"));
+    boolean unused = create().contains("foo");
+    boolean unused2 = 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/TreeRangeMapTest.java b/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
index 213b4fa..d82633a 100644
--- a/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
@@ -489,6 +489,20 @@
     assertEquals(ImmutableMap.of(Range.closedOpen(0, 2), 1), rangeMap.asMapOfRanges());
   }
 
+  public void testPutCoalescingSubmapEmpty() {
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(0, 1), 1);
+    rangeMap.put(Range.closedOpen(1, 2), 1);
+    assertEquals(
+        ImmutableMap.of(Range.closedOpen(0, 1), 1, Range.closedOpen(1, 2), 1),
+        rangeMap.asMapOfRanges());
+
+    RangeMap<Integer, Integer> subRangeMap = rangeMap.subRangeMap(Range.closedOpen(0, 2));
+    subRangeMap.putCoalescing(Range.closedOpen(1, 1), 1); // empty range coalesces connected ranges
+    assertEquals(ImmutableMap.of(Range.closedOpen(0, 2), 1), subRangeMap.asMapOfRanges());
+    assertEquals(ImmutableMap.of(Range.closedOpen(0, 2), 1), rangeMap.asMapOfRanges());
+  }
+
   public void testPutCoalescingComplex() {
     // {[0..1): 1, [1..3): 1, [3..5): 1, [7..10): 2, [12..15): 2, [18..19): 3}
     RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
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 d033e24..498a1a1 100644
--- a/android/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
@@ -285,6 +285,19 @@
     }
   }
 
+  public void testSubRangeSetAdd() {
+    TreeRangeSet<Integer> set = TreeRangeSet.create();
+    Range<Integer> range = Range.closedOpen(0, 5);
+    set.subRangeSet(range).add(range);
+  }
+
+  public void testSubRangeSetReplaceAdd() {
+    TreeRangeSet<Integer> set = TreeRangeSet.create();
+    Range<Integer> range = Range.closedOpen(0, 5);
+    set.add(range);
+    set.subRangeSet(range).add(range);
+  }
+
   public void testComplement() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
diff --git a/android/guava-tests/test/com/google/common/eventbus/EventBusTest.java b/android/guava-tests/test/com/google/common/eventbus/EventBusTest.java
index 647663c..249d3b0 100644
--- a/android/guava-tests/test/com/google/common/eventbus/EventBusTest.java
+++ b/android/guava-tests/test/com/google/common/eventbus/EventBusTest.java
@@ -289,6 +289,18 @@
     assertEquals(1, calls.get());
   }
 
+  public void testPrimitiveSubscribeFails() {
+    class SubscribesToPrimitive {
+      @Subscribe
+      public void toInt(int i) {}
+    }
+    try {
+      bus.register(new SubscribesToPrimitive());
+      fail("should have thrown");
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   /** Records thrown exception information. */
   private static final class RecordingSubscriberExceptionHandler
       implements SubscriberExceptionHandler {
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractDirectedGraphTest.java
deleted file mode 100644
index e8b8a43..0000000
--- a/android/guava-tests/test/com/google/common/graph/AbstractDirectedGraphTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * Abstract base class for testing implementations of {@link Graph} interface.
- *
- * <p>This class is responsible for testing that a directed implementation of {@link Graph} is
- * correctly handling directed edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be directed are found in superclasses.
- */
-public abstract class AbstractDirectedGraphTest extends AbstractGraphTest {
-  @Test
-  public void predecessors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.predecessors(N2)).containsExactly(N1);
-    // Edge direction handled correctly
-    assertThat(graph.predecessors(N1)).isEmpty();
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.successors(N1)).containsExactly(N2);
-    // Edge direction handled correctly
-    assertThat(graph.successors(N2)).isEmpty();
-  }
-
-  @Test
-  public void incidentEdges_oneEdge() {
-    putEdge(N1, N2);
-    EndpointPair<Integer> expectedEndpoints = EndpointPair.ordered(N1, N2);
-    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
-    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.inDegree(N2)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(graph.inDegree(N1)).isEqualTo(0);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.outDegree(N1)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(graph.outDegree(N2)).isEqualTo(0);
-  }
-
-  @Test
-  public void hasEdgeConnecting_correct() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
-  }
-
-  @Test
-  public void hasEdgeConnecting_backwards() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isFalse();
-  }
-
-  @Test
-  public void hasEdgeConnecting_mismatch() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isFalse();
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isFalse();
-  }
-
-  // Element Mutation
-
-  @Test
-  public void putEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(putEdge(N1, N2)).isTrue();
-  }
-
-  @Test
-  public void putEdge_existingEdgeBetweenSameNodes() {
-    assertThat(putEdge(N1, N2)).isTrue();
-    assertThat(putEdge(N1, N2)).isFalse();
-  }
-
-  @Test
-  public void putEdge_orderMismatch() {
-    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
-    try {
-      putEdge(endpoints);
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  public void removeEdge_antiparallelEdges() {
-    putEdge(N1, N2);
-    putEdge(N2, N1);
-
-    assertThat(graph.removeEdge(N1, N2)).isTrue();
-    assertThat(graph.successors(N1)).isEmpty();
-    assertThat(graph.predecessors(N1)).containsExactly(N2);
-    assertThat(graph.edges()).hasSize(1);
-
-    assertThat(graph.removeEdge(N2, N1)).isTrue();
-    assertThat(graph.successors(N1)).isEmpty();
-    assertThat(graph.predecessors(N1)).isEmpty();
-    assertThat(graph.edges()).isEmpty();
-  }
-
-  @Test
-  public void removeEdge_orderMismatch() {
-    putEdge(N1, N2);
-    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
-    try {
-      graph.removeEdge(endpoints);
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractDirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/AbstractDirectedNetworkTest.java
deleted file mode 100644
index 6111f82..0000000
--- a/android/guava-tests/test/com/google/common/graph/AbstractDirectedNetworkTest.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
-import static com.google.common.graph.TestUtil.assertEdgeNotInGraphErrorMessage;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.Collections;
-import java.util.Set;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Abstract base class for testing implementations of {@link Network} interface.
- *
- * <p>This class is responsible for testing that a directed implementation of {@link Network} is
- * correctly handling directed edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be directed are found in superclasses.
- */
-public abstract class AbstractDirectedNetworkTest extends AbstractNetworkTest {
-
-  @After
-  public void validateSourceAndTarget() {
-    for (Integer node : network.nodes()) {
-      for (String inEdge : network.inEdges(node)) {
-        EndpointPair<Integer> endpointPair = network.incidentNodes(inEdge);
-        assertThat(endpointPair.source()).isEqualTo(endpointPair.adjacentNode(node));
-        assertThat(endpointPair.target()).isEqualTo(node);
-      }
-
-      for (String outEdge : network.outEdges(node)) {
-        EndpointPair<Integer> endpointPair = network.incidentNodes(outEdge);
-        assertThat(endpointPair.source()).isEqualTo(node);
-        assertThat(endpointPair.target()).isEqualTo(endpointPair.adjacentNode(node));
-      }
-
-      for (Integer adjacentNode : network.adjacentNodes(node)) {
-        Set<String> edges = network.edgesConnecting(node, adjacentNode);
-        Set<String> antiParallelEdges = network.edgesConnecting(adjacentNode, node);
-        assertThat(node.equals(adjacentNode) || Collections.disjoint(edges, antiParallelEdges))
-            .isTrue();
-      }
-    }
-  }
-
-  @Test
-  public void edges_containsOrderMismatch() {
-    addEdge(N1, N2, E12);
-    EndpointPair<Integer> endpointsN1N2 = EndpointPair.unordered(N1, N2);
-    EndpointPair<Integer> endpointsN2N1 = EndpointPair.unordered(N2, N1);
-    assertThat(network.asGraph().edges()).doesNotContain(endpointsN1N2);
-    assertThat(network.asGraph().edges()).doesNotContain(endpointsN2N1);
-  }
-
-  @Test
-  public void edgesConnecting_orderMismatch() {
-    addEdge(N1, N2, E12);
-    try {
-      Set<String> unused = network.edgesConnecting(EndpointPair.unordered(N1, N2));
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  @Test
-  public void edgeConnectingOrNull_orderMismatch() {
-    addEdge(N1, N2, E12);
-    try {
-      String unused = network.edgeConnectingOrNull(EndpointPair.unordered(N1, N2));
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentNodes_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
-    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
-  }
-
-  @Test
-  public void edgesConnecting_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    // Passed nodes should be in the correct edge direction, first is the
-    // source node and the second is the target node
-    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
-  }
-
-  @Test
-  public void inEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inEdges(N2)).containsExactly(E12);
-    // Edge direction handled correctly
-    assertThat(network.inEdges(N1)).isEmpty();
-  }
-
-  @Test
-  public void outEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outEdges(N1)).containsExactly(E12);
-    // Edge direction handled correctly
-    assertThat(network.outEdges(N2)).isEmpty();
-  }
-
-  @Test
-  public void predecessors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.predecessors(N2)).containsExactly(N1);
-    // Edge direction handled correctly
-    assertThat(network.predecessors(N1)).isEmpty();
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.successors(N1)).containsExactly(N2);
-    // Edge direction handled correctly
-    assertThat(network.successors(N2)).isEmpty();
-  }
-
-  @Test
-  public void source_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
-  }
-
-  @Test
-  public void source_edgeNotInGraph() {
-    try {
-      network.incidentNodes(EDGE_NOT_IN_GRAPH).source();
-      fail(ERROR_EDGE_NOT_IN_GRAPH);
-    } catch (IllegalArgumentException e) {
-      assertEdgeNotInGraphErrorMessage(e);
-    }
-  }
-
-  @Test
-  public void target_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
-  }
-
-  @Test
-  public void target_edgeNotInGraph() {
-    try {
-      network.incidentNodes(EDGE_NOT_IN_GRAPH).target();
-      fail(ERROR_EDGE_NOT_IN_GRAPH);
-    } catch (IllegalArgumentException e) {
-      assertEdgeNotInGraphErrorMessage(e);
-    }
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inDegree(N2)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(network.inDegree(N1)).isEqualTo(0);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(network.outDegree(N2)).isEqualTo(0);
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(addEdge(N1, N2, E12)).isTrue();
-    assertThat(network.edges()).contains(E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    // Direction of the added edge is correctly handled
-    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenSameNodes() {
-    addEdge(N1, N2, E12);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N2, E12)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes() {
-    addEdge(N1, N2, E12);
-    try {
-      // Edge between totally different nodes
-      addEdge(N4, N5, E12);
-      fail(ERROR_ADDED_EXISTING_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
-    }
-    try {
-      // Edge between same nodes but in reverse direction
-      addEdge(N2, N1, E12);
-      fail(ERROR_ADDED_EXISTING_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
-      fail(ERROR_ADDED_PARALLEL_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_orderMismatch() {
-    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
-    try {
-      addEdge(endpoints, E12);
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java
index 2f81895..3a489a1 100644
--- a/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java
+++ b/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java
@@ -21,10 +21,10 @@
 import static com.google.common.graph.TestUtil.assertStronglyEquivalent;
 import static com.google.common.graph.TestUtil.sanityCheckSet;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashSet;
 import java.util.Set;
 import org.junit.After;
@@ -40,7 +40,7 @@
  * graph. The following test cases are left for the subclasses to handle:
  *
  * <ul>
- *   <li>Test cases related to whether the graph is directed, undirected, mutable, or immutable.
+ *   <li>Test cases related to whether the graph is directed or undirected.
  *   <li>Test cases related to the specific implementation of the {@link Graph} interface.
  * </ul>
  *
@@ -48,7 +48,15 @@
  * TODO(user): Differentiate between directed and undirected edge strings.
  */
 public abstract class AbstractGraphTest {
-  MutableGraph<Integer> graph;
+
+  Graph<Integer> graph;
+
+  /**
+   * The same reference as {@link #graph}, except as a mutable graph. This field is null in case
+   * {@link #createGraph()} didn't return a mutable graph.
+   */
+  MutableGraph<Integer> graphAsMutableGraph;
+
   static final Integer N1 = 1;
   static final Integer N2 = 2;
   static final Integer N3 = 3;
@@ -66,57 +74,36 @@
   static final String ERROR_ADDED_SELF_LOOP = "Should not be allowed to add a self-loop edge.";
 
   /** Creates and returns an instance of the graph to be tested. */
-  public abstract MutableGraph<Integer> createGraph();
+  abstract Graph<Integer> createGraph();
 
   /**
    * A proxy method that adds the node {@code n} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code n} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #graph} with a new graph that includes
+   * this node.
    */
-  @CanIgnoreReturnValue
-  protected boolean addNode(Integer n) {
-    return graph.addNode(n);
-  }
+  abstract void addNode(Integer n);
 
   /**
    * A proxy method that adds the edge {@code e} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code e} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * <p>This method should be used in tests of specific implementations if you want to ensure
-   * uniform behavior (including side effects) with how edges are added elsewhere in the tests. For
-   * example, the existing implementations of this method explicitly add the supplied nodes to the
-   * graph, and then call {@code graph.addEdge()} to connect the edge to the nodes; this is not part
-   * of the contract of {@code graph.addEdge()} and is done for convenience. In cases where you want
-   * to avoid such side effects (e.g., if you're testing what happens in your implementation if you
-   * add an edge whose end-points don't already exist in the graph), you should <b>not</b> use this
-   * method.
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #graph} with a new graph that includes
+   * this edge.
    */
-  @CanIgnoreReturnValue
-  protected boolean putEdge(Integer n1, Integer n2) {
-    graph.addNode(n1);
-    graph.addNode(n2);
-    return graph.putEdge(n1, n2);
-  }
+  abstract void putEdge(Integer n1, Integer n2);
 
-  @CanIgnoreReturnValue
-  protected boolean putEdge(EndpointPair<Integer> endpoints) {
-    graph.addNode(endpoints.nodeU());
-    graph.addNode(endpoints.nodeV());
-    return graph.putEdge(endpoints);
+  final boolean graphIsMutable() {
+    return graphAsMutableGraph != null;
   }
 
   @Before
-  public void init() {
+  public final void init() {
     graph = createGraph();
+    if (graph instanceof MutableGraph) {
+      graphAsMutableGraph = (MutableGraph<Integer>) graph;
+    }
   }
 
   @After
-  public void validateGraphState() {
+  public final void validateGraphState() {
     validateGraph(graph);
   }
 
@@ -361,24 +348,30 @@
 
   @Test
   public void addNode_newNode() {
-    assertThat(addNode(N1)).isTrue();
+    assume().that(graphIsMutable()).isTrue();
+
+    assertThat(graphAsMutableGraph.addNode(N1)).isTrue();
     assertThat(graph.nodes()).contains(N1);
   }
 
   @Test
   public void addNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     ImmutableSet<Integer> nodes = ImmutableSet.copyOf(graph.nodes());
-    assertThat(addNode(N1)).isFalse();
+    assertThat(graphAsMutableGraph.addNode(N1)).isFalse();
     assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     putEdge(N4, N1);
-    assertThat(graph.removeNode(N1)).isTrue();
-    assertThat(graph.removeNode(N1)).isFalse();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isFalse();
     assertThat(graph.nodes()).containsExactly(N2, N4);
     assertThat(graph.adjacentNodes(N2)).isEmpty();
     assertThat(graph.adjacentNodes(N4)).isEmpty();
@@ -386,32 +379,38 @@
 
   @Test
   public void removeNode_antiparallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     putEdge(N2, N1);
 
-    assertThat(graph.removeNode(N1)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
     assertThat(graph.nodes()).containsExactly(N2);
     assertThat(graph.edges()).isEmpty();
 
-    assertThat(graph.removeNode(N2)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N2)).isTrue();
     assertThat(graph.nodes()).isEmpty();
     assertThat(graph.edges()).isEmpty();
   }
 
   @Test
   public void removeNode_nodeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     ImmutableSet<Integer> nodes = ImmutableSet.copyOf(graph.nodes());
-    assertThat(graph.removeNode(NODE_NOT_IN_GRAPH)).isFalse();
+    assertThat(graphAsMutableGraph.removeNode(NODE_NOT_IN_GRAPH)).isFalse();
     assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_queryAfterRemoval() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     @SuppressWarnings("unused")
     Set<Integer> unused = graph.adjacentNodes(N1); // ensure cache (if any) is populated
-    assertThat(graph.removeNode(N1)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
     try {
       graph.adjacentNodes(N1);
       fail(ERROR_NODE_NOT_IN_GRAPH);
@@ -422,36 +421,45 @@
 
   @Test
   public void removeEdge_existingEdge() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     assertThat(graph.successors(N1)).containsExactly(N2);
     assertThat(graph.predecessors(N2)).containsExactly(N1);
-    assertThat(graph.removeEdge(N1, N2)).isTrue();
-    assertThat(graph.removeEdge(N1, N2)).isFalse();
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isTrue();
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isFalse();
     assertThat(graph.successors(N1)).isEmpty();
     assertThat(graph.predecessors(N2)).isEmpty();
   }
 
   @Test
   public void removeEdge_oneOfMany() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     putEdge(N1, N3);
     putEdge(N1, N4);
-    assertThat(graph.removeEdge(N1, N3)).isTrue();
+    assertThat(graphAsMutableGraph.removeEdge(N1, N3)).isTrue();
     assertThat(graph.adjacentNodes(N1)).containsExactly(N2, N4);
   }
 
   @Test
   public void removeEdge_nodeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
-    assertThat(graph.removeEdge(N1, NODE_NOT_IN_GRAPH)).isFalse();
+    assertThat(graphAsMutableGraph.removeEdge(N1, NODE_NOT_IN_GRAPH)).isFalse();
     assertThat(graph.successors(N1)).contains(N2);
   }
 
   @Test
   public void removeEdge_edgeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     addNode(N3);
-    assertThat(graph.removeEdge(N1, N3)).isFalse();
+
+    assertThat(graphAsMutableGraph.removeEdge(N1, N3)).isFalse();
     assertThat(graph.successors(N1)).contains(N2);
   }
 }
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 9154a73..e386252 100644
--- a/android/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
+++ b/android/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
@@ -22,14 +22,20 @@
 import static com.google.common.graph.TestUtil.assertStronglyEquivalent;
 import static com.google.common.graph.TestUtil.sanityCheckSet;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -51,7 +57,15 @@
  * TODO(user): Differentiate between directed and undirected edge strings.
  */
 public abstract class AbstractNetworkTest {
-  MutableNetwork<Integer, String> network;
+
+  Network<Integer, String> network;
+
+  /**
+   * The same reference as {@link #network}, except as a mutable network. This field is null in case
+   * {@link #createGraph()} didn't return a mutable network.
+   */
+  MutableNetwork<Integer, String> networkAsMutableNetwork;
+
   static final Integer N1 = 1;
   static final Integer N2 = 2;
   static final Integer N3 = 3;
@@ -92,54 +106,32 @@
       "Reusing an existing edge to connect different nodes succeeded";
 
   /** Creates and returns an instance of the graph to be tested. */
-  public abstract MutableNetwork<Integer, String> createGraph();
+  abstract Network<Integer, String> createGraph();
 
   /**
    * A proxy method that adds the node {@code n} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code n} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #network} with a new graph that
+   * includes this node.
    */
-  @CanIgnoreReturnValue
-  protected boolean addNode(Integer n) {
-    return network.addNode(n);
-  }
+  abstract void addNode(Integer n);
 
   /**
    * A proxy method that adds the edge {@code e} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code e} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * <p>This method should be used in tests of specific implementations if you want to ensure
-   * uniform behavior (including side effects) with how edges are added elsewhere in the tests. For
-   * example, the existing implementations of this method explicitly add the supplied nodes to the
-   * graph, and then call {@code graph.addEdge()} to connect the edge to the nodes; this is not part
-   * of the contract of {@code graph.addEdge()} and is done for convenience. In cases where you want
-   * to avoid such side effects (e.g., if you're testing what happens in your implementation if you
-   * add an edge whose end-points don't already exist in the graph), you should <b>not</b> use this
-   * method.
-   *
-   * <p>TODO(user): remove the addNode() calls, that's now contractually guaranteed
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #network} with a new graph that
+   * includes this edge.
    */
-  @CanIgnoreReturnValue
-  protected boolean addEdge(Integer n1, Integer n2, String e) {
-    network.addNode(n1);
-    network.addNode(n2);
-    return network.addEdge(n1, n2, e);
-  }
+  abstract void addEdge(Integer n1, Integer n2, String e);
 
-  protected boolean addEdge(EndpointPair<Integer> endpoints, String e) {
-    network.addNode(endpoints.nodeU());
-    network.addNode(endpoints.nodeV());
-    return network.addEdge(endpoints, e);
+  final boolean graphIsMutable() {
+    return networkAsMutableNetwork != null;
   }
 
   @Before
   public void init() {
     network = createGraph();
+    if (network instanceof MutableNetwork) {
+      networkAsMutableNetwork = (MutableNetwork<Integer, String>) network;
+    }
   }
 
   @After
@@ -497,6 +489,18 @@
   }
 
   @Test
+  public void adjacentEdges_parallelEdges() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+    addEdge(N1, N2, E12_B);
+    addEdge(N3, N4, E34);
+
+    assertThat(network.adjacentEdges(E12)).containsExactly(E12_A, E12_B);
+  }
+
+  @Test
   public void edgesConnecting_disconnectedNodes() {
     addNode(N1);
     addNode(N2);
@@ -528,6 +532,60 @@
   }
 
   @Test
+  public void edgesConnecting_parallelEdges_directed() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.isDirected()).isTrue();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
+    // Passed nodes should be in the correct edge direction, first is the
+    // source node and the second is the target node
+    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
+  }
+
+  @Test
+  public void edgesConnecting_parallelEdges_undirected() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.isDirected()).isFalse();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+    addEdge(N2, N1, E21);
+
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12, E12_A, E21);
+  }
+
+  @Test
+  public void edgesConnecting_parallelSelfLoopEdges() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N1, E11_A);
+
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
+  }
+
+  @Test
+  public void hasEdgeConnecting_disconnectedNodes() {
+    addNode(N1);
+    addNode(N2);
+    assertThat(network.hasEdgeConnecting(N1, N2)).isFalse();
+  }
+
+  @Test
+  public void hasEdgesConnecting_nodesNotInGraph() {
+    addNode(N1);
+    addNode(N2);
+    assertThat(network.hasEdgeConnecting(N1, NODE_NOT_IN_GRAPH)).isFalse();
+    assertThat(network.hasEdgeConnecting(NODE_NOT_IN_GRAPH, N2)).isFalse();
+    assertThat(network.hasEdgeConnecting(NODE_NOT_IN_GRAPH, NODE_NOT_IN_GRAPH)).isFalse();
+  }
+
+  @Test
   public void inEdges_noInEdges() {
     addNode(N1);
     assertThat(network.inEdges(N1)).isEmpty();
@@ -593,45 +651,56 @@
 
   @Test
   public void addNode_newNode() {
-    assertTrue(addNode(N1));
-    assertThat(network.nodes()).contains(N1);
+    assume().that(graphIsMutable()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addNode(N1));
+    assertThat(networkAsMutableNetwork.nodes()).contains(N1);
   }
 
   @Test
   public void addNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
-    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(network.nodes());
-    assertFalse(addNode(N1));
-    assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(networkAsMutableNetwork.nodes());
+    assertFalse(networkAsMutableNetwork.addNode(N1));
+    assertThat(networkAsMutableNetwork.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
     addEdge(N4, N1, E41);
-    assertTrue(network.removeNode(N1));
-    assertFalse(network.removeNode(N1));
-    assertThat(network.nodes()).containsExactly(N2, N4);
-    assertThat(network.edges()).doesNotContain(E12);
-    assertThat(network.edges()).doesNotContain(E41);
+    assertTrue(networkAsMutableNetwork.removeNode(N1));
+    assertFalse(networkAsMutableNetwork.removeNode(N1));
+    assertThat(networkAsMutableNetwork.nodes()).containsExactly(N2, N4);
+    assertThat(networkAsMutableNetwork.edges()).doesNotContain(E12);
+    assertThat(networkAsMutableNetwork.edges()).doesNotContain(E41);
   }
 
   @Test
   public void removeNode_nodeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
-    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(network.nodes());
-    assertFalse(network.removeNode(NODE_NOT_IN_GRAPH));
-    assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(networkAsMutableNetwork.nodes());
+    assertFalse(networkAsMutableNetwork.removeNode(NODE_NOT_IN_GRAPH));
+    assertThat(networkAsMutableNetwork.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_queryAfterRemoval() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     @SuppressWarnings("unused")
-    Set<Integer> unused = network.adjacentNodes(N1); // ensure cache (if any) is populated
-    assertTrue(network.removeNode(N1));
+    Set<Integer> unused =
+        networkAsMutableNetwork.adjacentNodes(N1); // ensure cache (if any) is populated
+    assertTrue(networkAsMutableNetwork.removeNode(N1));
     try {
-      network.adjacentNodes(N1);
+      networkAsMutableNetwork.adjacentNodes(N1);
       fail(ERROR_NODE_NOT_IN_GRAPH);
     } catch (IllegalArgumentException e) {
       assertNodeNotInGraphErrorMessage(e);
@@ -640,42 +709,139 @@
 
   @Test
   public void removeEdge_existingEdge() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
-    assertTrue(network.removeEdge(E12));
-    assertFalse(network.removeEdge(E12));
-    assertThat(network.edges()).doesNotContain(E12);
-    assertThat(network.edgesConnecting(N1, N2)).isEmpty();
+    assertTrue(networkAsMutableNetwork.removeEdge(E12));
+    assertFalse(networkAsMutableNetwork.removeEdge(E12));
+    assertThat(networkAsMutableNetwork.edges()).doesNotContain(E12);
+    assertThat(networkAsMutableNetwork.edgesConnecting(N1, N2)).isEmpty();
   }
 
   @Test
   public void removeEdge_oneOfMany() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
     addEdge(N1, N3, E13);
     addEdge(N1, N4, E14);
-    assertThat(network.edges()).containsExactly(E12, E13, E14);
-    assertTrue(network.removeEdge(E13));
-    assertThat(network.edges()).containsExactly(E12, E14);
+    assertThat(networkAsMutableNetwork.edges()).containsExactly(E12, E13, E14);
+    assertTrue(networkAsMutableNetwork.removeEdge(E13));
+    assertThat(networkAsMutableNetwork.edges()).containsExactly(E12, E14);
   }
 
   @Test
   public void removeEdge_edgeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertFalse(network.removeEdge(EDGE_NOT_IN_GRAPH));
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(networkAsMutableNetwork.edges());
+    assertFalse(networkAsMutableNetwork.removeEdge(EDGE_NOT_IN_GRAPH));
+    assertThat(networkAsMutableNetwork.edges()).containsExactlyElementsIn(edges);
   }
 
   @Test
   public void removeEdge_queryAfterRemoval() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
     @SuppressWarnings("unused")
-    EndpointPair<Integer> unused = network.incidentNodes(E12); // ensure cache (if any) is populated
-    assertTrue(network.removeEdge(E12));
+    EndpointPair<Integer> unused =
+        networkAsMutableNetwork.incidentNodes(E12); // ensure cache (if any) is populated
+    assertTrue(networkAsMutableNetwork.removeEdge(E12));
     try {
-      network.incidentNodes(E12);
+      networkAsMutableNetwork.incidentNodes(E12);
       fail(ERROR_EDGE_NOT_IN_GRAPH);
     } catch (IllegalArgumentException e) {
       assertEdgeNotInGraphErrorMessage(e);
     }
   }
+
+  @Test
+  public void removeEdge_parallelEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+    assertTrue(networkAsMutableNetwork.removeEdge(E12_A));
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+  }
+
+  @Test
+  public void removeEdge_parallelSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N1, E11_A);
+    addEdge(N1, N2, E12);
+    assertTrue(networkAsMutableNetwork.removeEdge(E11_A));
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertTrue(networkAsMutableNetwork.removeEdge(E11));
+    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+  }
+
+  @Test
+  public void concurrentIteration() throws Exception {
+    addEdge(1, 2, "foo");
+    addEdge(3, 4, "bar");
+    addEdge(5, 6, "baz");
+
+    int threadCount = 20;
+    ExecutorService executor = newFixedThreadPool(threadCount);
+    final CyclicBarrier barrier = new CyclicBarrier(threadCount);
+    ImmutableList.Builder<Future<?>> futures = ImmutableList.builder();
+    for (int i = 0; i < threadCount; i++) {
+      futures.add(
+          executor.submit(
+              new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                  barrier.await();
+                  Integer first = network.nodes().iterator().next();
+                  for (Integer node : network.nodes()) {
+                    Set<Integer> unused = network.successors(node);
+                  }
+                  /*
+                   * Also look up an earlier node so that, if the graph is using MapRetrievalCache,
+                   * we read one of the fields declared in that class.
+                   */
+                  Set<Integer> unused = network.successors(first);
+                  return null;
+                }
+              }));
+    }
+
+    /*
+     * It's unlikely that any operations would fail by throwing an exception, but let's check them
+     * just to be safe.
+     *
+     * The real purpose of this test is to produce a TSAN failure if MapIteratorCache is unsafe for
+     * reads from multiple threads -- unsafe, in fact, even in the absence of a concurrent write.
+     * The specific problem we had was unsafe reads of lastEntryReturnedBySomeIterator. (To fix the
+     * problem, we've since marked that field as volatile.)
+     *
+     * When MapIteratorCache is used from Immutable* classes, the TSAN failure doesn't indicate a
+     * real problem: The Entry objects are ImmutableMap entries, whose fields are all final and thus
+     * safe to read even when the Entry object is unsafely published. But with a mutable graph, the
+     * Entry object is likely to have a non-final value field, which is not safe to read when
+     * unsafely published. (The Entry object might even be newly created by each iterator.next()
+     * call, so we can't assume that writes to the Entry have been safely published by some other
+     * synchronization actions.)
+     *
+     * All that said: I haven't actually managed to make this particular test produce a TSAN error
+     * for the field accesses in MapIteratorCache. This teset *has* found other TSAN errors,
+     * including in MapRetrievalCache, so I'm not sure why this one is different. I did at least
+     * confirm that my change to MapIteratorCache fixes the TSAN error in the (larger) test it was
+     * originally reported in.
+     */
+    for (Future<?> future : futures.build()) {
+      future.get();
+    }
+    executor.shutdown();
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java
new file mode 100644
index 0000000..c50a7da
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java
@@ -0,0 +1,481 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Set;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing directed {@link Graph} implementations defined in this package.
+ */
+public abstract class AbstractStandardDirectedGraphTest extends AbstractGraphTest {
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<Integer> nodes = graph.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<Integer> predecessors = graph.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> successors = graph.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(successors).containsExactlyElementsIn(graph.successors(N1));
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
+    try {
+      incidentEdges.add(EndpointPair.ordered(N1, N2));
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
+    }
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.predecessors(N2)).containsExactly(N1);
+    // Edge direction handled correctly
+    assertThat(graph.predecessors(N1)).isEmpty();
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.successors(N1)).containsExactly(N2);
+    // Edge direction handled correctly
+    assertThat(graph.successors(N2)).isEmpty();
+  }
+
+  @Test
+  public void incidentEdges_oneEdge() {
+    putEdge(N1, N2);
+    EndpointPair<Integer> expectedEndpoints = EndpointPair.ordered(N1, N2);
+    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
+    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.inDegree(N2)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(graph.inDegree(N1)).isEqualTo(0);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.outDegree(N1)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(graph.outDegree(N2)).isEqualTo(0);
+  }
+
+  @Test
+  public void hasEdgeConnecting_correct() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
+  }
+
+  @Test
+  public void hasEdgeConnecting_backwards() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isFalse();
+  }
+
+  @Test
+  public void hasEdgeConnecting_mismatch() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isFalse();
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isFalse();
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    putEdge(N1, N2);
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1);
+    putEdge(N4, N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1, N4);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.successors(N1)).containsExactly(N1);
+    putEdge(N1, N2);
+    assertThat(graph.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.ordered(N1, N1));
+    putEdge(N1, N2);
+    assertThat(graph.incidentEdges(N1))
+        .containsExactly(EndpointPair.ordered(N1, N1), EndpointPair.ordered(N1, N2));
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.degree(N1)).isEqualTo(2);
+    putEdge(N1, N2);
+    assertThat(graph.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.inDegree(N1)).isEqualTo(1);
+    putEdge(N4, N1);
+    assertThat(graph.inDegree(N1)).isEqualTo(2);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.outDegree(N1)).isEqualTo(1);
+    putEdge(N1, N2);
+    assertThat(graph.outDegree(N1)).isEqualTo(2);
+  }
+
+  // Stable order tests
+
+  // Note: Stable order means that the ordering doesn't change between iterations and versions.
+  // Ideally, the ordering in test should never be updated.
+  @Test
+  public void stableIncidentEdgeOrder_edges_returnsInStableOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.edges())
+        .containsExactly(
+            EndpointPair.ordered(2, 1),
+            EndpointPair.ordered(1, 4),
+            EndpointPair.ordered(1, 3),
+            EndpointPair.ordered(1, 2),
+            EndpointPair.ordered(3, 1),
+            EndpointPair.ordered(5, 1))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_adjacentNodes_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3, 5).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_predecessors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.predecessors(1)).containsExactly(2, 5, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_successors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.successors(1)).containsExactly(4, 3, 2).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.ordered(2, 1),
+            EndpointPair.ordered(1, 4),
+            EndpointPair.ordered(1, 3),
+            EndpointPair.ordered(5, 1),
+            EndpointPair.ordered(1, 2),
+            EndpointPair.ordered(3, 1))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_withSelfLoop_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(2, 1);
+    putEdge(1, 1);
+    putEdge(1, 3);
+    putEdge(1, 2);
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.ordered(2, 1),
+            EndpointPair.ordered(1, 1),
+            EndpointPair.ordered(1, 3),
+            EndpointPair.ordered(1, 2))
+        .inOrder();
+  }
+
+  /**
+   * Populates the graph with nodes and edges in a star shape with node `1` in the middle.
+   *
+   * <p>Note that the edges are added in a shuffled order to properly test the effect of the
+   * insertion order.
+   */
+  private void populateStarShapedGraph() {
+    putEdge(2, 1);
+    putEdge(1, 4);
+    putEdge(1, 3);
+    putEdge(5, 1);
+    putEdge(1, 2);
+    putEdge(3, 1);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void putEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isTrue();
+  }
+
+  @Test
+  public void putEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isTrue();
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isFalse();
+  }
+
+  @Test
+  public void putEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
+    try {
+      graphAsMutableGraph.putEdge(endpoints);
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  /**
+   * Tests that the method {@code putEdge} will silently add the missing nodes to the graph, then
+   * add the edge connecting them. We are not using the proxy methods here as we want to test {@code
+   * putEdge} when the end-points are not elements of the graph.
+   */
+  @Test
+  public void putEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    graphAsMutableGraph.addNode(N1);
+    assertTrue(graphAsMutableGraph.putEdge(N1, N5));
+    assertTrue(graphAsMutableGraph.putEdge(N4, N1));
+    assertTrue(graphAsMutableGraph.putEdge(N2, N3));
+    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
+    assertThat(graph.successors(N1)).containsExactly(N5);
+    assertThat(graph.successors(N2)).containsExactly(N3);
+    assertThat(graph.successors(N3)).isEmpty();
+    assertThat(graph.successors(N4)).containsExactly(N1);
+    assertThat(graph.successors(N5)).isEmpty();
+  }
+
+  @Test
+  public void putEdge_doesntAllowSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isFalse();
+
+    try {
+      graphAsMutableGraph.putEdge(N1, N1);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  @Test
+  public void putEdge_allowsSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isTrue();
+    assertThat(graph.successors(N1)).containsExactly(N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1);
+  }
+
+  @Test
+  public void putEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    graphAsMutableGraph.putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isFalse();
+  }
+
+  @Test
+  public void removeEdge_antiparallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+    putEdge(N2, N1);
+
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isTrue();
+    assertThat(graph.successors(N1)).isEmpty();
+    assertThat(graph.predecessors(N1)).containsExactly(N2);
+    assertThat(graph.edges()).hasSize(1);
+
+    assertThat(graphAsMutableGraph.removeEdge(N2, N1)).isTrue();
+    assertThat(graph.successors(N1)).isEmpty();
+    assertThat(graph.predecessors(N1)).isEmpty();
+    assertThat(graph.edges()).isEmpty();
+  }
+
+  @Test
+  public void removeEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
+    try {
+      graphAsMutableGraph.removeEdge(endpoints);
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
+    assertThat(graph.nodes()).isEmpty();
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeEdge(N1, N1)).isTrue();
+    assertThat(graph.nodes()).containsExactly(N1);
+    assertThat(graph.successors(N1)).isEmpty();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedNetworkTest.java
new file mode 100644
index 0000000..98bc2fd
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedNetworkTest.java
@@ -0,0 +1,704 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
+import static com.google.common.graph.TestUtil.assertEdgeNotInGraphErrorMessage;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.ImmutableSet;
+import java.util.Collections;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing directed {@link Network} implementations defined in this package.
+ */
+public abstract class AbstractStandardDirectedNetworkTest extends AbstractNetworkTest {
+
+  @After
+  public void validateSourceAndTarget() {
+    for (Integer node : network.nodes()) {
+      for (String inEdge : network.inEdges(node)) {
+        EndpointPair<Integer> endpointPair = network.incidentNodes(inEdge);
+        assertThat(endpointPair.source()).isEqualTo(endpointPair.adjacentNode(node));
+        assertThat(endpointPair.target()).isEqualTo(node);
+      }
+
+      for (String outEdge : network.outEdges(node)) {
+        EndpointPair<Integer> endpointPair = network.incidentNodes(outEdge);
+        assertThat(endpointPair.source()).isEqualTo(node);
+        assertThat(endpointPair.target()).isEqualTo(endpointPair.adjacentNode(node));
+      }
+
+      for (Integer adjacentNode : network.adjacentNodes(node)) {
+        Set<String> edges = network.edgesConnecting(node, adjacentNode);
+        Set<String> antiParallelEdges = network.edgesConnecting(adjacentNode, node);
+        assertThat(node.equals(adjacentNode) || Collections.disjoint(edges, antiParallelEdges))
+            .isTrue();
+      }
+    }
+  }
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<Integer> nodes = network.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void edges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<String> edges = network.edges();
+    try {
+      edges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edges()).containsExactlyElementsIn(edges);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<String> incidentEdges = network.incidentEdges(N1);
+    try {
+      incidentEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  public void adjacentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    Set<String> adjacentEdges = network.adjacentEdges(E12);
+    try {
+      adjacentEdges.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N2, N3, E23);
+      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void edgesConnecting_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    addNode(N2);
+    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
+    try {
+      edgesConnecting.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
+    }
+  }
+
+  @Override
+  @Test
+  public void inEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<String> inEdges = network.inEdges(N2);
+    try {
+      inEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void outEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<String> outEdges = network.outEdges(N1);
+    try {
+      outEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<Integer> predecessors = network.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> successors = network.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(successors).containsExactlyElementsIn(network.successors(N1));
+    }
+  }
+
+  @Test
+  public void edges_containsOrderMismatch() {
+    addEdge(N1, N2, E12);
+    EndpointPair<Integer> endpointsN1N2 = EndpointPair.unordered(N1, N2);
+    EndpointPair<Integer> endpointsN2N1 = EndpointPair.unordered(N2, N1);
+    assertThat(network.asGraph().edges()).doesNotContain(endpointsN1N2);
+    assertThat(network.asGraph().edges()).doesNotContain(endpointsN2N1);
+  }
+
+  @Test
+  public void edgesConnecting_orderMismatch() {
+    addEdge(N1, N2, E12);
+    try {
+      Set<String> unused = network.edgesConnecting(EndpointPair.unordered(N1, N2));
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void edgeConnectingOrNull_orderMismatch() {
+    addEdge(N1, N2, E12);
+    try {
+      String unused = network.edgeConnectingOrNull(EndpointPair.unordered(N1, N2));
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentNodes_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
+    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
+  }
+
+  @Test
+  public void edgesConnecting_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    // Passed nodes should be in the correct edge direction, first is the
+    // source node and the second is the target node
+    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
+  }
+
+  @Test
+  public void inEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inEdges(N2)).containsExactly(E12);
+    // Edge direction handled correctly
+    assertThat(network.inEdges(N1)).isEmpty();
+  }
+
+  @Test
+  public void outEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outEdges(N1)).containsExactly(E12);
+    // Edge direction handled correctly
+    assertThat(network.outEdges(N2)).isEmpty();
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.predecessors(N2)).containsExactly(N1);
+    // Edge direction handled correctly
+    assertThat(network.predecessors(N1)).isEmpty();
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.successors(N1)).containsExactly(N2);
+    // Edge direction handled correctly
+    assertThat(network.successors(N2)).isEmpty();
+  }
+
+  @Test
+  public void source_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
+  }
+
+  @Test
+  public void source_edgeNotInGraph() {
+    try {
+      network.incidentNodes(EDGE_NOT_IN_GRAPH).source();
+      fail(ERROR_EDGE_NOT_IN_GRAPH);
+    } catch (IllegalArgumentException e) {
+      assertEdgeNotInGraphErrorMessage(e);
+    }
+  }
+
+  @Test
+  public void target_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
+  }
+
+  @Test
+  public void target_edgeNotInGraph() {
+    try {
+      network.incidentNodes(EDGE_NOT_IN_GRAPH).target();
+      fail(ERROR_EDGE_NOT_IN_GRAPH);
+    } catch (IllegalArgumentException e) {
+      assertEdgeNotInGraphErrorMessage(e);
+    }
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inDegree(N2)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(network.inDegree(N1)).isEqualTo(0);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(network.outDegree(N2)).isEqualTo(0);
+  }
+
+  @Test
+  public void edges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edges()).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentEdges(N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
+    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void adjacentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
+  }
+
+  @Test
+  public void edgesConnecting_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void inEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inEdges(N1)).containsExactly(E11);
+    addEdge(N4, N1, E41);
+    assertThat(network.inEdges(N1)).containsExactly(E11, E41);
+  }
+
+  @Test
+  public void outEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outEdges(N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.predecessors(N1)).containsExactly(N1);
+    addEdge(N4, N1, E41);
+    assertThat(network.predecessors(N1)).containsExactly(N1, N4);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.successors(N1)).containsExactly(N1);
+    addEdge(N1, N2, E12);
+    assertThat(network.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void source_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
+  }
+
+  @Test
+  public void target_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.degree(N1)).isEqualTo(2);
+    addEdge(N1, N2, E12);
+    assertThat(network.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inDegree(N1)).isEqualTo(1);
+    addEdge(N4, N1, E41);
+    assertThat(network.inDegree(N1)).isEqualTo(2);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outDegree(N1)).isEqualTo(1);
+    addEdge(N1, N2, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(2);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void addEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isTrue();
+    assertThat(network.edges()).contains(E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    // Direction of the added edge is correctly handled
+    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    try {
+      // Edge between totally different nodes
+      networkAsMutableNetwork.addEdge(N4, N5, E12);
+      fail(ERROR_ADDED_EXISTING_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
+    }
+    try {
+      // Edge between same nodes but in reverse direction
+      addEdge(N2, N1, E12);
+      fail(ERROR_ADDED_EXISTING_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
+      fail(ERROR_ADDED_PARALLEL_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12_A));
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
+  }
+
+  @Test
+  public void addEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
+    try {
+      networkAsMutableNetwork.addEdge(endpoints, E12);
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void addEdge_selfLoop_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isFalse();
+
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E11);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  /**
+   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
+   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
+   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
+   * elements of the graph.
+   */
+  @Test
+  public void addEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    networkAsMutableNetwork.addNode(N1);
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N5, E15));
+    assertTrue(networkAsMutableNetwork.addEdge(N4, N1, E41));
+    assertTrue(networkAsMutableNetwork.addEdge(N2, N3, E23));
+    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3);
+    assertThat(network.edges()).containsExactly(E15, E41, E23);
+    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
+    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
+    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
+    // Direction of the added edge is correctly handled
+    assertThat(network.edgesConnecting(N3, N2)).isEmpty();
+  }
+
+  @Test
+  public void addEdge_selfLoop_allowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isTrue();
+    assertThat(network.edges()).contains(E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, E11);
+      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    try {
+      networkAsMutableNetwork.addEdge(N2, N2, E11);
+      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E12);
+      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
+      fail("Adding a parallel self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11_A));
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeNode(N1)).isTrue();
+    assertThat(network.nodes()).isEmpty();
+    assertThat(network.edges()).doesNotContain(E11);
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeEdge(E11)).isTrue();
+    assertThat(network.edges()).doesNotContain(E11);
+    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java
new file mode 100644
index 0000000..a483f42
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java
@@ -0,0 +1,443 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.common.testing.EqualsTester;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing undirected {@link Graph} implementations defined in this package.
+ */
+public abstract class AbstractStandardUndirectedGraphTest extends AbstractGraphTest {
+
+  @After
+  public void validateUndirectedEdges() {
+    for (Integer node : graph.nodes()) {
+      new EqualsTester()
+          .addEqualityGroup(
+              graph.predecessors(node), graph.successors(node), graph.adjacentNodes(node))
+          .testEquals();
+    }
+  }
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<Integer> nodes = graph.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<Integer> predecessors = graph.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> successors = graph.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.successors(N1)).containsExactlyElementsIn(successors);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
+    try {
+      incidentEdges.add(EndpointPair.unordered(N1, N2));
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
+    }
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.predecessors(N2)).containsExactly(N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N2);
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.successors(N1)).containsExactly(N2);
+    assertThat(graph.successors(N2)).containsExactly(N1);
+  }
+
+  @Test
+  public void incidentEdges_oneEdge() {
+    putEdge(N1, N2);
+    EndpointPair<Integer> expectedEndpoints = EndpointPair.unordered(N1, N2);
+    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
+    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.inDegree(N2)).isEqualTo(1);
+    assertThat(graph.inDegree(N1)).isEqualTo(1);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.outDegree(N1)).isEqualTo(1);
+    assertThat(graph.outDegree(N2)).isEqualTo(1);
+  }
+
+  @Test
+  public void hasEdgeConnecting_correct() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isTrue();
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isTrue();
+  }
+
+  @Test
+  public void hasEdgeConnecting_mismatch() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isTrue();
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    putEdge(N1, N2);
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1);
+    putEdge(N1, N2);
+    assertThat(graph.predecessors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.successors(N1)).containsExactly(N1);
+    putEdge(N2, N1);
+    assertThat(graph.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.unordered(N1, N1));
+    putEdge(N1, N2);
+    assertThat(graph.incidentEdges(N1))
+        .containsExactly(EndpointPair.unordered(N1, N1), EndpointPair.unordered(N1, N2));
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.degree(N1)).isEqualTo(2);
+    putEdge(N1, N2);
+    assertThat(graph.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.inDegree(N1)).isEqualTo(2);
+    putEdge(N1, N2);
+    assertThat(graph.inDegree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.outDegree(N1)).isEqualTo(2);
+    putEdge(N2, N1);
+    assertThat(graph.outDegree(N1)).isEqualTo(3);
+  }
+
+  // Stable order tests
+
+  // Note: Stable order means that the ordering doesn't change between iterations and versions.
+  // Ideally, the ordering in test should never be updated.
+  @Test
+  public void stableIncidentEdgeOrder_edges_returnsInStableOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.edges())
+        .containsExactly(
+            EndpointPair.unordered(1, 2),
+            EndpointPair.unordered(1, 4),
+            EndpointPair.unordered(1, 3),
+            EndpointPair.unordered(4, 5))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_adjacentNodes_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_predecessors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_successors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.unordered(1, 2),
+            EndpointPair.unordered(1, 4),
+            EndpointPair.unordered(1, 3))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_withSelfLoop_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(2, 1);
+    putEdge(1, 1);
+    putEdge(1, 3);
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.unordered(2, 1),
+            EndpointPair.unordered(1, 1),
+            EndpointPair.unordered(1, 3))
+        .inOrder();
+  }
+
+  /**
+   * Populates the graph with nodes and edges in a star shape with node `1` in the middle.
+   *
+   * <p>Note that the edges are added in a shuffled order to properly test the effect of the
+   * insertion order.
+   */
+  private void populateTShapedGraph() {
+    putEdge(2, 1);
+    putEdge(1, 4);
+    putEdge(1, 3);
+    putEdge(1, 2); // Duplicate
+    putEdge(4, 5);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void putEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isTrue();
+  }
+
+  @Test
+  public void putEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+
+    assertThat(graphAsMutableGraph.putEdge(N2, N1)).isFalse();
+  }
+
+  /**
+   * Tests that the method {@code putEdge} will silently add the missing nodes to the graph, then
+   * add the edge connecting them. We are not using the proxy methods here as we want to test {@code
+   * putEdge} when the end-points are not elements of the graph.
+   */
+  @Test
+  public void putEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    graphAsMutableGraph.addNode(N1);
+    assertTrue(graphAsMutableGraph.putEdge(N1, N5));
+    assertTrue(graphAsMutableGraph.putEdge(N4, N1));
+    assertTrue(graphAsMutableGraph.putEdge(N2, N3));
+    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N4, N5);
+    assertThat(graph.adjacentNodes(N2)).containsExactly(N3);
+    assertThat(graph.adjacentNodes(N3)).containsExactly(N2);
+    assertThat(graph.adjacentNodes(N4)).containsExactly(N1);
+    assertThat(graph.adjacentNodes(N5)).containsExactly(N1);
+  }
+
+  @Test
+  public void putEdge_doesntAllowSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isFalse();
+
+    try {
+      putEdge(N1, N1);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  @Test
+  public void putEdge_allowsSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isTrue();
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N1);
+  }
+
+  @Test
+  public void putEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isFalse();
+  }
+
+  @Test
+  public void removeEdge_antiparallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+    putEdge(N2, N1); // no-op
+
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isTrue();
+    assertThat(graph.adjacentNodes(N1)).isEmpty();
+    assertThat(graph.edges()).isEmpty();
+    assertThat(graphAsMutableGraph.removeEdge(N2, N1)).isFalse();
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
+    assertThat(graph.nodes()).isEmpty();
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeEdge(N1, N1)).isTrue();
+    assertThat(graph.nodes()).containsExactly(N1);
+    assertThat(graph.adjacentNodes(N1)).isEmpty();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedNetworkTest.java
new file mode 100644
index 0000000..5cda1c1
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedNetworkTest.java
@@ -0,0 +1,595 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.testing.EqualsTester;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing undirected {@link Network} implementations defined in this
+ * package.
+ */
+public abstract class AbstractStandardUndirectedNetworkTest extends AbstractNetworkTest {
+  private static final EndpointPair<Integer> ENDPOINTS_N1N2 = EndpointPair.ordered(N1, N2);
+  private static final EndpointPair<Integer> ENDPOINTS_N2N1 = EndpointPair.ordered(N2, N1);
+
+  @After
+  public void validateUndirectedEdges() {
+    for (Integer node : network.nodes()) {
+      new EqualsTester()
+          .addEqualityGroup(
+              network.inEdges(node), network.outEdges(node), network.incidentEdges(node))
+          .testEquals();
+      new EqualsTester()
+          .addEqualityGroup(
+              network.predecessors(node), network.successors(node), network.adjacentNodes(node))
+          .testEquals();
+
+      for (Integer adjacentNode : network.adjacentNodes(node)) {
+        assertThat(network.edgesConnecting(node, adjacentNode))
+            .containsExactlyElementsIn(network.edgesConnecting(adjacentNode, node));
+      }
+    }
+  }
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    Set<Integer> nodes = network.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void edges_checkReturnedSetMutability() {
+    Set<String> edges = network.edges();
+    try {
+      edges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edges()).containsExactlyElementsIn(edges);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<String> incidentEdges = network.incidentEdges(N1);
+    try {
+      incidentEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  public void adjacentEdges_checkReturnedSetMutability() {
+    addEdge(N1, N2, E12);
+    Set<String> adjacentEdges = network.adjacentEdges(E12);
+    try {
+      adjacentEdges.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N2, N3, E23);
+      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void edgesConnecting_checkReturnedSetMutability() {
+    addNode(N1);
+    addNode(N2);
+    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
+    try {
+      edgesConnecting.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
+    }
+  }
+
+  @Override
+  @Test
+  public void inEdges_checkReturnedSetMutability() {
+    addNode(N2);
+    Set<String> inEdges = network.inEdges(N2);
+    try {
+      inEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void outEdges_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<String> outEdges = network.outEdges(N1);
+    try {
+      outEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    addNode(N2);
+    Set<Integer> predecessors = network.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<Integer> successors = network.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.successors(N1)).containsExactlyElementsIn(successors);
+    }
+  }
+
+  @Test
+  public void edges_containsOrderMismatch() {
+    addEdge(N1, N2, E12);
+    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N2N1);
+    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N1N2);
+  }
+
+  @Test
+  public void edgeConnectingOrNull_orderMismatch() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N2N1)).isEqualTo(E12);
+    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N1N2)).isEqualTo(E12);
+  }
+
+  @Test
+  public void edgesConnecting_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void inEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inEdges(N2)).containsExactly(E12);
+    assertThat(network.inEdges(N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void outEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outEdges(N2)).containsExactly(E12);
+    assertThat(network.outEdges(N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.predecessors(N2)).containsExactly(N1);
+    assertThat(network.predecessors(N1)).containsExactly(N2);
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.successors(N1)).containsExactly(N2);
+    assertThat(network.successors(N2)).containsExactly(N1);
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inDegree(N2)).isEqualTo(1);
+    assertThat(network.inDegree(N1)).isEqualTo(1);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(1);
+    assertThat(network.outDegree(N2)).isEqualTo(1);
+  }
+
+  @Test
+  public void edges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edges()).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentEdges(N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).nodeU()).isEqualTo(N1);
+    assertThat(network.incidentNodes(E11).nodeV()).isEqualTo(N1);
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void adjacentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
+  }
+
+  @Test
+  public void edgesConnecting_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void inEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inEdges(N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.inEdges(N1)).containsExactly(E11, E12);
+  }
+
+  @Test
+  public void outEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outEdges(N1)).containsExactly(E11);
+    addEdge(N2, N1, E12);
+    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.predecessors(N1)).containsExactly(N1);
+    addEdge(N1, N2, E12);
+    assertThat(network.predecessors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.successors(N1)).containsExactly(N1);
+    addEdge(N2, N1, E12);
+    assertThat(network.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.degree(N1)).isEqualTo(2);
+    addEdge(N1, N2, E12);
+    assertThat(network.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inDegree(N1)).isEqualTo(2);
+    addEdge(N1, N2, E12);
+    assertThat(network.inDegree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outDegree(N1)).isEqualTo(2);
+    addEdge(N2, N1, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(3);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void addEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isTrue();
+    assertThat(network.edges()).contains(E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isTrue();
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+    assertThat(networkAsMutableNetwork.addEdge(N2, N1, E12)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    try {
+      // Edge between totally different nodes
+      networkAsMutableNetwork.addEdge(N4, N5, E12);
+      fail(ERROR_ADDED_EXISTING_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
+      fail(ERROR_ADDED_PARALLEL_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+    try {
+      networkAsMutableNetwork.addEdge(N2, N1, EDGE_NOT_IN_GRAPH);
+      fail(ERROR_ADDED_PARALLEL_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12));
+    assertTrue(networkAsMutableNetwork.addEdge(N2, N1, E21));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12_A));
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
+  }
+
+  @Test
+  public void addEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    EndpointPair<Integer> endpoints = EndpointPair.ordered(N1, N2);
+    assertThat(networkAsMutableNetwork.addEdge(endpoints, E12)).isTrue();
+  }
+
+  @Test
+  public void addEdge_selfLoop_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isFalse();
+
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E11);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  /**
+   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
+   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
+   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
+   * elements of the graph.
+   */
+  @Test
+  public void addEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    networkAsMutableNetwork.addNode(N1);
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N5, E15));
+    assertTrue(networkAsMutableNetwork.addEdge(N4, N1, E41));
+    assertTrue(networkAsMutableNetwork.addEdge(N2, N3, E23));
+    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3);
+    assertThat(network.edges()).containsExactly(E15, E41, E23);
+    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
+    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
+    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
+    assertThat(network.edgesConnecting(N3, N2)).containsExactly(E23);
+  }
+
+  @Test
+  public void addEdge_selfLoop() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isTrue();
+    assertThat(network.edges()).contains(E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, E11);
+      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    try {
+      networkAsMutableNetwork.addEdge(N2, N2, E11);
+      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E12);
+      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
+      fail("Adding a parallel self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11_A));
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeNode(N1)).isTrue();
+    assertThat(network.nodes()).isEmpty();
+    assertThat(network.edges()).doesNotContain(E11);
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeEdge(E11)).isTrue();
+    assertThat(network.edges()).doesNotContain(E11);
+    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractUndirectedGraphTest.java
deleted file mode 100644
index 4996a6a..0000000
--- a/android/guava-tests/test/com/google/common/graph/AbstractUndirectedGraphTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Abstract base class for testing undirected implementations of the {@link Graph} interface.
- *
- * <p>This class is responsible for testing that an undirected implementation of {@link Graph} is
- * correctly handling undirected edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be undirected are found in superclasses.
- */
-public abstract class AbstractUndirectedGraphTest extends AbstractGraphTest {
-
-  @After
-  public void validateUndirectedEdges() {
-    for (Integer node : graph.nodes()) {
-      new EqualsTester()
-          .addEqualityGroup(
-              graph.predecessors(node), graph.successors(node), graph.adjacentNodes(node))
-          .testEquals();
-    }
-  }
-
-  @Test
-  public void predecessors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.predecessors(N2)).containsExactly(N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N2);
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.successors(N1)).containsExactly(N2);
-    assertThat(graph.successors(N2)).containsExactly(N1);
-  }
-
-  @Test
-  public void incidentEdges_oneEdge() {
-    putEdge(N1, N2);
-    EndpointPair<Integer> expectedEndpoints = EndpointPair.unordered(N1, N2);
-    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
-    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.inDegree(N2)).isEqualTo(1);
-    assertThat(graph.inDegree(N1)).isEqualTo(1);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.outDegree(N1)).isEqualTo(1);
-    assertThat(graph.outDegree(N2)).isEqualTo(1);
-  }
-
-  @Test
-  public void hasEdgeConnecting_correct() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isTrue();
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isTrue();
-  }
-
-  @Test
-  public void hasEdgeConnecting_mismatch() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isTrue();
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(putEdge(N1, N2)).isTrue();
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenSameNodes() {
-    putEdge(N1, N2);
-    assertThat(putEdge(N2, N1)).isFalse();
-  }
-
-  @Test
-  public void removeEdge_antiparallelEdges() {
-    putEdge(N1, N2);
-    putEdge(N2, N1); // no-op
-
-    assertThat(graph.removeEdge(N1, N2)).isTrue();
-    assertThat(graph.adjacentNodes(N1)).isEmpty();
-    assertThat(graph.edges()).isEmpty();
-    assertThat(graph.removeEdge(N2, N1)).isFalse();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractUndirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/AbstractUndirectedNetworkTest.java
deleted file mode 100644
index 630ec02..0000000
--- a/android/guava-tests/test/com/google/common/graph/AbstractUndirectedNetworkTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.testing.EqualsTester;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Abstract base class for testing undirected implementations of the {@link Network} interface.
- *
- * <p>This class is responsible for testing that an undirected implementation of {@link Network} is
- * correctly handling undirected edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be undirected are found in superclasses.
- */
-public abstract class AbstractUndirectedNetworkTest extends AbstractNetworkTest {
-  private static final EndpointPair<Integer> ENDPOINTS_N1N2 = EndpointPair.ordered(N1, N2);
-  private static final EndpointPair<Integer> ENDPOINTS_N2N1 = EndpointPair.ordered(N2, N1);
-
-  @After
-  public void validateUndirectedEdges() {
-    for (Integer node : network.nodes()) {
-      new EqualsTester()
-          .addEqualityGroup(
-              network.inEdges(node), network.outEdges(node), network.incidentEdges(node))
-          .testEquals();
-      new EqualsTester()
-          .addEqualityGroup(
-              network.predecessors(node), network.successors(node), network.adjacentNodes(node))
-          .testEquals();
-
-      for (Integer adjacentNode : network.adjacentNodes(node)) {
-        assertThat(network.edgesConnecting(node, adjacentNode))
-            .containsExactlyElementsIn(network.edgesConnecting(adjacentNode, node));
-      }
-    }
-  }
-
-  @Test
-  public void edges_containsOrderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N2N1);
-    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N1N2);
-  }
-
-  @Test
-  public void edgesConnecting_orderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(ENDPOINTS_N2N1)).containsExactly(E12);
-    assertThat(network.edgesConnecting(ENDPOINTS_N1N2)).containsExactly(E12);
-  }
-
-  @Test
-  public void edgeConnectingOrNull_orderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N2N1)).isEqualTo(E12);
-    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N1N2)).isEqualTo(E12);
-  }
-
-  @Test
-  public void edgesConnecting_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void inEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inEdges(N2)).containsExactly(E12);
-    assertThat(network.inEdges(N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void outEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outEdges(N2)).containsExactly(E12);
-    assertThat(network.outEdges(N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void predecessors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.predecessors(N2)).containsExactly(N1);
-    assertThat(network.predecessors(N1)).containsExactly(N2);
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.successors(N1)).containsExactly(N2);
-    assertThat(network.successors(N2)).containsExactly(N1);
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inDegree(N2)).isEqualTo(1);
-    assertThat(network.inDegree(N1)).isEqualTo(1);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(1);
-    assertThat(network.outDegree(N2)).isEqualTo(1);
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(addEdge(N1, N2, E12)).isTrue();
-    assertThat(network.edges()).contains(E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenSameNodes() {
-    assertThat(addEdge(N1, N2, E12)).isTrue();
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N2, E12)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-    assertThat(addEdge(N2, N1, E12)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes() {
-    addEdge(N1, N2, E12);
-    try {
-      // Edge between totally different nodes
-      addEdge(N4, N5, E12);
-      fail(ERROR_ADDED_EXISTING_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
-      fail(ERROR_ADDED_PARALLEL_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-    try {
-      addEdge(N2, N1, EDGE_NOT_IN_GRAPH);
-      fail(ERROR_ADDED_PARALLEL_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_orderMismatch() {
-    EndpointPair<Integer> endpoints = EndpointPair.ordered(N1, N2);
-    assertThat(addEdge(endpoints, E12)).isTrue();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedGraphTest.java
deleted file mode 100644
index ed998eb..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedGraphTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for a directed {@link ConfigurableMutableGraph} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableDirectedGraphTest extends ConfigurableSimpleDirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.directed().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    putEdge(N1, N1);
-    putEdge(N1, N2);
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1);
-    putEdge(N4, N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1, N4);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.successors(N1)).containsExactly(N1);
-    putEdge(N1, N2);
-    assertThat(graph.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.ordered(N1, N1));
-    putEdge(N1, N2);
-    assertThat(graph.incidentEdges(N1))
-        .containsExactly(EndpointPair.ordered(N1, N1), EndpointPair.ordered(N1, N2));
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.degree(N1)).isEqualTo(2);
-    putEdge(N1, N2);
-    assertThat(graph.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.inDegree(N1)).isEqualTo(1);
-    putEdge(N4, N1);
-    assertThat(graph.inDegree(N1)).isEqualTo(2);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.outDegree(N1)).isEqualTo(1);
-    putEdge(N1, N2);
-    assertThat(graph.outDegree(N1)).isEqualTo(2);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(putEdge(N1, N1)).isTrue();
-    assertThat(graph.successors(N1)).containsExactly(N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    putEdge(N1, N1);
-    assertThat(putEdge(N1, N1)).isFalse();
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    putEdge(N1, N1);
-    assertThat(graph.removeNode(N1)).isTrue();
-    assertThat(graph.nodes()).isEmpty();
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    putEdge(N1, N1);
-    assertThat(graph.removeEdge(N1, N1)).isTrue();
-    assertThat(graph.nodes()).containsExactly(N1);
-    assertThat(graph.successors(N1)).isEmpty();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedMultiNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedMultiNetworkTest.java
deleted file mode 100644
index 3a49e2d..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedMultiNetworkTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for a directed {@link ConfigurableMutableNetwork} allowing parallel edges and self-loops.
- */
-@RunWith(JUnit4.class)
-public class ConfigurableDirectedMultiNetworkTest extends ConfigurableDirectedNetworkTest {
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.directed().allowsParallelEdges(true).allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentEdges_parallelEdges() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    addEdge(N1, N2, E12_B);
-    addEdge(N3, N4, E34);
-    assertThat(network.adjacentEdges(E12)).containsExactly(E12_A, E12_B);
-  }
-
-  @Test
-  public void edgesConnecting_parallelEdges() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
-    // Passed nodes should be in the correct edge direction, first is the
-    // source node and the second is the target node
-    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
-  }
-
-  @Test
-  public void edgesConnecting_parallelSelfLoopEdges() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelEdge() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Test
-  public void removeEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    assertTrue(network.removeEdge(E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-  }
-
-  @Test
-  public void removeEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N1, E11_A);
-    addEdge(N1, N2, E12);
-    assertTrue(network.removeEdge(E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertTrue(network.removeEdge(E11));
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedNetworkTest.java
deleted file mode 100644
index 671b1e8..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableDirectedNetworkTest.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for a directed {@link ConfigurableMutableNetwork} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableDirectedNetworkTest extends ConfigurableSimpleDirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.directed().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void edges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edges()).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentEdges(N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
-    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void adjacentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
-  }
-
-  @Test
-  public void edgesConnecting_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void inEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inEdges(N1)).containsExactly(E11);
-    addEdge(N4, N1, E41);
-    assertThat(network.inEdges(N1)).containsExactly(E11, E41);
-  }
-
-  @Test
-  public void outEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outEdges(N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.predecessors(N1)).containsExactly(N1);
-    addEdge(N4, N1, E41);
-    assertThat(network.predecessors(N1)).containsExactly(N1, N4);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.successors(N1)).containsExactly(N1);
-    addEdge(N1, N2, E12);
-    assertThat(network.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void source_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
-  }
-
-  @Test
-  public void target_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.degree(N1)).isEqualTo(2);
-    addEdge(N1, N2, E12);
-    assertThat(network.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inDegree(N1)).isEqualTo(1);
-    addEdge(N4, N1, E41);
-    assertThat(network.inDegree(N1)).isEqualTo(2);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outDegree(N1)).isEqualTo(1);
-    addEdge(N1, N2, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(2);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(addEdge(N1, N1, E11)).isTrue();
-    assertThat(network.edges()).contains(E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    addEdge(N1, N1, E11);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N1, E11)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N2, E11);
-      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    try {
-      addEdge(N2, N2, E11);
-      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N1, E12);
-      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
-      fail("Adding a parallel self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    addEdge(N1, N1, E11);
-    assertThat(network.removeNode(N1)).isTrue();
-    assertThat(network.nodes()).isEmpty();
-    assertThat(network.edges()).doesNotContain(E11);
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    assertThat(network.removeEdge(E11)).isTrue();
-    assertThat(network.edges()).doesNotContain(E11);
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedGraphTest.java
deleted file mode 100644
index 888cf9a..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedGraphTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for a directed {@link ConfigurableMutableGraph}, creating a simple directed graph
- * (self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleDirectedGraphTest extends AbstractDirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.directed().allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = graph.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = graph.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = graph.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(successors).containsExactlyElementsIn(graph.successors(N1));
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
-    try {
-      incidentEdges.add(EndpointPair.ordered(N1, N2));
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      putEdge(N1, N1);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    graph.addNode(N1);
-    assertTrue(graph.putEdge(N1, N5));
-    assertTrue(graph.putEdge(N4, N1));
-    assertTrue(graph.putEdge(N2, N3));
-    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(graph.successors(N1)).containsExactly(N5);
-    assertThat(graph.successors(N2)).containsExactly(N3);
-    assertThat(graph.successors(N3)).isEmpty();
-    assertThat(graph.successors(N4)).containsExactly(N1);
-    assertThat(graph.successors(N5)).isEmpty();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedNetworkTest.java
deleted file mode 100644
index a8645b4..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedNetworkTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for a directed {@link ConfigurableMutableNetwork}, creating a simple directed graph
- * (parallel and self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleDirectedNetworkTest extends AbstractDirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.directed().allowsParallelEdges(false).allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = network.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void edges_checkReturnedSetMutability() {
-    Set<String> edges = network.edges();
-    try {
-      edges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edges()).containsExactlyElementsIn(edges);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> incidentEdges = network.incidentEdges(N1);
-    try {
-      incidentEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  public void adjacentEdges_checkReturnedSetMutability() {
-    addEdge(N1, N2, E12);
-    Set<String> adjacentEdges = network.adjacentEdges(E12);
-    try {
-      adjacentEdges.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N2, N3, E23);
-      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void edgesConnecting_checkReturnedSetMutability() {
-    addNode(N1);
-    addNode(N2);
-    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
-    try {
-      edgesConnecting.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
-    }
-  }
-
-  @Override
-  @Test
-  public void inEdges_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<String> inEdges = network.inEdges(N2);
-    try {
-      inEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void outEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> outEdges = network.outEdges(N1);
-    try {
-      outEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = network.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = network.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(successors).containsExactlyElementsIn(network.successors(N1));
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      addEdge(N1, N1, E11);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    network.addNode(N1);
-    assertTrue(network.addEdge(N1, N5, E15));
-    assertTrue(network.addEdge(N4, N1, E41));
-    assertTrue(network.addEdge(N2, N3, E23));
-    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(network.edges()).containsExactly(E15, E41, E23).inOrder();
-    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
-    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
-    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
-    // Direction of the added edge is correctly handled
-    assertThat(network.edgesConnecting(N3, N2)).isEmpty();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedGraphTest.java
deleted file mode 100644
index 97693d1..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedGraphTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for an undirected {@link ConfigurableMutableGraph}, creating a simple undirected graph
- * (self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleUndirectedGraphTest extends AbstractUndirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.undirected().allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = graph.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = graph.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = graph.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.successors(N1)).containsExactlyElementsIn(successors);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
-    try {
-      incidentEdges.add(EndpointPair.unordered(N1, N2));
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      putEdge(N1, N1);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    graph.addNode(N1);
-    assertTrue(graph.putEdge(N1, N5));
-    assertTrue(graph.putEdge(N4, N1));
-    assertTrue(graph.putEdge(N2, N3));
-    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N4, N5);
-    assertThat(graph.adjacentNodes(N2)).containsExactly(N3);
-    assertThat(graph.adjacentNodes(N3)).containsExactly(N2);
-    assertThat(graph.adjacentNodes(N4)).containsExactly(N1);
-    assertThat(graph.adjacentNodes(N5)).containsExactly(N1);
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedNetworkTest.java
deleted file mode 100644
index d1c4411..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedNetworkTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for an undirected {@link ConfigurableMutableNetwork}, creating a simple undirected graph
- * (parallel and self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleUndirectedNetworkTest extends AbstractUndirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.undirected().allowsParallelEdges(false).allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = network.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void edges_checkReturnedSetMutability() {
-    Set<String> edges = network.edges();
-    try {
-      edges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edges()).containsExactlyElementsIn(edges);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> incidentEdges = network.incidentEdges(N1);
-    try {
-      incidentEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  public void adjacentEdges_checkReturnedSetMutability() {
-    addEdge(N1, N2, E12);
-    Set<String> adjacentEdges = network.adjacentEdges(E12);
-    try {
-      adjacentEdges.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N2, N3, E23);
-      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void edgesConnecting_checkReturnedSetMutability() {
-    addNode(N1);
-    addNode(N2);
-    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
-    try {
-      edgesConnecting.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
-    }
-  }
-
-  @Override
-  @Test
-  public void inEdges_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<String> inEdges = network.inEdges(N2);
-    try {
-      inEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void outEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> outEdges = network.outEdges(N1);
-    try {
-      outEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = network.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = network.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.successors(N1)).containsExactlyElementsIn(successors);
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      addEdge(N1, N1, E11);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    network.addNode(N1);
-    assertTrue(network.addEdge(N1, N5, E15));
-    assertTrue(network.addEdge(N4, N1, E41));
-    assertTrue(network.addEdge(N2, N3, E23));
-    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(network.edges()).containsExactly(E15, E41, E23).inOrder();
-    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
-    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
-    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
-    assertThat(network.edgesConnecting(N3, N2)).containsExactly(E23);
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedGraphTest.java
deleted file mode 100644
index 3bdfd74..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedGraphTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for an undirected {@link ConfigurableMutableGraph} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableUndirectedGraphTest extends ConfigurableSimpleUndirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.undirected().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    putEdge(N1, N1);
-    putEdge(N1, N2);
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1);
-    putEdge(N1, N2);
-    assertThat(graph.predecessors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.successors(N1)).containsExactly(N1);
-    putEdge(N2, N1);
-    assertThat(graph.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.unordered(N1, N1));
-    putEdge(N1, N2);
-    assertThat(graph.incidentEdges(N1))
-        .containsExactly(EndpointPair.unordered(N1, N1), EndpointPair.unordered(N1, N2));
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.degree(N1)).isEqualTo(2);
-    putEdge(N1, N2);
-    assertThat(graph.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.inDegree(N1)).isEqualTo(2);
-    putEdge(N1, N2);
-    assertThat(graph.inDegree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.outDegree(N1)).isEqualTo(2);
-    putEdge(N2, N1);
-    assertThat(graph.outDegree(N1)).isEqualTo(3);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(putEdge(N1, N1)).isTrue();
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N1);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    putEdge(N1, N1);
-    assertThat(putEdge(N1, N1)).isFalse();
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    putEdge(N1, N1);
-    assertThat(graph.removeNode(N1)).isTrue();
-    assertThat(graph.nodes()).isEmpty();
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    putEdge(N1, N1);
-    assertThat(graph.removeEdge(N1, N1)).isTrue();
-    assertThat(graph.nodes()).containsExactly(N1);
-    assertThat(graph.adjacentNodes(N1)).isEmpty();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedMultiNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedMultiNetworkTest.java
deleted file mode 100644
index d239e22..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedMultiNetworkTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for an undirected {@link ConfigurableMutableNetwork} allowing parallel edges and
- * self-loops.
- */
-@RunWith(JUnit4.class)
-public class ConfigurableUndirectedMultiNetworkTest extends ConfigurableUndirectedNetworkTest {
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.undirected().allowsParallelEdges(true).allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentEdges_parallelEdges() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    addEdge(N1, N2, E12_B);
-    addEdge(N3, N4, E34);
-    assertThat(network.adjacentEdges(E12)).containsExactly(E12_A, E12_B);
-  }
-
-  @Test
-  public void edgesConnecting_parallelEdges() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertTrue(addEdge(N2, N1, E21));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12, E12_A, E21);
-  }
-
-  @Test
-  public void edgesConnecting_parallelSelfLoopEdges() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelEdge() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertTrue(addEdge(N2, N1, E21));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Test
-  public void removeEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    addEdge(N2, N1, E21);
-    assertTrue(network.removeEdge(E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E21);
-  }
-
-  @Test
-  public void removeEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N1, E11_A);
-    addEdge(N1, N2, E12);
-    assertTrue(network.removeEdge(E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertTrue(network.removeEdge(E11));
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedNetworkTest.java
deleted file mode 100644
index 28cd3e5..0000000
--- a/android/guava-tests/test/com/google/common/graph/ConfigurableUndirectedNetworkTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for an undirected {@link ConfigurableMutableNetwork} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableUndirectedNetworkTest extends ConfigurableSimpleUndirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.undirected().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void edges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edges()).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentEdges(N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).nodeU()).isEqualTo(N1);
-    assertThat(network.incidentNodes(E11).nodeV()).isEqualTo(N1);
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void adjacentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
-  }
-
-  @Test
-  public void edgesConnecting_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void inEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inEdges(N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.inEdges(N1)).containsExactly(E11, E12);
-  }
-
-  @Test
-  public void outEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outEdges(N1)).containsExactly(E11);
-    addEdge(N2, N1, E12);
-    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.predecessors(N1)).containsExactly(N1);
-    addEdge(N1, N2, E12);
-    assertThat(network.predecessors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.successors(N1)).containsExactly(N1);
-    addEdge(N2, N1, E12);
-    assertThat(network.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.degree(N1)).isEqualTo(2);
-    addEdge(N1, N2, E12);
-    assertThat(network.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inDegree(N1)).isEqualTo(2);
-    addEdge(N1, N2, E12);
-    assertThat(network.inDegree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outDegree(N1)).isEqualTo(2);
-    addEdge(N2, N1, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(3);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(addEdge(N1, N1, E11)).isTrue();
-    assertThat(network.edges()).contains(E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    addEdge(N1, N1, E11);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N1, E11)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N2, E11);
-      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    try {
-      addEdge(N2, N2, E11);
-      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N1, E12);
-      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
-      fail("Adding a parallel self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    addEdge(N1, N1, E11);
-    assertThat(network.removeNode(N1)).isTrue();
-    assertThat(network.nodes()).isEmpty();
-    assertThat(network.edges()).doesNotContain(E11);
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    assertThat(network.removeEdge(E11)).isTrue();
-    assertThat(network.edges()).doesNotContain(E11);
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/GraphsTest.java b/android/guava-tests/test/com/google/common/graph/GraphsTest.java
index ce892ad..a07def0 100644
--- a/android/guava-tests/test/com/google/common/graph/GraphsTest.java
+++ b/android/guava-tests/test/com/google/common/graph/GraphsTest.java
@@ -206,7 +206,7 @@
     MutableGraph<Integer> undirectedGraph = GraphBuilder.undirected().build();
     undirectedGraph.putEdge(N1, N2);
 
-    assertThat(transpose(undirectedGraph)).isSameAs(undirectedGraph);
+    assertThat(transpose(undirectedGraph)).isSameInstanceAs(undirectedGraph);
   }
 
   @Test
@@ -227,12 +227,12 @@
 
     Graph<Integer> transpose = transpose(directedGraph);
     assertThat(transpose).isEqualTo(expectedTranspose);
-    assertThat(transpose(transpose)).isSameAs(directedGraph);
+    assertThat(transpose(transpose)).isSameInstanceAs(directedGraph);
     AbstractGraphTest.validateGraph(transpose);
 
     for (Integer node : directedGraph.nodes()) {
-      assertThat(directedGraph.inDegree(node)).isSameAs(transpose.outDegree(node));
-      assertThat(directedGraph.outDegree(node)).isSameAs(transpose.inDegree(node));
+      assertThat(directedGraph.inDegree(node)).isSameInstanceAs(transpose.outDegree(node));
+      assertThat(directedGraph.outDegree(node)).isSameInstanceAs(transpose.inDegree(node));
     }
 
     assertThat(transpose.successors(N1)).doesNotContain(N2);
@@ -247,7 +247,7 @@
     MutableValueGraph<Integer, String> undirectedGraph = ValueGraphBuilder.undirected().build();
     undirectedGraph.putEdgeValue(N1, N2, E12);
 
-    assertThat(transpose(undirectedGraph)).isSameAs(undirectedGraph);
+    assertThat(transpose(undirectedGraph)).isSameInstanceAs(undirectedGraph);
   }
 
   @Test
@@ -270,13 +270,13 @@
 
     ValueGraph<Integer, String> transpose = transpose(directedGraph);
     assertThat(transpose).isEqualTo(expectedTranspose);
-    assertThat(transpose(transpose)).isSameAs(directedGraph);
+    assertThat(transpose(transpose)).isSameInstanceAs(directedGraph);
     AbstractGraphTest.validateGraph(transpose.asGraph());
 
     assertThat(transpose.edgeValueOrDefault(N1, N2, null)).isNull();
     for (Integer node : directedGraph.nodes()) {
-      assertThat(directedGraph.inDegree(node)).isSameAs(transpose.outDegree(node));
-      assertThat(directedGraph.outDegree(node)).isSameAs(transpose.inDegree(node));
+      assertThat(directedGraph.inDegree(node)).isSameInstanceAs(transpose.outDegree(node));
+      assertThat(directedGraph.outDegree(node)).isSameInstanceAs(transpose.inDegree(node));
     }
 
     directedGraph.putEdgeValue(N2, N1, E21);
@@ -290,7 +290,7 @@
     MutableNetwork<Integer, String> undirectedGraph = NetworkBuilder.undirected().build();
     undirectedGraph.addEdge(N1, N2, E12);
 
-    assertThat(transpose(undirectedGraph)).isSameAs(undirectedGraph);
+    assertThat(transpose(undirectedGraph)).isSameInstanceAs(undirectedGraph);
   }
 
   @Test
@@ -315,15 +315,15 @@
 
     Network<Integer, String> transpose = transpose(directedGraph);
     assertThat(transpose).isEqualTo(expectedTranspose);
-    assertThat(transpose(transpose)).isSameAs(directedGraph);
+    assertThat(transpose(transpose)).isSameInstanceAs(directedGraph);
     AbstractNetworkTest.validateNetwork(transpose);
 
     assertThat(transpose.edgesConnecting(N1, N2)).isEmpty();
     assertThat(transpose.edgeConnectingOrNull(N1, N2)).isNull();
 
     for (Integer node : directedGraph.nodes()) {
-      assertThat(directedGraph.inDegree(node)).isSameAs(transpose.outDegree(node));
-      assertThat(directedGraph.outDegree(node)).isSameAs(transpose.inDegree(node));
+      assertThat(directedGraph.inDegree(node)).isSameInstanceAs(transpose.outDegree(node));
+      assertThat(directedGraph.outDegree(node)).isSameInstanceAs(transpose.inDegree(node));
     }
 
     directedGraph.addEdge(N2, N1, E21);
@@ -487,7 +487,7 @@
       directedGraph.addEdge(N1, N1, E11);
       fail(ERROR_ADDED_SELF_LOOP);
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
     }
   }
 
@@ -519,7 +519,7 @@
       undirectedGraph.addEdge(N1, N1, E11);
       fail(ERROR_ADDED_SELF_LOOP);
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/graph/ImmutableGraphTest.java b/android/guava-tests/test/com/google/common/graph/ImmutableGraphTest.java
deleted file mode 100644
index 1a60836..0000000
--- a/android/guava-tests/test/com/google/common/graph/ImmutableGraphTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link ImmutableGraph} and {@link ImmutableValueGraph} . */
-@RunWith(JUnit4.class)
-public class ImmutableGraphTest {
-
-  @Test
-  public void immutableGraph() {
-    MutableGraph<String> mutableGraph = GraphBuilder.directed().build();
-    mutableGraph.addNode("A");
-    ImmutableGraph<String> immutableGraph = ImmutableGraph.copyOf(mutableGraph);
-
-    assertThat(immutableGraph).isNotInstanceOf(MutableValueGraph.class);
-    assertThat(immutableGraph).isEqualTo(mutableGraph);
-
-    mutableGraph.addNode("B");
-    assertThat(immutableGraph).isNotEqualTo(mutableGraph);
-  }
-
-  @Test
-  public void immutableValueGraph() {
-    MutableValueGraph<String, Integer> mutableValueGraph = ValueGraphBuilder.directed().build();
-    mutableValueGraph.addNode("A");
-    ImmutableValueGraph<String, Integer> immutableValueGraph =
-        ImmutableValueGraph.copyOf(mutableValueGraph);
-
-    assertThat(immutableValueGraph.asGraph()).isInstanceOf(ImmutableGraph.class);
-    assertThat(immutableValueGraph).isNotInstanceOf(MutableValueGraph.class);
-    assertThat(immutableValueGraph).isEqualTo(mutableValueGraph);
-
-    mutableValueGraph.addNode("B");
-    assertThat(immutableValueGraph).isNotEqualTo(mutableValueGraph);
-  }
-
-  @Test
-  public void copyOfImmutableGraph_optimized() {
-    Graph<String> graph1 = ImmutableGraph.copyOf(GraphBuilder.directed().<String>build());
-    Graph<String> graph2 = ImmutableGraph.copyOf(graph1);
-
-    assertThat(graph2).isSameAs(graph1);
-  }
-
-  @Test
-  public void copyOfImmutableValueGraph_optimized() {
-    ValueGraph<String, Integer> graph1 =
-        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
-    ValueGraph<String, Integer> graph2 = ImmutableValueGraph.copyOf(graph1);
-
-    assertThat(graph2).isSameAs(graph1);
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java b/android/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java
index e138656..5de3cf7 100644
--- a/android/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java
+++ b/android/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java
@@ -46,7 +46,7 @@
         ImmutableNetwork.copyOf(NetworkBuilder.directed().<String, String>build());
     Network<String, String> network2 = ImmutableNetwork.copyOf(network1);
 
-    assertThat(network2).isSameAs(network1);
+    assertThat(network2).isSameInstanceAs(network1);
   }
 
   @Test
@@ -74,4 +74,74 @@
     assertThat(network.edgesConnecting("A", "B")).containsExactly("AB");
     assertThat(network.edgesConnecting("B", "A")).containsExactly("AB");
   }
+
+  @Test
+  public void immutableNetworkBuilder_appliesNetworkBuilderConfig() {
+    ImmutableNetwork<String, Integer> emptyNetwork =
+        NetworkBuilder.directed()
+            .allowsSelfLoops(true)
+            .nodeOrder(ElementOrder.<String>natural())
+            .<String, Integer>immutable()
+            .build();
+
+    assertThat(emptyNetwork.isDirected()).isTrue();
+    assertThat(emptyNetwork.allowsSelfLoops()).isTrue();
+    assertThat(emptyNetwork.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  /**
+   * Tests that the ImmutableNetwork.Builder doesn't change when the creating NetworkBuilder
+   * changes.
+   */
+  @Test
+  @SuppressWarnings("CheckReturnValue")
+  public void immutableNetworkBuilder_copiesNetworkBuilder() {
+    NetworkBuilder<String, Object> networkBuilder =
+        NetworkBuilder.directed()
+            .allowsSelfLoops(true)
+            .<String>nodeOrder(ElementOrder.<String>natural());
+    ImmutableNetwork.Builder<String, Integer> immutableNetworkBuilder =
+        networkBuilder.<String, Integer>immutable();
+
+    // Update NetworkBuilder, but this shouldn't impact immutableNetworkBuilder
+    networkBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
+
+    ImmutableNetwork<String, Integer> emptyNetwork = immutableNetworkBuilder.build();
+
+    assertThat(emptyNetwork.isDirected()).isTrue();
+    assertThat(emptyNetwork.allowsSelfLoops()).isTrue();
+    assertThat(emptyNetwork.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  @Test
+  public void immutableNetworkBuilder_addNode() {
+    ImmutableNetwork<String, Integer> network =
+        NetworkBuilder.directed().<String, Integer>immutable().addNode("A").build();
+
+    assertThat(network.nodes()).containsExactly("A");
+    assertThat(network.edges()).isEmpty();
+  }
+
+  @Test
+  public void immutableNetworkBuilder_putEdgeFromNodes() {
+    ImmutableNetwork<String, Integer> network =
+        NetworkBuilder.directed().<String, Integer>immutable().addEdge("A", "B", 10).build();
+
+    assertThat(network.nodes()).containsExactly("A", "B");
+    assertThat(network.edges()).containsExactly(10);
+    assertThat(network.incidentNodes(10)).isEqualTo(EndpointPair.ordered("A", "B"));
+  }
+
+  @Test
+  public void immutableNetworkBuilder_putEdgeFromEndpointPair() {
+    ImmutableNetwork<String, Integer> network =
+        NetworkBuilder.directed()
+            .<String, Integer>immutable()
+            .addEdge(EndpointPair.ordered("A", "B"), 10)
+            .build();
+
+    assertThat(network.nodes()).containsExactly("A", "B");
+    assertThat(network.edges()).containsExactly(10);
+    assertThat(network.incidentNodes(10)).isEqualTo(EndpointPair.ordered("A", "B"));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java b/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java
new file mode 100644
index 0000000..8e5e67f
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 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.graph;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link ImmutableValueGraph} . */
+@RunWith(JUnit4.class)
+public class ImmutableValueGraphTest {
+
+  @Test
+  public void immutableValueGraph() {
+    MutableValueGraph<String, Integer> mutableValueGraph = ValueGraphBuilder.directed().build();
+    mutableValueGraph.addNode("A");
+    ImmutableValueGraph<String, Integer> immutableValueGraph =
+        ImmutableValueGraph.copyOf(mutableValueGraph);
+
+    assertThat(immutableValueGraph.asGraph()).isInstanceOf(ImmutableGraph.class);
+    assertThat(immutableValueGraph).isNotInstanceOf(MutableValueGraph.class);
+    assertThat(immutableValueGraph).isEqualTo(mutableValueGraph);
+
+    mutableValueGraph.addNode("B");
+    assertThat(immutableValueGraph).isNotEqualTo(mutableValueGraph);
+  }
+
+  @Test
+  public void copyOfImmutableValueGraph_optimized() {
+    ValueGraph<String, Integer> graph1 =
+        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
+    ValueGraph<String, Integer> graph2 = ImmutableValueGraph.copyOf(graph1);
+
+    assertThat(graph2).isSameInstanceAs(graph1);
+  }
+
+  @Test
+  public void incidentEdgeOrder_stable() {
+    ImmutableValueGraph<String, Integer> immutableValueGraph =
+        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
+
+    assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void incidentEdgeOrder_fromUnorderedGraph_stable() {
+    ImmutableValueGraph<String, Integer> immutableValueGraph =
+        ImmutableValueGraph.copyOf(
+            ValueGraphBuilder.directed()
+                .incidentEdgeOrder(ElementOrder.unordered())
+                .<String, Integer>build());
+
+    assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_appliesGraphBuilderConfig() {
+    ImmutableValueGraph<String, Integer> emptyGraph =
+        ValueGraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .nodeOrder(ElementOrder.<String>natural())
+            .<String, Integer>immutable()
+            .build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  /**
+   * Tests that the ImmutableValueGraph.Builder doesn't change when the creating ValueGraphBuilder
+   * changes.
+   */
+  @Test
+  @SuppressWarnings("CheckReturnValue")
+  public void immutableValueGraphBuilder_copiesGraphBuilder() {
+    ValueGraphBuilder<String, Object> graphBuilder =
+        ValueGraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .<String>nodeOrder(ElementOrder.<String>natural());
+    ImmutableValueGraph.Builder<String, Integer> immutableValueGraphBuilder =
+        graphBuilder.<String, Integer>immutable();
+
+    // Update ValueGraphBuilder, but this shouldn't impact immutableValueGraphBuilder
+    graphBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
+
+    ImmutableValueGraph<String, Integer> emptyGraph = immutableValueGraphBuilder.build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_addNode() {
+    ImmutableValueGraph<String, Integer> graph =
+        ValueGraphBuilder.directed().<String, Integer>immutable().addNode("A").build();
+
+    assertThat(graph.nodes()).containsExactly("A");
+    assertThat(graph.edges()).isEmpty();
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_putEdgeFromNodes() {
+    ImmutableValueGraph<String, Integer> graph =
+        ValueGraphBuilder.directed()
+            .<String, Integer>immutable()
+            .putEdgeValue("A", "B", 10)
+            .build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+    assertThat(graph.edgeValueOrDefault("A", "B", null)).isEqualTo(10);
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_putEdgeFromEndpointPair() {
+    ImmutableValueGraph<String, Integer> graph =
+        ValueGraphBuilder.directed()
+            .<String, Integer>immutable()
+            .putEdgeValue(EndpointPair.ordered("A", "B"), 10)
+            .build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+    assertThat(graph.edgeValueOrDefault("A", "B", null)).isEqualTo(10);
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_incidentEdges_preservesIncidentEdgesOrder() {
+    ImmutableValueGraph<Integer, String> graph =
+        ValueGraphBuilder.directed()
+            .<Integer, String>immutable()
+            .putEdgeValue(2, 1, "2-1")
+            .putEdgeValue(2, 3, "2-3")
+            .putEdgeValue(1, 2, "1-2")
+            .build();
+
+    assertThat(graph.incidentEdges(2))
+        .containsExactly(
+            EndpointPair.ordered(2, 1), EndpointPair.ordered(2, 3), EndpointPair.ordered(1, 2))
+        .inOrder();
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_incidentEdgeOrder_stable() {
+    ImmutableValueGraph<Integer, String> graph =
+        ValueGraphBuilder.directed().<Integer, String>immutable().build();
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_fromUnorderedBuilder_incidentEdgeOrder_stable() {
+    ImmutableValueGraph<Integer, String> graph =
+        ValueGraphBuilder.directed()
+            .incidentEdgeOrder(ElementOrder.unordered())
+            .<Integer, String>immutable()
+            .build();
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+}
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 564032a..f66b19b 100644
--- a/android/guava-tests/test/com/google/common/graph/MapCacheTest.java
+++ b/android/guava-tests/test/com/google/common/graph/MapCacheTest.java
@@ -83,7 +83,7 @@
   public void testRemoveEqualKeyWithDifferentReference() {
     String fooReference1 = new String("foo");
     String fooReference2 = new String("foo");
-    assertThat(fooReference1).isNotSameAs(fooReference2);
+    assertThat(fooReference1).isNotSameInstanceAs(fooReference2);
 
     assertThat(mapCache.put(fooReference1, "bar")).isNull();
     assertThat(mapCache.get(fooReference1)).isEqualTo("bar"); // ensure first reference is cached
diff --git a/android/guava-tests/test/com/google/common/graph/PackageSanityTests.java b/android/guava-tests/test/com/google/common/graph/PackageSanityTests.java
index 2022952..f1526c2 100644
--- a/android/guava-tests/test/com/google/common/graph/PackageSanityTests.java
+++ b/android/guava-tests/test/com/google/common/graph/PackageSanityTests.java
@@ -35,16 +35,20 @@
   private static final AbstractGraphBuilder<?> GRAPH_BUILDER_B =
       ValueGraphBuilder.directed().allowsSelfLoops(true).expectedNodeCount(16);
 
-  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_A = graphWithNode("A");
-  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_B = graphWithNode("B");
+  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_A =
+      GraphBuilder.directed().<String>immutable().addNode("A").build();
+  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_B =
+      GraphBuilder.directed().<String>immutable().addNode("B").build();
 
   private static final NetworkBuilder<?, ?> NETWORK_BUILDER_A =
       NetworkBuilder.directed().allowsParallelEdges(true).expectedNodeCount(10);
   private static final NetworkBuilder<?, ?> NETWORK_BUILDER_B =
       NetworkBuilder.directed().allowsSelfLoops(true).expectedNodeCount(16);
 
-  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_A = networkWithNode("A");
-  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_B = networkWithNode("B");
+  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_A =
+      NetworkBuilder.directed().<String, String>immutable().addNode("A").build();
+  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_B =
+      NetworkBuilder.directed().<String, String>immutable().addNode("B").build();
 
   public PackageSanityTests() {
     setDistinctValues(AbstractGraphBuilder.class, GRAPH_BUILDER_A, GRAPH_BUILDER_B);
@@ -66,16 +70,4 @@
           .contains(ERROR_ELEMENT_NOT_IN_GRAPH);
     }
   }
-
-  private static <N> ImmutableGraph<N> graphWithNode(N node) {
-    MutableGraph<N> graph = GraphBuilder.directed().build();
-    graph.addNode(node);
-    return ImmutableGraph.copyOf(graph);
-  }
-
-  private static <N> ImmutableNetwork<N, N> networkWithNode(N node) {
-    MutableNetwork<N, N> network = NetworkBuilder.directed().build();
-    network.addNode(node);
-    return ImmutableNetwork.copyOf(network);
-  }
 }
diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java
new file mode 100644
index 0000000..d89baa0
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardImmutableDirectedGraphTest extends AbstractStandardDirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(new Object[][] {{false}, {true}});
+  }
+
+  private final boolean allowsSelfLoops;
+  private ImmutableGraph.Builder<Integer> graphBuilder;
+
+  public StandardImmutableDirectedGraphTest(boolean allowsSelfLoops) {
+    this.allowsSelfLoops = allowsSelfLoops;
+  }
+
+  @Override
+  public Graph<Integer> createGraph() {
+    graphBuilder = GraphBuilder.directed().allowsSelfLoops(allowsSelfLoops).immutable();
+    return graphBuilder.build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphBuilder.addNode(n);
+    graph = graphBuilder.build();
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphBuilder.putEdge(n1, n2);
+    graph = graphBuilder.build();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedNetworkTest.java
new file mode 100644
index 0000000..b237ff9
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedNetworkTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.collect.Ordering;
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link ImmutableNetwork}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public class StandardImmutableDirectedNetworkTest extends AbstractStandardDirectedNetworkTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, allowsParallelEdges={1}, nodeOrder={2}, edgeOrder={3}")
+  public static Collection<Object[]> parameters() {
+    ElementOrder<?> naturalElementOrder = ElementOrder.sorted(Ordering.natural());
+
+    return Arrays.asList(
+        new Object[][] {
+          {false, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {true, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {false, false, naturalElementOrder, naturalElementOrder},
+          {true, true, ElementOrder.insertion(), ElementOrder.insertion()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final boolean allowsParallelEdges;
+  private final ElementOrder<Integer> nodeOrder;
+  private final ElementOrder<String> edgeOrder;
+
+  private ImmutableNetwork.Builder<Integer, String> networkBuilder;
+
+  public StandardImmutableDirectedNetworkTest(
+      boolean allowsSelfLoops,
+      boolean allowsParallelEdges,
+      ElementOrder<Integer> nodeOrder,
+      ElementOrder<String> edgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.allowsParallelEdges = allowsParallelEdges;
+    this.nodeOrder = nodeOrder;
+    this.edgeOrder = edgeOrder;
+  }
+
+  @Override
+  Network<Integer, String> createGraph() {
+    networkBuilder =
+        NetworkBuilder.directed()
+            .allowsSelfLoops(allowsSelfLoops)
+            .allowsParallelEdges(allowsParallelEdges)
+            .nodeOrder(nodeOrder)
+            .edgeOrder(edgeOrder)
+            .immutable();
+
+    return networkBuilder.build();
+  }
+
+  @Override
+  void addNode(Integer n) {
+    networkBuilder.addNode(n);
+    network = networkBuilder.build();
+  }
+
+  @Override
+  void addEdge(Integer n1, Integer n2, String e) {
+    networkBuilder.addEdge(n1, n2, e);
+    network = networkBuilder.build();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java
new file mode 100644
index 0000000..47cd6a0
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link ImmutableGraph} and {@link ImmutableGraph.Builder} that are not ready covered by
+ * {@link StandardImmutableDirectedGraphTest}.
+ */
+@RunWith(JUnit4.class)
+public class StandardImmutableGraphAdditionalTest {
+
+  @Test
+  public void immutableGraph() {
+    MutableGraph<String> mutableGraph = GraphBuilder.directed().build();
+    mutableGraph.addNode("A");
+    ImmutableGraph<String> immutableGraph = ImmutableGraph.copyOf(mutableGraph);
+
+    assertThat(immutableGraph).isNotInstanceOf(MutableValueGraph.class);
+    assertThat(immutableGraph).isEqualTo(mutableGraph);
+
+    mutableGraph.addNode("B");
+    assertThat(immutableGraph).isNotEqualTo(mutableGraph);
+  }
+
+  @Test
+  public void copyOfImmutableGraph_optimized() {
+    Graph<String> graph1 = ImmutableGraph.copyOf(GraphBuilder.directed().<String>build());
+    Graph<String> graph2 = ImmutableGraph.copyOf(graph1);
+
+    assertThat(graph2).isSameInstanceAs(graph1);
+  }
+
+  @Test
+  public void immutableGraphBuilder_appliesGraphBuilderConfig() {
+    ImmutableGraph<String> emptyGraph =
+        GraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .nodeOrder(ElementOrder.<String>natural())
+            .immutable()
+            .build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  /**
+   * Tests that the ImmutableGraph.Builder doesn't change when the creating GraphBuilder changes.
+   */
+  @Test
+  @SuppressWarnings("CheckReturnValue")
+  public void immutableGraphBuilder_copiesGraphBuilder() {
+    GraphBuilder<String> graphBuilder =
+        GraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .<String>nodeOrder(ElementOrder.<String>natural());
+    ImmutableGraph.Builder<String> immutableGraphBuilder = graphBuilder.immutable();
+
+    // Update GraphBuilder, but this shouldn't impact immutableGraphBuilder
+    graphBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
+
+    ImmutableGraph<String> emptyGraph = immutableGraphBuilder.build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  @Test
+  public void copyOf_incidentEdgeOrder() {
+    ImmutableGraph<Object> graph = ImmutableGraph.copyOf(GraphBuilder.undirected().build());
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void copyOf_fromUnorderedGraph_incidentEdgeOrder() {
+    ImmutableGraph<Object> graph =
+        ImmutableGraph.copyOf(
+            GraphBuilder.undirected().incidentEdgeOrder(ElementOrder.unordered()).build());
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void immutableGraphBuilder_addNode() {
+    ImmutableGraph<String> graph = GraphBuilder.directed().<String>immutable().addNode("A").build();
+
+    assertThat(graph.nodes()).containsExactly("A");
+    assertThat(graph.edges()).isEmpty();
+  }
+
+  @Test
+  public void immutableGraphBuilder_putEdgeFromNodes() {
+    ImmutableGraph<String> graph =
+        GraphBuilder.directed().<String>immutable().putEdge("A", "B").build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+  }
+
+  @Test
+  public void immutableGraphBuilder_putEdgeFromEndpointPair() {
+    ImmutableGraph<String> graph =
+        GraphBuilder.directed().<String>immutable().putEdge(EndpointPair.ordered("A", "B")).build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java
new file mode 100644
index 0000000..7f580a6
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for an undirected {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardImmutableUndirectedGraphTest
+    extends AbstractStandardUndirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(new Object[][] {{false}, {true}});
+  }
+
+  private final boolean allowsSelfLoops;
+  private ImmutableGraph.Builder<Integer> graphBuilder;
+
+  public StandardImmutableUndirectedGraphTest(boolean allowsSelfLoops) {
+    this.allowsSelfLoops = allowsSelfLoops;
+  }
+
+  @Override
+  public Graph<Integer> createGraph() {
+    graphBuilder = GraphBuilder.undirected().allowsSelfLoops(allowsSelfLoops).immutable();
+    return graphBuilder.build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphBuilder.addNode(n);
+    graph = graphBuilder.build();
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphBuilder.putEdge(n1, n2);
+    graph = graphBuilder.build();
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardMutableDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/StandardMutableDirectedGraphTest.java
new file mode 100644
index 0000000..191010e
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardMutableDirectedGraphTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardMutableDirectedGraphTest extends AbstractStandardDirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(
+        new Object[][] {
+          {false, ElementOrder.unordered()},
+          {true, ElementOrder.unordered()},
+          {false, ElementOrder.stable()},
+          {true, ElementOrder.stable()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final ElementOrder<Integer> incidentEdgeOrder;
+
+  public StandardMutableDirectedGraphTest(
+      boolean allowsSelfLoops, ElementOrder<Integer> incidentEdgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.incidentEdgeOrder = incidentEdgeOrder;
+  }
+
+  @Override
+  public MutableGraph<Integer> createGraph() {
+    return GraphBuilder.directed()
+        .allowsSelfLoops(allowsSelfLoops)
+        .incidentEdgeOrder(incidentEdgeOrder)
+        .build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphAsMutableGraph.addNode(n);
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphAsMutableGraph.putEdge(n1, n2);
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardMutableDirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/StandardMutableDirectedNetworkTest.java
new file mode 100644
index 0000000..fb8be1d
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardMutableDirectedNetworkTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.collect.Ordering;
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link StandardMutableNetwork} allowing self-loops. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public class StandardMutableDirectedNetworkTest extends AbstractStandardDirectedNetworkTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, allowsParallelEdges={1}, nodeOrder={2}, edgeOrder={3}")
+  public static Collection<Object[]> parameters() {
+    ElementOrder<?> naturalElementOrder = ElementOrder.sorted(Ordering.natural());
+
+    return Arrays.asList(
+        new Object[][] {
+          {false, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {true, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {false, false, naturalElementOrder, naturalElementOrder},
+          {true, true, ElementOrder.insertion(), ElementOrder.insertion()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final boolean allowsParallelEdges;
+  private final ElementOrder<Integer> nodeOrder;
+  private final ElementOrder<String> edgeOrder;
+
+  public StandardMutableDirectedNetworkTest(
+      boolean allowsSelfLoops,
+      boolean allowsParallelEdges,
+      ElementOrder<Integer> nodeOrder,
+      ElementOrder<String> edgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.allowsParallelEdges = allowsParallelEdges;
+    this.nodeOrder = nodeOrder;
+    this.edgeOrder = edgeOrder;
+  }
+
+  @Override
+  MutableNetwork<Integer, String> createGraph() {
+    return NetworkBuilder.directed()
+        .allowsSelfLoops(allowsSelfLoops)
+        .allowsParallelEdges(allowsParallelEdges)
+        .nodeOrder(nodeOrder)
+        .edgeOrder(edgeOrder)
+        .build();
+  }
+
+  @Override
+  void addNode(Integer n) {
+    networkAsMutableNetwork.addNode(n);
+  }
+
+  @Override
+  void addEdge(Integer n1, Integer n2, String e) {
+    networkAsMutableNetwork.addEdge(n1, n2, e);
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardMutableUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/StandardMutableUndirectedGraphTest.java
new file mode 100644
index 0000000..aa0372a
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardMutableUndirectedGraphTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for an undirected {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public class StandardMutableUndirectedGraphTest extends AbstractStandardUndirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(
+        new Object[][] {
+          {false, ElementOrder.unordered()},
+          {true, ElementOrder.unordered()},
+          {false, ElementOrder.stable()},
+          {true, ElementOrder.stable()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final ElementOrder<Integer> incidentEdgeOrder;
+
+  public StandardMutableUndirectedGraphTest(
+      boolean allowsSelfLoops, ElementOrder<Integer> incidentEdgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.incidentEdgeOrder = incidentEdgeOrder;
+  }
+
+  @Override
+  public MutableGraph<Integer> createGraph() {
+    return GraphBuilder.undirected()
+        .allowsSelfLoops(allowsSelfLoops)
+        .incidentEdgeOrder(incidentEdgeOrder)
+        .build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphAsMutableGraph.addNode(n);
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphAsMutableGraph.putEdge(n1, n2);
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/StandardMutableUndirectedNetworkTest.java b/android/guava-tests/test/com/google/common/graph/StandardMutableUndirectedNetworkTest.java
new file mode 100644
index 0000000..c021b5d
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/graph/StandardMutableUndirectedNetworkTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.collect.Ordering;
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for an undirected {@link StandardMutableNetwork}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardMutableUndirectedNetworkTest
+    extends AbstractStandardUndirectedNetworkTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, allowsParallelEdges={1}, nodeOrder={2}, edgeOrder={3}")
+  public static Collection<Object[]> parameters() {
+    ElementOrder<?> naturalElementOrder = ElementOrder.sorted(Ordering.natural());
+
+    return Arrays.asList(
+        new Object[][] {
+          {false, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {true, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {false, false, naturalElementOrder, naturalElementOrder},
+          {true, true, ElementOrder.insertion(), ElementOrder.insertion()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final boolean allowsParallelEdges;
+  private final ElementOrder<Integer> nodeOrder;
+  private final ElementOrder<String> edgeOrder;
+
+  public StandardMutableUndirectedNetworkTest(
+      boolean allowsSelfLoops,
+      boolean allowsParallelEdges,
+      ElementOrder<Integer> nodeOrder,
+      ElementOrder<String> edgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.allowsParallelEdges = allowsParallelEdges;
+    this.nodeOrder = nodeOrder;
+    this.edgeOrder = edgeOrder;
+  }
+
+  @Override
+  MutableNetwork<Integer, String> createGraph() {
+    return NetworkBuilder.undirected()
+        .allowsSelfLoops(allowsSelfLoops)
+        .allowsParallelEdges(allowsParallelEdges)
+        .nodeOrder(nodeOrder)
+        .edgeOrder(edgeOrder)
+        .build();
+  }
+
+  @Override
+  void addNode(Integer n) {
+    networkAsMutableNetwork.addNode(n);
+  }
+
+  @Override
+  void addEdge(Integer n1, Integer n2, String e) {
+    networkAsMutableNetwork.addEdge(n1, n2, e);
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/graph/TraverserTest.java b/android/guava-tests/test/com/google/common/graph/TraverserTest.java
index f1db943..d4c8cf7 100644
--- a/android/guava-tests/test/com/google/common/graph/TraverserTest.java
+++ b/android/guava-tests/test/com/google/common/graph/TraverserTest.java
@@ -185,6 +185,13 @@
   }
 
   @Test
+  public void forGraph_breadthFirst_infinite() {
+    Iterable<Integer> result =
+        Traverser.forGraph(fixedSuccessors(Iterables.cycle(1, 2, 3))).breadthFirst(0);
+    assertThat(Iterables.limit(result, 4)).containsExactly(0, 1, 2, 3).inOrder();
+  }
+
+  @Test
   public void forGraph_breadthFirst_diamond() {
     Traverser<Character> traverser = Traverser.forGraph(DIAMOND_GRAPH);
     assertEqualCharNodes(traverser.breadthFirst('a'), "abcd");
@@ -374,6 +381,13 @@
   }
 
   @Test
+  public void forGraph_depthFirstPreOrder_infinite() {
+    Iterable<Integer> result =
+        Traverser.forGraph(fixedSuccessors(Iterables.cycle(1, 2, 3))).depthFirstPreOrder(0);
+    assertThat(Iterables.limit(result, 3)).containsExactly(0, 1, 2).inOrder();
+  }
+
+  @Test
   public void forGraph_depthFirstPreOrder_diamond() {
     Traverser<Character> traverser = Traverser.forGraph(DIAMOND_GRAPH);
     assertEqualCharNodes(traverser.depthFirstPreOrder('a'), "abdc");
@@ -519,11 +533,11 @@
     Iterable<Character> result = Traverser.forGraph(graph).depthFirstPreOrder('a');
 
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b');
 
     // Iterate again to see if calculation is done again
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b', 'd', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b');
   }
 
   @Test
@@ -532,11 +546,11 @@
     Iterable<Character> result = Traverser.forGraph(graph).depthFirstPreOrder(charactersOf("ac"));
 
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b', 'c', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b', 'c');
 
     // Iterate again to see if calculation is done again
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b', 'c', 'd', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b', 'c');
   }
 
   @Test
@@ -785,6 +799,13 @@
   }
 
   @Test
+  public void forTree_breadthFirst_infinite() {
+    Iterable<Integer> result =
+        Traverser.forTree(fixedSuccessors(Iterables.cycle(1, 2, 3))).breadthFirst(0);
+    assertThat(Iterables.limit(result, 8)).containsExactly(0, 1, 2, 3, 1, 2, 3, 1).inOrder();
+  }
+
+  @Test
   public void forTree_breadthFirst_tree() throws Exception {
     Traverser<Character> traverser = Traverser.forTree(TREE);
 
@@ -913,6 +934,13 @@
   }
 
   @Test
+  public void forTree_depthFirstPreOrder_infinite() {
+    Iterable<Integer> result =
+        Traverser.forTree(fixedSuccessors(Iterables.cycle(1, 2, 3))).depthFirstPreOrder(0);
+    assertThat(Iterables.limit(result, 3)).containsExactly(0, 1, 1).inOrder();
+  }
+
+  @Test
   public void forTree_depthFirstPreOrderIterable_tree() throws Exception {
     Traverser<Character> traverser = Traverser.forTree(TREE);
 
@@ -1022,11 +1050,11 @@
     Iterable<Character> result = Traverser.forGraph(graph).depthFirstPreOrder('h');
 
     assertEqualCharNodes(Iterables.limit(result, 2), "hd");
-    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'd', 'a');
+    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'd');
 
     // Iterate again to see if calculation is done again
     assertEqualCharNodes(Iterables.limit(result, 2), "hd");
-    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'h', 'd', 'd', 'a', 'a');
+    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'h', 'd', 'd');
   }
 
   @Test
@@ -1238,4 +1266,13 @@
       return delegate.successors(node);
     }
   }
+
+  private static <N> SuccessorsFunction<N> fixedSuccessors(final Iterable<N> successors) {
+    return new SuccessorsFunction<N>() {
+      @Override
+      public Iterable<N> successors(N n) {
+        return successors;
+      }
+    };
+  }
 }
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 a295692..a3f4814 100644
--- a/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java
+++ b/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java
@@ -19,14 +19,21 @@
 import static com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
 import static com.google.common.graph.TestUtil.assertStronglyEquivalent;
 import static com.google.common.truth.Truth.assertThat;
+import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.junit.Assert.fail;
 
+import com.google.common.collect.ImmutableList;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/** Tests for {@link ConfigurableMutableValueGraph} and related functionality. */
+/** Tests for {@link StandardMutableValueGraph} and related functionality. */
 // TODO(user): Expand coverage and move to proper test suite.
 @RunWith(JUnit4.class)
 public final class ValueGraphTest {
@@ -44,6 +51,7 @@
     assertThat(graph.nodes()).isEqualTo(asGraph.nodes());
     assertThat(graph.edges()).isEqualTo(asGraph.edges());
     assertThat(graph.nodeOrder()).isEqualTo(asGraph.nodeOrder());
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(asGraph.incidentEdgeOrder());
     assertThat(graph.isDirected()).isEqualTo(asGraph.isDirected());
     assertThat(graph.allowsSelfLoops()).isEqualTo(asGraph.allowsSelfLoops());
 
@@ -114,6 +122,18 @@
   }
 
   @Test
+  public void incidentEdgeOrder_unordered() {
+    graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.unordered()).build();
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.unordered());
+  }
+
+  @Test
+  public void incidentEdgeOrder_stable() {
+    graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.stable()).build();
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
   public void hasEdgeConnecting_directed_correct() {
     graph = ValueGraphBuilder.directed().build();
     graph.putEdgeValue(1, 2, "A");
@@ -330,4 +350,72 @@
     otherGraph.putEdgeValue(1, 2, "valueB");
     assertThat(graph).isNotEqualTo(otherGraph); // values differ
   }
+
+  @Test
+  public void incidentEdges_stableIncidentEdgeOrder_preservesIncidentEdgesOrder_directed() {
+    graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.stable()).build();
+    graph.putEdgeValue(2, 1, "2-1");
+    graph.putEdgeValue(2, 3, "2-3");
+    graph.putEdgeValue(1, 2, "1-2");
+
+    assertThat(graph.incidentEdges(2))
+        .containsExactly(
+            EndpointPair.ordered(2, 1), EndpointPair.ordered(2, 3), EndpointPair.ordered(1, 2))
+        .inOrder();
+  }
+
+  @Test
+  public void incidentEdges_stableIncidentEdgeOrder_preservesIncidentEdgesOrder_undirected() {
+    graph = ValueGraphBuilder.undirected().incidentEdgeOrder(ElementOrder.stable()).build();
+    graph.putEdgeValue(2, 3, "2-3");
+    graph.putEdgeValue(2, 1, "2-1");
+    graph.putEdgeValue(2, 4, "2-4");
+    graph.putEdgeValue(1, 2, "1-2"); // Duplicate nodes, different value
+
+    assertThat(graph.incidentEdges(2))
+        .containsExactly(
+            EndpointPair.unordered(2, 3),
+            EndpointPair.unordered(1, 2),
+            EndpointPair.unordered(2, 4))
+        .inOrder();
+  }
+
+  @Test
+  public void concurrentIteration() throws Exception {
+    graph = ValueGraphBuilder.directed().build();
+    graph.putEdgeValue(1, 2, "A");
+    graph.putEdgeValue(3, 4, "B");
+    graph.putEdgeValue(5, 6, "C");
+
+    int threadCount = 20;
+    ExecutorService executor = newFixedThreadPool(threadCount);
+    final CyclicBarrier barrier = new CyclicBarrier(threadCount);
+    ImmutableList.Builder<Future<?>> futures = ImmutableList.builder();
+    for (int i = 0; i < threadCount; i++) {
+      futures.add(
+          executor.submit(
+              new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                  barrier.await();
+                  Integer first = graph.nodes().iterator().next();
+                  for (Integer node : graph.nodes()) {
+                    Set<Integer> unused = graph.successors(node);
+                  }
+                  /*
+                   * Also look up an earlier node so that, if the graph is using MapRetrievalCache,
+                   * we read one of the fields declared in that class.
+                   */
+                  Set<Integer> unused = graph.successors(first);
+                  return null;
+                }
+              }));
+    }
+
+    // For more about this test, see the equivalent in AbstractNetworkTest.
+    for (Future<?> future : futures.build()) {
+      future.get();
+    }
+    executor.shutdown();
+  }
 }
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 d1cf3fd..4d64f98 100644
--- a/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
+++ b/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
@@ -304,7 +304,7 @@
   public void testLargeNumberOfInsertions() {
     // We use horrible FPPs here to keep Java from OOM'ing
     BloomFilter<String> unused =
-        BloomFilter.create(Funnels.unencodedCharsFunnel(), Integer.MAX_VALUE / 2, 0.29);
+        BloomFilter.create(Funnels.unencodedCharsFunnel(), Integer.MAX_VALUE / 2, 0.30);
     unused = BloomFilter.create(Funnels.unencodedCharsFunnel(), 45L * Integer.MAX_VALUE, 0.99);
   }
 
diff --git a/android/guava-tests/test/com/google/common/hash/FunnelsTest.java b/android/guava-tests/test/com/google/common/hash/FunnelsTest.java
index 922bc5d..6b0c758 100644
--- a/android/guava-tests/test/com/google/common/hash/FunnelsTest.java
+++ b/android/guava-tests/test/com/google/common/hash/FunnelsTest.java
@@ -93,7 +93,7 @@
   }
 
   public void testSequential() {
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({"unchecked", "DoNotMock"})
     Funnel<Object> elementFunnel = mock(Funnel.class);
     PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
     Funnel<Iterable<?>> sequential = Funnels.sequentialFunnel(elementFunnel);
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 f2b8971..8dfbdb0 100644
--- a/android/guava-tests/test/com/google/common/hash/HashTestUtils.java
+++ b/android/guava-tests/test/com/google/common/hash/HashTestUtils.java
@@ -509,9 +509,9 @@
     rng.nextBytes(bytes);
     ByteBuffer littleEndian = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
     ByteBuffer bigEndian = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN);
-    assertEquals(hashFunction.hashBytes(littleEndian), hashFunction.hashBytes(littleEndian));
+    assertEquals(hashFunction.hashBytes(littleEndian), hashFunction.hashBytes(bigEndian));
     assertEquals(ByteOrder.LITTLE_ENDIAN, littleEndian.order());
-    assertEquals(ByteOrder.BIG_ENDIAN, littleEndian.order());
+    assertEquals(ByteOrder.BIG_ENDIAN, bigEndian.order());
   }
 
   static void assertHasherByteBufferPreservesByteOrder(HashFunction hashFunction) {
@@ -522,9 +522,9 @@
     ByteBuffer bigEndian = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN);
     assertEquals(
         hashFunction.newHasher().putBytes(littleEndian).hash(),
-        hashFunction.newHasher().putBytes(littleEndian).hash());
+        hashFunction.newHasher().putBytes(bigEndian).hash());
     assertEquals(ByteOrder.LITTLE_ENDIAN, littleEndian.order());
-    assertEquals(ByteOrder.BIG_ENDIAN, littleEndian.order());
+    assertEquals(ByteOrder.BIG_ENDIAN, bigEndian.order());
   }
 
   static void assertHashBytesThrowsCorrectExceptions(HashFunction hashFunction) {
diff --git a/android/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java b/android/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java
index 58ed689..05351d9 100644
--- a/android/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java
+++ b/android/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java
@@ -35,6 +35,7 @@
   private static final byte[] testBytes = new byte[] {'y', 'a', 'm', 's'};
   private ByteArrayInputStream buffer;
 
+  @SuppressWarnings("DoNotMock")
   @Override
   protected void setUp() throws Exception {
     super.setUp();
diff --git a/android/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java b/android/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java
index fd8f340..55e8fbf 100644
--- a/android/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java
+++ b/android/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java
@@ -33,6 +33,7 @@
   private HashFunction hashFunction;
   private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
 
+  @SuppressWarnings("DoNotMock")
   @Override
   protected void setUp() throws Exception {
     super.setUp();
diff --git a/android/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java b/android/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java
index c76ec76..ded4447 100644
--- a/android/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java
+++ b/android/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java
@@ -34,7 +34,7 @@
   private static final HashFunction SIP_WITHOUT_KEY = Hashing.sipHash24();
 
   // These constants were originally ported from https://www.131002.net/siphash/siphash24.c. See:
-  // https://github.com/nahi/siphash-java-inline/blob/master/src/test/java/SipHashInlineTest.java
+  // https://github.com/nahi/siphash-java-inline/blob/master/src/test/java/org/jruby/util/SipHashInlineTest.java
   private static final long[] EXPECTED =
       new long[] {
         0x726fdb47dd0e0e31L,
diff --git a/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java b/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java
index 17bc325..832fb07 100644
--- a/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java
+++ b/android/guava-tests/test/com/google/common/io/BaseEncodingTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.io.BaseEncoding.base32;
 import static com.google.common.io.BaseEncoding.base32Hex;
 import static com.google.common.io.BaseEncoding.base64;
+import static com.google.common.io.BaseEncoding.base64Url;
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtCompatible;
@@ -31,6 +32,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import junit.framework.TestCase;
@@ -190,6 +192,16 @@
     testEncodesWithOffset(base64(), "foobar", 4, 0, "");
   }
 
+  public void testBase64Url() {
+    testDecodesByBytes(base64Url(), "_zzz", new byte[] {-1, 60, -13});
+    testDecodesByBytes(base64Url(), "-zzz", new byte[] {-5, 60, -13});
+  }
+
+  public void testBase64UrlInvalidDecodings() {
+    assertFailsToDecode(base64Url(), "+zzz", "Unrecognized character: +");
+    assertFailsToDecode(base64Url(), "/zzz", "Unrecognized character: /");
+  }
+
   public void testBase32() {
     // The following test vectors are specified in RFC 4648 itself
     testEncodingWithCasing(base32(), "", "");
@@ -383,29 +395,86 @@
     assertThat(encoding.decode(encoded)).isEqualTo(decoded.getBytes(UTF_8));
   }
 
+  private static void testDecodesByBytes(BaseEncoding encoding, String encoded, byte[] decoded) {
+    assertTrue(encoding.canDecode(encoded));
+    assertThat(encoding.decode(encoded)).isEqualTo(decoded);
+  }
+
   private static void assertFailsToDecode(BaseEncoding encoding, String cannotDecode) {
     assertFailsToDecode(encoding, cannotDecode, null);
   }
 
   private static void assertFailsToDecode(
       BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
-    assertFalse(encoding.canDecode(cannotDecode));
-    try {
-      encoding.decode(cannotDecode);
-      fail("Expected IllegalArgumentException");
-    } catch (IllegalArgumentException expected) {
-      if (expectedMessage != null) {
-        assertThat(expected).hasCauseThat().hasMessageThat().isEqualTo(expectedMessage);
-      }
+    // We use this somewhat weird pattern with an enum for each assertion we want to make as a way
+    // of dealing with the fact that one of the assertions is @GwtIncompatible but we don't want to
+    // have to have duplicate @GwtIncompatible test methods just to make that assertion.
+    for (AssertFailsToDecodeStrategy strategy : AssertFailsToDecodeStrategy.values()) {
+      strategy.assertFailsToDecode(encoding, cannotDecode, expectedMessage);
     }
-    try {
-      encoding.decodeChecked(cannotDecode);
-      fail("Expected DecodingException");
-    } catch (DecodingException expected) {
-      if (expectedMessage != null) {
-        assertThat(expected).hasMessageThat().isEqualTo(expectedMessage);
+  }
+
+  enum AssertFailsToDecodeStrategy {
+    @GwtIncompatible // decodingStream(Reader)
+    DECODING_STREAM {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+        // Regression test for case where DecodingException was swallowed by default implementation
+        // of
+        // InputStream.read(byte[], int, int)
+        // See https://github.com/google/guava/issues/3542
+        Reader reader = new StringReader(cannotDecode);
+        InputStream decodingStream = encoding.decodingStream(reader);
+        try {
+          ByteStreams.exhaust(decodingStream);
+          fail("Expected DecodingException");
+        } catch (DecodingException expected) {
+          // Don't assert on the expectedMessage; the messages for exceptions thrown from the
+          // decoding stream may differ from the messages for the decode methods.
+        } catch (IOException e) {
+          fail("Expected DecodingException but got: " + e);
+        }
       }
-    }
+    },
+    CAN_DECODE {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+        assertFalse(encoding.canDecode(cannotDecode));
+      }
+    },
+    DECODE {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+        try {
+          encoding.decode(cannotDecode);
+          fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException expected) {
+          if (expectedMessage != null) {
+            assertThat(expected).hasCauseThat().hasMessageThat().isEqualTo(expectedMessage);
+          }
+        }
+      }
+    },
+    DECODE_CHECKED {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage) {
+        try {
+          encoding.decodeChecked(cannotDecode);
+          fail("Expected DecodingException");
+        } catch (DecodingException expected) {
+          if (expectedMessage != null) {
+            assertThat(expected).hasMessageThat().isEqualTo(expectedMessage);
+          }
+        }
+      }
+    };
+
+    abstract void assertFailsToDecode(
+        BaseEncoding encoding, String cannotDecode, @NullableDecl String expectedMessage);
   }
 
   @GwtIncompatible // Reader/Writer
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 0f5b3d9..f0ba829 100644
--- a/android/guava-tests/test/com/google/common/io/ByteSourceTest.java
+++ b/android/guava-tests/test/com/google/common/io/ByteSourceTest.java
@@ -454,6 +454,10 @@
     }
   }
 
+  public void testSlice_returnEmptySource() {
+    assertEquals(ByteSource.empty(), source.slice(0, 3).slice(4, 3));
+  }
+
   private static int getAndResetRecords(TestLogHandler logHandler) {
     int records = logHandler.getStoredLogRecords().size();
     logHandler.clear();
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 981238a..f715303 100644
--- a/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
+++ b/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
@@ -48,7 +48,7 @@
 
     ReadableByteChannel inChannel = Channels.newChannel(new ByteArrayInputStream(expected));
     ByteStreams.copy(inChannel, outChannel);
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   public void testCopyFileChannel() throws IOException {
@@ -57,24 +57,18 @@
     WritableByteChannel outChannel = Channels.newChannel(out);
 
     File testFile = createTempFile();
-    FileOutputStream fos = new FileOutputStream(testFile);
     byte[] dummyData = newPreFilledByteArray(chunkSize);
-    try {
+    try (FileOutputStream fos = new FileOutputStream(testFile)) {
       for (int i = 0; i < 500; i++) {
         fos.write(dummyData);
       }
-    } finally {
-      fos.close();
     }
-    ReadableByteChannel inChannel = new RandomAccessFile(testFile, "r").getChannel();
-    try {
+    try (ReadableByteChannel inChannel = new RandomAccessFile(testFile, "r").getChannel()) {
       ByteStreams.copy(inChannel, outChannel);
-    } finally {
-      inChannel.close();
     }
     byte[] actual = out.toByteArray();
     for (int i = 0; i < 500 * chunkSize; i += chunkSize) {
-      assertEquals(dummyData, Arrays.copyOfRange(actual, i, i + chunkSize));
+      assertThat(Arrays.copyOfRange(actual, i, i + chunkSize)).isEqualTo(dummyData);
     }
   }
 
@@ -84,56 +78,56 @@
     try {
       ByteStreams.readFully(newTestStream(10), null, 0, 10);
       fail("expected exception");
-    } catch (NullPointerException e) {
+    } catch (NullPointerException expected) {
     }
 
     try {
       ByteStreams.readFully(null, b, 0, 10);
       fail("expected exception");
-    } catch (NullPointerException e) {
+    } catch (NullPointerException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, -1, 10);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, 0, -1);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, 0, -1);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, 2, 10);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(5), b, 0, 10);
       fail("expected exception");
-    } catch (EOFException e) {
+    } catch (EOFException expected) {
     }
 
     Arrays.fill(b, (byte) 0);
     ByteStreams.readFully(newTestStream(10), b, 0, 0);
-    assertEquals(new byte[10], b);
+    assertThat(b).isEqualTo(new byte[10]);
 
     Arrays.fill(b, (byte) 0);
     ByteStreams.readFully(newTestStream(10), b, 0, 10);
-    assertEquals(newPreFilledByteArray(10), b);
+    assertThat(b).isEqualTo(newPreFilledByteArray(10));
 
     Arrays.fill(b, (byte) 0);
     ByteStreams.readFully(newTestStream(10), b, 0, 5);
-    assertEquals(new byte[] {0, 1, 2, 3, 4, 0, 0, 0, 0, 0}, b);
+    assertThat(b).isEqualTo(new byte[] {0, 1, 2, 3, 4, 0, 0, 0, 0, 0});
   }
 
   public void testSkipFully() throws IOException {
@@ -146,7 +140,7 @@
     try {
       skipHelper(101, 0, new ByteArrayInputStream(bytes));
       fail("expected exception");
-    } catch (EOFException e) {
+    } catch (EOFException expected) {
     }
   }
 
@@ -183,7 +177,7 @@
     ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
     byte[] actual = new byte[bytes.length];
     in.readFully(actual);
-    assertEquals(bytes, actual);
+    assertThat(actual).isEqualTo(bytes);
   }
 
   public void testNewDataInput_readFullyAndThenSome() {
@@ -268,27 +262,27 @@
 
   public void testNewDataInput_readByte() {
     ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
-    for (int i = 0; i < bytes.length; i++) {
-      assertEquals(bytes[i], in.readByte());
+    for (byte aByte : bytes) {
+      assertEquals(aByte, in.readByte());
     }
     try {
       in.readByte();
       fail("expected exception");
-    } catch (IllegalStateException ex) {
-      assertThat(ex).hasCauseThat().isInstanceOf(EOFException.class);
+    } catch (IllegalStateException expected) {
+      assertThat(expected).hasCauseThat().isInstanceOf(EOFException.class);
     }
   }
 
   public void testNewDataInput_readUnsignedByte() {
     ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
-    for (int i = 0; i < bytes.length; i++) {
-      assertEquals(bytes[i], in.readUnsignedByte());
+    for (byte aByte : bytes) {
+      assertEquals(aByte, in.readUnsignedByte());
     }
     try {
       in.readUnsignedByte();
       fail("expected exception");
-    } catch (IllegalStateException ex) {
-      assertThat(ex).hasCauseThat().isInstanceOf(EOFException.class);
+    } catch (IllegalStateException expected) {
+      assertThat(expected).hasCauseThat().isInstanceOf(EOFException.class);
     }
   }
 
@@ -323,40 +317,40 @@
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeInt(0x12345678);
     out.writeInt(0x76543210);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_sized() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput(4);
     out.writeInt(0x12345678);
     out.writeInt(0x76543210);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeLong() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeLong(0x1234567876543210L);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeByteArray() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.write(bytes);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeByte() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.write(0x12);
     out.writeByte(0x34);
-    assertEquals(new byte[] {0x12, 0x34}, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(new byte[] {0x12, 0x34});
   }
 
   public void testNewDataOutput_writeByteOffset() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.write(bytes, 4, 2);
     byte[] expected = {bytes[4], bytes[5]};
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   public void testNewDataOutput_writeBoolean() {
@@ -364,13 +358,13 @@
     out.writeBoolean(true);
     out.writeBoolean(false);
     byte[] expected = {(byte) 1, (byte) 0};
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   public void testNewDataOutput_writeChar() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeChar('a');
-    assertEquals(new byte[] {0, 97}, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(new byte[] {0, 97});
   }
 
   // Hardcoded because of Android problems. See testUtf16Expected.
@@ -382,14 +376,14 @@
     out.writeChars("r\u00C9sum\u00C9");
     // need to remove byte order mark before comparing
     byte[] expected = Arrays.copyOfRange(utf16ExpectedWithBom, 2, 14);
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   @AndroidIncompatible // https://code.google.com/p/android/issues/detail?id=196848
   public void testUtf16Expected() {
     byte[] hardcodedExpected = utf16ExpectedWithBom;
     byte[] computedExpected = "r\u00C9sum\u00C9".getBytes(Charsets.UTF_16);
-    assertEquals(hardcodedExpected, computedExpected);
+    assertThat(computedExpected).isEqualTo(hardcodedExpected);
   }
 
   public void testNewDataOutput_writeUTF() {
@@ -400,26 +394,26 @@
     // writeUTF writes the length of the string in 2 bytes
     assertEquals(0, actual[0]);
     assertEquals(expected.length, actual[1]);
-    assertEquals(expected, Arrays.copyOfRange(actual, 2, actual.length));
+    assertThat(Arrays.copyOfRange(actual, 2, actual.length)).isEqualTo(expected);
   }
 
   public void testNewDataOutput_writeShort() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeShort(0x1234);
-    assertEquals(new byte[] {0x12, 0x34}, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(new byte[] {0x12, 0x34});
   }
 
   public void testNewDataOutput_writeDouble() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeDouble(Double.longBitsToDouble(0x1234567876543210L));
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeFloat() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeFloat(Float.intBitsToFloat(0x12345678));
     out.writeFloat(Float.intBitsToFloat(0x76543210));
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_BAOS() {
@@ -427,7 +421,7 @@
     ByteArrayDataOutput out = ByteStreams.newDataOutput(baos);
     out.writeInt(0x12345678);
     assertEquals(4, baos.size());
-    assertEquals(new byte[] {0x12, 0x34, 0x56, 0x78}, baos.toByteArray());
+    assertThat(baos.toByteArray()).isEqualTo(new byte[] {0x12, 0x34, 0x56, 0x78});
   }
 
   private static final byte[] PRE_FILLED_100 = newPreFilledByteArray(100);
@@ -435,13 +429,13 @@
   public void testToByteArray() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_emptyStream() throws IOException {
     InputStream in = newTestStream(0);
     byte[] b = ByteStreams.toByteArray(in);
-    assertEquals(new byte[0], b);
+    assertThat(b).isEqualTo(new byte[0]);
   }
 
   public void testToByteArray_largeStream() throws IOException {
@@ -449,44 +443,44 @@
     byte[] expected = newPreFilledByteArray(10000000);
     InputStream in = new ByteArrayInputStream(expected);
     byte[] b = ByteStreams.toByteArray(in);
-    assertEquals(expected, b);
+    assertThat(b).isEqualTo(expected);
   }
 
   public void testToByteArray_withSize_givenCorrectSize() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 100);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSmallerSize() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 80);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenLargerSize() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 120);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSizeZero() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 0);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSizeOneSmallerThanActual() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     // this results in toByteArrayInternal being called when the stream is actually exhausted
     byte[] b = ByteStreams.toByteArray(in, 99);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSizeTwoSmallerThanActual() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 98);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testExhaust() throws IOException {
@@ -508,7 +502,7 @@
   private static class SlowSkipper extends FilterInputStream {
     private final long max;
 
-    public SlowSkipper(InputStream in, long max) {
+    SlowSkipper(InputStream in, long max) {
       super(in);
       this.max = max;
     }
@@ -521,15 +515,15 @@
 
   public void testReadBytes() throws IOException {
     final byte[] array = newPreFilledByteArray(1000);
-    assertEquals(
-        array, ByteStreams.readBytes(new ByteArrayInputStream(array), new TestByteProcessor()));
+    assertThat(ByteStreams.readBytes(new ByteArrayInputStream(array), new TestByteProcessor()))
+        .isEqualTo(array);
   }
 
-  private class TestByteProcessor implements ByteProcessor<byte[]> {
+  private static class TestByteProcessor implements ByteProcessor<byte[]> {
     private final ByteArrayOutputStream out = new ByteArrayOutputStream();
 
     @Override
-    public boolean processBytes(byte[] buf, int off, int len) throws IOException {
+    public boolean processBytes(byte[] buf, int off, int len) {
       out.write(buf, off, len);
       return true;
     }
@@ -549,7 +543,8 @@
             new ByteProcessor<Integer>() {
               @Override
               public boolean processBytes(byte[] buf, int off, int len) {
-                assertEquals(copyOfRange(buf, off, off + len), newPreFilledByteArray(8192));
+                assertThat(newPreFilledByteArray(8192))
+                    .isEqualTo(Arrays.copyOfRange(buf, off, off + len));
                 return false;
               }
 
@@ -676,17 +671,4 @@
       return false;
     }
   }
-
-  private static byte[] copyOfRange(byte[] in, int from, int to) {
-    byte[] out = new byte[to - from];
-    for (int i = 0; i < to - from; i++) {
-      out[i] = in[from + i];
-    }
-    return out;
-  }
-
-  // TODO(cpovirk): Inline this.
-  private static void assertEquals(byte[] expected, byte[] actual) {
-    assertThat(actual).isEqualTo(expected);
-  }
 }
diff --git a/android/guava-tests/test/com/google/common/io/CharStreamsTest.java b/android/guava-tests/test/com/google/common/io/CharStreamsTest.java
index 3007f09..9b2c24e 100644
--- a/android/guava-tests/test/com/google/common/io/CharStreamsTest.java
+++ b/android/guava-tests/test/com/google/common/io/CharStreamsTest.java
@@ -267,6 +267,21 @@
     String test = "Test string for NullWriter";
     nullWriter.write(test);
     nullWriter.write(test, 2, 10);
+    nullWriter.append(null);
+    nullWriter.append(null, 0, 4);
+
+    try {
+      nullWriter.append(null, -1, 4);
+      fail();
+    } catch (IndexOutOfBoundsException expected) {
+    }
+
+    try {
+      nullWriter.append(null, 0, 5);
+      fail();
+    } catch (IndexOutOfBoundsException expected) {
+    }
+
     // nothing really to assert?
     assertSame(CharStreams.nullWriter(), CharStreams.nullWriter());
   }
diff --git a/android/guava-tests/test/com/google/common/math/BigDecimalMathTest.java b/android/guava-tests/test/com/google/common/math/BigDecimalMathTest.java
new file mode 100644
index 0000000..ff86fd5
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/math/BigDecimalMathTest.java
@@ -0,0 +1,270 @@
+/*
+ * 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.math;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static java.math.RoundingMode.CEILING;
+import static java.math.RoundingMode.DOWN;
+import static java.math.RoundingMode.FLOOR;
+import static java.math.RoundingMode.HALF_DOWN;
+import static java.math.RoundingMode.HALF_EVEN;
+import static java.math.RoundingMode.HALF_UP;
+import static java.math.RoundingMode.UNNECESSARY;
+import static java.math.RoundingMode.UP;
+import static java.math.RoundingMode.values;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
+import junit.framework.TestCase;
+
+@GwtIncompatible
+public class BigDecimalMathTest extends TestCase {
+  private static final class RoundToDoubleTester {
+    private final BigDecimal input;
+    private final Map<RoundingMode, Double> expectedValues = new EnumMap<>(RoundingMode.class);
+    private boolean unnecessaryShouldThrow = false;
+
+    RoundToDoubleTester(BigDecimal input) {
+      this.input = input;
+    }
+
+    RoundToDoubleTester setExpectation(double expectedValue, RoundingMode... modes) {
+      for (RoundingMode mode : modes) {
+        Double previous = expectedValues.put(mode, expectedValue);
+        if (previous != null) {
+          throw new AssertionError();
+        }
+      }
+      return this;
+    }
+
+    public RoundToDoubleTester roundUnnecessaryShouldThrow() {
+      unnecessaryShouldThrow = true;
+      return this;
+    }
+
+    public void test() {
+      assertThat(expectedValues.keySet())
+          .containsAtLeastElementsIn(EnumSet.complementOf(EnumSet.of(UNNECESSARY)));
+      for (Map.Entry<RoundingMode, Double> entry : expectedValues.entrySet()) {
+        RoundingMode mode = entry.getKey();
+        Double expectation = entry.getValue();
+        assertWithMessage("roundToDouble(" + input + ", " + mode + ")")
+            .that(BigDecimalMath.roundToDouble(input, mode))
+            .isEqualTo(expectation);
+      }
+
+      if (!expectedValues.containsKey(UNNECESSARY)) {
+        assertWithMessage("Expected roundUnnecessaryShouldThrow call")
+            .that(unnecessaryShouldThrow)
+            .isTrue();
+        try {
+          BigDecimalMath.roundToDouble(input, UNNECESSARY);
+          fail("Expected ArithmeticException for roundToDouble(" + input + ", UNNECESSARY)");
+        } catch (ArithmeticException expected) {
+          // expected
+        }
+      }
+    }
+  }
+
+  public void testRoundToDouble_zero() {
+    new RoundToDoubleTester(BigDecimal.ZERO).setExpectation(0.0, values()).test();
+  }
+
+  public void testRoundToDouble_oneThird() {
+    new RoundToDoubleTester(
+            BigDecimal.ONE.divide(BigDecimal.valueOf(3), new MathContext(50, HALF_EVEN)))
+        .roundUnnecessaryShouldThrow()
+        .setExpectation(0.33333333333333337, UP, CEILING)
+        .setExpectation(0.3333333333333333, HALF_EVEN, FLOOR, DOWN, HALF_UP, HALF_DOWN)
+        .test();
+  }
+
+  public void testRoundToDouble_halfMinDouble() {
+    BigDecimal minDouble = new BigDecimal(Double.MIN_VALUE);
+    BigDecimal halfMinDouble = minDouble.divide(BigDecimal.valueOf(2));
+    new RoundToDoubleTester(halfMinDouble)
+        .roundUnnecessaryShouldThrow()
+        .setExpectation(Double.MIN_VALUE, UP, CEILING, HALF_UP)
+        .setExpectation(0.0, HALF_EVEN, FLOOR, DOWN, HALF_DOWN)
+        .test();
+  }
+
+  public void testRoundToDouble_halfNegativeMinDouble() {
+    BigDecimal minDouble = new BigDecimal(-Double.MIN_VALUE);
+    BigDecimal halfMinDouble = minDouble.divide(BigDecimal.valueOf(2));
+    new RoundToDoubleTester(halfMinDouble)
+        .roundUnnecessaryShouldThrow()
+        .setExpectation(-Double.MIN_VALUE, UP, FLOOR, HALF_UP)
+        .setExpectation(-0.0, HALF_EVEN, CEILING, DOWN, HALF_DOWN)
+        .test();
+  }
+
+  public void testRoundToDouble_smallPositive() {
+    new RoundToDoubleTester(BigDecimal.valueOf(16)).setExpectation(16.0, values()).test();
+  }
+
+  public void testRoundToDouble_maxPreciselyRepresentable() {
+    new RoundToDoubleTester(BigDecimal.valueOf(1L << 53))
+        .setExpectation(Math.pow(2, 53), values())
+        .test();
+  }
+
+  public void testRoundToDouble_maxPreciselyRepresentablePlusOne() {
+    double twoToThe53 = Math.pow(2, 53);
+    // the representable doubles are 2^53 and 2^53 + 2.
+    // 2^53+1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 53) + 1))
+        .setExpectation(twoToThe53, DOWN, FLOOR, HALF_DOWN, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe53), CEILING, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusOne() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+1 is less than halfway between, so HALF_DOWN and HALF_UP will both go down.
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 54) + 1))
+        .setExpectation(twoToThe54, DOWN, FLOOR, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusOneHalf() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+1 is less than halfway between, so HALF_DOWN and HALF_UP will both go down.
+    new RoundToDoubleTester(BigDecimal.valueOf(1L << 54).add(new BigDecimal(0.5)))
+        .setExpectation(twoToThe54, DOWN, FLOOR, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusThree() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+3 is more than halfway between, so HALF_DOWN and HALF_UP will both go up.
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 54) + 3))
+        .setExpectation(twoToThe54, DOWN, FLOOR)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusFour() {
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 54) + 4))
+        .setExpectation(Math.pow(2, 54) + 4, values())
+        .test();
+  }
+
+  public void testRoundToDouble_maxDouble() {
+    BigDecimal maxDoubleAsBD = new BigDecimal(Double.MAX_VALUE);
+    new RoundToDoubleTester(maxDoubleAsBD).setExpectation(Double.MAX_VALUE, values()).test();
+  }
+
+  public void testRoundToDouble_maxDoublePlusOne() {
+    BigDecimal maxDoubleAsBD = new BigDecimal(Double.MAX_VALUE).add(BigDecimal.ONE);
+    new RoundToDoubleTester(maxDoubleAsBD)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_wayTooBig() {
+    BigDecimal bi = BigDecimal.valueOf(2).pow(2 * Double.MAX_EXPONENT);
+    new RoundToDoubleTester(bi)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_smallNegative() {
+    new RoundToDoubleTester(BigDecimal.valueOf(-16)).setExpectation(-16.0, values()).test();
+  }
+
+  public void testRoundToDouble_minPreciselyRepresentable() {
+    new RoundToDoubleTester(BigDecimal.valueOf(-1L << 53))
+        .setExpectation(-Math.pow(2, 53), values())
+        .test();
+  }
+
+  public void testRoundToDouble_minPreciselyRepresentableMinusOne() {
+    // the representable doubles are -2^53 and -2^53 - 2.
+    // -2^53-1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 53) - 1))
+        .setExpectation(-Math.pow(2, 53), DOWN, CEILING, HALF_DOWN, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 53)), FLOOR, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeTwoToThe54MinusOne() {
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 54) - 1))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeTwoToThe54MinusThree() {
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 54) - 3))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING)
+        .setExpectation(
+            DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeTwoToThe54MinusFour() {
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 54) - 4))
+        .setExpectation(-Math.pow(2, 54) - 4, values())
+        .test();
+  }
+
+  public void testRoundToDouble_minDouble() {
+    BigDecimal minDoubleAsBD = new BigDecimal(-Double.MAX_VALUE);
+    new RoundToDoubleTester(minDoubleAsBD).setExpectation(-Double.MAX_VALUE, values()).test();
+  }
+
+  public void testRoundToDouble_minDoubleMinusOne() {
+    BigDecimal minDoubleAsBD = new BigDecimal(-Double.MAX_VALUE).subtract(BigDecimal.ONE);
+    new RoundToDoubleTester(minDoubleAsBD)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeWayTooBig() {
+    BigDecimal bi = BigDecimal.valueOf(2).pow(2 * Double.MAX_EXPONENT).negate();
+    new RoundToDoubleTester(bi)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+}
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 33f3bcf..8a9b4fc 100644
--- a/android/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
+++ b/android/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
@@ -22,6 +22,8 @@
 import static com.google.common.math.MathTesting.NEGATIVE_BIGINTEGER_CANDIDATES;
 import static com.google.common.math.MathTesting.NONZERO_BIGINTEGER_CANDIDATES;
 import static com.google.common.math.MathTesting.POSITIVE_BIGINTEGER_CANDIDATES;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.math.BigInteger.ONE;
 import static java.math.BigInteger.TEN;
 import static java.math.BigInteger.ZERO;
@@ -33,6 +35,7 @@
 import static java.math.RoundingMode.HALF_UP;
 import static java.math.RoundingMode.UNNECESSARY;
 import static java.math.RoundingMode.UP;
+import static java.math.RoundingMode.values;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -41,6 +44,9 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
 import junit.framework.TestCase;
 
 /**
@@ -542,6 +548,219 @@
     }
   }
 
+  @GwtIncompatible
+  private static final class RoundToDoubleTester {
+    private final BigInteger input;
+    private final Map<RoundingMode, Double> expectedValues = new EnumMap<>(RoundingMode.class);
+    private boolean unnecessaryShouldThrow = false;
+
+    RoundToDoubleTester(BigInteger input) {
+      this.input = input;
+    }
+
+    RoundToDoubleTester setExpectation(double expectedValue, RoundingMode... modes) {
+      for (RoundingMode mode : modes) {
+        Double previous = expectedValues.put(mode, expectedValue);
+        if (previous != null) {
+          throw new AssertionError();
+        }
+      }
+      return this;
+    }
+
+    public RoundToDoubleTester roundUnnecessaryShouldThrow() {
+      unnecessaryShouldThrow = true;
+      return this;
+    }
+
+    public void test() {
+      assertThat(expectedValues.keySet())
+          .containsAtLeastElementsIn(EnumSet.complementOf(EnumSet.of(UNNECESSARY)));
+      for (Map.Entry<RoundingMode, Double> entry : expectedValues.entrySet()) {
+        RoundingMode mode = entry.getKey();
+        Double expectation = entry.getValue();
+        assertWithMessage("roundToDouble(" + input + ", " + mode + ")")
+            .that(BigIntegerMath.roundToDouble(input, mode))
+            .isEqualTo(expectation);
+      }
+
+      if (!expectedValues.containsKey(UNNECESSARY)) {
+        assertWithMessage("Expected roundUnnecessaryShouldThrow call")
+            .that(unnecessaryShouldThrow)
+            .isTrue();
+        try {
+          BigIntegerMath.roundToDouble(input, UNNECESSARY);
+          fail("Expected ArithmeticException for roundToDouble(" + input + ", UNNECESSARY)");
+        } catch (ArithmeticException expected) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_Zero() {
+    new RoundToDoubleTester(BigInteger.ZERO).setExpectation(0.0, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_smallPositive() {
+    new RoundToDoubleTester(BigInteger.valueOf(16)).setExpectation(16.0, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxPreciselyRepresentable() {
+    new RoundToDoubleTester(BigInteger.valueOf(1L << 53))
+        .setExpectation(Math.pow(2, 53), values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxPreciselyRepresentablePlusOne() {
+    double twoToThe53 = Math.pow(2, 53);
+    // the representable doubles are 2^53 and 2^53 + 2.
+    // 2^53+1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 53) + 1))
+        .setExpectation(twoToThe53, DOWN, FLOOR, HALF_DOWN, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe53), CEILING, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_twoToThe54PlusOne() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+1 is less than halfway between, so HALF_DOWN and HALF_UP will both go down.
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 54) + 1))
+        .setExpectation(twoToThe54, DOWN, FLOOR, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_twoToThe54PlusThree() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+3 is more than halfway between, so HALF_DOWN and HALF_UP will both go up.
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 54) + 3))
+        .setExpectation(twoToThe54, DOWN, FLOOR)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_twoToThe54PlusFour() {
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 54) + 4))
+        .setExpectation(Math.pow(2, 54) + 4, values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxDouble() {
+    BigInteger maxDoubleAsBI = DoubleMath.roundToBigInteger(Double.MAX_VALUE, UNNECESSARY);
+    new RoundToDoubleTester(maxDoubleAsBI).setExpectation(Double.MAX_VALUE, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxDoublePlusOne() {
+    BigInteger maxDoubleAsBI =
+        DoubleMath.roundToBigInteger(Double.MAX_VALUE, UNNECESSARY).add(BigInteger.ONE);
+    new RoundToDoubleTester(maxDoubleAsBI)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_wayTooBig() {
+    BigInteger bi = BigInteger.ONE.shiftLeft(2 * Double.MAX_EXPONENT);
+    new RoundToDoubleTester(bi)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_smallNegative() {
+    new RoundToDoubleTester(BigInteger.valueOf(-16)).setExpectation(-16.0, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minPreciselyRepresentable() {
+    new RoundToDoubleTester(BigInteger.valueOf(-1L << 53))
+        .setExpectation(-Math.pow(2, 53), values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minPreciselyRepresentableMinusOne() {
+    // the representable doubles are -2^53 and -2^53 - 2.
+    // -2^53-1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 53) - 1))
+        .setExpectation(-Math.pow(2, 53), DOWN, CEILING, HALF_DOWN, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 53)), FLOOR, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeTwoToThe54MinusOne() {
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 54) - 1))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeTwoToThe54MinusThree() {
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 54) - 3))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING)
+        .setExpectation(
+            DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeTwoToThe54MinusFour() {
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 54) - 4))
+        .setExpectation(-Math.pow(2, 54) - 4, values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minDouble() {
+    BigInteger minDoubleAsBI = DoubleMath.roundToBigInteger(-Double.MAX_VALUE, UNNECESSARY);
+    new RoundToDoubleTester(minDoubleAsBI).setExpectation(-Double.MAX_VALUE, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minDoubleMinusOne() {
+    BigInteger minDoubleAsBI =
+        DoubleMath.roundToBigInteger(-Double.MAX_VALUE, UNNECESSARY).subtract(BigInteger.ONE);
+    new RoundToDoubleTester(minDoubleAsBI)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeWayTooBig() {
+    BigInteger bi = BigInteger.ONE.shiftLeft(2 * Double.MAX_EXPONENT).negate();
+    new RoundToDoubleTester(bi)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
   @GwtIncompatible // NullPointerTester
   public void testNullPointers() {
     NullPointerTester tester = new NullPointerTester();
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 1387e00..2284668 100644
--- a/android/guava-tests/test/com/google/common/math/LongMathTest.java
+++ b/android/guava-tests/test/com/google/common/math/LongMathTest.java
@@ -25,7 +25,8 @@
 import static com.google.common.math.MathTesting.NONZERO_LONG_CANDIDATES;
 import static com.google.common.math.MathTesting.POSITIVE_INTEGER_CANDIDATES;
 import static com.google.common.math.MathTesting.POSITIVE_LONG_CANDIDATES;
-import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.math.BigInteger.valueOf;
 import static java.math.RoundingMode.FLOOR;
 import static java.math.RoundingMode.UNNECESSARY;
@@ -36,6 +37,7 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.util.EnumSet;
 import java.util.Random;
 import junit.framework.TestCase;
 
@@ -949,7 +951,76 @@
     }
   }
 
+  private static final long[] roundToDoubleTestCandidates = {
+    0,
+    16,
+    1L << 53,
+    (1L << 53) + 1,
+    (1L << 53) + 2,
+    (1L << 53) + 3,
+    (1L << 53) + 4,
+    1L << 54,
+    (1L << 54) + 1,
+    (1L << 54) + 2,
+    (1L << 54) + 3,
+    (1L << 54) + 4,
+    0x7ffffffffffffe00L, // halfway between 2^63 and next-lower double
+    0x7ffffffffffffe01L, // above + 1
+    0x7ffffffffffffdffL, // above - 1
+    Long.MAX_VALUE - (1L << 11) + 1,
+    Long.MAX_VALUE - 2,
+    Long.MAX_VALUE - 1,
+    Long.MAX_VALUE,
+    -16,
+    -1L << 53,
+    -(1L << 53) - 1,
+    -(1L << 53) - 2,
+    -(1L << 53) - 3,
+    -(1L << 53) - 4,
+    -1L << 54,
+    -(1L << 54) - 1,
+    -(1L << 54) - 2,
+    -(1L << 54) - 3,
+    -(1L << 54) - 4,
+    Long.MIN_VALUE + 2,
+    Long.MIN_VALUE + 1,
+    Long.MIN_VALUE
+  };
+
+  @GwtIncompatible
+  public void testRoundToDoubleAgainstBigInteger() {
+    for (RoundingMode roundingMode : EnumSet.complementOf(EnumSet.of(UNNECESSARY))) {
+      for (long candidate : roundToDoubleTestCandidates) {
+        assertThat(LongMath.roundToDouble(candidate, roundingMode))
+            .isEqualTo(BigIntegerMath.roundToDouble(BigInteger.valueOf(candidate), roundingMode));
+      }
+    }
+  }
+
+  @GwtIncompatible
+  public void testRoundToDoubleAgainstBigIntegerUnnecessary() {
+    for (long candidate : roundToDoubleTestCandidates) {
+      Double expectedDouble = null;
+      try {
+        expectedDouble = BigIntegerMath.roundToDouble(BigInteger.valueOf(candidate), UNNECESSARY);
+      } catch (ArithmeticException expected) {
+        // do nothing
+      }
+
+      if (expectedDouble != null) {
+        assertThat(LongMath.roundToDouble(candidate, UNNECESSARY)).isEqualTo(expectedDouble);
+      } else {
+        try {
+          LongMath.roundToDouble(candidate, UNNECESSARY);
+          fail("Expected ArithmeticException on roundToDouble(" + candidate + ", UNNECESSARY)");
+        } catch (ArithmeticException expected) {
+          // success
+        }
+      }
+    }
+  }
+
   private static void failFormat(String template, Object... args) {
-    assert_().fail(template, args);
+    assertWithMessage(template, args).fail();
   }
 }
diff --git a/android/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java b/android/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java
index 0a21790..34f82e9 100644
--- a/android/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java
+++ b/android/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java
@@ -43,6 +43,7 @@
 import static com.google.common.math.StatsTesting.createFilledPairedStatsAccumulator;
 import static com.google.common.math.StatsTesting.createPartitionedFilledPairedStatsAccumulator;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.math.StatsTesting.ManyValues;
 import java.util.Collections;
@@ -210,17 +211,17 @@
       double populationCovarianceByAddAllPartitionedPairedStats =
           accumulatorByAddAllPartitionedPairedStats.populationCovariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationCovariance).named("population covariance of " + values).isNaN();
-        assertThat(populationCovarianceByAddAllPartitionedPairedStats)
-            .named("population covariance by addAll(PairedStats) of " + values)
+        assertWithMessage("population covariance of " + values).that(populationCovariance).isNaN();
+        assertWithMessage("population covariance by addAll(PairedStats) of " + values)
+            .that(populationCovarianceByAddAllPartitionedPairedStats)
             .isNaN();
       } else {
-        assertThat(populationCovariance)
-            .named("population covariance of " + values)
+        assertWithMessage("population covariance of " + values)
+            .that(populationCovariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_PRODUCTS_OF_DELTAS / MANY_VALUES_COUNT);
-        assertThat(populationCovarianceByAddAllPartitionedPairedStats)
-            .named("population covariance by addAll(PairedStats) of " + values)
+        assertWithMessage("population covariance by addAll(PairedStats) of " + values)
+            .that(populationCovarianceByAddAllPartitionedPairedStats)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_PRODUCTS_OF_DELTAS / MANY_VALUES_COUNT);
       }
@@ -340,22 +341,22 @@
       double pearsonsCorrelationCoefficientByAddAllPartitionedPairedStats =
           accumulatorByAddAllPartitionedPairedStats.pearsonsCorrelationCoefficient();
       if (values.hasAnyNonFinite()) {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isNaN();
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+        assertWithMessage("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isNaN();
       } else {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isWithin(ALLOWED_ERROR)
             .of(
                 accumulator.populationCovariance()
                     / (accumulator.xStats().populationStandardDeviation()
                         * accumulator.yStats().populationStandardDeviation()));
-        assertThat(pearsonsCorrelationCoefficientByAddAllPartitionedPairedStats)
-            .named("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+        assertWithMessage("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+            .that(pearsonsCorrelationCoefficientByAddAllPartitionedPairedStats)
             .isWithin(ALLOWED_ERROR)
             .of(
                 accumulatorByAddAllPartitionedPairedStats.populationCovariance()
diff --git a/android/guava-tests/test/com/google/common/math/PairedStatsTest.java b/android/guava-tests/test/com/google/common/math/PairedStatsTest.java
index f427ae6..7dd9e94 100644
--- a/android/guava-tests/test/com/google/common/math/PairedStatsTest.java
+++ b/android/guava-tests/test/com/google/common/math/PairedStatsTest.java
@@ -47,6 +47,7 @@
 import static com.google.common.math.StatsTesting.assertVerticalLinearTransformation;
 import static com.google.common.math.StatsTesting.createPairedStatsOf;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.math.StatsTesting.ManyValues;
@@ -104,10 +105,10 @@
       PairedStats stats = createPairedStatsOf(values.asIterable(), OTHER_MANY_VALUES);
       double populationCovariance = stats.populationCovariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationCovariance).named("population covariance of " + values).isNaN();
+        assertWithMessage("population covariance of " + values).that(populationCovariance).isNaN();
       } else {
-        assertThat(populationCovariance)
-            .named("population covariance of " + values)
+        assertWithMessage("population covariance of " + values)
+            .that(populationCovariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_PRODUCTS_OF_DELTAS / MANY_VALUES_COUNT);
       }
@@ -169,12 +170,12 @@
       PairedStats stats = createPairedStatsOf(MANY_VALUES, values.asIterable());
       double pearsonsCorrelationCoefficient = stats.pearsonsCorrelationCoefficient();
       if (values.hasAnyNonFinite()) {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isNaN();
       } else {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isWithin(ALLOWED_ERROR)
             .of(
                 stats.populationCovariance()
diff --git a/android/guava-tests/test/com/google/common/math/QuantilesTest.java b/android/guava-tests/test/com/google/common/math/QuantilesTest.java
index bdd3521..5ac5f6e 100644
--- a/android/guava-tests/test/com/google/common/math/QuantilesTest.java
+++ b/android/guava-tests/test/com/google/common/math/QuantilesTest.java
@@ -20,6 +20,7 @@
 import static com.google.common.math.Quantiles.percentiles;
 import static com.google.common.math.Quantiles.quartiles;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.Double.NEGATIVE_INFINITY;
 import static java.lang.Double.NaN;
 import static java.lang.Double.POSITIVE_INFINITY;
@@ -35,6 +36,7 @@
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
 import com.google.common.truth.Correspondence;
+import com.google.common.truth.Correspondence.BinaryPredicate;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -87,20 +89,17 @@
    * each other or identical non-finite values.
    */
   private static final Correspondence<Double, Double> QUANTILE_CORRESPONDENCE =
-      new Correspondence<Double, Double>() {
-
-        @Override
-        public boolean compare(@NullableDecl Double actual, @NullableDecl Double expected) {
-          // Test for equality to allow non-finite values to match; otherwise, use the finite test.
-          return actual.equals(expected)
-              || FINITE_QUANTILE_CORRESPONDENCE.compare(actual, expected);
-        }
-
-        @Override
-        public String toString() {
-          return "is identical to or " + FINITE_QUANTILE_CORRESPONDENCE;
-        }
-      };
+      Correspondence.from(
+          new BinaryPredicate<Double, Double>() {
+            @Override
+            public boolean apply(@NullableDecl Double actual, @NullableDecl Double expected) {
+              // Test for equality to allow non-finite values to match; otherwise, use the finite
+              // test.
+              return actual.equals(expected)
+                  || FINITE_QUANTILE_CORRESPONDENCE.compare(actual, expected);
+            }
+          },
+          "is identical to or " + FINITE_QUANTILE_CORRESPONDENCE);
 
   // 1. Tests on a hardcoded dataset for chains starting with median(), quartiles(), and scale(10):
 
@@ -291,6 +290,18 @@
             8, SIXTEEN_SQUARES_DECILE_8);
   }
 
+  public void testScale_indexes_varargs_compute_indexOrderIsMaintained() {
+    assertThat(Quantiles.scale(10).indexes(0, 10, 5, 1, 8, 1).compute(SIXTEEN_SQUARES_INTEGERS))
+        .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
+        .containsExactly(
+            0, SIXTEEN_SQUARES_MIN,
+            10, SIXTEEN_SQUARES_MAX,
+            5, SIXTEEN_SQUARES_MEDIAN,
+            1, SIXTEEN_SQUARES_DECILE_1,
+            8, SIXTEEN_SQUARES_DECILE_8)
+        .inOrder();
+  }
+
   public void testScale_indexes_varargs_compute_doubleVarargs() {
     double[] dataset = Doubles.toArray(SIXTEEN_SQUARES_DOUBLES);
     assertThat(Quantiles.scale(10).indexes(0, 10, 5, 1, 8, 1).compute(dataset))
@@ -509,8 +520,8 @@
 
   public void testPercentiles_index_compute_doubleCollection() {
     for (int index = 0; index <= 100; index++) {
-      assertThat(percentiles().index(index).compute(PSEUDORANDOM_DATASET))
-          .named("quantile at index " + index)
+      assertWithMessage("quantile at index " + index)
+          .that(percentiles().index(index).compute(PSEUDORANDOM_DATASET))
           .isWithin(ALLOWED_ERROR)
           .of(expectedLargeDatasetPercentile(index));
     }
@@ -521,8 +532,8 @@
     // Assert that the computation gives the correct result for all possible percentiles.
     for (int index = 0; index <= 100; index++) {
       double[] dataset = Doubles.toArray(PSEUDORANDOM_DATASET);
-      assertThat(percentiles().index(index).computeInPlace(dataset))
-          .named("quantile at index " + index)
+      assertWithMessage("quantile at index " + index)
+          .that(percentiles().index(index).computeInPlace(dataset))
           .isWithin(ALLOWED_ERROR)
           .of(expectedLargeDatasetPercentile(index));
     }
@@ -745,4 +756,13 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  public void testScale_indexes_indexes_computeInPlace_empty() {
+    int[] emptyIndexes = {};
+    try {
+      Quantiles.ScaleAndIndexes unused = Quantiles.scale(10).indexes(emptyIndexes);
+      fail("Expected IllegalArgumentException");
+    } catch (IllegalArgumentException expected) {
+    }
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java b/android/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java
index a38c803..6926a69 100644
--- a/android/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java
+++ b/android/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java
@@ -44,6 +44,7 @@
 import static com.google.common.math.StatsTesting.TWO_VALUES_MIN;
 import static com.google.common.math.StatsTesting.TWO_VALUES_SUM_OF_SQUARES_OF_DELTAS;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.Math.sqrt;
 
 import com.google.common.collect.ImmutableList;
@@ -75,6 +76,7 @@
   private StatsAccumulator manyValuesAccumulatorByRepeatedAdd;
   private StatsAccumulator manyValuesAccumulatorByAddAndAddAll;
   private StatsAccumulator manyValuesAccumulatorByAddAllStats;
+  private StatsAccumulator manyValuesAccumulatorByAddAllStatsAccumulator;
   private StatsAccumulator integerManyValuesAccumulatorByAddAllIterable;
   private StatsAccumulator longManyValuesAccumulatorByAddAllIterator;
   private StatsAccumulator longManyValuesAccumulatorByAddAllVarargs;
@@ -129,6 +131,12 @@
     manyValuesAccumulatorByAddAllStats.addAll(
         Stats.of(MANY_VALUES.subList(MANY_VALUES.size() / 2, MANY_VALUES.size())));
 
+    manyValuesAccumulatorByAddAllStatsAccumulator = new StatsAccumulator();
+    manyValuesAccumulatorByAddAllStatsAccumulator.addAll(
+        statsAccumulatorOf(MANY_VALUES.subList(0, MANY_VALUES.size() / 2)));
+    manyValuesAccumulatorByAddAllStatsAccumulator.addAll(
+        statsAccumulatorOf(MANY_VALUES.subList(MANY_VALUES.size() / 2, MANY_VALUES.size())));
+
     integerManyValuesAccumulatorByAddAllIterable = new StatsAccumulator();
     integerManyValuesAccumulatorByAddAllIterable.addAll(INTEGER_MANY_VALUES);
 
@@ -139,6 +147,12 @@
     longManyValuesAccumulatorByAddAllVarargs.addAll(Longs.toArray(LONG_MANY_VALUES));
   }
 
+  private static StatsAccumulator statsAccumulatorOf(Iterable<? extends Number> values) {
+    StatsAccumulator accumulator = new StatsAccumulator();
+    accumulator.addAll(values);
+    return accumulator;
+  }
+
   public void testCount() {
     assertThat(emptyAccumulator.count()).isEqualTo(0);
     assertThat(emptyAccumulatorByAddAllEmptyIterable.count()).isEqualTo(0);
@@ -153,6 +167,7 @@
     assertThat(manyValuesAccumulatorByRepeatedAdd.count()).isEqualTo(MANY_VALUES_COUNT);
     assertThat(manyValuesAccumulatorByAddAndAddAll.count()).isEqualTo(MANY_VALUES_COUNT);
     assertThat(manyValuesAccumulatorByAddAllStats.count()).isEqualTo(MANY_VALUES_COUNT);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.count()).isEqualTo(MANY_VALUES_COUNT);
     assertThat(integerManyValuesAccumulatorByAddAllIterable.count())
         .isEqualTo(StatsTesting.INTEGER_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllIterator.count())
@@ -212,6 +227,9 @@
     assertThat(manyValuesAccumulatorByAddAllStats.mean())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_MEAN);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.mean())
+        .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_MEAN);
     // For datasets of many double values created from an iterable, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -224,37 +242,40 @@
       double mean = accumulator.mean();
       double meanByAddAllStats = accumulatorByAddAllStats.mean();
       if (values.hasAnyNaN()) {
-        assertThat(mean).named("mean of " + values).isNaN();
-        assertThat(meanByAddAllStats).named("mean by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
+        assertWithMessage("mean by addAll(Stats) of " + values).that(meanByAddAllStats).isNaN();
       } else if (values.hasAnyPositiveInfinity() && values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNaN();
-        assertThat(meanByAddAllStats).named("mean by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
+        assertWithMessage("mean by addAll(Stats) of " + values).that(meanByAddAllStats).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(mean).named("mean of " + values).isPositiveInfinity();
-        assertThat(meanByAddAllStats)
-            .named("mean by addAll(Stats) of " + values)
+        assertWithMessage("mean of " + values).that(mean).isPositiveInfinity();
+        assertWithMessage("mean by addAll(Stats) of " + values)
+            .that(meanByAddAllStats)
             .isPositiveInfinity();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNegativeInfinity();
-        assertThat(meanByAddAllStats)
-            .named("mean by addAll(Stats) of " + values)
+        assertWithMessage("mean of " + values).that(mean).isNegativeInfinity();
+        assertWithMessage("mean by addAll(Stats) of " + values)
+            .that(meanByAddAllStats)
             .isNegativeInfinity();
       } else {
-        assertThat(mean).named("mean of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
-        assertThat(meanByAddAllStats)
-            .named("mean by addAll(Stats) of " + values)
+        assertWithMessage("mean of " + values)
+            .that(mean)
+            .isWithin(ALLOWED_ERROR)
+            .of(MANY_VALUES_MEAN);
+        assertWithMessage("mean by addAll(Stats) of " + values)
+            .that(meanByAddAllStats)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_MEAN);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(longManyValuesAccumulatorByAddAllIterator.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
     assertThat(longManyValuesAccumulatorByAddAllVarargs.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
   }
 
@@ -286,14 +307,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.sum())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_MEAN * MANY_VALUES_COUNT);
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.sum())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.sum())
         .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_MEAN * MANY_VALUES_COUNT);
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.sum())
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN * INTEGER_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllIterator.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllVarargs.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
   }
 
@@ -339,6 +363,9 @@
     assertThat(manyValuesAccumulatorByAddAllStats.populationVariance())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.populationVariance())
+        .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
     // For datasets of many double values created from an iterator, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -351,29 +378,29 @@
       double populationVariance = accumulator.populationVariance();
       double populationVarianceByAddAllStats = accumulatorByAddAllStats.populationVariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationVariance).named("population variance of " + values).isNaN();
-        assertThat(populationVarianceByAddAllStats)
-            .named("population variance by addAll(Stats) of " + values)
+        assertWithMessage("population variance of " + values).that(populationVariance).isNaN();
+        assertWithMessage("population variance by addAll(Stats) of " + values)
+            .that(populationVarianceByAddAllStats)
             .isNaN();
       } else {
-        assertThat(populationVariance)
-            .named("population variance of " + values)
+        assertWithMessage("population variance of " + values)
+            .that(populationVariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
-        assertThat(populationVarianceByAddAllStats)
-            .named("population variance by addAll(Stats) of " + values)
+        assertWithMessage("population variance by addAll(Stats) of " + values)
+            .that(populationVarianceByAddAllStats)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllIterator.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllVarargs.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
   }
 
@@ -421,14 +448,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.populationStandardDeviation())
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT));
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.populationStandardDeviation())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.populationStandardDeviation())
         .isWithin(ALLOWED_ERROR)
+        .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT));
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.populationStandardDeviation())
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT));
     assertThat(longManyValuesAccumulatorByAddAllIterator.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
     assertThat(longManyValuesAccumulatorByAddAllVarargs.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
   }
 
@@ -482,14 +512,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.sampleVariance())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1));
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleVariance())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.sampleVariance())
         .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1));
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleVariance())
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1));
     assertThat(longManyValuesAccumulatorByAddAllIterator.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
     assertThat(longManyValuesAccumulatorByAddAllVarargs.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
   }
 
@@ -543,14 +576,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.sampleStandardDeviation())
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1)));
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleStandardDeviation())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.sampleStandardDeviation())
         .isWithin(ALLOWED_ERROR)
+        .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1)));
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleStandardDeviation())
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1)));
     assertThat(longManyValuesAccumulatorByAddAllIterator.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
     assertThat(longManyValuesAccumulatorByAddAllVarargs.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
   }
 
@@ -570,28 +606,17 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(oneValueAccumulator.max()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(oneValueAccumulatorByAddAllEmptyStats.max()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(twoValuesAccumulator.max()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MAX);
-    assertThat(twoValuesAccumulatorByAddAllStats.max()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllIterable.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllIterator.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllVarargs.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByRepeatedAdd.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAndAddAll.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllStats.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
+    assertThat(oneValueAccumulator.max()).isEqualTo(ONE_VALUE);
+    assertThat(oneValueAccumulatorByAddAllEmptyStats.max()).isEqualTo(ONE_VALUE);
+    assertThat(twoValuesAccumulator.max()).isEqualTo(TWO_VALUES_MAX);
+    assertThat(twoValuesAccumulatorByAddAllStats.max()).isEqualTo(TWO_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllIterable.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllIterator.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllVarargs.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByRepeatedAdd.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAndAddAll.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllStats.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.max()).isEqualTo(MANY_VALUES_MAX);
     // For datasets of many double values created from an array, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -604,30 +629,24 @@
       double max = accumulator.max();
       double maxByAddAllStats = accumulatorByAddAllStats.max();
       if (values.hasAnyNaN()) {
-        assertThat(max).named("max of " + values).isNaN();
-        assertThat(maxByAddAllStats).named("max by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("max of " + values).that(max).isNaN();
+        assertWithMessage("max by addAll(Stats) of " + values).that(maxByAddAllStats).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(max).named("max of " + values).isPositiveInfinity();
-        assertThat(maxByAddAllStats)
-            .named("max by addAll(Stats) of " + values)
+        assertWithMessage("max of " + values).that(max).isPositiveInfinity();
+        assertWithMessage("max by addAll(Stats) of " + values)
+            .that(maxByAddAllStats)
             .isPositiveInfinity();
       } else {
-        assertThat(max).named("max of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
-        assertThat(maxByAddAllStats)
-            .named("max by addAll(Stats) of " + values)
-            .isWithin(ALLOWED_ERROR)
-            .of(MANY_VALUES_MAX);
+        assertWithMessage("max of " + values).that(max).isEqualTo(MANY_VALUES_MAX);
+        assertWithMessage("max by addAll(Stats) of " + values)
+            .that(maxByAddAllStats)
+            .isEqualTo(MANY_VALUES_MAX);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MAX);
-    assertThat(longManyValuesAccumulatorByAddAllIterator.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
-    assertThat(longManyValuesAccumulatorByAddAllVarargs.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
+        .isEqualTo(INTEGER_MANY_VALUES_MAX);
+    assertThat(longManyValuesAccumulatorByAddAllIterator.max()).isEqualTo(LONG_MANY_VALUES_MAX);
+    assertThat(longManyValuesAccumulatorByAddAllVarargs.max()).isEqualTo(LONG_MANY_VALUES_MAX);
   }
 
   public void testMin() {
@@ -646,28 +665,17 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(oneValueAccumulator.min()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(oneValueAccumulatorByAddAllEmptyStats.min()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(twoValuesAccumulator.min()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MIN);
-    assertThat(twoValuesAccumulatorByAddAllStats.min()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllIterable.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllIterator.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllVarargs.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByRepeatedAdd.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAndAddAll.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllStats.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
+    assertThat(oneValueAccumulator.min()).isEqualTo(ONE_VALUE);
+    assertThat(oneValueAccumulatorByAddAllEmptyStats.min()).isEqualTo(ONE_VALUE);
+    assertThat(twoValuesAccumulator.min()).isEqualTo(TWO_VALUES_MIN);
+    assertThat(twoValuesAccumulatorByAddAllStats.min()).isEqualTo(TWO_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllIterable.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllIterator.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllVarargs.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByRepeatedAdd.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAndAddAll.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllStats.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.min()).isEqualTo(MANY_VALUES_MIN);
     // For datasets of many double values created by adding elements individually, we test many
     // combinations of finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -680,29 +688,23 @@
       double min = accumulator.min();
       double minByAddAllStats = accumulatorByAddAllStats.min();
       if (values.hasAnyNaN()) {
-        assertThat(min).named("min of " + values).isNaN();
-        assertThat(minByAddAllStats).named("min by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("min of " + values).that(min).isNaN();
+        assertWithMessage("min by addAll(Stats) of " + values).that(minByAddAllStats).isNaN();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(min).named("min of " + values).isNegativeInfinity();
-        assertThat(minByAddAllStats)
-            .named("min by addAll(Stats) of " + values)
+        assertWithMessage("min of " + values).that(min).isNegativeInfinity();
+        assertWithMessage("min by addAll(Stats) of " + values)
+            .that(minByAddAllStats)
             .isNegativeInfinity();
       } else {
-        assertThat(min).named("min of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
-        assertThat(minByAddAllStats)
-            .named("min by addAll(Stats) of " + values)
-            .isWithin(ALLOWED_ERROR)
-            .of(MANY_VALUES_MIN);
+        assertWithMessage("min of " + values).that(min).isEqualTo(MANY_VALUES_MIN);
+        assertWithMessage("min by addAll(Stats) of " + values)
+            .that(minByAddAllStats)
+            .isEqualTo(MANY_VALUES_MIN);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MIN);
-    assertThat(longManyValuesAccumulatorByAddAllIterator.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
-    assertThat(longManyValuesAccumulatorByAddAllVarargs.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
+        .isEqualTo(INTEGER_MANY_VALUES_MIN);
+    assertThat(longManyValuesAccumulatorByAddAllIterator.min()).isEqualTo(LONG_MANY_VALUES_MIN);
+    assertThat(longManyValuesAccumulatorByAddAllVarargs.min()).isEqualTo(LONG_MANY_VALUES_MIN);
   }
 }
diff --git a/android/guava-tests/test/com/google/common/math/StatsTest.java b/android/guava-tests/test/com/google/common/math/StatsTest.java
index 2e9e540..76de5b5 100644
--- a/android/guava-tests/test/com/google/common/math/StatsTest.java
+++ b/android/guava-tests/test/com/google/common/math/StatsTest.java
@@ -64,6 +64,7 @@
 import static com.google.common.math.StatsTesting.TWO_VALUES_STATS;
 import static com.google.common.math.StatsTesting.TWO_VALUES_SUM_OF_SQUARES_OF_DELTAS;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.Double.NEGATIVE_INFINITY;
 import static java.lang.Double.NaN;
 import static java.lang.Double.POSITIVE_INFINITY;
@@ -123,15 +124,18 @@
     for (ManyValues values : ALL_MANY_VALUES) {
       double mean = Stats.of(values.asArray()).mean();
       if (values.hasAnyNaN()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity() && values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(mean).named("mean of " + values).isPositiveInfinity();
+        assertWithMessage("mean of " + values).that(mean).isPositiveInfinity();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNegativeInfinity();
+        assertWithMessage("mean of " + values).that(mean).isNegativeInfinity();
       } else {
-        assertThat(mean).named("mean of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
+        assertWithMessage("mean of " + values)
+            .that(mean)
+            .isWithin(ALLOWED_ERROR)
+            .of(MANY_VALUES_MEAN);
       }
     }
     assertThat(MANY_VALUES_STATS_ITERABLE.mean()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
@@ -141,19 +145,19 @@
         .isWithin(ALLOWED_ERROR * Double.MAX_VALUE)
         .of(LARGE_VALUES_MEAN);
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(LARGE_INTEGER_VALUES_STATS.mean())
         .isWithin(ALLOWED_ERROR * Integer.MAX_VALUE)
         .of(LARGE_INTEGER_VALUES_MEAN);
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
     assertThat(LARGE_LONG_VALUES_STATS.mean())
         .isWithin(ALLOWED_ERROR * Long.MAX_VALUE)
@@ -178,16 +182,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_MEAN * MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN * INTEGER_MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN * INTEGER_MANY_VALUES_COUNT);
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
   }
 
@@ -217,10 +221,10 @@
     for (ManyValues values : ALL_MANY_VALUES) {
       double populationVariance = Stats.of(values.asIterable()).populationVariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationVariance).named("population variance of " + values).isNaN();
+        assertWithMessage("population variance of " + values).that(populationVariance).isNaN();
       } else {
-        assertThat(populationVariance)
-            .named("population variance of " + values)
+        assertWithMessage("population variance of " + values)
+            .that(populationVariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
       }
@@ -232,19 +236,19 @@
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT);
     assertThat(LARGE_INTEGER_VALUES_STATS.populationVariance())
         .isWithin(ALLOWED_ERROR * Integer.MAX_VALUE * Integer.MAX_VALUE)
         .of(LARGE_INTEGER_VALUES_POPULATION_VARIANCE);
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
     assertThat(LARGE_LONG_VALUES_STATS.populationVariance())
         .isWithin(ALLOWED_ERROR * Long.MAX_VALUE * Long.MAX_VALUE)
@@ -279,16 +283,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT));
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT));
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT));
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
   }
 
@@ -324,16 +328,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1));
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1));
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1));
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
   }
 
@@ -369,16 +373,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1)));
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1)));
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1)));
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
   }
 
@@ -393,38 +397,30 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(ONE_VALUE_STATS.max()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
+    assertThat(ONE_VALUE_STATS.max()).isEqualTo(ONE_VALUE);
     assertThat(Stats.of(POSITIVE_INFINITY).max()).isPositiveInfinity();
     assertThat(Stats.of(NEGATIVE_INFINITY).max()).isNegativeInfinity();
     assertThat(Stats.of(NaN).max()).isNaN();
-    assertThat(TWO_VALUES_STATS.max()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MAX);
-    assertThat(MANY_VALUES_STATS_VARARGS.max()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
-    assertThat(MANY_VALUES_STATS_ITERABLE.max()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
+    assertThat(TWO_VALUES_STATS.max()).isEqualTo(TWO_VALUES_MAX);
+    assertThat(MANY_VALUES_STATS_VARARGS.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(MANY_VALUES_STATS_ITERABLE.max()).isEqualTo(MANY_VALUES_MAX);
     // For datasets of many double values created from an iterator, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
       double max = Stats.of(values.asIterable().iterator()).max();
       if (values.hasAnyNaN()) {
-        assertThat(max).named("max of " + values).isNaN();
+        assertWithMessage("max of " + values).that(max).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(max).named("max of " + values).isPositiveInfinity();
+        assertWithMessage("max of " + values).that(max).isPositiveInfinity();
       } else {
-        assertThat(max).named("max of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
+        assertWithMessage("max of " + values).that(max).isEqualTo(MANY_VALUES_MAX);
       }
     }
-    assertThat(MANY_VALUES_STATS_SNAPSHOT.max()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
-    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MAX);
-    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MAX);
-    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
-    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
+    assertThat(MANY_VALUES_STATS_SNAPSHOT.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.max()).isEqualTo(INTEGER_MANY_VALUES_MAX);
+    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.max()).isEqualTo(INTEGER_MANY_VALUES_MAX);
+    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.max()).isEqualTo(LONG_MANY_VALUES_MAX);
+    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.max()).isEqualTo(LONG_MANY_VALUES_MAX);
   }
 
   public void testMin() {
@@ -438,14 +434,14 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(ONE_VALUE_STATS.min()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
+    assertThat(ONE_VALUE_STATS.min()).isEqualTo(ONE_VALUE);
     assertThat(Stats.of(POSITIVE_INFINITY).min()).isPositiveInfinity();
     assertThat(Stats.of(NEGATIVE_INFINITY).min()).isNegativeInfinity();
     assertThat(Stats.of(NaN).min()).isNaN();
-    assertThat(TWO_VALUES_STATS.min()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MIN);
-    assertThat(MANY_VALUES_STATS_VARARGS.min()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
-    assertThat(MANY_VALUES_STATS_ITERABLE.min()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
-    assertThat(MANY_VALUES_STATS_ITERATOR.min()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
+    assertThat(TWO_VALUES_STATS.min()).isEqualTo(TWO_VALUES_MIN);
+    assertThat(MANY_VALUES_STATS_VARARGS.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(MANY_VALUES_STATS_ITERABLE.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(MANY_VALUES_STATS_ITERATOR.min()).isEqualTo(MANY_VALUES_MIN);
     // For datasets of many double values created from an accumulator snapshot, we test many
     // combinations of finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -453,25 +449,17 @@
       accumulator.addAll(values.asIterable());
       double min = accumulator.snapshot().min();
       if (values.hasAnyNaN()) {
-        assertThat(min).named("min of " + values).isNaN();
+        assertWithMessage("min of " + values).that(min).isNaN();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(min).named("min of " + values).isNegativeInfinity();
+        assertWithMessage("min of " + values).that(min).isNegativeInfinity();
       } else {
-        assertThat(min).named("min of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
+        assertWithMessage("min of " + values).that(min).isEqualTo(MANY_VALUES_MIN);
       }
     }
-    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MIN);
-    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MIN);
-    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
-    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
+    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.min()).isEqualTo(INTEGER_MANY_VALUES_MIN);
+    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.min()).isEqualTo(INTEGER_MANY_VALUES_MIN);
+    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.min()).isEqualTo(LONG_MANY_VALUES_MIN);
+    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.min()).isEqualTo(LONG_MANY_VALUES_MIN);
   }
 
   public void testEqualsAndHashCode() {
@@ -537,28 +525,33 @@
     for (ManyValues values : ALL_MANY_VALUES) {
       double mean = Stats.meanOf(values.asArray());
       if (values.hasAnyNaN()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity() && values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(mean).named("mean of " + values).isPositiveInfinity();
+        assertWithMessage("mean of " + values).that(mean).isPositiveInfinity();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNegativeInfinity();
+        assertWithMessage("mean of " + values).that(mean).isNegativeInfinity();
       } else {
-        assertThat(mean).named("mean of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
+        assertWithMessage("mean of " + values)
+            .that(mean)
+            .isWithin(ALLOWED_ERROR)
+            .of(MANY_VALUES_MEAN);
       }
     }
     assertThat(Stats.meanOf(MANY_VALUES)).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(MANY_VALUES.iterator())).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(INTEGER_MANY_VALUES))
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(Ints.toArray(INTEGER_MANY_VALUES)))
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
-    assertThat(Stats.meanOf(LONG_MANY_VALUES)).isWithin(ALLOWED_ERROR).of(LONG_MANY_VALUES_MEAN);
+    assertThat(Stats.meanOf(LONG_MANY_VALUES))
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
+        .of(LONG_MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(Longs.toArray(LONG_MANY_VALUES)))
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
   }
 
diff --git a/android/guava-tests/test/com/google/common/math/StatsTesting.java b/android/guava-tests/test/com/google/common/math/StatsTesting.java
index b0aa362..12689d3 100644
--- a/android/guava-tests/test/com/google/common/math/StatsTesting.java
+++ b/android/guava-tests/test/com/google/common/math/StatsTesting.java
@@ -222,7 +222,7 @@
   static final Stats MANY_VALUES_STATS_VARARGS = Stats.of(1.1, -44.44, 33.33, 555.555, -2.2);
   static final Stats MANY_VALUES_STATS_ITERABLE = Stats.of(MANY_VALUES);
   static final Stats MANY_VALUES_STATS_ITERATOR = Stats.of(MANY_VALUES.iterator());
-  static final Stats MANY_VALUES_STATS_SNAPSHOT;
+  static final Stats MANY_VALUES_STATS_SNAPSHOT = buildManyValuesStatsSnapshot();
   static final Stats LARGE_VALUES_STATS = Stats.of(LARGE_VALUES);
   static final Stats OTHER_MANY_VALUES_STATS = Stats.of(OTHER_MANY_VALUES);
   static final Stats INTEGER_MANY_VALUES_STATS_VARARGS =
@@ -230,20 +230,21 @@
   static final Stats INTEGER_MANY_VALUES_STATS_ITERABLE = Stats.of(INTEGER_MANY_VALUES);
   static final Stats LARGE_INTEGER_VALUES_STATS = Stats.of(LARGE_INTEGER_VALUES);
   static final Stats LONG_MANY_VALUES_STATS_ITERATOR = Stats.of(LONG_MANY_VALUES.iterator());
-  static final Stats LONG_MANY_VALUES_STATS_SNAPSHOT;
+  static final Stats LONG_MANY_VALUES_STATS_SNAPSHOT = buildLongManyValuesStatsSnapshot();
   static final Stats LARGE_LONG_VALUES_STATS = Stats.of(LARGE_LONG_VALUES);
 
-  static {
+  private static Stats buildManyValuesStatsSnapshot() {
     StatsAccumulator accumulator = new StatsAccumulator();
     accumulator.addAll(MANY_VALUES);
-    MANY_VALUES_STATS_SNAPSHOT = accumulator.snapshot();
+    Stats stats = accumulator.snapshot();
     accumulator.add(999.999); // should do nothing to the snapshot
+    return stats;
   }
 
-  static {
+  private static Stats buildLongManyValuesStatsSnapshot() {
     StatsAccumulator accumulator = new StatsAccumulator();
     accumulator.addAll(LONG_MANY_VALUES);
-    LONG_MANY_VALUES_STATS_SNAPSHOT = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
   static final ImmutableList<Stats> ALL_STATS =
@@ -275,42 +276,43 @@
       createPairedStatsOf(ImmutableList.of(ONE_VALUE), ImmutableList.of(OTHER_ONE_VALUE));
   static final PairedStats TWO_VALUES_PAIRED_STATS =
       createPairedStatsOf(TWO_VALUES, OTHER_TWO_VALUES);
-  static final PairedStats MANY_VALUES_PAIRED_STATS;
+  static final PairedStats MANY_VALUES_PAIRED_STATS = buildManyValuesPairedStats();
   static final PairedStats DUPLICATE_MANY_VALUES_PAIRED_STATS =
       createPairedStatsOf(MANY_VALUES, OTHER_MANY_VALUES);
-  static final PairedStats HORIZONTAL_VALUES_PAIRED_STATS;
-  static final PairedStats VERTICAL_VALUES_PAIRED_STATS;
-  static final PairedStats CONSTANT_VALUES_PAIRED_STATS;
+  static final PairedStats HORIZONTAL_VALUES_PAIRED_STATS = buildHorizontalValuesPairedStats();
+  static final PairedStats VERTICAL_VALUES_PAIRED_STATS = buildVerticalValuesPairedStats();
+  static final PairedStats CONSTANT_VALUES_PAIRED_STATS = buildConstantValuesPairedStats();
 
-  static {
+  private static PairedStats buildManyValuesPairedStats() {
     PairedStatsAccumulator accumulator =
         createFilledPairedStatsAccumulator(MANY_VALUES, OTHER_MANY_VALUES);
-    MANY_VALUES_PAIRED_STATS = accumulator.snapshot();
+    PairedStats stats = accumulator.snapshot();
     accumulator.add(99.99, 9999.9999); // should do nothing to the snapshot
+    return stats;
   }
 
-  static {
+  private static PairedStats buildHorizontalValuesPairedStats() {
     PairedStatsAccumulator accumulator = new PairedStatsAccumulator();
     for (double x : MANY_VALUES) {
       accumulator.add(x, OTHER_ONE_VALUE);
     }
-    HORIZONTAL_VALUES_PAIRED_STATS = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
-  static {
+  private static PairedStats buildVerticalValuesPairedStats() {
     PairedStatsAccumulator accumulator = new PairedStatsAccumulator();
     for (double y : OTHER_MANY_VALUES) {
       accumulator.add(ONE_VALUE, y);
     }
-    VERTICAL_VALUES_PAIRED_STATS = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
-  static {
+  private static PairedStats buildConstantValuesPairedStats() {
     PairedStatsAccumulator accumulator = new PairedStatsAccumulator();
     for (int i = 0; i < MANY_VALUES_COUNT; ++i) {
       accumulator.add(ONE_VALUE, OTHER_ONE_VALUE);
     }
-    CONSTANT_VALUES_PAIRED_STATS = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
   static final ImmutableList<PairedStats> ALL_PAIRED_STATS =
@@ -387,8 +389,8 @@
         .of(x1 + xDelta);
     assertThat(transformation.slope()).isWithin(ALLOWED_ERROR).of(yDelta / xDelta);
     assertThat(transformation.inverse().slope()).isWithin(ALLOWED_ERROR).of(xDelta / yDelta);
-    assertThat(transformation.inverse()).isSameAs(transformation.inverse());
-    assertThat(transformation.inverse().inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation.inverse());
+    assertThat(transformation.inverse().inverse()).isSameInstanceAs(transformation);
   }
 
   /**
@@ -415,8 +417,8 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(transformation.inverse()).isSameAs(transformation.inverse());
-    assertThat(transformation.inverse().inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation.inverse());
+    assertThat(transformation.inverse().inverse()).isSameInstanceAs(transformation);
   }
 
   /**
@@ -443,8 +445,8 @@
     } catch (IllegalStateException expected) {
     }
     assertThat(transformation.inverse().slope()).isWithin(ALLOWED_ERROR).of(0.0);
-    assertThat(transformation.inverse()).isSameAs(transformation.inverse());
-    assertThat(transformation.inverse().inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation.inverse());
+    assertThat(transformation.inverse().inverse()).isSameInstanceAs(transformation);
   }
 
   /**
@@ -456,7 +458,7 @@
     assertThat(transformation.isVertical()).isFalse();
     assertThat(transformation.slope()).isNaN();
     assertThat(transformation.transform(0.0)).isNaN();
-    assertThat(transformation.inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation);
   }
 
   /**
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 65e6fdb..9927e6b 100644
--- a/android/guava-tests/test/com/google/common/net/HttpHeadersTest.java
+++ b/android/guava-tests/test/com/google/common/net/HttpHeadersTest.java
@@ -36,18 +36,22 @@
   public void testConstantNameMatchesString() throws Exception {
     // Special case some of the weird HTTP Header names...
     ImmutableBiMap<String, String> specialCases =
-        ImmutableBiMap.of(
-            "ETAG",
-            "ETag",
-            "SOURCE_MAP",
-            "SourceMap",
-            "X_WEBKIT_CSP",
-            "X-WebKit-CSP",
-            "X_WEBKIT_CSP_REPORT_ONLY",
-            "X-WebKit-CSP-Report-Only");
+        ImmutableBiMap.<String, String>builder()
+            .put("CDN_LOOP", "CDN-Loop")
+            .put("ETAG", "ETag")
+            .put("SOURCE_MAP", "SourceMap")
+            .put("SEC_WEBSOCKET_ACCEPT", "Sec-WebSocket-Accept")
+            .put("SEC_WEBSOCKET_EXTENSIONS", "Sec-WebSocket-Extensions")
+            .put("SEC_WEBSOCKET_KEY", "Sec-WebSocket-Key")
+            .put("SEC_WEBSOCKET_PROTOCOL", "Sec-WebSocket-Protocol")
+            .put("SEC_WEBSOCKET_VERSION", "Sec-WebSocket-Version")
+            .put("X_WEBKIT_CSP", "X-WebKit-CSP")
+            .put("X_WEBKIT_CSP_REPORT_ONLY", "X-WebKit-CSP-Report-Only")
+            .build();
     ImmutableSet<String> uppercaseAcronyms =
         ImmutableSet.of(
-            "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "TE", "UID", "URL", "WWW", "XSS");
+            "CH", "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "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 62c7bd0..ed3aa27 100644
--- a/android/guava-tests/test/com/google/common/net/InetAddressesTest.java
+++ b/android/guava-tests/test/com/google/common/net/InetAddressesTest.java
@@ -18,7 +18,9 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.testing.NullPointerTester;
+import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -39,77 +41,80 @@
   }
 
   public void testForStringBogusInput() {
-    String[] bogusInputs = {
-      "",
-      "016.016.016.016",
-      "016.016.016",
-      "016.016",
-      "016",
-      "000.000.000.000",
-      "000",
-      "0x0a.0x0a.0x0a.0x0a",
-      "0x0a.0x0a.0x0a",
-      "0x0a.0x0a",
-      "0x0a",
-      "42.42.42.42.42",
-      "42.42.42",
-      "42.42",
-      "42",
-      "42..42.42",
-      "42..42.42.42",
-      "42.42.42.42.",
-      "42.42.42.42...",
-      ".42.42.42.42",
-      "...42.42.42.42",
-      "42.42.42.-0",
-      "42.42.42.+0",
-      ".",
-      "...",
-      "bogus",
-      "bogus.com",
-      "192.168.0.1.com",
-      "12345.67899.-54321.-98765",
-      "257.0.0.0",
-      "42.42.42.-42",
-      "3ffe::1.net",
-      "3ffe::1::1",
-      "1::2::3::4:5",
-      "::7:6:5:4:3:2:", // should end with ":0"
-      ":6:5:4:3:2:1::", // should begin with "0:"
-      "2001::db:::1",
-      "FEDC:9878",
-      "+1.+2.+3.4",
-      "1.2.3.4e0",
-      "::7:6:5:4:3:2:1:0", // too many parts
-      "7:6:5:4:3:2:1:0::", // too many parts
-      "9:8:7:6:5:4:3::2:1", // too many parts
-      "0:1:2:3::4:5:6:7", // :: must remove at least one 0.
-      "3ffe:0:0:0:0:0:0:0:1", // too many parts (9 instead of 8)
-      "3ffe::10000", // hextet exceeds 16 bits
-      "3ffe::goog",
-      "3ffe::-0",
-      "3ffe::+0",
-      "3ffe::-1",
-      ":",
-      ":::",
-      "::1.2.3",
-      "::1.2.3.4.5",
-      "::1.2.3.4:",
-      "1.2.3.4::",
-      "2001:db8::1:",
-      ":2001:db8::1",
-      ":1:2:3:4:5:6:7",
-      "1:2:3:4:5:6:7:",
-      ":1:2:3:4:5:6:"
-    };
+    ImmutableSet<String> bogusInputs =
+        ImmutableSet.of(
+            "",
+            "016.016.016.016",
+            "016.016.016",
+            "016.016",
+            "016",
+            "000.000.000.000",
+            "000",
+            "0x0a.0x0a.0x0a.0x0a",
+            "0x0a.0x0a.0x0a",
+            "0x0a.0x0a",
+            "0x0a",
+            "42.42.42.42.42",
+            "42.42.42",
+            "42.42",
+            "42",
+            "42..42.42",
+            "42..42.42.42",
+            "42.42.42.42.",
+            "42.42.42.42...",
+            ".42.42.42.42",
+            ".42.42.42",
+            "...42.42.42.42",
+            "42.42.42.-0",
+            "42.42.42.+0",
+            ".",
+            "...",
+            "bogus",
+            "bogus.com",
+            "192.168.0.1.com",
+            "12345.67899.-54321.-98765",
+            "257.0.0.0",
+            "42.42.42.-42",
+            "42.42.42.ab",
+            "3ffe::1.net",
+            "3ffe::1::1",
+            "1::2::3::4:5",
+            "::7:6:5:4:3:2:", // should end with ":0"
+            ":6:5:4:3:2:1::", // should begin with "0:"
+            "2001::db:::1",
+            "FEDC:9878",
+            "+1.+2.+3.4",
+            "1.2.3.4e0",
+            "6:5:4:3:2:1:0", // too few parts
+            "::7:6:5:4:3:2:1:0", // too many parts
+            "7:6:5:4:3:2:1:0::", // too many parts
+            "9:8:7:6:5:4:3::2:1", // too many parts
+            "0:1:2:3::4:5:6:7", // :: must remove at least one 0.
+            "3ffe:0:0:0:0:0:0:0:1", // too many parts (9 instead of 8)
+            "3ffe::10000", // hextet exceeds 16 bits
+            "3ffe::goog",
+            "3ffe::-0",
+            "3ffe::+0",
+            "3ffe::-1",
+            ":",
+            ":::",
+            "::1.2.3",
+            "::1.2.3.4.5",
+            "::1.2.3.4:",
+            "1.2.3.4::",
+            "2001:db8::1:",
+            ":2001:db8::1",
+            ":1:2:3:4:5:6:7",
+            "1:2:3:4:5:6:7:",
+            ":1:2:3:4:5:6:");
 
-    for (int i = 0; i < bogusInputs.length; i++) {
+    for (String bogusInput : bogusInputs) {
       try {
-        InetAddresses.forString(bogusInputs[i]);
-        fail("IllegalArgumentException expected for '" + bogusInputs[i] + "'");
+        InetAddresses.forString(bogusInput);
+        fail("IllegalArgumentException expected for '" + bogusInput + "'");
       } catch (IllegalArgumentException expected) {
       }
-      assertFalse(InetAddresses.isInetAddress(bogusInputs[i]));
+      assertFalse(InetAddresses.isInetAddress(bogusInput));
     }
   }
 
@@ -124,40 +129,35 @@
 
   public void testForStringIPv4Input() throws UnknownHostException {
     String ipStr = "192.168.0.1";
-    InetAddress ipv4Addr = null;
     // Shouldn't hit DNS, because it's an IP string literal.
-    ipv4Addr = InetAddress.getByName(ipStr);
+    InetAddress ipv4Addr = InetAddress.getByName(ipStr);
     assertEquals(ipv4Addr, InetAddresses.forString(ipStr));
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
   public void testForStringIPv6Input() throws UnknownHostException {
     String ipStr = "3ffe::1";
-    InetAddress ipv6Addr = null;
     // Shouldn't hit DNS, because it's an IP string literal.
-    ipv6Addr = InetAddress.getByName(ipStr);
+    InetAddress ipv6Addr = InetAddress.getByName(ipStr);
     assertEquals(ipv6Addr, InetAddresses.forString(ipStr));
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
   public void testForStringIPv6EightColons() throws UnknownHostException {
-    String[] eightColons = {
-      "::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::",
-    };
+    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::");
 
-    for (int i = 0; i < eightColons.length; i++) {
-      InetAddress ipv6Addr = null;
+    for (String ipString : eightColons) {
       // Shouldn't hit DNS, because it's an IP string literal.
-      ipv6Addr = InetAddress.getByName(eightColons[i]);
-      assertEquals(ipv6Addr, InetAddresses.forString(eightColons[i]));
-      assertTrue(InetAddresses.isInetAddress(eightColons[i]));
+      InetAddress ipv6Addr = InetAddress.getByName(ipString);
+      assertEquals(ipv6Addr, InetAddresses.forString(ipString));
+      assertTrue(InetAddresses.isInetAddress(ipString));
     }
   }
 
   public void testConvertDottedQuadToHex() throws UnknownHostException {
-    String[] ipStrings = {
-      "7::0.128.0.127", "7::0.128.0.128", "7::128.128.0.127", "7::0.128.128.127"
-    };
+    ImmutableSet<String> ipStrings =
+        ImmutableSet.of("7::0.128.0.127", "7::0.128.0.128", "7::128.128.0.127", "7::0.128.128.127");
 
     for (String ipString : ipStrings) {
       // Shouldn't hit DNS, because it's an IP string literal.
@@ -167,6 +167,58 @@
     }
   }
 
+  // see https://github.com/google/guava/issues/2587
+  private static final ImmutableSet<String> SCOPE_IDS =
+      ImmutableSet.of("eno1", "en1", "eth0", "X", "1", "2", "14", "20");
+
+  public void testIPv4AddressWithScopeId() {
+    ImmutableSet<String> ipStrings = ImmutableSet.of("1.2.3.4", "192.168.0.1");
+    for (String ipString : ipStrings) {
+      for (String scopeId : SCOPE_IDS) {
+        String withScopeId = ipString + "%" + scopeId;
+        assertFalse(
+            "InetAddresses.isInetAddress(" + withScopeId + ") should be false but was true",
+            InetAddresses.isInetAddress(withScopeId));
+      }
+    }
+  }
+
+  public void testDottedQuadAddressWithScopeId() {
+    ImmutableSet<String> ipStrings =
+        ImmutableSet.of("7::0.128.0.127", "7::0.128.0.128", "7::128.128.0.127", "7::0.128.128.127");
+    for (String ipString : ipStrings) {
+      for (String scopeId : SCOPE_IDS) {
+        String withScopeId = ipString + "%" + scopeId;
+        assertFalse(
+            "InetAddresses.isInetAddress(" + withScopeId + ") should be false but was true",
+            InetAddresses.isInetAddress(withScopeId));
+      }
+    }
+  }
+
+  public void testIPv6AddressWithScopeId() {
+    ImmutableSet<String> ipStrings =
+        ImmutableSet.of(
+            "0:0:0:0:0:0:0:1",
+            "fe80::a",
+            "fe80::1",
+            "fe80::2",
+            "fe80::42",
+            "fe80::3dd0:7f8e:57b7:34d5",
+            "fe80::71a3:2b00:ddd3:753f",
+            "fe80::8b2:d61e:e5c:b333",
+            "fe80::b059:65f4:e877:c40");
+    for (String ipString : ipStrings) {
+      for (String scopeId : SCOPE_IDS) {
+        String withScopeId = ipString + "%" + scopeId;
+        assertTrue(
+            "InetAddresses.isInetAddress(" + withScopeId + ") should be true but was false",
+            InetAddresses.isInetAddress(withScopeId));
+        assertEquals(InetAddresses.forString(withScopeId), InetAddresses.forString(ipString));
+      }
+    }
+  }
+
   public void testToAddrStringIPv4() {
     // Don't need to test IPv4 much; it just calls getHostAddress().
     assertEquals("1.2.3.4", InetAddresses.toAddrString(InetAddresses.forString("1.2.3.4")));
@@ -315,34 +367,30 @@
   }
 
   public void testCompatIPv4Addresses() {
-    String[] nonCompatAddresses = {
-      "3ffe::1", "::", "::1",
-    };
+    ImmutableSet<String> nonCompatAddresses = ImmutableSet.of("3ffe::1", "::", "::1");
 
-    for (int i = 0; i < nonCompatAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(nonCompatAddresses[i]);
+    for (String nonCompatAddress : nonCompatAddresses) {
+      InetAddress ip = InetAddresses.forString(nonCompatAddress);
       assertFalse(InetAddresses.isCompatIPv4Address((Inet6Address) ip));
       try {
         InetAddresses.getCompatIPv4Address((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + nonCompatAddresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + nonCompatAddress + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
 
-    String[] validCompatAddresses = {
-      "::1.2.3.4", "::102:304",
-    };
+    ImmutableSet<String> validCompatAddresses = ImmutableSet.of("::1.2.3.4", "::102:304");
     String compatStr = "1.2.3.4";
     InetAddress compat = InetAddresses.forString(compatStr);
 
-    for (int i = 0; i < validCompatAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(validCompatAddresses[i]);
-      assertTrue("checking '" + validCompatAddresses[i] + "'", ip instanceof Inet6Address);
+    for (String validCompatAddress : validCompatAddresses) {
+      InetAddress ip = InetAddresses.forString(validCompatAddress);
+      assertTrue("checking '" + validCompatAddress + "'", ip instanceof Inet6Address);
       assertTrue(
-          "checking '" + validCompatAddresses[i] + "'",
+          "checking '" + validCompatAddress + "'",
           InetAddresses.isCompatIPv4Address((Inet6Address) ip));
       assertEquals(
-          "checking '" + validCompatAddresses[i] + "'",
+          "checking '" + validCompatAddress + "'",
           compat,
           InetAddresses.getCompatIPv4Address((Inet6Address) ip));
     }
@@ -389,16 +437,14 @@
   }
 
   public void test6to4Addresses() {
-    String[] non6to4Addresses = {
-      "::1.2.3.4", "3ffe::1", "::", "::1",
-    };
+    ImmutableSet<String> non6to4Addresses = ImmutableSet.of("::1.2.3.4", "3ffe::1", "::", "::1");
 
-    for (int i = 0; i < non6to4Addresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(non6to4Addresses[i]);
+    for (String non6to4Address : non6to4Addresses) {
+      InetAddress ip = InetAddresses.forString(non6to4Address);
       assertFalse(InetAddresses.is6to4Address((Inet6Address) ip));
       try {
         InetAddresses.get6to4IPv4Address((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + non6to4Addresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + non6to4Address + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
@@ -413,16 +459,14 @@
   }
 
   public void testTeredoAddresses() {
-    String[] nonTeredoAddresses = {
-      "::1.2.3.4", "3ffe::1", "::", "::1",
-    };
+    ImmutableSet<String> nonTeredoAddresses = ImmutableSet.of("::1.2.3.4", "3ffe::1", "::", "::1");
 
-    for (int i = 0; i < nonTeredoAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(nonTeredoAddresses[i]);
+    for (String nonTeredoAddress : nonTeredoAddresses) {
+      InetAddress ip = InetAddresses.forString(nonTeredoAddress);
       assertFalse(InetAddresses.isTeredoAddress((Inet6Address) ip));
       try {
         InetAddresses.getTeredoInfo((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + nonTeredoAddresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + nonTeredoAddress + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
@@ -457,37 +501,39 @@
 
   public void testIsatapAddresses() {
     InetAddress ipv4 = InetAddresses.forString("1.2.3.4");
-    String[] validIsatapAddresses = {
-      "2001:db8::5efe:102:304",
-      "2001:db8::100:5efe:102:304", // Private Multicast? Not likely.
-      "2001:db8::200:5efe:102:304",
-      "2001:db8::300:5efe:102:304" // Public Multicast? Also unlikely.
-    };
-    String[] nonIsatapAddresses = {
-      "::1.2.3.4",
-      "3ffe::1",
-      "::",
-      "::1",
-      "2001:db8::0040:5efe:102:304",
-      "2001:db8::5ffe:102:304",
-      "2001:db8::5eff:102:304",
-      "2001:0:102:203:200:5efe:506:708", // Teredo address; not ISATAP
-    };
+    ImmutableSet<String> validIsatapAddresses =
+        ImmutableSet.of(
+            "2001:db8::5efe:102:304",
+            "2001:db8::100:5efe:102:304", // Private Multicast? Not likely.
+            "2001:db8::200:5efe:102:304",
+            "2001:db8::300:5efe:102:304" // Public Multicast? Also unlikely.
+            );
+    ImmutableSet<String> nonIsatapAddresses =
+        ImmutableSet.of(
+            "::1.2.3.4",
+            "3ffe::1",
+            "::",
+            "::1",
+            "2001:db8::0040:5efe:102:304",
+            "2001:db8::5ffe:102:304",
+            "2001:db8::5eff:102:304",
+            "2001:0:102:203:200:5efe:506:708" // Teredo address; not ISATAP
+            );
 
-    for (int i = 0; i < validIsatapAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(validIsatapAddresses[i]);
+    for (String validIsatapAddress : validIsatapAddresses) {
+      InetAddress ip = InetAddresses.forString(validIsatapAddress);
       assertTrue(InetAddresses.isIsatapAddress((Inet6Address) ip));
       assertEquals(
-          "checking '" + validIsatapAddresses[i] + "'",
+          "checking '" + validIsatapAddress + "'",
           ipv4,
           InetAddresses.getIsatapIPv4Address((Inet6Address) ip));
     }
-    for (int i = 0; i < nonIsatapAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(nonIsatapAddresses[i]);
+    for (String nonIsatapAddress : nonIsatapAddresses) {
+      InetAddress ip = InetAddresses.forString(nonIsatapAddress);
       assertFalse(InetAddresses.isIsatapAddress((Inet6Address) ip));
       try {
         InetAddresses.getIsatapIPv4Address((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + nonIsatapAddresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + nonIsatapAddress + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
@@ -525,75 +571,77 @@
 
   public void testGetCoercedIPv4Address() {
     // Check that a coerced IPv4 address is unaltered.
-    InetAddress localHost4 = InetAddresses.forString("127.0.0.1");
-    assertEquals(localHost4, InetAddresses.getCoercedIPv4Address(localHost4));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("127.0.0.1")))
+        .isEqualTo(InetAddresses.forString("127.0.0.1"));
 
     // ::1 special case
-    assertEquals(localHost4, InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1")))
+        .isEqualTo(InetAddresses.forString("127.0.0.1"));
 
     // :: special case
-    assertEquals(
-        InetAddresses.forString("0.0.0.0"),
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::")))
+        .isEqualTo(InetAddresses.forString("0.0.0.0"));
 
     // test compat address (should be hashed)
-    assertTrue(
-        InetAddresses.forString("1.2.3.4")
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1.2.3.4")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1.2.3.4")))
+        .isNotEqualTo(InetAddresses.forString("1.2.3.4"));
 
     // test 6to4 address (should be hashed)
-    assertTrue(
-        InetAddresses.forString("1.2.3.4")
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")))
+        .isNotEqualTo(InetAddresses.forString("1.2.3.4"));
 
     // 2 6to4 addresses differing in the embedded IPv4 address should
     // hash to the different values.
-    assertTrue(
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1"))
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0506:0708::1")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")))
+        .isNotEqualTo(
+            InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0506:0708::1")));
 
     // 2 6to4 addresses NOT differing in the embedded IPv4 address should
     // hash to the same value.
-    assertTrue(
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1"))
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::2")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")))
+        .isEqualTo(
+            InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::2")));
 
     // test Teredo address (should be hashed)
-    assertTrue(
-        InetAddresses.forString("192.0.2.45")
-            != InetAddresses.getCoercedIPv4Address(
-                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")));
+    assertThat(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")))
+        .isNotEqualTo(InetAddresses.forString("192.0.2.45"));
 
-    // 2 Teredo addresses differing in the embedded IPv4 address should
-    // hash to the different values.
-    assertTrue(
-        InetAddresses.getCoercedIPv4Address(
-                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2"))
-            != InetAddresses.getCoercedIPv4Address(
-                InetAddresses.forString("2001:0000:4136:e379:8000:63bf:3fff:fdd2")));
+    // 2 Teredo addresses differing in their embedded IPv4 addresses should hash to different
+    // values.
+    assertThat(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")))
+        .isNotEqualTo(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd3")));
 
-    // 2 Teredo addresses NOT differing in the embedded IPv4 address should
-    // hash to the same value.
-    assertEquals(
-        InetAddresses.getCoercedIPv4Address(
-            InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")),
-        InetAddresses.getCoercedIPv4Address(
-            InetAddresses.forString("2001:0000:4136:e378:9000:63bf:3fff:fdd2")));
+    // 2 Teredo addresses NOT differing in the their embedded IPv4 addresses should hash to the same
+    // value.
+    assertThat(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")))
+        .isEqualTo(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:5136:f378:9000:73bf:3fff:fdd2")));
 
     // Test that an address hashes in to the 224.0.0.0/3 number-space.
-    InetAddress coerced =
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2001:4860::1"));
-    assertTrue(0xe0000000 <= InetAddresses.coerceToInteger(coerced));
-    assertTrue(InetAddresses.coerceToInteger(coerced) <= 0xfffffffe);
+    int coercedInt =
+        InetAddresses.coerceToInteger(
+            InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2001:4860::1")));
+    assertThat(coercedInt).isAtLeast(0xe0000000);
+    assertThat(coercedInt).isAtMost(0xfffffffe);
   }
 
-  public void testToInteger() {
-    InetAddress ipv4Addr = InetAddresses.forString("127.0.0.1");
-    assertEquals(0x7f000001, InetAddresses.coerceToInteger(ipv4Addr));
+  public void testCoerceToInteger() {
+    assertThat(InetAddresses.coerceToInteger(InetAddresses.forString("127.0.0.1")))
+        .isEqualTo(0x7f000001);
   }
 
   public void testFromInteger() {
-    assertEquals(InetAddresses.fromInteger(0x7f000001), InetAddresses.forString("127.0.0.1"));
+    assertThat(InetAddresses.fromInteger(0x7f000001))
+        .isEqualTo(InetAddresses.forString("127.0.0.1"));
   }
 
   public void testFromLittleEndianByteArray() throws UnknownHostException {
@@ -722,4 +770,80 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  public void testFromIpv4BigIntegerThrowsLessThanZero() {
+    try {
+      InetAddresses.fromIPv4BigInteger(BigInteger.valueOf(-1L));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals("BigInteger must be greater than or equal to 0", expected.getMessage());
+    }
+  }
+
+  public void testFromIpv6BigIntegerThrowsLessThanZero() {
+    try {
+      InetAddresses.fromIPv6BigInteger(BigInteger.valueOf(-1L));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals("BigInteger must be greater than or equal to 0", expected.getMessage());
+    }
+  }
+
+  public void testFromIpv4BigIntegerValid() {
+    checkBigIntegerConversion("0.0.0.0", BigInteger.ZERO);
+    checkBigIntegerConversion("0.0.0.1", BigInteger.ONE);
+    checkBigIntegerConversion("127.255.255.255", BigInteger.valueOf(Integer.MAX_VALUE));
+    checkBigIntegerConversion(
+        "255.255.255.254", BigInteger.valueOf(Integer.MAX_VALUE).multiply(BigInteger.valueOf(2)));
+    checkBigIntegerConversion(
+        "255.255.255.255", BigInteger.ONE.shiftLeft(32).subtract(BigInteger.ONE));
+  }
+
+  public void testFromIpv6BigIntegerValid() {
+    checkBigIntegerConversion("::", BigInteger.ZERO);
+    checkBigIntegerConversion("::1", BigInteger.ONE);
+    checkBigIntegerConversion("::7fff:ffff", BigInteger.valueOf(Integer.MAX_VALUE));
+    checkBigIntegerConversion("::7fff:ffff:ffff:ffff", BigInteger.valueOf(Long.MAX_VALUE));
+    checkBigIntegerConversion(
+        "::ffff:ffff:ffff:ffff", BigInteger.ONE.shiftLeft(64).subtract(BigInteger.ONE));
+    checkBigIntegerConversion(
+        "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
+        BigInteger.ONE.shiftLeft(128).subtract(BigInteger.ONE));
+  }
+
+  public void testFromIpv4BigIntegerInputTooLarge() {
+    try {
+      InetAddresses.fromIPv4BigInteger(BigInteger.ONE.shiftLeft(32).add(BigInteger.ONE));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals(
+          "BigInteger cannot be converted to InetAddress because it has more than 4 bytes:"
+              + " 4294967297",
+          expected.getMessage());
+    }
+  }
+
+  public void testFromIpv6BigIntegerInputTooLarge() {
+    try {
+      InetAddresses.fromIPv6BigInteger(BigInteger.ONE.shiftLeft(128).add(BigInteger.ONE));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals(
+          "BigInteger cannot be converted to InetAddress because it has more than 16 bytes:"
+              + " 340282366920938463463374607431768211457",
+          expected.getMessage());
+    }
+  }
+
+  /** Checks that the IP converts to the big integer and the big integer converts to the IP. */
+  private static void checkBigIntegerConversion(String ip, BigInteger bigIntegerIp) {
+    InetAddress address = InetAddresses.forString(ip);
+    boolean isIpv6 = address instanceof Inet6Address;
+    assertEquals(bigIntegerIp, InetAddresses.toBigInteger(address));
+    assertEquals(
+        address,
+        isIpv6
+            ? InetAddresses.fromIPv6BigInteger(bigIntegerIp)
+            : InetAddresses.fromIPv4BigInteger(bigIntegerIp));
+  }
 }
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 126076e..09602b7 100644
--- a/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
+++ b/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
@@ -63,6 +63,8 @@
           "f_a",
           "foo.net.us\uFF61ocm",
           "woo.com.",
+          "8server.shop",
+          "123.cn",
           "a" + DELTA + "b.com",
           ALMOST_TOO_MANY_LEVELS,
           ALMOST_TOO_LONG);
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 7dfa9b8..cec3cdd 100644
--- a/android/guava-tests/test/com/google/common/net/MediaTypeTest.java
+++ b/android/guava-tests/test/com/google/common/net/MediaTypeTest.java
@@ -148,6 +148,38 @@
     }
   }
 
+  public void testCreate_nonAsciiType() {
+    try {
+      MediaType.create("…", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testCreate_nonAsciiSubtype() {
+    try {
+      MediaType.create("a", "…");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testCreate_emptyType() {
+    try {
+      MediaType.create("", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testCreate_emptySubtype() {
+    try {
+      MediaType.create("a", "");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testCreateApplicationType() {
     MediaType newType = MediaType.createApplicationType("yams");
     assertEquals("application", newType.type());
@@ -160,6 +192,12 @@
     assertEquals("yams", newType.subtype());
   }
 
+  public void testCreateFontType() {
+    MediaType newType = MediaType.createFontType("yams");
+    assertEquals("font", newType.type());
+    assertEquals("yams", newType.subtype());
+  }
+
   public void testCreateImageType() {
     MediaType newType = MediaType.createImageType("yams");
     assertEquals("image", newType.type());
@@ -225,6 +263,26 @@
     }
   }
 
+  public void testWithParameters_nonAsciiParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    ImmutableListMultimap<String, String> parameters = ImmutableListMultimap.of("…", "a");
+    try {
+      mediaType.withParameters(parameters);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParameters_nonAsciiParameterValue() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    ImmutableListMultimap<String, String> parameters = ImmutableListMultimap.of("a", "…");
+    try {
+      mediaType.withParameters(parameters);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testWithParameter() {
     assertEquals(
         MediaType.parse("text/plain; a=1"), MediaType.parse("text/plain").withParameter("a", "1"));
@@ -248,6 +306,33 @@
     }
   }
 
+  public void testWithParameter_nonAsciiParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameter("…", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParameter_nonAsciiParameterValue() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameter("a", "…");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParameter_emptyParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameter("", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testWithParametersIterable() {
     assertEquals(
         MediaType.parse("text/plain"),
@@ -275,6 +360,24 @@
     }
   }
 
+  public void testWithParametersIterable_nonAsciiParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameters("…", ImmutableSet.of("a"));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParametersIterable_nonAsciiParameterValue() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameters("a", ImmutableSet.of("…"));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testWithParametersIterable_nullValue() {
     MediaType mediaType = MediaType.parse("text/plain");
     try {
@@ -507,10 +610,13 @@
   public void testToString() {
     assertEquals("text/plain", MediaType.create("text", "plain").toString());
     assertEquals(
-        "text/plain; something=\"cr@zy\"; something-else=\"crazy with spaces\"",
+        "text/plain; something=\"cr@zy\"; something-else=\"crazy with spaces\";"
+            + " and-another-thing=\"\"; normal-thing=foo",
         MediaType.create("text", "plain")
             .withParameter("something", "cr@zy")
             .withParameter("something-else", "crazy with spaces")
+            .withParameter("and-another-thing", "")
+            .withParameter("normal-thing", "foo")
             .toString());
   }
 }
diff --git a/android/guava-tests/test/com/google/common/primitives/DoublesTest.java b/android/guava-tests/test/com/google/common/primitives/DoublesTest.java
index 293fdb1..871b84c 100644
--- a/android/guava-tests/test/com/google/common/primitives/DoublesTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/DoublesTest.java
@@ -194,6 +194,7 @@
     assertEquals(-1, Doubles.lastIndexOf(new double[] {NaN, 5.0}, NaN));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Doubles.max();
@@ -216,6 +217,7 @@
     assertTrue(Double.isNaN(Doubles.max(VALUES)));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Doubles.min();
diff --git a/android/guava-tests/test/com/google/common/primitives/FloatsTest.java b/android/guava-tests/test/com/google/common/primitives/FloatsTest.java
index 7eb0c5b..fd59ad4 100644
--- a/android/guava-tests/test/com/google/common/primitives/FloatsTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/FloatsTest.java
@@ -186,6 +186,7 @@
     assertEquals(-1, Floats.lastIndexOf(new float[] {NaN, 5f}, NaN));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Floats.max();
@@ -207,6 +208,7 @@
     assertTrue(Float.isNaN(Floats.max(VALUES)));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Floats.min();
diff --git a/android/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java b/android/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java
index b55d4ba..4d98836 100644
--- a/android/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java
@@ -90,7 +90,8 @@
      * We don't guarantee the same-as property, so we aren't obligated to test it. However, it's
      * useful in testing - when two things are the same then one can't have bugs the other doesn't.
      */
-    assertThat(ImmutableDoubleArray.copyOf(new double[0])).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(new double[0]))
+        .isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_array_nonempty() {
@@ -102,7 +103,7 @@
 
   public void testCopyOf_iterable_notCollection_empty() {
     Iterable<Double> iterable = iterable(Collections.<Double>emptySet());
-    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_iterable_notCollection_nonempty() {
@@ -114,7 +115,7 @@
 
   public void testCopyOf_iterable_collection_empty() {
     Iterable<Double> iterable = Collections.emptySet();
-    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_iterable_collection_nonempty() {
@@ -126,7 +127,7 @@
 
   public void testCopyOf_collection_empty() {
     Collection<Double> iterable = Collections.emptySet();
-    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_collection_nonempty() {
@@ -331,9 +332,9 @@
     ImmutableDoubleArray iia1 = ImmutableDoubleArray.of(5);
     ImmutableDoubleArray iia3 = ImmutableDoubleArray.of(5, 25, 125);
 
-    assertThat(iia0.subArray(0, 0)).isSameAs(ImmutableDoubleArray.of());
-    assertThat(iia1.subArray(0, 0)).isSameAs(ImmutableDoubleArray.of());
-    assertThat(iia1.subArray(1, 1)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(iia0.subArray(0, 0)).isSameInstanceAs(ImmutableDoubleArray.of());
+    assertThat(iia1.subArray(0, 0)).isSameInstanceAs(ImmutableDoubleArray.of());
+    assertThat(iia1.subArray(1, 1)).isSameInstanceAs(ImmutableDoubleArray.of());
     assertThat(iia1.subArray(0, 1).asList()).containsExactly(5.0);
     assertThat(iia3.subArray(0, 2).asList()).containsExactly(5.0, 25.0).inOrder();
     assertThat(iia3.subArray(1, 3).asList()).containsExactly(25.0, 125.0).inOrder();
@@ -400,9 +401,9 @@
 
   @GwtIncompatible // SerializableTester
   public void testSerialization() {
-    assertThat(reserialize(ImmutableDoubleArray.of())).isSameAs(ImmutableDoubleArray.of());
+    assertThat(reserialize(ImmutableDoubleArray.of())).isSameInstanceAs(ImmutableDoubleArray.of());
     assertThat(reserialize(ImmutableDoubleArray.of(0, 1).subArray(1, 1)))
-        .isSameAs(ImmutableDoubleArray.of());
+        .isSameInstanceAs(ImmutableDoubleArray.of());
 
     ImmutableDoubleArray iia = ImmutableDoubleArray.of(0, 1, 3, 6).subArray(1, 3);
     ImmutableDoubleArray iia2 = reserialize(iia);
@@ -412,14 +413,14 @@
 
   private static void assertActuallyTrims(ImmutableDoubleArray iia) {
     ImmutableDoubleArray trimmed = iia.trimmed();
-    assertThat(trimmed).isNotSameAs(iia);
+    assertThat(trimmed).isNotSameInstanceAs(iia);
 
     // Yes, this is apparently how you check array equality in Truth
     assertThat(trimmed.toArray()).isEqualTo(iia.toArray());
   }
 
   private static void assertDoesntActuallyTrim(ImmutableDoubleArray iia) {
-    assertThat(iia.trimmed()).isSameAs(iia);
+    assertThat(iia.trimmed()).isSameInstanceAs(iia);
   }
 
   @GwtIncompatible // suite
diff --git a/android/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java b/android/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java
index 7fd7dea..86274d4 100644
--- a/android/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java
@@ -88,7 +88,7 @@
      * We don't guarantee the same-as property, so we aren't obligated to test it. However, it's
      * useful in testing - when two things are the same then one can't have bugs the other doesn't.
      */
-    assertThat(ImmutableIntArray.copyOf(new int[0])).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(new int[0])).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_array_nonempty() {
@@ -100,7 +100,7 @@
 
   public void testCopyOf_iterable_notCollection_empty() {
     Iterable<Integer> iterable = iterable(Collections.<Integer>emptySet());
-    assertThat(ImmutableIntArray.copyOf(iterable)).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(iterable)).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_iterable_notCollection_nonempty() {
@@ -112,7 +112,7 @@
 
   public void testCopyOf_iterable_collection_empty() {
     Iterable<Integer> iterable = Collections.emptySet();
-    assertThat(ImmutableIntArray.copyOf(iterable)).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(iterable)).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_iterable_collection_nonempty() {
@@ -124,7 +124,7 @@
 
   public void testCopyOf_collection_empty() {
     Collection<Integer> iterable = Collections.emptySet();
-    assertThat(ImmutableIntArray.copyOf(iterable)).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(iterable)).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_collection_nonempty() {
@@ -319,9 +319,9 @@
     ImmutableIntArray iia1 = ImmutableIntArray.of(5);
     ImmutableIntArray iia3 = ImmutableIntArray.of(5, 25, 125);
 
-    assertThat(iia0.subArray(0, 0)).isSameAs(ImmutableIntArray.of());
-    assertThat(iia1.subArray(0, 0)).isSameAs(ImmutableIntArray.of());
-    assertThat(iia1.subArray(1, 1)).isSameAs(ImmutableIntArray.of());
+    assertThat(iia0.subArray(0, 0)).isSameInstanceAs(ImmutableIntArray.of());
+    assertThat(iia1.subArray(0, 0)).isSameInstanceAs(ImmutableIntArray.of());
+    assertThat(iia1.subArray(1, 1)).isSameInstanceAs(ImmutableIntArray.of());
     assertThat(iia1.subArray(0, 1).asList()).containsExactly(5);
     assertThat(iia3.subArray(0, 2).asList()).containsExactly(5, 25).inOrder();
     assertThat(iia3.subArray(1, 3).asList()).containsExactly(25, 125).inOrder();
@@ -388,9 +388,9 @@
 
   @GwtIncompatible // SerializableTester
   public void testSerialization() {
-    assertThat(reserialize(ImmutableIntArray.of())).isSameAs(ImmutableIntArray.of());
+    assertThat(reserialize(ImmutableIntArray.of())).isSameInstanceAs(ImmutableIntArray.of());
     assertThat(reserialize(ImmutableIntArray.of(0, 1).subArray(1, 1)))
-        .isSameAs(ImmutableIntArray.of());
+        .isSameInstanceAs(ImmutableIntArray.of());
 
     ImmutableIntArray iia = ImmutableIntArray.of(0, 1, 3, 6).subArray(1, 3);
     ImmutableIntArray iia2 = reserialize(iia);
@@ -400,14 +400,14 @@
 
   private static void assertActuallyTrims(ImmutableIntArray iia) {
     ImmutableIntArray trimmed = iia.trimmed();
-    assertThat(trimmed).isNotSameAs(iia);
+    assertThat(trimmed).isNotSameInstanceAs(iia);
 
     // Yes, this is apparently how you check array equality in Truth
     assertThat(trimmed.toArray()).isEqualTo(iia.toArray());
   }
 
   private static void assertDoesntActuallyTrim(ImmutableIntArray iia) {
-    assertThat(iia.trimmed()).isSameAs(iia);
+    assertThat(iia.trimmed()).isSameInstanceAs(iia);
   }
 
   @GwtIncompatible // suite
diff --git a/android/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java b/android/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java
index e8813c1..ff879ec 100644
--- a/android/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java
@@ -90,7 +90,7 @@
      * We don't guarantee the same-as property, so we aren't obligated to test it. However, it's
      * useful in testing - when two things are the same then one can't have bugs the other doesn't.
      */
-    assertThat(ImmutableLongArray.copyOf(new long[0])).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(new long[0])).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_array_nonempty() {
@@ -102,7 +102,7 @@
 
   public void testCopyOf_iterable_notCollection_empty() {
     Iterable<Long> iterable = iterable(Collections.<Long>emptySet());
-    assertThat(ImmutableLongArray.copyOf(iterable)).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(iterable)).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_iterable_notCollection_nonempty() {
@@ -114,7 +114,7 @@
 
   public void testCopyOf_iterable_collection_empty() {
     Iterable<Long> iterable = Collections.emptySet();
-    assertThat(ImmutableLongArray.copyOf(iterable)).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(iterable)).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_iterable_collection_nonempty() {
@@ -126,7 +126,7 @@
 
   public void testCopyOf_collection_empty() {
     Collection<Long> iterable = Collections.emptySet();
-    assertThat(ImmutableLongArray.copyOf(iterable)).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(iterable)).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_collection_nonempty() {
@@ -321,9 +321,9 @@
     ImmutableLongArray iia1 = ImmutableLongArray.of(5);
     ImmutableLongArray iia3 = ImmutableLongArray.of(5, 25, 125);
 
-    assertThat(iia0.subArray(0, 0)).isSameAs(ImmutableLongArray.of());
-    assertThat(iia1.subArray(0, 0)).isSameAs(ImmutableLongArray.of());
-    assertThat(iia1.subArray(1, 1)).isSameAs(ImmutableLongArray.of());
+    assertThat(iia0.subArray(0, 0)).isSameInstanceAs(ImmutableLongArray.of());
+    assertThat(iia1.subArray(0, 0)).isSameInstanceAs(ImmutableLongArray.of());
+    assertThat(iia1.subArray(1, 1)).isSameInstanceAs(ImmutableLongArray.of());
     assertThat(iia1.subArray(0, 1).asList()).containsExactly(5L);
     assertThat(iia3.subArray(0, 2).asList()).containsExactly(5L, 25L).inOrder();
     assertThat(iia3.subArray(1, 3).asList()).containsExactly(25L, 125L).inOrder();
@@ -390,9 +390,9 @@
 
   @GwtIncompatible // SerializableTester
   public void testSerialization() {
-    assertThat(reserialize(ImmutableLongArray.of())).isSameAs(ImmutableLongArray.of());
+    assertThat(reserialize(ImmutableLongArray.of())).isSameInstanceAs(ImmutableLongArray.of());
     assertThat(reserialize(ImmutableLongArray.of(0, 1).subArray(1, 1)))
-        .isSameAs(ImmutableLongArray.of());
+        .isSameInstanceAs(ImmutableLongArray.of());
 
     ImmutableLongArray iia = ImmutableLongArray.of(0, 1, 3, 6).subArray(1, 3);
     ImmutableLongArray iia2 = reserialize(iia);
@@ -402,14 +402,14 @@
 
   private static void assertActuallyTrims(ImmutableLongArray iia) {
     ImmutableLongArray trimmed = iia.trimmed();
-    assertThat(trimmed).isNotSameAs(iia);
+    assertThat(trimmed).isNotSameInstanceAs(iia);
 
     // Yes, this is apparently how you check array equality in Truth
     assertThat(trimmed.toArray()).isEqualTo(iia.toArray());
   }
 
   private static void assertDoesntActuallyTrim(ImmutableLongArray iia) {
-    assertThat(iia.trimmed()).isSameAs(iia);
+    assertThat(iia.trimmed()).isSameInstanceAs(iia);
   }
 
   @GwtIncompatible // suite
diff --git a/android/guava-tests/test/com/google/common/primitives/IntsTest.java b/android/guava-tests/test/com/google/common/primitives/IntsTest.java
index 4487897..7215422 100644
--- a/android/guava-tests/test/com/google/common/primitives/IntsTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/IntsTest.java
@@ -155,6 +155,7 @@
     assertEquals(3, Ints.lastIndexOf(new int[] {(int) 2, (int) 3, (int) 2, (int) 3}, (int) 3));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Ints.max();
@@ -169,6 +170,7 @@
     assertEquals((int) 9, Ints.max((int) 8, (int) 6, (int) 7, (int) 5, (int) 3, (int) 0, (int) 9));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Ints.min();
diff --git a/android/guava-tests/test/com/google/common/primitives/ShortsTest.java b/android/guava-tests/test/com/google/common/primitives/ShortsTest.java
index bc4d951..0816c69 100644
--- a/android/guava-tests/test/com/google/common/primitives/ShortsTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/ShortsTest.java
@@ -175,6 +175,7 @@
         3, Shorts.lastIndexOf(new short[] {(short) 2, (short) 3, (short) 2, (short) 3}, (short) 3));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Shorts.max();
@@ -191,6 +192,7 @@
         Shorts.max((short) 8, (short) 6, (short) 7, (short) 5, (short) 3, (short) 0, (short) 9));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Shorts.min();
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 58ebbbe..8bccae7 100644
--- a/android/guava-tests/test/com/google/common/reflect/ClassPathTest.java
+++ b/android/guava-tests/test/com/google/common/reflect/ClassPathTest.java
@@ -37,17 +37,14 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
-import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.Permission;
 import java.security.PermissionCollection;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
@@ -59,15 +56,16 @@
 /** Functional tests of {@link ClassPath}. */
 public class ClassPathTest extends TestCase {
   private static final Logger log = Logger.getLogger(ClassPathTest.class.getName());
+  private static final File FILE = new File(".");
 
   public void testEquals() {
     new EqualsTester()
         .addEqualityGroup(classInfo(ClassPathTest.class), classInfo(ClassPathTest.class))
         .addEqualityGroup(classInfo(Test.class), classInfo(Test.class, getClass().getClassLoader()))
         .addEqualityGroup(
-            new ResourceInfo("a/b/c.txt", getClass().getClassLoader()),
-            new ResourceInfo("a/b/c.txt", getClass().getClassLoader()))
-        .addEqualityGroup(new ResourceInfo("x.txt", getClass().getClassLoader()))
+            new ResourceInfo(FILE, "a/b/c.txt", getClass().getClassLoader()),
+            new ResourceInfo(FILE, "a/b/c.txt", getClass().getClassLoader()))
+        .addEqualityGroup(new ResourceInfo(FILE, "x.txt", getClass().getClassLoader()))
         .testEquals();
   }
 
@@ -339,19 +337,20 @@
 
   public void testGetSimpleName() {
     ClassLoader classLoader = getClass().getClassLoader();
-    assertEquals("Foo", new ClassInfo("Foo.class", classLoader).getSimpleName());
-    assertEquals("Foo", new ClassInfo("a/b/Foo.class", classLoader).getSimpleName());
-    assertEquals("Foo", new ClassInfo("a/b/Bar$Foo.class", classLoader).getSimpleName());
-    assertEquals("", new ClassInfo("a/b/Bar$1.class", classLoader).getSimpleName());
-    assertEquals("Foo", new ClassInfo("a/b/Bar$Foo.class", classLoader).getSimpleName());
-    assertEquals("", new ClassInfo("a/b/Bar$1.class", classLoader).getSimpleName());
-    assertEquals("Local", new ClassInfo("a/b/Bar$1Local.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "Foo.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "a/b/Foo.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "a/b/Bar$Foo.class", classLoader).getSimpleName());
+    assertEquals("", new ClassInfo(FILE, "a/b/Bar$1.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "a/b/Bar$Foo.class", classLoader).getSimpleName());
+    assertEquals("", new ClassInfo(FILE, "a/b/Bar$1.class", classLoader).getSimpleName());
+    assertEquals("Local", new ClassInfo(FILE, "a/b/Bar$1Local.class", classLoader).getSimpleName());
   }
 
   public void testGetPackageName() {
-    assertEquals("", new ClassInfo("Foo.class", getClass().getClassLoader()).getPackageName());
     assertEquals(
-        "a.b", new ClassInfo("a/b/Foo.class", getClass().getClassLoader()).getPackageName());
+        "", new ClassInfo(FILE, "Foo.class", getClass().getClassLoader()).getPackageName());
+    assertEquals(
+        "a.b", new ClassInfo(FILE, "a/b/Foo.class", getClass().getClassLoader()).getPackageName());
   }
 
   // Test that ResourceInfo.urls() returns identical content to ClassLoader.getResources()
@@ -464,7 +463,7 @@
   private static ResourceInfo resourceInfo(Class<?> cls) {
     String resource = cls.getName().replace('.', '/') + ".class";
     ClassLoader loader = cls.getClassLoader();
-    return ResourceInfo.of(resource, loader);
+    return ResourceInfo.of(FILE, resource, loader);
   }
 
   private static ClassInfo classInfo(Class<?> cls) {
@@ -473,7 +472,7 @@
 
   private static ClassInfo classInfo(Class<?> cls, ClassLoader classLoader) {
     String resource = cls.getName().replace('.', '/') + ".class";
-    return new ClassInfo(resource, classLoader);
+    return new ClassInfo(FILE, resource, classLoader);
   }
 
   private static Manifest manifestClasspath(String classpath) throws IOException {
@@ -518,20 +517,8 @@
     final Set<String> resources = new HashSet<>();
 
     @Override
-    protected void scanDirectory(ClassLoader loader, File root) throws IOException {
-      URI base = root.toURI();
-      for (File entry : Files.fileTraverser().depthFirstPreOrder(root)) {
-        String resourceName = new File(base.relativize(entry.toURI()).getPath()).getPath();
-        resources.add(resourceName);
-      }
-    }
-
-    @Override
-    protected void scanJarFile(ClassLoader loader, JarFile file) throws IOException {
-      Enumeration<JarEntry> entries = file.entries();
-      while (entries.hasMoreElements()) {
-        resources.add(entries.nextElement().getName());
-      }
+    protected void scanResource(ResourceInfo resource) throws IOException {
+      resources.add(resource.getResourceName());
     }
   }
 
@@ -557,13 +544,13 @@
     }
 
     @Override
-    protected void scanJarFile(ClassLoader loader, JarFile file) throws IOException {
+    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
       this.found = new File(file.getName());
       throw new StopScanningException();
     }
 
     @Override
-    protected void scanDirectory(ClassLoader loader, File root) {}
+    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 {}
diff --git a/android/guava-tests/test/com/google/common/reflect/SubtypeTester.java b/android/guava-tests/test/com/google/common/reflect/SubtypeTester.java
index dcf9626..3eec668 100644
--- a/android/guava-tests/test/com/google/common/reflect/SubtypeTester.java
+++ b/android/guava-tests/test/com/google/common/reflect/SubtypeTester.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.errorprone.annotations.RequiredModifiers;
 import java.lang.annotation.ElementType;
@@ -84,11 +85,11 @@
     Type returnType = method.getGenericReturnType();
     Type paramType = getOnlyParameterType();
     TestSubtype spec = method.getAnnotation(TestSubtype.class);
-    assertThat(TypeToken.of(paramType).isSubtypeOf(returnType))
-        .named("%s is subtype of %s", paramType, returnType)
+    assertWithMessage("%s is subtype of %s", paramType, returnType)
+        .that(TypeToken.of(paramType).isSubtypeOf(returnType))
         .isTrue();
-    assertThat(TypeToken.of(returnType).isSupertypeOf(paramType))
-        .named("%s is supertype of %s", returnType, paramType)
+    assertWithMessage("%s is supertype of %s", returnType, paramType)
+        .that(TypeToken.of(returnType).isSupertypeOf(paramType))
         .isTrue();
     if (!spec.suppressGetSubtype()) {
       assertThat(getSubtype(returnType, TypeToken.of(paramType).getRawType())).isEqualTo(paramType);
@@ -108,11 +109,11 @@
     Type returnType = method.getGenericReturnType();
     Type paramType = getOnlyParameterType();
     TestSubtype spec = method.getAnnotation(TestSubtype.class);
-    assertThat(TypeToken.of(paramType).isSubtypeOf(returnType))
-        .named("%s is subtype of %s", paramType, returnType)
+    assertWithMessage("%s is subtype of %s", paramType, returnType)
+        .that(TypeToken.of(paramType).isSubtypeOf(returnType))
         .isFalse();
-    assertThat(TypeToken.of(returnType).isSupertypeOf(paramType))
-        .named("%s is supertype of %s", returnType, paramType)
+    assertWithMessage("%s is supertype of %s", returnType, paramType)
+        .that(TypeToken.of(returnType).isSupertypeOf(paramType))
         .isFalse();
     if (!spec.suppressGetSubtype()) {
       try {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
index c7474f2..f49b962 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
@@ -462,14 +462,14 @@
       getDone(future);
       fail();
     } catch (ExecutionException e) {
-      assertThat(e.getCause()).isSameAs(expectedException);
+      assertThat(e.getCause()).isSameInstanceAs(expectedException);
     }
 
     try {
       getDoneFromTimeoutOverload(future);
       fail();
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(expectedException);
+      assertThat(e).hasCauseThat().isSameInstanceAs(expectedException);
     }
   }
 
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 d075f80..77d04ff 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
@@ -39,7 +39,7 @@
  * </ul>
  *
  * To force selection of our fallback strategies we load {@link AbstractFuture} (and all of {@code
- * com.google.common.util.concurrent} in degenerate class loaders which make certain platform
+ * com.google.common.util.concurrent}) in degenerate class loaders which make certain platform
  * classes unavailable. Then we construct a test suite so we can run the normal AbstractFutureTest
  * test methods in these degenerate classloaders.
  */
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 368e2d4..3c210ce 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
@@ -19,11 +19,13 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Range;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -78,8 +80,8 @@
     // Ensure we get a unique execution exception on each get
     assertNotSame(ee1, ee2);
 
-    assertThat(ee1).hasCauseThat().isSameAs(failure);
-    assertThat(ee2).hasCauseThat().isSameAs(failure);
+    assertThat(ee1).hasCauseThat().isSameInstanceAs(failure);
+    assertThat(ee2).hasCauseThat().isSameInstanceAs(failure);
 
     checkStackTrace(ee1);
     checkStackTrace(ee2);
@@ -155,7 +157,7 @@
       normalFuture.get();
       fail();
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(exception);
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
     }
   }
 
@@ -212,6 +214,44 @@
     assertThat(SettableFuture.create().toString()).isNotEqualTo(SettableFuture.create().toString());
   }
 
+  public void testToString_oom() throws Exception {
+    SettableFuture<Object> future = SettableFuture.create();
+    future.set(
+        new Object() {
+          @Override
+          public String toString() {
+            throw new OutOfMemoryError();
+          }
+
+          @Override
+          public int hashCode() {
+            throw new OutOfMemoryError();
+          }
+        });
+
+    String unused = future.toString();
+
+    SettableFuture<Object> future2 = SettableFuture.create();
+
+    // A more organic OOM from a toString implementation
+    Object object =
+        new Object() {
+          @Override
+          public String toString() {
+            return new String(new char[50_000]);
+          }
+        };
+    List<Object> list = Collections.singletonList(object);
+    for (int i = 0; i < 10; i++) {
+      Object[] array = new Object[500];
+      Arrays.fill(array, list);
+      list = Arrays.asList(array);
+    }
+    future2.set(list);
+
+    unused = future.toString();
+  }
+
   public void testToString_notDone() throws Exception {
     AbstractFuture<Object> testFuture =
         new AbstractFuture<Object>() {
@@ -232,6 +272,20 @@
     }
   }
 
+  public void testToString_completesDuringToString() throws Exception {
+    AbstractFuture<Object> testFuture =
+        new AbstractFuture<Object>() {
+          @Override
+          public String pendingToString() {
+            // Complete ourselves during the toString calculation
+            this.set(true);
+            return "cause=[Because this test isn't done]";
+          }
+        };
+    assertThat(testFuture.toString())
+        .matches("[^\\[]+\\[status=SUCCESS, result=\\[java.lang.Boolean@\\w+\\]\\]");
+  }
+
   /**
    * This test attempts to cause a future to wait for longer than it was requested to from a timed
    * get() call. As measurements of time are prone to flakiness, it tries to assert based on ranges
@@ -290,11 +344,11 @@
     testFuture3.setFuture(testFuture2);
     assertThat(testFuture3.toString())
         .matches(
-            "[^\\[]+\\[status=PENDING, info=\\[setFuture="
-                + "\\[[^\\[]+\\[status=PENDING, info=\\[cause=\\[Someday...\\]\\]\\]\\]\\]\\]");
+            "[^\\[]+\\[status=PENDING, setFuture=\\[[^\\[]+\\[status=PENDING,"
+                + " info=\\[cause=\\[Someday...]]]]]");
     testFuture2.set("result string");
     assertThat(testFuture3.toString())
-        .matches("[^\\[]+\\[status=SUCCESS, result=\\[result string\\]\\]");
+        .matches("[^\\[]+\\[status=SUCCESS, result=\\[java.lang.String@\\w+\\]\\]");
   }
 
   public void testToString_cancelled() throws Exception {
@@ -381,7 +435,7 @@
     final ExecutorService executor = Executors.newFixedThreadPool(barrier.getParties());
     final AtomicReference<AbstractFuture<String>> currentFuture = Atomics.newReference();
     final AtomicInteger numSuccessfulSetCalls = new AtomicInteger();
-    Callable<Void> completeSucessFullyRunnable =
+    Callable<Void> completeSuccessfullyRunnable =
         new Callable<Void>() {
           @Override
           public Void call() {
@@ -416,7 +470,7 @@
             return null;
           }
         };
-    Callable<Void> setFutureCompleteSucessFullyRunnable =
+    Callable<Void> setFutureCompleteSuccessfullyRunnable =
         new Callable<Void>() {
           ListenableFuture<String> future = Futures.immediateFuture("setFuture");
 
@@ -497,10 +551,10 @@
           }
         };
     List<Callable<?>> allTasks = new ArrayList<>();
-    allTasks.add(completeSucessFullyRunnable);
+    allTasks.add(completeSuccessfullyRunnable);
     allTasks.add(completeExceptionallyRunnable);
     allTasks.add(cancelRunnable);
-    allTasks.add(setFutureCompleteSucessFullyRunnable);
+    allTasks.add(setFutureCompleteSuccessfullyRunnable);
     allTasks.add(setFutureCompleteExceptionallyRunnable);
     allTasks.add(setFutureCancelRunnable);
     for (int k = 0; k < 50; k++) {
@@ -563,24 +617,24 @@
     final ExecutorService executor = Executors.newFixedThreadPool(barrier.getParties());
     final AtomicReference<AbstractFuture<String>> currentFuture = Atomics.newReference();
     final AtomicReference<AbstractFuture<String>> setFutureFuture = Atomics.newReference();
-    final AtomicBoolean setFutureSetSucess = new AtomicBoolean();
-    final AtomicBoolean setFutureCompletionSucess = new AtomicBoolean();
-    final AtomicBoolean cancellationSucess = new AtomicBoolean();
+    final AtomicBoolean setFutureSetSuccess = new AtomicBoolean();
+    final AtomicBoolean setFutureCompletionSuccess = new AtomicBoolean();
+    final AtomicBoolean cancellationSuccess = new AtomicBoolean();
     Runnable cancelRunnable =
         new Runnable() {
           @Override
           public void run() {
-            cancellationSucess.set(currentFuture.get().cancel(true));
+            cancellationSuccess.set(currentFuture.get().cancel(true));
             awaitUnchecked(barrier);
           }
         };
-    Runnable setFutureCompleteSucessFullyRunnable =
+    Runnable setFutureCompleteSuccessfullyRunnable =
         new Runnable() {
           @Override
           public void run() {
             AbstractFuture<String> future = setFutureFuture.get();
-            setFutureSetSucess.set(currentFuture.get().setFuture(future));
-            setFutureCompletionSucess.set(future.set("hello-async-world"));
+            setFutureSetSuccess.set(currentFuture.get().setFuture(future));
+            setFutureCompletionSuccess.set(future.set("hello-async-world"));
             awaitUnchecked(barrier);
           }
         };
@@ -626,7 +680,7 @@
         };
     List<Runnable> allTasks = new ArrayList<>();
     allTasks.add(cancelRunnable);
-    allTasks.add(setFutureCompleteSucessFullyRunnable);
+    allTasks.add(setFutureCompleteSuccessfullyRunnable);
     for (int k = 0; k < size; k++) {
       // For each listener we add a task that submits it to the executor directly for the blocking
       // get usecase and another task that adds it as a listener to the future to exercise both
@@ -659,12 +713,12 @@
       Object result = Iterables.getOnlyElement(finalResults);
       if (result == CancellationException.class) {
         assertTrue(future.isCancelled());
-        assertTrue(cancellationSucess.get());
+        assertTrue(cancellationSuccess.get());
         // cancellation can interleave in 3 ways
         // 1. prior to setFuture
         // 2. after setFuture before set() on the future assigned
         // 3. after setFuture and set() are called but before the listener completes.
-        if (!setFutureSetSucess.get() || !setFutureCompletionSucess.get()) {
+        if (!setFutureSetSuccess.get() || !setFutureCompletionSuccess.get()) {
           // If setFuture fails or set on the future fails then it must be because that future was
           // cancelled
           assertTrue(setFuture.isCancelled());
@@ -672,14 +726,14 @@
         }
       } else {
         // set on the future completed
-        assertFalse(cancellationSucess.get());
-        assertTrue(setFutureSetSucess.get());
-        assertTrue(setFutureCompletionSucess.get());
+        assertFalse(cancellationSuccess.get());
+        assertTrue(setFutureSetSuccess.get());
+        assertTrue(setFutureCompletionSuccess.get());
       }
       // reset for next iteration
-      setFutureSetSucess.set(false);
-      setFutureCompletionSucess.set(false);
-      cancellationSucess.set(false);
+      setFutureSetSuccess.set(false);
+      setFutureCompletionSuccess.set(false);
+      cancellationSuccess.set(false);
       finalResults.clear();
     }
     executor.shutdown();
@@ -696,17 +750,17 @@
     final ExecutorService executor = Executors.newFixedThreadPool(barrier.getParties());
     final AtomicReference<AbstractFuture<String>> currentFuture = Atomics.newReference();
     final AtomicBoolean setFutureSuccess = new AtomicBoolean();
-    final AtomicBoolean cancellationSucess = new AtomicBoolean();
+    final AtomicBoolean cancellationSuccess = new AtomicBoolean();
     Callable<Void> cancelRunnable =
         new Callable<Void>() {
           @Override
           public Void call() {
-            cancellationSucess.set(currentFuture.get().cancel(true));
+            cancellationSuccess.set(currentFuture.get().cancel(true));
             awaitUnchecked(barrier);
             return null;
           }
         };
-    Callable<Void> setFutureCompleteSucessFullyRunnable =
+    Callable<Void> setFutureCompleteSuccessfullyRunnable =
         new Callable<Void>() {
           final ListenableFuture<String> future = Futures.immediateFuture("hello");
 
@@ -736,7 +790,7 @@
         };
     List<Callable<?>> allTasks = new ArrayList<>();
     allTasks.add(cancelRunnable);
-    allTasks.add(setFutureCompleteSucessFullyRunnable);
+    allTasks.add(setFutureCompleteSuccessfullyRunnable);
     allTasks.add(Executors.callable(collectResultsRunnable));
     assertEquals(allTasks.size() + 1, barrier.getParties()); // sanity check
     for (int i = 0; i < 1000; i++) {
@@ -754,15 +808,15 @@
       Object result = Iterables.getOnlyElement(finalResults);
       if (result == CancellationException.class) {
         assertTrue(future.isCancelled());
-        assertTrue(cancellationSucess.get());
+        assertTrue(cancellationSuccess.get());
         assertFalse(setFutureSuccess.get());
       } else {
         assertTrue(setFutureSuccess.get());
-        assertFalse(cancellationSucess.get());
+        assertFalse(cancellationSuccess.get());
       }
       // reset for next iteration
       setFutureSuccess.set(false);
-      cancellationSucess.set(false);
+      cancellationSuccess.set(false);
       finalResults.clear();
     }
     executor.shutdown();
@@ -783,6 +837,23 @@
     assertTrue(orig.isDone());
   }
 
+  // Verify that StackOverflowError in a long chain of SetFuture doesn't cause the entire toString
+  // call to fail
+  @GwtIncompatible
+  @AndroidIncompatible
+  public void testSetFutureToString_stackOverflow() {
+    SettableFuture<String> orig = SettableFuture.create();
+    SettableFuture<String> prev = orig;
+    for (int i = 0; i < 100000; i++) {
+      SettableFuture<String> curr = SettableFuture.create();
+      prev.setFuture(curr);
+      prev = curr;
+    }
+    // orig represents the 'outermost' future
+    assertThat(orig.toString())
+        .contains("Exception thrown from implementation: class java.lang.StackOverflowError");
+  }
+
   public void testSetFuture_misbehavingFutureThrows() throws Exception {
     SettableFuture<String> future = SettableFuture.create();
     ListenableFuture<String> badFuture =
@@ -886,7 +957,7 @@
   public void testSetFutureSelf_toString() {
     SettableFuture<String> orig = SettableFuture.create();
     orig.setFuture(orig);
-    assertThat(orig.toString()).contains("[status=PENDING, info=[setFuture=[this future]]]");
+    assertThat(orig.toString()).contains("[status=PENDING, setFuture=[this future]]");
   }
 
   public void testSetSelf_toString() {
@@ -895,21 +966,33 @@
     assertThat(orig.toString()).contains("[status=SUCCESS, result=[this future]]");
   }
 
+  public void testSetFutureSelf_toStringException() {
+    SettableFuture<String> orig = SettableFuture.create();
+    orig.setFuture(
+        new AbstractFuture<String>() {
+          @Override
+          public String toString() {
+            throw new NullPointerException();
+          }
+        });
+    assertThat(orig.toString())
+        .contains(
+            "[status=PENDING, setFuture=[Exception thrown from implementation: class"
+                + " java.lang.NullPointerException]]");
+  }
+
   public void testSetIndirectSelf_toString() {
     final SettableFuture<Object> orig = SettableFuture.create();
     // unlike the above this indirection defeats the trivial cycle detection and causes a SOE
-    orig.set(
-        new Object() {
+    orig.setFuture(
+        new ForwardingListenableFuture<Object>() {
           @Override
-          public String toString() {
-            return orig.toString();
+          protected ListenableFuture<Object> delegate() {
+            return orig;
           }
         });
-    try {
-      orig.toString();
-      fail();
-    } catch (StackOverflowError expected) {
-    }
+    assertThat(orig.toString())
+        .contains("Exception thrown from implementation: class java.lang.StackOverflowError");
   }
 
   // Regression test for a case where we would fail to execute listeners immediately on done futures
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
index 74f5d7c..7cad8b0 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
@@ -68,7 +68,7 @@
         service.startAsync().awaitRunning();
         fail();
       } catch (RuntimeException e) {
-        assertThat(e).hasCauseThat().isSameAs(exception);
+        assertThat(e).hasCauseThat().isSameInstanceAs(exception);
       }
       assertEquals(Service.State.FAILED, service.state());
     }
@@ -87,7 +87,7 @@
         service.stopAsync().awaitTerminated();
         fail();
       } catch (RuntimeException e) {
-        assertThat(e).hasCauseThat().isSameAs(exception);
+        assertThat(e).hasCauseThat().isSameInstanceAs(exception);
       }
       assertEquals(Service.State.FAILED, service.state());
     }
@@ -117,7 +117,7 @@
       service.startAsync().awaitRunning();
       fail();
     } catch (RuntimeException e) {
-      assertThat(e).hasCauseThat().isSameAs(exception);
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
     }
     assertEquals(1, service.startUpCalled);
     assertEquals(Service.State.FAILED, service.state());
@@ -164,7 +164,7 @@
       service.stopAsync().awaitTerminated();
       fail();
     } catch (RuntimeException e) {
-      assertThat(e).hasCauseThat().isSameAs(exception);
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
     }
     assertEquals(1, service.startUpCalled);
     assertEquals(1, service.shutDownCalled);
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 8e7cde9..16a4cd0 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
@@ -98,7 +98,7 @@
       fail();
     } catch (CancellationException expected) {
     }
-    // An execution exception holds a runtime exception (from throwables.propogate) that holds our
+    // An execution exception holds a runtime exception (from throwables.propagate) that holds our
     // original exception.
     assertEquals(service.runException, service.failureCause());
     assertEquals(Service.State.FAILED, service.state());
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 faac76e..5f42106 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
@@ -42,7 +42,7 @@
  */
 public class AbstractServiceTest extends TestCase {
 
-  private static final long LONG_TIMEOUT_MILLIS = 2500;
+  private static final long LONG_TIMEOUT_MILLIS = 10000;
   private Thread executionThread;
   private Throwable thrownByExecutionThread;
 
@@ -234,21 +234,21 @@
    */
   public void testManualServiceStopMultipleTimesWhileStarting() throws Exception {
     ManualSwitchedService service = new ManualSwitchedService();
-    final AtomicInteger stopppingCount = new AtomicInteger();
+    final AtomicInteger stoppingCount = new AtomicInteger();
     service.addListener(
         new Listener() {
           @Override
           public void stopping(State from) {
-            stopppingCount.incrementAndGet();
+            stoppingCount.incrementAndGet();
           }
         },
         directExecutor());
 
     service.startAsync();
     service.stopAsync();
-    assertEquals(1, stopppingCount.get());
+    assertEquals(1, stoppingCount.get());
     service.stopAsync();
-    assertEquals(1, stopppingCount.get());
+    assertEquals(1, stoppingCount.get());
   }
 
   public void testManualServiceStopWhileNew() throws Exception {
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
new file mode 100644
index 0000000..d905dcd
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2011 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.GwtIncompatible;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import junit.framework.TestCase;
+
+/**
+ * Basher test for {@link AtomicLongMap}.
+ *
+ * @author mike nonemacher
+ */
+@GwtIncompatible // threads
+
+public class AtomicLongMapBasherTest extends TestCase {
+  private final Random random = new Random(301);
+
+  public void testModify_basher() throws InterruptedException {
+    int nTasks = 3000;
+    int nThreads = 100;
+    final int getsPerTask = 1000;
+    final int deltaRange = 10000;
+    final String key = "key";
+
+    final AtomicLong sum = new AtomicLong();
+    final AtomicLongMap<String> map = AtomicLongMap.create();
+
+    ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
+    for (int i = 0; i < nTasks; i++) {
+      @SuppressWarnings("unused") // go/futurereturn-lsc
+      Future<?> possiblyIgnoredError =
+          threadPool.submit(
+              new Runnable() {
+                @Override
+                public void run() {
+                  int threadSum = 0;
+                  for (int j = 0; j < getsPerTask; j++) {
+                    long delta = random.nextInt(deltaRange);
+                    int behavior = random.nextInt(10);
+                    switch (behavior) {
+                      case 0:
+                        map.incrementAndGet(key);
+                        threadSum++;
+                        break;
+                      case 1:
+                        map.decrementAndGet(key);
+                        threadSum--;
+                        break;
+                      case 2:
+                        map.addAndGet(key, delta);
+                        threadSum += delta;
+                        break;
+                      case 3:
+                        map.getAndIncrement(key);
+                        threadSum++;
+                        break;
+                      case 4:
+                        map.getAndDecrement(key);
+                        threadSum--;
+                        break;
+                      case 5:
+                        map.getAndAdd(key, delta);
+                        threadSum += delta;
+                        break;
+                      case 6:
+                        long oldValue = map.put(key, delta);
+                        threadSum += delta - oldValue;
+                        break;
+                      case 7:
+                        oldValue = map.get(key);
+                        if (map.replace(key, oldValue, delta)) {
+                          threadSum += delta - oldValue;
+                        }
+                        break;
+                      case 8:
+                        oldValue = map.remove(key);
+                        threadSum -= oldValue;
+                        break;
+                      case 9:
+                        oldValue = map.get(key);
+                        if (map.remove(key, oldValue)) {
+                          threadSum -= oldValue;
+                        }
+                        break;
+                      default:
+                        throw new AssertionError();
+                    }
+                  }
+                  sum.addAndGet(threadSum);
+                }
+              });
+    }
+
+    threadPool.shutdown();
+    assertTrue(threadPool.awaitTermination(300, TimeUnit.SECONDS));
+
+    assertEquals(sum.get(), map.get(key));
+  }
+}
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
index 557bb15..587a4ec 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
@@ -25,11 +25,6 @@
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 import junit.framework.TestCase;
 
 /**
@@ -42,7 +37,7 @@
   private static final int ITERATIONS = 100;
   private static final int MAX_ADDEND = 100;
 
-  private Random random = new Random(301);
+  private final Random random = new Random(301);
 
   @GwtIncompatible // NullPointerTester
   public void testNulls() {
@@ -578,87 +573,4 @@
     AtomicLongMap<String> reserialized = SerializableTester.reserialize(map);
     assertEquals(map.asMap(), reserialized.asMap());
   }
-
-  @GwtIncompatible // threads
-  public void testModify_basher() throws InterruptedException {
-    int nTasks = 3000;
-    int nThreads = 100;
-    final int getsPerTask = 1000;
-    final int deltaRange = 10000;
-    final String key = "key";
-
-    final AtomicLong sum = new AtomicLong();
-    final AtomicLongMap<String> map = AtomicLongMap.create();
-
-    ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
-    for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
-      Future<?> possiblyIgnoredError =
-          threadPool.submit(
-              new Runnable() {
-                @Override
-                public void run() {
-                  int threadSum = 0;
-                  for (int j = 0; j < getsPerTask; j++) {
-                    long delta = random.nextInt(deltaRange);
-                    int behavior = random.nextInt(10);
-                    switch (behavior) {
-                      case 0:
-                        map.incrementAndGet(key);
-                        threadSum++;
-                        break;
-                      case 1:
-                        map.decrementAndGet(key);
-                        threadSum--;
-                        break;
-                      case 2:
-                        map.addAndGet(key, delta);
-                        threadSum += delta;
-                        break;
-                      case 3:
-                        map.getAndIncrement(key);
-                        threadSum++;
-                        break;
-                      case 4:
-                        map.getAndDecrement(key);
-                        threadSum--;
-                        break;
-                      case 5:
-                        map.getAndAdd(key, delta);
-                        threadSum += delta;
-                        break;
-                      case 6:
-                        long oldValue = map.put(key, delta);
-                        threadSum += delta - oldValue;
-                        break;
-                      case 7:
-                        oldValue = map.get(key);
-                        if (map.replace(key, oldValue, delta)) {
-                          threadSum += delta - oldValue;
-                        }
-                        break;
-                      case 8:
-                        oldValue = map.remove(key);
-                        threadSum -= oldValue;
-                        break;
-                      case 9:
-                        oldValue = map.get(key);
-                        if (map.remove(key, oldValue)) {
-                          threadSum -= oldValue;
-                        }
-                        break;
-                      default:
-                        throw new AssertionError();
-                    }
-                  }
-                  sum.addAndGet(threadSum);
-                }
-              });
-    }
-
-    threadPool.shutdown();
-    assertTrue(threadPool.awaitTermination(300, TimeUnit.SECONDS));
-
-    assertEquals(sum.get(), map.get(key));
-  }
 }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java b/android/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java
index c7cd617..5bc92dc 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java
@@ -82,7 +82,7 @@
       future.get();
       fail("Expected exception to be thrown");
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(expected);
+      assertThat(e).hasCauseThat().isSameInstanceAs(expected);
     }
   }
 
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
new file mode 100644
index 0000000..66c8d6d
--- /dev/null
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
@@ -0,0 +1,1921 @@
+/*
+ * Copyright (C) 2017 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 com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Lists.asList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
+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.MoreExecutors.directExecutor;
+import static com.google.common.util.concurrent.MoreExecutors.shutdownAndAwaitTermination;
+import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
+import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+import static java.util.Arrays.asList;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
+import com.google.common.collect.ImmutableList;
+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.AsyncClosingFunction;
+import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
+import com.google.common.util.concurrent.ClosingFuture.ClosingFunction;
+import com.google.common.util.concurrent.ClosingFuture.Combiner;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.AsyncCombiningCallable;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.CombiningCallable;
+import com.google.common.util.concurrent.ClosingFuture.Combiner2.AsyncClosingFunction2;
+import com.google.common.util.concurrent.ClosingFuture.Combiner2.ClosingFunction2;
+import com.google.common.util.concurrent.ClosingFuture.Combiner3.ClosingFunction3;
+import com.google.common.util.concurrent.ClosingFuture.Combiner4.ClosingFunction4;
+import com.google.common.util.concurrent.ClosingFuture.Combiner5.ClosingFunction5;
+import com.google.common.util.concurrent.ClosingFuture.DeferredCloser;
+import com.google.common.util.concurrent.ClosingFuture.Peeker;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloser;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloserConsumer;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
+import junit.framework.TestCase;
+import org.mockito.Mockito;
+
+/**
+ * Tests for {@link ClosingFuture}. Subclasses exercise either the {@link
+ * ClosingFuture#finishToFuture()} or {@link
+ * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)} paths to complete a
+ * {@link ClosingFuture} pipeline.
+ */
+public abstract class ClosingFutureTest extends TestCase {
+  // TODO(dpb): Use Expect once that supports JUnit 3, or we can use JUnit 4.
+  final List<AssertionError> failures = new ArrayList<>();
+  final StandardSubjectBuilder expect =
+      StandardSubjectBuilder.forCustomFailureStrategy(
+          new FailureStrategy() {
+            @Override
+            public void fail(AssertionError failure) {
+              failures.add(failure);
+            }
+          });
+
+  final ListeningExecutorService executor =
+      MoreExecutors.listeningDecorator(newSingleThreadExecutor());
+  final ExecutorService closingExecutor = newSingleThreadExecutor();
+
+  final TestCloseable closeable1 = new TestCloseable("closeable1");
+  final TestCloseable closeable2 = new TestCloseable("closeable2");
+  final TestCloseable closeable3 = new TestCloseable("closeable3");
+  final TestCloseable closeable4 = new TestCloseable("closeable4");
+
+  final Waiter waiter = new Waiter();
+  final CountDownLatch futureCancelled = new CountDownLatch(1);
+  final Exception exception = new Exception();
+  final Closeable mockCloseable = Mockito.mock(Closeable.class);
+
+  @Override
+  protected void tearDown() throws Exception {
+    assertNoExpectedFailures();
+    super.tearDown();
+  }
+
+  public void testFrom() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.from(executor.submit(Callables.returning(closeable1)))
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable1);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+  }
+
+  public void testFrom_failedInput() throws Exception {
+    assertFinallyFailsWithException(failedClosingFuture());
+  }
+
+  public void testFrom_cancelledInput() throws Exception {
+    assertBecomesCanceled(ClosingFuture.from(immediateCancelledFuture()));
+  }
+
+  public void testEventuallyClosing() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable1);
+                    assertStillOpen(closeable1);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testEventuallyClosing_failedInput() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.eventuallyClosing(
+            Futures.<Closeable>immediateFailedFuture(exception), closingExecutor));
+  }
+
+  public void testEventuallyClosing_cancelledInput() throws Exception {
+    assertBecomesCanceled(
+        ClosingFuture.eventuallyClosing(
+            Futures.<Closeable>immediateCancelledFuture(), closingExecutor));
+  }
+
+  public void testEventuallyClosing_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.eventuallyClosing(
+            executor.submit(
+                waiter.waitFor(
+                    new Callable<TestCloseable>() {
+                      @Override
+                      public TestCloseable call() throws InterruptedException {
+                        awaitUninterruptibly(futureCancelled);
+                        return closeable1;
+                      }
+                    })),
+            closingExecutor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the callable returns
+    assertStillOpen(closeable1);
+    waiter.awaitReturned();
+    assertClosed(closeable1);
+  }
+
+  public void testEventuallyClosing_throws() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.eventuallyClosing(
+            executor.submit(
+                new Callable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call() throws Exception {
+                    throw exception;
+                  }
+                }),
+            closingExecutor));
+  }
+
+  public void testSubmit() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+                new ClosingCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable3;
+                  }
+                },
+                executor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable3);
+                    assertStillOpen(closeable1, closeable2, closeable3);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testSubmit_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer) throws Exception {
+                    awaitUninterruptibly(futureCancelled);
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable3;
+                  }
+                }),
+            executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testSubmit_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Object>() {
+              @Override
+              public 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(
+            waiter.waitFor(
+                new ClosingCallable<String>() {
+                  @Override
+                  public String call(DeferredCloser closer) throws Exception {
+                    return "value";
+                  }
+                }),
+            executor);
+    ListenableFuture<?> statusFuture = closingFuture.statusFuture();
+    waiter.awaitStarted();
+    assertThat(statusFuture.isDone()).isFalse();
+    waiter.awaitReturned();
+    assertThat(getUninterruptibly(statusFuture)).isNull();
+  }
+
+  public void testStatusFuture_failure() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<String>() {
+                  @Override
+                  public String call(DeferredCloser closer) throws Exception {
+                    throw exception;
+                  }
+                }),
+            executor);
+    ListenableFuture<?> statusFuture = closingFuture.statusFuture();
+    waiter.awaitStarted();
+    assertThat(statusFuture.isDone()).isFalse();
+    waiter.awaitReturned();
+    assertThatFutureFailsWithException(statusFuture);
+  }
+
+  public void testStatusFuture_cancelDoesNothing() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<String>() {
+                  @Override
+                  public String call(DeferredCloser closer) throws Exception {
+                    return "value";
+                  }
+                }),
+            executor);
+    ListenableFuture<?> statusFuture = closingFuture.statusFuture();
+    waiter.awaitStarted();
+    assertThat(statusFuture.isDone()).isFalse();
+    statusFuture.cancel(true);
+    assertThat(statusFuture.isCancelled()).isTrue();
+    waiter.awaitReturned();
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+  }
+
+  public void testCancel_caught() throws Exception {
+    ClosingFuture<String> step0 = ClosingFuture.from(immediateFuture("value 0"));
+    ClosingFuture<String> step1 =
+        step0.transform(
+            new ClosingFunction<String, String>() {
+              @Override
+              public String apply(DeferredCloser closer, String v) throws Exception {
+                closer.eventuallyClose(closeable1, closingExecutor);
+                return "value 1";
+              }
+            },
+            executor);
+    Waiter step2Waiter = new Waiter();
+    ClosingFuture<String> step2 =
+        step1.transform(
+            step2Waiter.waitFor(
+                new ClosingFunction<String, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, String v) throws Exception {
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return "value 2";
+                  }
+                }),
+            executor);
+    ClosingFuture<String> step3 =
+        step2.transform(
+            new ClosingFunction<String, String>() {
+              @Override
+              public String apply(DeferredCloser closer, String input) throws Exception {
+                closer.eventuallyClose(closeable3, closingExecutor);
+                return "value 3";
+              }
+            },
+            executor);
+    Waiter step4Waiter = new Waiter();
+    ClosingFuture<String> step4 =
+        step3.catching(
+            CancellationException.class,
+            step4Waiter.waitFor(
+                new ClosingFunction<CancellationException, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, CancellationException input)
+                      throws Exception {
+                    closer.eventuallyClose(closeable4, closingExecutor);
+                    return "value 4";
+                  }
+                }),
+            executor);
+
+    // Pause in step 2.
+    step2Waiter.awaitStarted();
+
+    // Everything should still be open.
+    assertStillOpen(closeable1, closeable2, closeable3, closeable4);
+
+    // Cancel step 3, resume step 2, and pause in step 4.
+    assertWithMessage("step3.cancel()").that(step3.cancel(false)).isTrue();
+    step2Waiter.awaitReturned();
+    step4Waiter.awaitStarted();
+
+    // Step 1 is not cancelled because it was done.
+    assertWithMessage("step1.statusFuture().isCancelled()")
+        .that(step1.statusFuture().isCancelled())
+        .isFalse();
+    // But its closeable is closed.
+    assertClosed(closeable1);
+
+    // Step 2 is cancelled because it wasn't complete.
+    assertWithMessage("step2.statusFuture().isCancelled()")
+        .that(step2.statusFuture().isCancelled())
+        .isTrue();
+    // Its closeable is closed.
+    assertClosed(closeable2);
+
+    // Step 3 was cancelled before it began
+    assertWithMessage("step3.statusFuture().isCancelled()")
+        .that(step3.statusFuture().isCancelled())
+        .isTrue();
+    // Its closeable is still open.
+    assertStillOpen(closeable3);
+
+    // Step 4 is not cancelled, because it caught the cancellation.
+    assertWithMessage("step4.statusFuture().isCancelled()")
+        .that(step4.statusFuture().isCancelled())
+        .isFalse();
+    // Its closeable isn't closed yet.
+    assertStillOpen(closeable4);
+
+    // Resume step 4 and complete.
+    step4Waiter.awaitReturned();
+    assertThat(getFinalValue(step4)).isEqualTo("value 4");
+
+    // Step 4's closeable is now closed.
+    assertClosed(closeable4);
+    // Step 3 still never ran, so its closeable should still be open.
+    assertStillOpen(closeable3);
+  }
+
+  public void testTransform() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transform(
+                new ClosingFunction<String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(DeferredCloser closer, String v) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable3;
+                  }
+                },
+                executor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable3);
+                    assertStillOpen(closeable1, closeable2, closeable3);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testTransform_cancelledPipeline() throws Exception {
+    String value = "value";
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.from(immediateFuture(value))
+            .transform(
+                new ClosingFunction<String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(DeferredCloser closer, String v) throws Exception {
+                    return closer.eventuallyClose(closeable1, closingExecutor);
+                  }
+                },
+                executor)
+            .transform(
+                waiter.waitFor(
+                    new ClosingFunction<TestCloseable, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(DeferredCloser closer, TestCloseable v)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        closer.eventuallyClose(closeable3, closingExecutor);
+                        return closeable4;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+    assertStillOpen(closeable4);
+  }
+
+  public void testTransform_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transform(
+                new ClosingFunction<String, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, String v) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testTransformAsync() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                new AsyncClosingFunction<String, TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> apply(DeferredCloser closer, String v)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return ClosingFuture.eventuallyClosing(
+                        immediateFuture(closeable3), closingExecutor);
+                  }
+                },
+                executor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable3);
+                    assertStillOpen(closeable1, closeable2, closeable3);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testTransformAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                waiter.waitFor(
+                    new AsyncClosingFunction<String, TestCloseable>() {
+                      @Override
+                      public ClosingFuture<TestCloseable> apply(DeferredCloser closer, String v)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return ClosingFuture.eventuallyClosing(
+                            immediateFuture(closeable3), closingExecutor);
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2, closeable3);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testTransformAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                new AsyncClosingFunction<String, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(DeferredCloser closer, String v)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testTransformAsync_failed() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                new AsyncClosingFunction<String, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(DeferredCloser closer, String v)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return failedClosingFuture();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testTransformAsync_withoutCloser() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+                new ClosingCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer) throws Exception {
+                    return closer.eventuallyClose(closeable1, closingExecutor);
+                  }
+                },
+                executor)
+            .transformAsync(
+                ClosingFuture.withoutCloser(
+                    new AsyncFunction<TestCloseable, String>() {
+                      @Override
+                      public ListenableFuture<String> apply(TestCloseable v) throws Exception {
+                        assertThat(v).isSameInstanceAs(closeable1);
+                        assertStillOpen(closeable1);
+                        return immediateFuture("value");
+                      }
+                    }),
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllComplete_call() throws Exception {
+    final ClosingFuture<String> input1 = ClosingFuture.from(immediateFuture("value1"));
+    final ClosingFuture<Object> input2Failed = failedClosingFuture();
+    final ClosingFuture<String> nonInput = ClosingFuture.from(immediateFuture("value3"));
+    final AtomicReference<ClosingFuture.Peeker> capturedPeeker = new AtomicReference<>();
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(ImmutableList.of(input1, input2Failed))
+            .call(
+                new CombiningCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer, Peeker peeker) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    assertThat(peeker.getDone(input1)).isSameInstanceAs("value1");
+                    try {
+                      peeker.getDone(input2Failed);
+                      fail("Peeker.getDone() should fail for failed inputs");
+                    } catch (ExecutionException expected) {
+                    }
+                    try {
+                      peeker.getDone(nonInput);
+                      fail("Peeker should not be able to peek into non-input ClosingFuture.");
+                    } catch (IllegalArgumentException expected) {
+                    }
+                    capturedPeeker.set(peeker);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable2);
+    assertClosed(closeable1);
+    try {
+      capturedPeeker.get().getDone(input1);
+      fail("Peeker should not be able to peek except during call.");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testWhenAllComplete_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .call(
+                waiter.waitFor(
+                    new CombiningCallable<TestCloseable>() {
+                      @Override
+                      public TestCloseable call(DeferredCloser closer, Peeker peeker)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllComplete_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .call(
+                new CombiningCallable<Object>() {
+                  @Override
+                  public Object call(DeferredCloser closer, Peeker peeker) throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllComplete_callAsync() throws Exception {
+    final ClosingFuture<String> input1 = ClosingFuture.from(immediateFuture("value1"));
+    final ClosingFuture<Object> input2Failed = failedClosingFuture();
+    final ClosingFuture<String> nonInput = ClosingFuture.from(immediateFuture("value3"));
+    final AtomicReference<ClosingFuture.Peeker> capturedPeeker = new AtomicReference<>();
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(ImmutableList.of(input1, input2Failed))
+            .callAsync(
+                new AsyncCombiningCallable<TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> call(DeferredCloser closer, Peeker peeker)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    assertThat(peeker.getDone(input1)).isSameInstanceAs("value1");
+                    try {
+                      peeker.getDone(input2Failed);
+                      fail("Peeker should fail for failed inputs");
+                    } catch (ExecutionException expected) {
+                    }
+                    try {
+                      peeker.getDone(nonInput);
+                      fail("Peeker should not be able to peek into non-input ClosingFuture.");
+                    } catch (IllegalArgumentException expected) {
+                    }
+                    capturedPeeker.set(peeker);
+                    return ClosingFuture.eventuallyClosing(
+                        immediateFuture(closeable2), closingExecutor);
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+    try {
+      capturedPeeker.get().getDone(input1);
+      fail("Peeker should not be able to peek except during call.");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testWhenAllComplete_callAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .callAsync(
+                waiter.waitFor(
+                    new AsyncCombiningCallable<TestCloseable>() {
+                      @Override
+                      public ClosingFuture<TestCloseable> call(DeferredCloser closer, Peeker peeker)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        return ClosingFuture.eventuallyClosing(
+                            immediateFuture(closeable3), closingExecutor);
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testWhenAllComplete_callAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .callAsync(
+                new AsyncCombiningCallable<Object>() {
+                  @Override
+                  public ClosingFuture<Object> call(DeferredCloser closer, Peeker peeker)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  // We don't need to test the happy case for SuccessfulCombiner.call(Async) because it's the same
+  // as Combiner.
+
+  public void testWhenAllSucceed_call_failedInput() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.whenAllSucceed(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture("value")), failedClosingFuture()))
+            .call(
+                new CombiningCallable<Object>() {
+                  @Override
+                  public Object call(DeferredCloser closer, Peeker peeker) throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor));
+  }
+
+  public void testWhenAllSucceed_callAsync_failedInput() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.whenAllSucceed(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture("value")), failedClosingFuture()))
+            .callAsync(
+                new AsyncCombiningCallable<Object>() {
+                  @Override
+                  public ClosingFuture<Object> call(DeferredCloser closer, Peeker peeker)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor));
+  }
+
+  public void testWhenAllSucceed2_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value1")))
+            .call(
+                new ClosingFunction2<TestCloseable, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(DeferredCloser closer, TestCloseable v1, String v2)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value1");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed2_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture())
+            .call(
+                new ClosingFunction2<TestCloseable, Object, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, TestCloseable v1, Object v2)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed2_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction2<TestCloseable, TestCloseable, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer, TestCloseable v1, TestCloseable v2)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed2_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor))
+            .call(
+                new ClosingFunction2<TestCloseable, TestCloseable, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, TestCloseable v1, TestCloseable v2)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed2_callAsync() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value1")))
+            .callAsync(
+                new AsyncClosingFunction2<TestCloseable, String, TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> apply(
+                      DeferredCloser closer, TestCloseable v1, String v2) throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value1");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return ClosingFuture.eventuallyClosing(
+                        immediateFuture(closeable3), closingExecutor);
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable3);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed2_callAsync_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture())
+            .callAsync(
+                new AsyncClosingFunction2<TestCloseable, Object, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(
+                      DeferredCloser closer, TestCloseable v1, Object v2) throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed2_callAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)))
+            .callAsync(
+                waiter.waitFor(
+                    new AsyncClosingFunction2<TestCloseable, TestCloseable, TestCloseable>() {
+                      @Override
+                      public ClosingFuture<TestCloseable> apply(
+                          DeferredCloser closer, TestCloseable v1, TestCloseable v2)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return ClosingFuture.eventuallyClosing(
+                            immediateFuture(closeable3), closingExecutor);
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2, closeable3);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed2_callAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor))
+            .callAsync(
+                new AsyncClosingFunction2<TestCloseable, TestCloseable, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(
+                      DeferredCloser closer, TestCloseable v1, TestCloseable v2) throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed3_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value2")),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                new ClosingFunction3<TestCloseable, String, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(
+                      DeferredCloser closer, TestCloseable v1, String v2, String v3)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value2");
+                    assertThat(v3).isEqualTo("value3");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed3_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture(),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                new ClosingFunction3<TestCloseable, Object, String, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, TestCloseable v1, Object v2, String v3)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed3_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction3<TestCloseable, TestCloseable, String, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer, TestCloseable v1, TestCloseable v2, String v3)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed3_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                new ClosingFunction3<TestCloseable, TestCloseable, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer, TestCloseable v1, TestCloseable v2, String v3)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed4_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value2")),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                new ClosingFunction4<TestCloseable, String, String, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(
+                      DeferredCloser closer, TestCloseable v1, String v2, String v3, String v4)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value2");
+                    assertThat(v3).isEqualTo("value3");
+                    assertThat(v4).isEqualTo("value4");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed4_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture(),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                new ClosingFunction4<TestCloseable, Object, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer, TestCloseable v1, Object v2, String v3, String v4)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed4_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction4<
+                        TestCloseable, TestCloseable, String, String, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer,
+                          TestCloseable v1,
+                          TestCloseable v2,
+                          String v3,
+                          String v4)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed4_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                new ClosingFunction4<TestCloseable, TestCloseable, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      TestCloseable v2,
+                      String v3,
+                      String v4)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed5_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value2")),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                new ClosingFunction5<
+                    TestCloseable, String, String, String, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      String v2,
+                      String v3,
+                      String v4,
+                      String v5)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value2");
+                    assertThat(v3).isEqualTo("value3");
+                    assertThat(v4).isEqualTo("value4");
+                    assertThat(v5).isEqualTo("value5");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed5_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture(),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                new ClosingFunction5<TestCloseable, Object, String, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      Object v2,
+                      String v3,
+                      String v4,
+                      String v5)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed5_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction5<
+                        TestCloseable, TestCloseable, String, String, String, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer,
+                          TestCloseable v1,
+                          TestCloseable v2,
+                          String v3,
+                          String v4,
+                          String v5)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed5_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                new ClosingFunction5<
+                    TestCloseable, TestCloseable, String, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      TestCloseable v2,
+                      String v3,
+                      String v4,
+                      String v5)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testTransform_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.transform(
+            new ClosingFunction<String, String>() {
+              @Override
+              public String apply(DeferredCloser closer, String v) throws Exception {
+                return "value2";
+              }
+            },
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testTransformAsync_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.transformAsync(
+            new AsyncClosingFunction<String, String>() {
+              @Override
+              public ClosingFuture<String> apply(DeferredCloser closer, String v) throws Exception {
+                return ClosingFuture.from(immediateFuture("value2"));
+              }
+            },
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testCatching_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.catching(
+            Exception.class,
+            new ClosingFunction<Exception, String>() {
+              @Override
+              public String apply(DeferredCloser closer, Exception x) throws Exception {
+                return "value2";
+              }
+            },
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testCatchingAsync_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.catchingAsync(
+            Exception.class,
+            ClosingFuture.withoutCloser(
+                new AsyncFunction<Exception, String>() {
+                  @Override
+                  public ListenableFuture<String> apply(Exception x) throws Exception {
+                    return immediateFuture("value2");
+                  }
+                }),
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testWhenAllComplete_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    Combiner unused = ClosingFuture.whenAllComplete(asList(closingFuture));
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testWhenAllSucceed_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    Combiner unused = ClosingFuture.whenAllSucceed(asList(closingFuture));
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  protected final void assertDerivingThrowsIllegalStateException(
+      ClosingFuture<String> closingFuture) {
+    try {
+      closingFuture.transform(
+          new ClosingFunction<String, String>() {
+            @Override
+            public String apply(DeferredCloser closer3, String v1) throws Exception {
+              return "value3";
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected5) {
+    }
+    try {
+      closingFuture.transformAsync(
+          new AsyncClosingFunction<String, String>() {
+            @Override
+            public ClosingFuture<String> apply(DeferredCloser closer2, String v) throws Exception {
+              return ClosingFuture.from(immediateFuture("value3"));
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected4) {
+    }
+    try {
+      closingFuture.catching(
+          Exception.class,
+          new ClosingFunction<Exception, String>() {
+            @Override
+            public String apply(DeferredCloser closer1, Exception x1) throws Exception {
+              return "value3";
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected3) {
+    }
+    try {
+      closingFuture.catchingAsync(
+          Exception.class,
+          new AsyncClosingFunction<Exception, String>() {
+            @Override
+            public ClosingFuture<String> apply(DeferredCloser closer, Exception x)
+                throws Exception {
+              return ClosingFuture.from(immediateFuture("value3"));
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected2) {
+    }
+    try {
+      ClosingFuture.whenAllComplete(asList(closingFuture));
+      fail();
+    } catch (IllegalStateException expected1) {
+    }
+    try {
+      ClosingFuture.whenAllSucceed(asList(closingFuture));
+      fail();
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  /** Asserts that marking this step a final step throws {@link IllegalStateException}. */
+  protected void assertFinalStepThrowsIllegalStateException(ClosingFuture<?> closingFuture) {
+    try {
+      closingFuture.finishToFuture();
+      fail();
+    } catch (IllegalStateException expected) {
+    }
+    try {
+      closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), executor);
+      fail();
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  // Avoid infinite recursion if a closeable's close() method throws RejectedExecutionException and
+  // is closed using the direct executor.
+  public void testCloseThrowsRejectedExecutionException() throws Exception {
+    doThrow(new RejectedExecutionException()).when(mockCloseable).close();
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, directExecutor());
+              }
+            },
+            executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo(mockCloseable);
+    waitUntilClosed(closingFuture);
+    verify(mockCloseable, timeout(1000)).close();
+  }
+
+  /**
+   * Marks the given step final, waits for it to be finished, and returns the value.
+   *
+   * @throws ExecutionException if the step failed
+   * @throws CancellationException if the step was cancelled
+   */
+  abstract <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException;
+
+  /** Marks the given step final, cancels it, and waits for the cancellation to happen. */
+  abstract void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture);
+
+  /**
+   * Marks the given step final and waits for it to fail. Expects the failure exception to match
+   * {@link ClosingFutureTest#exception}.
+   */
+  abstract void assertFinallyFailsWithException(ClosingFuture<?> closingFuture);
+
+  /** Waits for the given step to be canceled. */
+  abstract void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException;
+
+  /** Waits for the given step's closeables to be closed. */
+  void waitUntilClosed(ClosingFuture<?> closingFuture) {
+    assertTrue(awaitUninterruptibly(closingFuture.whenClosedCountDown(), 1, SECONDS));
+  }
+
+  /** Tests for {@link ClosingFuture} that exercise {@link ClosingFuture#finishToFuture()}. */
+
+  public static class FinishToFutureTest extends ClosingFutureTest {
+
+    public void testFinishToFuture_throwsIfCalledTwice() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+      try {
+        FluentFuture<Closeable> unused2 = closingFuture.finishToFuture();
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testFinishToFuture_throwsAfterCallingFinishToValueAndCloser() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), directExecutor());
+      try {
+        FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testFinishToFuture_preventsFurtherDerivation() {
+      ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+      FluentFuture<String> unused = closingFuture.finishToFuture();
+      assertDerivingThrowsIllegalStateException(closingFuture);
+    }
+
+    @Override
+    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+      return getUninterruptibly(closingFuture.finishToFuture());
+    }
+
+    @Override
+    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+      assertThatFutureFailsWithException(closingFuture.finishToFuture());
+    }
+
+    @Override
+    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+      assertThatFutureBecomesCancelled(closingFuture.finishToFuture());
+    }
+
+    @Override
+    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+      assertThat(closingFuture.finishToFuture().cancel(false)).isTrue();
+      waitUntilClosed(closingFuture);
+      futureCancelled.countDown();
+    }
+  }
+
+  /**
+   * Tests for {@link ClosingFuture} that exercise {@link
+   * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)}.
+   */
+
+  public static class FinishToValueAndCloserTest extends ClosingFutureTest {
+
+    private final ExecutorService finishToValueAndCloserExecutor = newSingleThreadExecutor();
+    private volatile ValueAndCloser<?> valueAndCloser;
+
+    @Override
+    protected void tearDown() throws Exception {
+      super.tearDown();
+      assertWithMessage("finishToValueAndCloserExecutor was shut down")
+          .that(shutdownAndAwaitTermination(finishToValueAndCloserExecutor, 10, SECONDS))
+          .isTrue();
+    }
+
+    public void testFinishToValueAndCloser_throwsIfCalledTwice() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      closingFuture.finishToValueAndCloser(
+          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+      try {
+        closingFuture.finishToValueAndCloser(
+            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testFinishToValueAndCloser_throwsAfterCallingFinishToFuture() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+      try {
+        closingFuture.finishToValueAndCloser(
+            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    @Override
+    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+      return finishToValueAndCloser(closingFuture).get();
+    }
+
+    @Override
+    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+      assertThatFutureFailsWithException(closingFuture.statusFuture());
+      ValueAndCloser<?> valueAndCloser = finishToValueAndCloser(closingFuture);
+      try {
+        valueAndCloser.get();
+        fail();
+      } catch (ExecutionException expected) {
+        assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+      }
+      valueAndCloser.closeAsync();
+    }
+
+    @Override
+    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+      assertThatFutureBecomesCancelled(closingFuture.statusFuture());
+    }
+
+    @Override
+    void waitUntilClosed(ClosingFuture<?> closingFuture) {
+      if (valueAndCloser != null) {
+        valueAndCloser.closeAsync();
+      }
+      super.waitUntilClosed(closingFuture);
+    }
+
+    @Override
+    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+      assertThat(closingFuture.cancel(false)).isTrue();
+      ValueAndCloser<?> unused = finishToValueAndCloser(closingFuture);
+      waitUntilClosed(closingFuture);
+      futureCancelled.countDown();
+    }
+
+    private <V> ValueAndCloser<V> finishToValueAndCloser(ClosingFuture<V> closingFuture) {
+      final CountDownLatch valueAndCloserSet = new CountDownLatch(1);
+      closingFuture.finishToValueAndCloser(
+          new ValueAndCloserConsumer<V>() {
+            @Override
+            public void accept(ValueAndCloser<V> valueAndCloser) {
+              FinishToValueAndCloserTest.this.valueAndCloser = valueAndCloser;
+              valueAndCloserSet.countDown();
+            }
+          },
+          finishToValueAndCloserExecutor);
+      assertWithMessage("valueAndCloser was set")
+          .that(awaitUninterruptibly(valueAndCloserSet, 10, SECONDS))
+          .isTrue();
+      @SuppressWarnings("unchecked")
+      ValueAndCloser<V> valueAndCloserWithType = (ValueAndCloser<V>) valueAndCloser;
+      return valueAndCloserWithType;
+    }
+  }
+
+  void assertThatFutureFailsWithException(Future<?> future) {
+    try {
+      getUninterruptibly(future);
+      fail("Expected future to fail: " + future);
+    } catch (ExecutionException e) {
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
+    }
+  }
+
+  private static void assertThatFutureBecomesCancelled(Future<?> future) throws ExecutionException {
+    try {
+      getUninterruptibly(future);
+      fail("Expected future to be canceled: " + future);
+    } catch (CancellationException expected) {
+    }
+  }
+
+  private static void assertStillOpen(TestCloseable closeable1, TestCloseable... moreCloseables)
+      throws IOException {
+    for (TestCloseable closeable : asList(closeable1, moreCloseables)) {
+      assertWithMessage("%s.stillOpen()", closeable).that(closeable.stillOpen()).isTrue();
+    }
+  }
+
+  static void assertClosed(TestCloseable closeable1, TestCloseable... moreCloseables)
+      throws IOException {
+    for (TestCloseable closeable : asList(closeable1, moreCloseables)) {
+      assertWithMessage("%s.isClosed()", closeable).that(closeable.awaitClosed()).isTrue();
+    }
+  }
+
+  private ClosingFuture<Object> failedClosingFuture() {
+    return ClosingFuture.from(immediateFailedFuture(exception));
+  }
+
+  private void assertNoExpectedFailures() {
+    assertWithMessage("executor was shut down")
+        .that(shutdownAndAwaitTermination(executor, 10, SECONDS))
+        .isTrue();
+    assertWithMessage("closingExecutor was shut down")
+        .that(shutdownAndAwaitTermination(closingExecutor, 10, SECONDS))
+        .isTrue();
+    if (!failures.isEmpty()) {
+      StringWriter message = new StringWriter();
+      PrintWriter writer = new PrintWriter(message);
+      writer.println("Expected no failures, but found:");
+      for (AssertionError failure : failures) {
+        failure.printStackTrace(writer);
+      }
+      failures.clear();
+      assertWithMessage(message.toString()).fail();
+    }
+  }
+
+  static final class TestCloseable implements Closeable {
+    private final CountDownLatch latch = new CountDownLatch(1);
+    private final String name;
+
+    TestCloseable(String name) {
+      this.name = name;
+    }
+
+    @Override
+    public void close() throws IOException {
+      latch.countDown();
+    }
+
+    boolean awaitClosed() {
+      return awaitUninterruptibly(latch, 10, SECONDS);
+    }
+
+    boolean stillOpen() {
+      return !awaitUninterruptibly(latch, 1, SECONDS);
+    }
+
+    @Override
+    public String toString() {
+      return name;
+    }
+  }
+
+  static final class Waiter {
+    private final CountDownLatch started = new CountDownLatch(1);
+    private final CountDownLatch canReturn = new CountDownLatch(1);
+    private final CountDownLatch returned = new CountDownLatch(1);
+    private Object proxy;
+
+    <V> Callable<V> waitFor(Callable<V> callable) {
+      return waitFor(callable, Callable.class);
+    }
+
+    <V> ClosingCallable<V> waitFor(ClosingCallable<V> closingCallable) {
+      return waitFor(closingCallable, ClosingCallable.class);
+    }
+
+    <T, U> ClosingFunction<T, U> waitFor(ClosingFunction<T, U> closingFunction) {
+      return waitFor(closingFunction, ClosingFunction.class);
+    }
+
+    <T, U> AsyncClosingFunction<T, U> waitFor(AsyncClosingFunction<T, U> asyncClosingFunction) {
+      return waitFor(asyncClosingFunction, AsyncClosingFunction.class);
+    }
+
+    <V> CombiningCallable<V> waitFor(CombiningCallable<V> combiningCallable) {
+      return waitFor(combiningCallable, CombiningCallable.class);
+    }
+
+    <V> AsyncCombiningCallable<V> waitFor(AsyncCombiningCallable<V> asyncCombiningCallable) {
+      return waitFor(asyncCombiningCallable, AsyncCombiningCallable.class);
+    }
+
+    <V1, V2, U> ClosingFunction2<V1, V2, U> waitFor(ClosingFunction2<V1, V2, U> closingFunction2) {
+      return waitFor(closingFunction2, ClosingFunction2.class);
+    }
+
+    <V1, V2, U> AsyncClosingFunction2<V1, V2, U> waitFor(
+        AsyncClosingFunction2<V1, V2, U> asyncClosingFunction2) {
+      return waitFor(asyncClosingFunction2, AsyncClosingFunction2.class);
+    }
+
+    <V1, V2, V3, U> ClosingFunction3<V1, V2, V3, U> waitFor(
+        ClosingFunction3<V1, V2, V3, U> closingFunction3) {
+      return waitFor(closingFunction3, ClosingFunction3.class);
+    }
+
+    <V1, V2, V3, V4, U> ClosingFunction4<V1, V2, V3, V4, U> waitFor(
+        ClosingFunction4<V1, V2, V3, V4, U> closingFunction4) {
+      return waitFor(closingFunction4, ClosingFunction4.class);
+    }
+
+    <V1, V2, V3, V4, V5, U> ClosingFunction5<V1, V2, V3, V4, V5, U> waitFor(
+        ClosingFunction5<V1, V2, V3, V4, V5, U> closingFunction5) {
+      return waitFor(closingFunction5, ClosingFunction5.class);
+    }
+
+    <T> T waitFor(final T delegate, final Class<T> type) {
+      checkState(proxy == null);
+      T proxyObject =
+          Reflection.newProxy(
+              type,
+              new InvocationHandler() {
+                @Override
+                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                  if (!method.getDeclaringClass().equals(type)) {
+                    return method.invoke(delegate, args);
+                  }
+                  checkState(started.getCount() == 1);
+                  started.countDown();
+                  try {
+                    return method.invoke(delegate, args);
+                  } catch (InvocationTargetException e) {
+                    throw e.getCause();
+                  } finally {
+                    awaitUninterruptibly(canReturn);
+                    returned.countDown();
+                  }
+                }
+              });
+      this.proxy = proxyObject;
+      return proxyObject;
+    }
+
+    void awaitStarted() {
+      assertTrue(awaitUninterruptibly(started, 10, SECONDS));
+    }
+
+    void awaitReturned() {
+      canReturn.countDown();
+      assertTrue(awaitUninterruptibly(returned, 10, SECONDS));
+    }
+  }
+
+  private static final class NoOpValueAndCloserConsumer<V> implements ValueAndCloserConsumer<V> {
+    @Override
+    public void accept(ValueAndCloser<V> valueAndCloser) {}
+  }
+}
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 6d67e9a..687f226 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
@@ -15,15 +15,27 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.Futures.allAsList;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.Function;
+import com.google.common.testing.GcFinalization;
+import com.google.common.testing.TestLogHandler;
+import com.google.j2objc.annotations.J2ObjCIncompatible;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
 import junit.framework.TestCase;
 
 /** Tests for {@link ExecutionSequencer} */
@@ -60,11 +72,6 @@
     assertThat(secondCallable.called).isTrue();
   }
 
-  public void testCancellationNotPropagatedIfAlreadyStarted() {
-    serializer.submitAsync(firstCallable, directExecutor()).cancel(true);
-    assertThat(firstFuture.isCancelled()).isFalse();
-  }
-
   public void testCancellationDoesNotViolateSerialization() {
     @SuppressWarnings({"unused", "nullness"})
     Future<?> possiblyIgnoredError = serializer.submitAsync(firstCallable, directExecutor());
@@ -140,8 +147,268 @@
     assertThat(getDone(future2)).isFalse();
   }
 
+  @GwtIncompatible
+  @J2ObjCIncompatible // gc
+  @AndroidIncompatible
+  public void testCancellationWithReferencedObject() throws Exception {
+    Object toBeGCed = new Object();
+    WeakReference<Object> ref = new WeakReference<>(toBeGCed);
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ListenableFuture<?> ignored =
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor());
+    serializer.submit(toStringCallable(toBeGCed), directExecutor()).cancel(true);
+    toBeGCed = null;
+    GcFinalization.awaitClear(ref);
+  }
+
+  private static Callable<String> toStringCallable(final Object object) {
+    return new Callable<String>() {
+      @Override
+      public String call() {
+        return object.toString();
+      }
+    };
+  }
+
+  public void testCancellationDuringReentrancy() throws Exception {
+    TestLogHandler logHandler = new TestLogHandler();
+    Logger.getLogger(AbstractFuture.class.getName()).addHandler(logHandler);
+
+    List<Future<?>> results = new ArrayList<>();
+    final Runnable[] manualExecutorTask = new Runnable[1];
+    Executor manualExecutor =
+        new Executor() {
+          @Override
+          public void execute(Runnable task) {
+            manualExecutorTask[0] = task;
+          }
+        };
+
+    results.add(serializer.submit(Callables.returning(null), manualExecutor));
+    final Future<?>[] thingToCancel = new Future<?>[1];
+    results.add(
+        serializer.submit(
+            new Callable<Void>() {
+              @Override
+              public Void call() {
+                thingToCancel[0].cancel(false);
+                return null;
+              }
+            },
+            directExecutor()));
+    thingToCancel[0] = serializer.submit(Callables.returning(null), directExecutor());
+    results.add(thingToCancel[0]);
+    // Enqueue more than enough tasks to force reentrancy.
+    for (int i = 0; i < 5; i++) {
+      results.add(serializer.submit(Callables.returning(null), directExecutor()));
+    }
+
+    manualExecutorTask[0].run();
+
+    for (Future<?> result : results) {
+      if (!result.isCancelled()) {
+        result.get(10, SECONDS);
+      }
+      // TODO(cpovirk): Verify that the cancelled futures are exactly ones that we expect.
+    }
+
+    assertThat(logHandler.getStoredLogRecords()).isEmpty();
+  }
+
+  public void testAvoidsStackOverflow_manySubmitted() throws Exception {
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ArrayList<ListenableFuture<Void>> results = new ArrayList<>(50_001);
+    results.add(
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor()));
+    for (int i = 0; i < 50_000; i++) {
+      results.add(serializer.submit(Callables.<Void>returning(null), directExecutor()));
+    }
+    settableFuture.set(null);
+    getDone(allAsList(results));
+  }
+
+  public void testAvoidsStackOverflow_manyCancelled() throws Exception {
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ListenableFuture<Void> unused =
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor());
+    for (int i = 0; i < 50_000; i++) {
+      serializer.submit(Callables.<Void>returning(null), directExecutor()).cancel(true);
+    }
+    ListenableFuture<Integer> stackDepthCheck =
+        serializer.submit(
+            new Callable<Integer>() {
+              @Override
+              public Integer call() {
+                return Thread.currentThread().getStackTrace().length;
+              }
+            },
+            directExecutor());
+    settableFuture.set(null);
+    assertThat(getDone(stackDepthCheck))
+        .isLessThan(Thread.currentThread().getStackTrace().length + 100);
+  }
+
+  public void testAvoidsStackOverflow_alternatingCancelledAndSubmitted() throws Exception {
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ListenableFuture<Void> unused =
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor());
+    for (int i = 0; i < 25_000; i++) {
+      serializer.submit(Callables.<Void>returning(null), directExecutor()).cancel(true);
+      unused = serializer.submit(Callables.<Void>returning(null), directExecutor());
+    }
+    ListenableFuture<Integer> stackDepthCheck =
+        serializer.submit(
+            new Callable<Integer>() {
+              @Override
+              public Integer call() {
+                return Thread.currentThread().getStackTrace().length;
+              }
+            },
+            directExecutor());
+    settableFuture.set(null);
+    assertThat(getDone(stackDepthCheck))
+        .isLessThan(Thread.currentThread().getStackTrace().length + 100);
+  }
+
+  private static Function<Integer, Integer> add(final int delta) {
+    return new Function<Integer, Integer>() {
+      @Override
+      public Integer apply(Integer input) {
+        return input + delta;
+      }
+    };
+  }
+
+  private static AsyncCallable<Integer> asyncAdd(
+      final ListenableFuture<Integer> future, final int delta, final Executor executor) {
+    return new AsyncCallable<Integer>() {
+      @Override
+      public ListenableFuture<Integer> call() throws Exception {
+        return Futures.transform(future, add(delta), executor);
+      }
+    };
+  }
+
+  private static final class LongHolder {
+    long count;
+  }
+
+  private static final int ITERATION_COUNT = 50_000;
+  private static final int DIRECT_EXECUTIONS_PER_THREAD = 100;
+
+  @GwtIncompatible // threads
+
+  public void testAvoidsStackOverflow_multipleThreads() throws Exception {
+    final LongHolder holder = new LongHolder();
+    final ArrayList<ListenableFuture<Integer>> lengthChecks = new ArrayList<>();
+    final List<Integer> completeLengthChecks;
+    final int baseStackDepth;
+    ExecutorService service = Executors.newFixedThreadPool(5);
+    try {
+      // Avoid counting frames from the executor itself, or the ExecutionSequencer
+      baseStackDepth =
+          serializer
+              .submit(
+                  new Callable<Integer>() {
+                    @Override
+                    public Integer call() {
+                      return Thread.currentThread().getStackTrace().length;
+                    }
+                  },
+                  service)
+              .get();
+      final SettableFuture<Void> settableFuture = SettableFuture.create();
+      ListenableFuture<?> unused =
+          serializer.submitAsync(
+              new AsyncCallable<Void>() {
+                @Override
+                public ListenableFuture<Void> call() {
+                  return settableFuture;
+                }
+              },
+              directExecutor());
+      for (int i = 0; i < 50_000; i++) {
+        if (i % DIRECT_EXECUTIONS_PER_THREAD == 0) {
+          // after some number of iterations, switch threads
+          unused =
+              serializer.submit(
+                  new Callable<Void>() {
+                    @Override
+                    public Void call() {
+                      holder.count++;
+                      return null;
+                    }
+                  },
+                  service);
+        } else if (i % DIRECT_EXECUTIONS_PER_THREAD == DIRECT_EXECUTIONS_PER_THREAD - 1) {
+          // When at max depth, record stack trace depth
+          lengthChecks.add(
+              serializer.submit(
+                  new Callable<Integer>() {
+                    @Override
+                    public Integer call() {
+                      holder.count++;
+                      return Thread.currentThread().getStackTrace().length;
+                    }
+                  },
+                  directExecutor()));
+        } else {
+          // Otherwise, schedule a task on directExecutor
+          unused =
+              serializer.submit(
+                  new Callable<Void>() {
+                    @Override
+                    public Void call() {
+                      holder.count++;
+                      return null;
+                    }
+                  },
+                  directExecutor());
+        }
+      }
+      settableFuture.set(null);
+      completeLengthChecks = allAsList(lengthChecks).get();
+    } finally {
+      service.shutdown();
+    }
+    assertThat(holder.count).isEqualTo(ITERATION_COUNT);
+    for (int length : completeLengthChecks) {
+      // Verify that at max depth, less than one stack frame per submitted task was consumed
+      assertThat(length - baseStackDepth).isLessThan(DIRECT_EXECUTIONS_PER_THREAD / 2);
+    }
+  }
+
+  @SuppressWarnings("ObjectToString") // Intended behavior
   public void testToString() {
-    Future<?> first = serializer.submitAsync(firstCallable, directExecutor());
+    Future<?> unused = serializer.submitAsync(firstCallable, directExecutor());
     TestCallable secondCallable = new TestCallable(SettableFuture.<Void>create());
     Future<?> second = serializer.submitAsync(secondCallable, directExecutor());
     assertThat(secondCallable.called).isFalse();
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 6c66c46..ab53f53 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
@@ -41,7 +41,12 @@
 public class FluentFutureTest extends TestCase {
   public void testFromFluentFuture() {
     FluentFuture<String> f = FluentFuture.from(SettableFuture.<String>create());
-    assertThat(FluentFuture.from(f)).isSameAs(f);
+    assertThat(FluentFuture.from(f)).isSameInstanceAs(f);
+  }
+
+  public void testFromFluentFuturePassingAsNonFluent() {
+    ListenableFuture<String> f = FluentFuture.from(SettableFuture.<String>create());
+    assertThat(FluentFuture.from(f)).isSameInstanceAs(f);
   }
 
   public void testFromNonFluentFuture() throws Exception {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ForwardingCheckedFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ForwardingCheckedFutureTest.java
deleted file mode 100644
index 3c71997..0000000
--- a/android/guava-tests/test/com/google/common/util/concurrent/ForwardingCheckedFutureTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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 junit.framework.TestCase;
-
-/**
- * Test for {@link ForwardingCheckedFuture}
- *
- * @author Ben Yu
- */
-public class ForwardingCheckedFutureTest extends TestCase {
-  public void testForwarding() {
-    ForwardingObjectTester.testForwardingObject(ForwardingCheckedFuture.class);
-  }
-}
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 3c19478..2ec1736 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
@@ -160,7 +160,7 @@
       getChecked(FAILED_FUTURE_CHECKED_EXCEPTION, ExceptionWithGoodAndBadConstructor.class);
       fail();
     } catch (ExceptionWithGoodAndBadConstructor expected) {
-      assertThat(expected).hasCauseThat().isSameAs(CHECKED_EXCEPTION);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(CHECKED_EXCEPTION);
     }
   }
 
@@ -287,7 +287,7 @@
           TimeUnit.SECONDS);
       fail();
     } catch (ExceptionWithGoodAndBadConstructor expected) {
-      assertThat(expected).hasCauseThat().isSameAs(CHECKED_EXCEPTION);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(CHECKED_EXCEPTION);
     }
   }
 
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 276e5ff..797ee48 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
@@ -29,15 +29,14 @@
 import static com.google.common.util.concurrent.Futures.catchingAsync;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
-import static com.google.common.util.concurrent.Futures.immediateCheckedFuture;
-import static com.google.common.util.concurrent.Futures.immediateFailedCheckedFuture;
 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.Futures.immediateVoidFuture;
 import static com.google.common.util.concurrent.Futures.inCompletionOrder;
 import static com.google.common.util.concurrent.Futures.lazyTransform;
-import static com.google.common.util.concurrent.Futures.makeChecked;
 import static com.google.common.util.concurrent.Futures.nonCancellationPropagating;
 import static com.google.common.util.concurrent.Futures.scheduleAsync;
+import static com.google.common.util.concurrent.Futures.submit;
 import static com.google.common.util.concurrent.Futures.submitAsync;
 import static com.google.common.util.concurrent.Futures.successfulAsList;
 import static com.google.common.util.concurrent.Futures.transform;
@@ -49,7 +48,7 @@
 import static com.google.common.util.concurrent.TestPlatform.getDoneFromTimeoutOverload;
 import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
-import static java.lang.Thread.currentThread;
+import static com.google.common.util.concurrent.testing.TestingExecutors.noOpScheduledExecutor;
 import static java.util.Arrays.asList;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
@@ -140,6 +139,14 @@
     assertThat(future.toString()).contains("[status=SUCCESS, result=[" + DATA1 + "]]");
   }
 
+  public void testImmediateVoidFuture() throws Exception {
+    ListenableFuture<Void> voidFuture = immediateVoidFuture();
+
+    assertThat(getDone(voidFuture)).isNull();
+    assertThat(getDoneFromTimeoutOverload(voidFuture)).isNull();
+    assertThat(voidFuture.toString()).contains("[status=SUCCESS, result=[null]]");
+  }
+
   public void testImmediateFailedFuture() throws Exception {
     Exception exception = new Exception();
     ListenableFuture<String> future = immediateFailedFuture(exception);
@@ -232,49 +239,6 @@
 
   private static class MyException extends Exception {}
 
-  @GwtIncompatible // immediateCheckedFuture
-  public void testImmediateCheckedFuture() throws Exception {
-    CheckedFuture<String, MyException> future = immediateCheckedFuture(DATA1);
-    assertThat(future.toString()).endsWith("[status=SUCCESS, result=[" + DATA1 + "]]");
-
-    // Verify that the proper object is returned without waiting
-    assertSame(DATA1, future.get(0L, MILLISECONDS));
-    assertSame(DATA1, future.checkedGet(0L, MILLISECONDS));
-  }
-
-  @GwtIncompatible // immediateCheckedFuture
-  public void testMultipleImmediateCheckedFutures() throws Exception {
-    CheckedFuture<String, MyException> future1 = immediateCheckedFuture(DATA1);
-    CheckedFuture<String, MyException> future2 = immediateCheckedFuture(DATA2);
-
-    // Verify that the proper objects are returned without waiting
-    assertSame(DATA1, future1.get(0L, MILLISECONDS));
-    assertSame(DATA1, future1.checkedGet(0L, MILLISECONDS));
-    assertSame(DATA2, future2.get(0L, MILLISECONDS));
-    assertSame(DATA2, future2.checkedGet(0L, MILLISECONDS));
-  }
-
-  @GwtIncompatible // immediateFailedCheckedFuture
-  public void testImmediateFailedCheckedFuture() throws Exception {
-    MyException exception = new MyException();
-    CheckedFuture<String, MyException> future = immediateFailedCheckedFuture(exception);
-    assertThat(future.toString()).endsWith("[status=FAILURE, cause=[" + exception + "]]");
-
-    try {
-      future.get(0L, MILLISECONDS);
-      fail();
-    } catch (ExecutionException expected) {
-      assertSame(exception, expected.getCause());
-    }
-
-    try {
-      future.checkedGet(0L, MILLISECONDS);
-      fail();
-    } catch (MyException expected) {
-      assertSame(exception, expected);
-    }
-  }
-
   // Class hierarchy for generics sanity checks
   private static class Foo {}
 
@@ -844,26 +808,23 @@
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
     AsyncFunction<Object, Object> function =
-        new AsyncFunction<Object, Object>() {
-          @Override
-          public ListenableFuture<Object> apply(Object input) throws Exception {
-            functionCalled.countDown();
-            functionBlocking.await();
-            return immediateFuture(null);
-          }
-
-          @Override
-          public String toString() {
-            return "Called my toString";
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncFunction<Object, Object>() {
+              @Override
+              public ListenableFuture<Object> apply(Object input) throws Exception {
+                functionCalled.countDown();
+                functionBlocking.await();
+                return immediateFuture(null);
+              }
+            });
 
     ExecutorService executor = Executors.newSingleThreadExecutor();
     try {
       ListenableFuture<?> output =
           Futures.transformAsync(immediateFuture(null), function, executor);
       functionCalled.await();
-      assertThat(output.toString()).contains("Called my toString");
+      assertThat(output.toString()).contains(function.toString());
     } finally {
       functionBlocking.countDown();
       executor.shutdown();
@@ -995,7 +956,7 @@
             new AsyncFunction<Throwable, Integer>() {
               @Override
               public ListenableFuture<Integer> apply(Throwable t) throws Exception {
-                assertThat(t).isSameAs(raisedException);
+                assertThat(t).isSameInstanceAs(raisedException);
                 return immediateFuture(20);
               }
             });
@@ -1128,7 +1089,7 @@
             new AsyncFunction<Throwable, Integer>() {
               @Override
               public ListenableFuture<Integer> apply(Throwable t) throws Exception {
-                assertThat(t).isSameAs(raisedException);
+                assertThat(t).isSameInstanceAs(raisedException);
                 return secondary;
               }
             });
@@ -1216,19 +1177,16 @@
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
     AsyncFunction<Object, Object> function =
-        new AsyncFunction<Object, Object>() {
-          @Override
-          public ListenableFuture<Object> apply(Object input) throws Exception {
-            functionCalled.countDown();
-            functionBlocking.await();
-            return immediateFuture(null);
-          }
-
-          @Override
-          public String toString() {
-            return "Called my toString";
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncFunction<Object, Object>() {
+              @Override
+              public ListenableFuture<Object> apply(Object input) throws Exception {
+                functionCalled.countDown();
+                functionBlocking.await();
+                return immediateFuture(null);
+              }
+            });
 
     ExecutorService executor = Executors.newSingleThreadExecutor();
     try {
@@ -1236,7 +1194,7 @@
           Futures.catchingAsync(
               immediateFailedFuture(new RuntimeException()), Throwable.class, function, executor);
       functionCalled.await();
-      assertThat(output.toString()).contains("Called my toString");
+      assertThat(output.toString()).contains(function.toString());
     } finally {
       functionBlocking.countDown();
       executor.shutdown();
@@ -1246,17 +1204,14 @@
   public void testCatchingAsync_futureToString() throws Exception {
     final SettableFuture<Object> toReturn = SettableFuture.create();
     AsyncFunction<Object, Object> function =
-        new AsyncFunction<Object, Object>() {
-          @Override
-          public ListenableFuture<Object> apply(Object input) throws Exception {
-            return toReturn;
-          }
-
-          @Override
-          public String toString() {
-            return "Called my toString";
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncFunction<Object, Object>() {
+              @Override
+              public ListenableFuture<Object> apply(Object input) throws Exception {
+                return toReturn;
+              }
+            });
 
     ListenableFuture<?> output =
         Futures.catchingAsync(
@@ -1284,7 +1239,7 @@
             new Function<Throwable, Integer>() {
               @Override
               public Integer apply(Throwable t) {
-                assertThat(t).isSameAs(raisedException);
+                assertThat(t).isSameInstanceAs(raisedException);
                 return 20;
               }
             });
@@ -1983,6 +1938,82 @@
     assertThat(Thread.interrupted()).isFalse();
   }
 
+  public void testSubmit_callable_returnsValue() throws Exception {
+    Callable<Integer> callable =
+        new Callable<Integer>() {
+          @Override
+          public Integer call() {
+            return 42;
+          }
+        };
+    ListenableFuture<Integer> future = submit(callable, directExecutor());
+    assertThat(future.isDone()).isTrue();
+    assertThat(getDone(future)).isEqualTo(42);
+  }
+
+  public void testSubmit_callable_throwsException() {
+    final Exception exception = new Exception("Exception for testing");
+    Callable<Integer> callable =
+        new Callable<Integer>() {
+          @Override
+          public Integer call() throws Exception {
+            throw exception;
+          }
+        };
+    ListenableFuture<Integer> future = submit(callable, directExecutor());
+    try {
+      getDone(future);
+      fail();
+    } catch (ExecutionException expected) {
+      assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+    }
+  }
+
+  public void testSubmit_runnable_completesAfterRun() throws Exception {
+    final List<Runnable> pendingRunnables = newArrayList();
+    final List<Runnable> executedRunnables = newArrayList();
+    Runnable runnable =
+        new Runnable() {
+          @Override
+          public void run() {
+            executedRunnables.add(this);
+          }
+        };
+    Executor executor =
+        new Executor() {
+          @Override
+          public void execute(Runnable runnable) {
+            pendingRunnables.add(runnable);
+          }
+        };
+    ListenableFuture<Void> future = submit(runnable, executor);
+    assertThat(future.isDone()).isFalse();
+    assertThat(executedRunnables).isEmpty();
+    assertThat(pendingRunnables).hasSize(1);
+    pendingRunnables.remove(0).run();
+    assertThat(future.isDone()).isTrue();
+    assertThat(executedRunnables).containsExactly(runnable);
+    assertThat(pendingRunnables).isEmpty();
+  }
+
+  public void testSubmit_runnable_throwsException() throws Exception {
+    final RuntimeException exception = new RuntimeException("Exception for testing");
+    Runnable runnable =
+        new Runnable() {
+          @Override
+          public void run() {
+            throw exception;
+          }
+        };
+    ListenableFuture<Void> future = submit(runnable, directExecutor());
+    try {
+      getDone(future);
+      fail();
+    } catch (ExecutionException expected) {
+      assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+    }
+  }
+
   @GwtIncompatible // threads
 
   public void testScheduleAsync_asyncCallable_error() throws InterruptedException {
@@ -2484,7 +2515,7 @@
       fail();
     } catch (CancellationException expected) {
       assertThat(getOnlyElement(aggregateFutureLogHandler.getStoredLogRecords()).getThrown())
-          .isSameAs(subsequentFailure);
+          .isSameInstanceAs(subsequentFailure);
     }
   }
 
@@ -2559,25 +2590,66 @@
     unused = whenAllComplete(asList(futures)).call(combiner, directExecutor());
   }
 
+  @GwtIncompatible // threads
+
   public void testWhenAllComplete_asyncResult() throws Exception {
-    final SettableFuture<Integer> futureInteger = SettableFuture.create();
-    final SettableFuture<Boolean> futureBoolean = SettableFuture.create();
+    SettableFuture<Integer> futureInteger = SettableFuture.create();
+    SettableFuture<Boolean> futureBoolean = SettableFuture.create();
+
+    final ExecutorService executor = newSingleThreadExecutor();
+    final CountDownLatch callableBlocking = new CountDownLatch(1);
+    final SettableFuture<String> resultOfCombiner = SettableFuture.create();
     AsyncCallable<String> combiner =
-        new AsyncCallable<String>() {
-          @Override
-          public ListenableFuture<String> call() throws Exception {
-            return immediateFuture(
-                createCombinedResult(getDone(futureInteger), getDone(futureBoolean)));
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncCallable<String>() {
+              @Override
+              public ListenableFuture<String> call() throws Exception {
+                // Make this executor terminate after this task so that the test can tell when
+                // futureResult has received resultOfCombiner.
+                executor.shutdown();
+                callableBlocking.await();
+                return resultOfCombiner;
+              }
+            });
 
     ListenableFuture<String> futureResult =
-        whenAllComplete(futureInteger, futureBoolean).callAsync(combiner, directExecutor());
+        whenAllComplete(futureInteger, futureBoolean).callAsync(combiner, executor);
+
+    // Waiting on backing futures
+    assertThat(futureResult.toString())
+        .matches(
+            "CombinedFuture@\\w+\\[status=PENDING,"
+                + " info=\\[futures=\\[SettableFuture@\\w+\\[status=PENDING],"
+                + " SettableFuture@\\w+\\[status=PENDING]]]]");
     Integer integerPartial = 1;
     futureInteger.set(integerPartial);
+    assertThat(futureResult.toString())
+        .matches(
+            "CombinedFuture@\\w+\\[status=PENDING,"
+                + " info=\\[futures=\\[SettableFuture@\\w+\\[status=SUCCESS,"
+                + " result=\\[java.lang.Integer@\\w+]], SettableFuture@\\w+\\[status=PENDING]]]]");
+
+    // Backing futures complete
     Boolean booleanPartial = true;
     futureBoolean.set(booleanPartial);
-    assertEquals(createCombinedResult(integerPartial, booleanPartial), getDone(futureResult));
+    // Once the backing futures are done there's a (brief) moment where we know nothing
+    assertThat(futureResult.toString()).matches("CombinedFuture@\\w+\\[status=PENDING]");
+    callableBlocking.countDown();
+    // Need to wait for resultFuture to be returned.
+    assertTrue(executor.awaitTermination(10, SECONDS));
+    // But once the async function has returned a future we can include that in the toString
+    assertThat(futureResult.toString())
+        .matches(
+            "CombinedFuture@\\w+\\[status=PENDING,"
+                + " setFuture=\\[SettableFuture@\\w+\\[status=PENDING]]]");
+
+    // Future complete
+    resultOfCombiner.set(createCombinedResult(getDone(futureInteger), getDone(futureBoolean)));
+    String expectedResult = createCombinedResult(integerPartial, booleanPartial);
+    assertEquals(expectedResult, futureResult.get());
+    assertThat(futureResult.toString())
+        .matches("CombinedFuture@\\w+\\[status=SUCCESS, result=\\[java.lang.String@\\w+]]");
   }
 
   public void testWhenAllComplete_asyncError() throws Exception {
@@ -2848,6 +2920,84 @@
     }
   }
 
+  @AndroidIncompatible
+  @GwtIncompatible
+  public void testWhenAllSucceed_releasesInputFuturesUponSubmission() throws Exception {
+    SettableFuture<Long> future1 = SettableFuture.create();
+    SettableFuture<Long> future2 = SettableFuture.create();
+    WeakReference<SettableFuture<Long>> future1Ref = new WeakReference<>(future1);
+    WeakReference<SettableFuture<Long>> future2Ref = new WeakReference<>(future2);
+
+    Callable<Long> combiner =
+        new Callable<Long>() {
+          @Override
+          public Long call() {
+            throw new AssertionError();
+          }
+        };
+
+    ListenableFuture<Long> unused =
+        whenAllSucceed(future1, future2).call(combiner, noOpScheduledExecutor());
+
+    future1.set(1L);
+    future1 = null;
+    future2.set(2L);
+    future2 = null;
+
+    /*
+     * Futures should be collected even if combiner never runs. This is kind of a silly test, since
+     * the combiner is almost certain to hold its own reference to the futures, and a real app would
+     * hold a reference to the executor and thus to the combiner. What we really care about is that
+     * the futures are released once the combiner is done running. But we happen to provide this
+     * earlier cleanup at the moment, so we're testing it.
+     */
+    GcFinalization.awaitClear(future1Ref);
+    GcFinalization.awaitClear(future2Ref);
+  }
+
+  @AndroidIncompatible
+  @GwtIncompatible
+  public void testWhenAllComplete_releasesInputFuturesUponCancellation() throws Exception {
+    SettableFuture<Long> future = SettableFuture.create();
+    WeakReference<SettableFuture<Long>> futureRef = new WeakReference<>(future);
+
+    Callable<Long> combiner =
+        new Callable<Long>() {
+          @Override
+          public Long call() {
+            throw new AssertionError();
+          }
+        };
+
+    ListenableFuture<Long> unused = whenAllComplete(future).call(combiner, noOpScheduledExecutor());
+
+    unused.cancel(false);
+    future = null;
+
+    // Future should be collected because whenAll*Complete* doesn't need to look at its result.
+    GcFinalization.awaitClear(futureRef);
+  }
+
+  @AndroidIncompatible
+  @GwtIncompatible
+  public void testWhenAllSucceed_releasesCallable() throws Exception {
+    AsyncCallable<Long> combiner =
+        new AsyncCallable<Long>() {
+          @Override
+          public ListenableFuture<Long> call() {
+            return SettableFuture.create();
+          }
+        };
+    WeakReference<AsyncCallable<Long>> combinerRef = new WeakReference<>(combiner);
+
+    ListenableFuture<Long> unused =
+        whenAllSucceed(immediateFuture(1L)).callAsync(combiner, directExecutor());
+
+    combiner = null;
+    // combiner should be collected even if the future it returns never completes.
+    GcFinalization.awaitClear(combinerRef);
+  }
+
   /*
    * TODO(cpovirk): maybe pass around TestFuture instances instead of
    * ListenableFuture instances
@@ -3117,7 +3267,7 @@
       throw failureWithCause(e, "Unexpected exception");
     } finally {
       executor.shutdownNow();
-      // TODO(cpovirk: assertTrue(awaitTerminationUninterruptibly(executor, 10, SECONDS));
+      // TODO(cpovirk): assertTrue(awaitTerminationUninterruptibly(executor, 10, SECONDS));
     }
   }
 
@@ -3481,6 +3631,24 @@
     assertThat(logged.get(0).getThrown()).isInstanceOf(MyError.class);
   }
 
+  public void testSuccessfulAsList_failureLoggedEvenAfterOutputCancelled() throws Exception {
+    ListenableFuture<String> input = new CancelPanickingFuture<>();
+    ListenableFuture<List<String>> output = successfulAsList(input);
+    output.cancel(false);
+
+    List<LogRecord> logged = aggregateFutureLogHandler.getStoredLogRecords();
+    assertThat(logged).hasSize(1);
+    assertThat(logged.get(0).getThrown()).hasMessageThat().isEqualTo("You can't fire me, I quit.");
+  }
+
+  private static final class CancelPanickingFuture<V> extends AbstractFuture<V> {
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+      setException(new Error("You can't fire me, I quit."));
+      return false;
+    }
+  }
+
   public void testNonCancellationPropagating_successful() throws Exception {
     SettableFuture<Foo> input = SettableFuture.create();
     ListenableFuture<Foo> wrapper = nonCancellationPropagating(input);
@@ -3536,233 +3704,6 @@
   }
 
   @GwtIncompatible // used only in GwtIncompatible tests
-  private static final Function<Exception, TestException> mapper =
-      new Function<Exception, TestException>() {
-        @Override
-        public TestException apply(Exception from) {
-          if (from instanceof ExecutionException) {
-            return new TestException(from.getCause());
-          } else {
-            assertTrue(
-                "got " + from.getClass(),
-                from instanceof InterruptedException || from instanceof CancellationException);
-            return new TestException(from);
-          }
-        }
-      };
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_mapsExecutionExceptions() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked = makeChecked(future, mapper);
-
-    future.setException(new IOException("checked"));
-
-    assertTrue(checked.isDone());
-    assertFalse(checked.isCancelled());
-
-    try {
-      checked.get();
-      fail();
-    } catch (ExecutionException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-
-    try {
-      checked.get(5, SECONDS);
-      fail();
-    } catch (ExecutionException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_mapsInterruption() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked = makeChecked(future, mapper);
-
-    currentThread().interrupt();
-
-    try {
-      checked.get();
-      fail();
-    } catch (InterruptedException expected) {
-    }
-
-    currentThread().interrupt();
-
-    try {
-      checked.get(5, SECONDS);
-      fail();
-    } catch (InterruptedException expected) {
-    }
-
-    currentThread().interrupt();
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(InterruptedException.class);
-    }
-
-    currentThread().interrupt();
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(InterruptedException.class);
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_mapsCancellation() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked = makeChecked(future, mapper);
-
-    assertTrue(future.cancel(true)); // argument is ignored
-
-    try {
-      checked.get();
-      fail();
-    } catch (CancellationException expected) {
-    }
-
-    try {
-      checked.get(5, SECONDS);
-      fail();
-    } catch (CancellationException expected) {
-    }
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(CancellationException.class);
-    }
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(CancellationException.class);
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_propagatesFailedMappers() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    future.setException(new Exception("failed"));
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (NullPointerException expected) {
-    }
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-
-  public void testMakeChecked_listenersRunOnceCompleted() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    ListenableFutureTester tester = new ListenableFutureTester(checked);
-    tester.setUp();
-    future.set(DATA1);
-    tester.testCompletedFuture(DATA1);
-    tester.tearDown();
-  }
-
-  @GwtIncompatible // makeChecked
-
-  public void testMakeChecked_listenersRunOnCancel() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    ListenableFutureTester tester = new ListenableFutureTester(checked);
-    tester.setUp();
-    future.cancel(true); // argument is ignored
-    tester.testCancelledFuture();
-    tester.tearDown();
-  }
-
-  @GwtIncompatible // makeChecked
-
-  public void testMakeChecked_listenersRunOnFailure() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    ListenableFutureTester tester = new ListenableFutureTester(checked);
-    tester.setUp();
-    future.setException(new Exception("failed"));
-    tester.testFailedFuture("failed");
-    tester.tearDown();
-  }
-
-  @GwtIncompatible // used only in GwtIncompatible tests
   private interface MapperFunction extends Function<Throwable, Exception> {}
 
   public void testCompletionOrder() throws Exception {
@@ -3974,6 +3915,10 @@
   // Simulate a timeout that fires before the call the SES.schedule returns but the future is
   // already completed.
 
+  // This test covers a bug where an Error thrown from a callback could cause the TimeoutFuture to
+  // never complete when timing out.  Notably, nothing would get logged since the Error would get
+  // stuck in the ScheduledFuture inside of TimeoutFuture and nothing ever calls get on it.
+
   private static final Executor REJECTING_EXECUTOR =
       new Executor() {
         @Override
@@ -3990,4 +3935,34 @@
       }
     };
   }
+
+  private static <I, O> AsyncFunction<I, O> tagged(
+      final String toString, final AsyncFunction<I, O> function) {
+    return new AsyncFunction<I, O>() {
+      @Override
+      public ListenableFuture<O> apply(I input) throws Exception {
+        return function.apply(input);
+      }
+
+      @Override
+      public String toString() {
+        return toString;
+      }
+    };
+  }
+
+  private static <V> AsyncCallable<V> tagged(
+      final String toString, final AsyncCallable<V> callable) {
+    return new AsyncCallable<V>() {
+      @Override
+      public ListenableFuture<V> call() throws Exception {
+        return callable.call();
+      }
+
+      @Override
+      public String toString() {
+        return toString;
+      }
+    };
+  }
 }
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 1f1111b..741ff45 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
@@ -233,6 +233,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/MoreExecutorsTest.java b/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
index 2343845..08c8f19 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
@@ -467,7 +467,7 @@
       future.get();
       fail("Expected ExecutionException");
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(expectedCause);
+      assertThat(e).hasCauseThat().isSameInstanceAs(expectedCause);
     }
   }
 
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 4b1bd83..ff9e311 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
@@ -17,6 +17,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.MoreExecutors.newSequentialExecutor;
 import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
 
 import com.google.common.collect.ImmutableList;
@@ -188,7 +189,7 @@
     // Check that this thread has been marked as interrupted again now that the thread has been
     // returned by SequentialExecutor. Clear the bit while checking so that the test doesn't hose
     // JUnit or some other test case.
-    assertThat(Thread.currentThread().interrupted()).isTrue();
+    assertThat(Thread.interrupted()).isTrue();
   }
 
   public void testInterrupt_doesNotInterruptSubsequentTask() throws Exception {
@@ -215,7 +216,7 @@
     // Check that the interruption of a SequentialExecutor's task is restored to the thread once
     // it is yielded. Clear the bit while checking so that the test doesn't hose JUnit or some other
     // test case.
-    assertThat(Thread.currentThread().interrupted()).isTrue();
+    assertThat(Thread.interrupted()).isTrue();
   }
 
   public void testInterrupt_doesNotStopExecution() {
@@ -348,4 +349,40 @@
       assertThat(expected).hasCauseThat().isInstanceOf(RejectedExecutionException.class);
     }
   }
+
+  public void testToString() {
+    final Runnable[] currentTask = new Runnable[1];
+    final Executor delegate =
+        new Executor() {
+          @Override
+          public void execute(Runnable task) {
+            currentTask[0] = task;
+            task.run();
+            currentTask[0] = null;
+          }
+
+          @Override
+          public String toString() {
+            return "theDelegate";
+          }
+        };
+    Executor sequential1 = newSequentialExecutor(delegate);
+    Executor sequential2 = newSequentialExecutor(delegate);
+    assertThat(sequential1.toString()).contains("theDelegate");
+    assertThat(sequential1.toString()).isNotEqualTo(sequential2.toString());
+    final String[] whileRunningToString = new String[1];
+    sequential1.execute(
+        new Runnable() {
+          @Override
+          public void run() {
+            whileRunningToString[0] = "" + currentTask[0];
+          }
+
+          @Override
+          public String toString() {
+            return "my runnable's toString";
+          }
+        });
+    assertThat(whileRunningToString[0]).contains("my runnable's toString");
+  }
 }
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 0223b9a..fbc238e 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
@@ -17,6 +17,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.Arrays.asList;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
@@ -171,7 +172,7 @@
     Service b = new NoOpService();
     ServiceManager manager = new ServiceManager(asList(a, b));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     assertState(manager, Service.State.NEW, a, b);
     assertFalse(manager.isHealthy());
     manager.startAsync().awaitHealthy();
@@ -195,7 +196,7 @@
     Service e = new NoOpService();
     ServiceManager manager = new ServiceManager(asList(a, b, c, d, e));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     assertState(manager, Service.State.NEW, a, b, c, d, e);
     try {
       manager.startAsync().awaitHealthy();
@@ -219,7 +220,7 @@
     Service b = new FailRunService();
     ServiceManager manager = new ServiceManager(asList(a, b));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     assertState(manager, Service.State.NEW, a, b);
     try {
       manager.startAsync().awaitHealthy();
@@ -242,7 +243,7 @@
     Service c = new NoOpService();
     ServiceManager manager = new ServiceManager(asList(a, b, c));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
 
     manager.startAsync().awaitHealthy();
     assertTrue(listener.healthyCalled);
@@ -292,7 +293,7 @@
     Service a = new FailStartService();
     ServiceManager manager = new ServiceManager(asList(a));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     try {
       manager.startAsync().awaitHealthy();
       fail();
@@ -309,7 +310,7 @@
     Service a = new FailStartService();
     ServiceManager manager = new ServiceManager(asList(a));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     try {
       manager.startAsync().awaitHealthy();
       fail();
@@ -334,7 +335,8 @@
           public void failure(Service service) {
             manager.stopAsync();
           }
-        });
+        },
+        directExecutor());
     manager.startAsync();
     manager.awaitStopped(10, TimeUnit.MILLISECONDS);
   }
@@ -408,7 +410,7 @@
     logger.addHandler(logHandler);
     ServiceManager manager = new ServiceManager(Arrays.<Service>asList());
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     manager.startAsync().awaitHealthy();
     assertTrue(manager.isHealthy());
     assertTrue(listener.healthyCalled);
@@ -476,7 +478,8 @@
             // block until after the service manager is shutdown
             Uninterruptibles.awaitUninterruptibly(failLeave);
           }
-        });
+        },
+        directExecutor());
     manager.startAsync();
     afterStarted.countDown();
     // We do not call awaitHealthy because, due to races, that method may throw an exception.  But
@@ -608,7 +611,7 @@
       }
       ServiceManager manager = new ServiceManager(services);
       manager.startAsync().awaitHealthy();
-      manager.stopAsync().awaitStopped(1, TimeUnit.SECONDS);
+      manager.stopAsync().awaitStopped(10, TimeUnit.SECONDS);
     }
   }
 
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 6cabb08..105e8de 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
@@ -112,7 +112,7 @@
       future.get();
       fail("Expected ExecutionException");
     } catch (ExecutionException ee) {
-      assertThat(ee).hasCauseThat().isSameAs(e);
+      assertThat(ee).hasCauseThat().isSameInstanceAs(e);
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
index 26a44b7..04b824f 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
@@ -38,7 +38,7 @@
 public class SimpleTimeLimiterTest extends TestCase {
 
   private static final long DELAY_MS = 50;
-  private static final long ENOUGH_MS = 500;
+  private static final long ENOUGH_MS = 10000;
   private static final long NOT_ENOUGH_MS = 5;
 
   private static final String GOOD_CALLABLE_RESULT = "good callable result";
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 6ec5620..47507cd 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
@@ -33,7 +33,7 @@
 import java.util.concurrent.TimeoutException;
 import junit.framework.TestCase;
 
-// TODO(azana/cpovirk): Should this be merged into UninterruptiblesTest?
+// TODO(cpovirk): Should this be merged into UninterruptiblesTest?
 /**
  * Unit test for {@link Uninterruptibles#getUninterruptibly}
  *
@@ -97,7 +97,7 @@
 
     assertFalse(Thread.interrupted());
     try {
-      delayedFuture.get(10000, TimeUnit.MILLISECONDS);
+      delayedFuture.get(20000, TimeUnit.MILLISECONDS);
       fail("expected to be interrupted");
     } catch (InterruptedException expected) {
     } catch (TimeoutException e) {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
index fbe00bf..e58cf6a 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
@@ -17,22 +17,28 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.util.concurrent.InterruptionUtil.repeatedlyInterruptTestThread;
+import static com.google.common.util.concurrent.Uninterruptibles.awaitTerminationUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.joinUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.putUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.takeUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.tryAcquireUninterruptibly;
+import static com.google.common.util.concurrent.Uninterruptibles.tryLockUninterruptibly;
+import static java.util.concurrent.Executors.newFixedThreadPool;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Stopwatch;
 import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.TearDown;
 import com.google.common.testing.TearDownStack;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Date;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
@@ -141,6 +147,63 @@
     assertInterrupted();
   }
 
+  // Lock.tryLock() tests
+  public void testTryLockTimeoutExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    Thread lockThread = acquireFor(lock, 5, SECONDS);
+
+    boolean lockAcquired = tryLockUninterruptibly(lock, 500, MILLISECONDS);
+
+    assertFalse(lockAcquired);
+    assertAtLeastTimePassed(stopwatch, 500);
+    assertNotInterrupted();
+
+    // finish locking thread
+    lockThread.interrupt();
+  }
+
+  public void testTryLockTimeoutNotExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    acquireFor(lock, 500, MILLISECONDS);
+
+    boolean signaledBeforeTimeout = tryLockUninterruptibly(lock, 1500, MILLISECONDS);
+
+    assertTrue(signaledBeforeTimeout);
+    assertTimeNotPassed(stopwatch, LONG_DELAY_MS);
+    assertNotInterrupted();
+  }
+
+  public void testTryLockInterruptedTimeoutExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    Thread lockThread = acquireFor(lock, 5, SECONDS);
+    requestInterruptIn(500);
+
+    boolean signaledBeforeTimeout = tryLockUninterruptibly(lock, 1000, MILLISECONDS);
+
+    assertFalse(signaledBeforeTimeout);
+    assertAtLeastTimePassed(stopwatch, 1000);
+    assertInterrupted();
+
+    // finish locking thread
+    lockThread.interrupt();
+  }
+
+  public void testTryLockInterruptedTimeoutNotExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    acquireFor(lock, 1000, MILLISECONDS);
+    requestInterruptIn(500);
+
+    boolean signaledBeforeTimeout = tryLockUninterruptibly(lock, 1500, MILLISECONDS);
+
+    assertTrue(signaledBeforeTimeout);
+    assertTimeNotPassed(stopwatch, LONG_DELAY_MS);
+    assertInterrupted();
+  }
+
   // BlockingQueue.put() tests
   public void testPutWithNoWait() {
     Stopwatch stopwatch = Stopwatch.createStarted();
@@ -405,6 +468,37 @@
     assertInterrupted();
   }
 
+  // executor.awaitTermination Testcases
+  public void testTryAwaitTerminationUninterruptiblyLongTimeUnit_success() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(1000));
+    executor.shutdown();
+    assertTrue(awaitTerminationUninterruptibly(executor, LONG_DELAY_MS, MILLISECONDS));
+    assertTrue(executor.isTerminated());
+    assertInterrupted();
+  }
+
+  public void testTryAwaitTerminationUninterruptiblyLongTimeUnit_failure() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(10000));
+    executor.shutdown();
+    assertFalse(awaitTerminationUninterruptibly(executor, 1000, MILLISECONDS));
+    assertFalse(executor.isTerminated());
+    assertInterrupted();
+  }
+
+  public void testTryAwaitTerminationInfiniteTimeout() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(1000));
+    executor.shutdown();
+    awaitTerminationUninterruptibly(executor);
+    assertTrue(executor.isTerminated());
+    assertInterrupted();
+  }
+
   /**
    * Wrapper around {@link Stopwatch} which also contains an "expected completion time." Creating a
    * {@code Completion} starts the underlying stopwatch.
@@ -694,6 +788,15 @@
     }
   }
 
+  private static final class SleepTask extends DelayedActionRunnable {
+    SleepTask(long tMinus) {
+      super(tMinus);
+    }
+
+    @Override
+    protected void doAction() {}
+  }
+
   private static void sleepSuccessfully(long sleepMillis) {
     Completion completed = new Completion(sleepMillis - SLEEP_SLACK);
     Uninterruptibles.sleepUninterruptibly(sleepMillis, MILLISECONDS);
@@ -729,6 +832,30 @@
     InterruptionUtil.requestInterruptIn(millis, MILLISECONDS);
   }
 
+  @CanIgnoreReturnValue
+  private static Thread acquireFor(final Lock lock, final long duration, final TimeUnit unit) {
+    final CountDownLatch latch = new CountDownLatch(1);
+    Thread thread =
+        new Thread() {
+          @Override
+          public void run() {
+            lock.lock();
+            latch.countDown();
+            try {
+              Thread.sleep(unit.toMillis(duration));
+            } catch (InterruptedException e) {
+              // simply finish execution
+            } finally {
+              lock.unlock();
+            }
+          }
+        };
+    thread.setDaemon(true);
+    thread.start();
+    awaitUninterruptibly(latch);
+    return thread;
+  }
+
   private static class TestCondition implements Condition {
     private final Lock lock;
     private final Condition condition;
diff --git a/android/guava/pom.xml b/android/guava/pom.xml
index cbff022..92db217 100644
--- a/android/guava/pom.xml
+++ b/android/guava/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>27.1-android</version>
+    <version>30.0-android</version>
   </parent>
   <artifactId>guava</artifactId>
   <packaging>bundle</packaging>
@@ -42,11 +42,6 @@
       <groupId>com.google.j2objc</groupId>
       <artifactId>j2objc-annotations</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.mojo</groupId>
-      <artifactId>animal-sniffer-annotations</artifactId>
-      <version>${animal.sniffer.version}</version>
-    </dependency>
     <!-- TODO(cpovirk): does this comment belong on the <dependency> in <profiles>? -->
     <!-- TODO(cpovirk): want this only for dependency plugin but seems not to work there? Maven runs without failure, but the resulting Javadoc is missing the hoped-for inherited text -->
   </dependencies>
@@ -111,6 +106,8 @@
               <includeArtifactIds>srczip</includeArtifactIds>
               <outputDirectory>${project.build.directory}/jdk-sources</outputDirectory>
               <silent>false</silent>
+              <!-- Exclude module-info files (since we're using -source 8 to avoid other modules problems) and FileDescriptor (which uses a language feature not available in Java 8). -->
+              <excludes>**/module-info.java,**/java/io/FileDescriptor.java</excludes>
             </configuration>
           </execution>
         </executions>
@@ -128,7 +125,38 @@
           <sourcepath>${project.build.sourceDirectory}:${project.build.directory}/jdk-sources</sourcepath>
 
           <!-- Passing `-subpackages com.google.common` breaks things, so we explicitly exclude everything else instead. -->
-          <excludePackageNames>com.google.common.base.internal,com.google.thirdparty.publicsuffix,com.oracle,com.sun,java,javax,jdk,org,sun</excludePackageNames>
+          <!-- excludePackageNames requires specification of packages separately from "all subpackages".
+               https://issues.apache.org/jira/browse/MJAVADOC-584 -->
+          <excludePackageNames>
+            com.google.common.base.internal,com.google.common.base.internal.*,com.google.thirdparty.publicsuffix,com.google.thirdparty.publicsuffix.*,com.oracle.*,com.sun.*,java.*,javax.*,jdk,jdk.*,org.*,sun.*
+          </excludePackageNames>
+          <!-- Ignore some tags that are found in Java 11 sources but not recognized... under -source 8, I think it was? I can no longer reproduce the failure. -->
+          <tags>
+            <tag>
+              <name>apiNote</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>implNote</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>implSpec</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>jls</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>revised</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>spec</name>
+              <placement>X</placement>
+            </tag>
+          </tags>
 
           <!-- TODO(cpovirk): Move this to the parent after making the package-list files available there. -->
           <!-- We add the link ourselves, both so that we can choose Java 9 over the version that -source suggests and so that we can solve the JSR305 problem described below. -->
@@ -174,7 +202,7 @@
   </build>
   <profiles>
     <profile>
-      <id>srczip</id>
+      <id>srczip-parent</id>
       <activation>
         <file>
           <exists>${java.home}/../src.zip</exists>
@@ -191,5 +219,34 @@
         </dependency>
       </dependencies>
     </profile>
+    <profile>
+      <id>srczip-lib</id>
+      <activation>
+        <file>
+          <exists>${java.home}/lib/src.zip</exists>
+        </file>
+      </activation>
+      <dependencies>
+        <dependency>
+          <groupId>jdk</groupId>
+          <artifactId>srczip</artifactId>
+          <version>999</version>
+          <scope>system</scope>
+          <systemPath>${java.home}/lib/src.zip</systemPath>
+          <optional>true</optional>
+        </dependency>
+      </dependencies>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-javadoc-plugin</artifactId>
+            <configuration>
+              <!-- We need to point at the java.base subdirectory because Maven appears to assume that package foo.bar is located in foo/bar and not java.base/foo/bar when translating excludePackageNames into filenames to pass to javadoc. (Note that manually passing -exclude to javadoc appears to possibly not work at all for java.* types??) Also, referring only to java.base avoids a lot of other sources. -->
+              <sourcepath>${project.build.sourceDirectory}:${project.build.directory}/jdk-sources/java.base</sourcepath>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
   </profiles>
 </project>
diff --git a/android/guava/src/com/google/common/annotations/VisibleForTesting.java b/android/guava/src/com/google/common/annotations/VisibleForTesting.java
index 4540cfd..e767afc 100755
--- a/android/guava/src/com/google/common/annotations/VisibleForTesting.java
+++ b/android/guava/src/com/google/common/annotations/VisibleForTesting.java
@@ -18,6 +18,13 @@
  * Annotates a program element that exists, or is more widely visible than otherwise necessary, only
  * for use in test code.
  *
+ * <p><b>Do not use this interface</b> for public or protected declarations: it is a fig leaf for
+ * bad design, and it does not prevent anyone from using the declaration---and experience has shown
+ * that they will. If the method breaks the encapsulation of its class, then its internal
+ * representation will be hard to change. Instead, use <a
+ * href="http://errorprone.info/bugpattern/RestrictedApiChecker">RestrictedApiChecker</a>, which
+ * enforces fine-grained visibility policies.
+ *
  * @author Johannes Henkel
  */
 @GwtCompatible
diff --git a/android/guava/src/com/google/common/base/AbstractIterator.java b/android/guava/src/com/google/common/base/AbstractIterator.java
index aaeb5f0..f6f521e 100644
--- a/android/guava/src/com/google/common/base/AbstractIterator.java
+++ b/android/guava/src/com/google/common/base/AbstractIterator.java
@@ -54,10 +54,10 @@
   public final boolean hasNext() {
     checkState(state != State.FAILED);
     switch (state) {
-      case READY:
-        return true;
       case DONE:
         return false;
+      case READY:
+        return true;
       default:
     }
     return tryToComputeNext();
diff --git a/android/guava/src/com/google/common/base/CaseFormat.java b/android/guava/src/com/google/common/base/CaseFormat.java
index 55acb1c..5e24bc9 100644
--- a/android/guava/src/com/google/common/base/CaseFormat.java
+++ b/android/guava/src/com/google/common/base/CaseFormat.java
@@ -73,6 +73,11 @@
     String normalizeWord(String word) {
       return firstCharOnlyToUpper(word);
     }
+
+    @Override
+    String normalizeFirstWord(String word) {
+      return Ascii.toLowerCase(word);
+    }
   },
 
   /** Java and C++ class naming convention, e.g., "UpperCamel". */
@@ -130,7 +135,7 @@
     while ((j = wordBoundary.indexIn(s, ++j)) != -1) {
       if (i == 0) {
         // include some extra space for separators
-        out = new StringBuilder(s.length() + 4 * wordSeparator.length());
+        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)));
@@ -197,8 +202,8 @@
 
   abstract String normalizeWord(String word);
 
-  private String normalizeFirstWord(String word) {
-    return (this == LOWER_CAMEL) ? Ascii.toLowerCase(word) : normalizeWord(word);
+  String normalizeFirstWord(String word) {
+    return normalizeWord(word);
   }
 
   private static String firstCharOnlyToUpper(String word) {
diff --git a/android/guava/src/com/google/common/base/CharMatcher.java b/android/guava/src/com/google/common/base/CharMatcher.java
index 6e15024..e17db17 100644
--- a/android/guava/src/com/google/common/base/CharMatcher.java
+++ b/android/guava/src/com/google/common/base/CharMatcher.java
@@ -1208,6 +1208,10 @@
   @VisibleForTesting
   static final class Whitespace extends NamedFastMatcher {
 
+    // TABLE is a precomputed hashset of whitespace characters. MULTIPLIER serves as a hash function
+    // whose key property is that it maps 25 characters into the 32-slot table without collision.
+    // Basically this is an opportunistic fast implementation as opposed to "good code". For most
+    // other use-cases, the reduction in readability isn't worth it.
     static final String TABLE =
         "\u2002\u3000\r\u0085\u200A\u2005\u2000\u3000"
             + "\u2029\u000B\u3000\u2008\u2003\u205F\u3000\u1680"
diff --git a/android/guava/src/com/google/common/base/Converter.java b/android/guava/src/com/google/common/base/Converter.java
index 4d30791..82c0057 100644
--- a/android/guava/src/com/google/common/base/Converter.java
+++ b/android/guava/src/com/google/common/base/Converter.java
@@ -20,9 +20,9 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.ForOverride;
 import com.google.errorprone.annotations.concurrent.LazyInit;
+import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -118,7 +118,7 @@
   private final boolean handleNullAutomatically;
 
   // We lazily cache the reverse view to avoid allocating on every call to reverse().
-  @LazyInit @MonotonicNonNullDecl private transient Converter<B, A> reverse;
+  @LazyInit @RetainedWith @NullableDecl private transient Converter<B, A> reverse;
 
   /** Constructor for use by subclasses. */
   protected Converter() {
@@ -484,7 +484,7 @@
    * "pass-through type".
    */
   private static final class IdentityConverter<T> extends Converter<T, T> implements Serializable {
-    static final IdentityConverter INSTANCE = new IdentityConverter();
+    static final IdentityConverter<?> INSTANCE = new IdentityConverter<>();
 
     @Override
     protected T doForward(T t) {
diff --git a/android/guava/src/com/google/common/base/FinalizableReference.java b/android/guava/src/com/google/common/base/FinalizableReference.java
index f7e5cf8..848e7ee 100644
--- a/android/guava/src/com/google/common/base/FinalizableReference.java
+++ b/android/guava/src/com/google/common/base/FinalizableReference.java
@@ -15,6 +15,7 @@
 package com.google.common.base;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * Implemented by references that have code to run after garbage collection of their referents.
@@ -23,6 +24,7 @@
  * @author Bob Lee
  * @since 2.0
  */
+@DoNotMock("Use an instance of one of the Finalizable*Reference classes")
 @GwtIncompatible
 public interface FinalizableReference {
   /**
diff --git a/android/guava/src/com/google/common/base/Functions.java b/android/guava/src/com/google/common/base/Functions.java
index e998c7a..805f15c 100644
--- a/android/guava/src/com/google/common/base/Functions.java
+++ b/android/guava/src/com/google/common/base/Functions.java
@@ -122,7 +122,7 @@
    * set. See also {@link #forMap(Map)}, which throws an exception in this case.
    *
    * <p><b>Java 8 users:</b> you can just write the lambda expression {@code k ->
-   * map.getWithDefault(k, defaultValue)} instead.
+   * map.getOrDefault(k, defaultValue)} instead.
    *
    * @param map source map that determines the function behavior
    * @param defaultValue the value to return for inputs that aren't map keys
diff --git a/android/guava/src/com/google/common/base/MoreObjects.java b/android/guava/src/com/google/common/base/MoreObjects.java
index 606fcbc..a56b2a6 100644
--- a/android/guava/src/com/google/common/base/MoreObjects.java
+++ b/android/guava/src/com/google/common/base/MoreObjects.java
@@ -47,6 +47,9 @@
    * lazy evaluation of the fallback instance, using {@link Optional#or(Supplier)
    * first.or(supplier)}.
    *
+   * <p><b>Java 9 users:</b> use {@code java.util.Objects.requireNonNullElse(first, second)}
+   * instead.
+   *
    * @return {@code first} if it is non-null; otherwise {@code second} if it is non-null
    * @throws NullPointerException if both {@code first} and {@code second} are null
    * @since 18.0 (since 3.0 as {@code Objects.firstNonNull()}).
diff --git a/android/guava/src/com/google/common/base/Optional.java b/android/guava/src/com/google/common/base/Optional.java
index 4fbcd25..611ba54 100644
--- a/android/guava/src/com/google/common/base/Optional.java
+++ b/android/guava/src/com/google/common/base/Optional.java
@@ -18,6 +18,7 @@
 
 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;
@@ -79,6 +80,7 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
+@DoNotMock("Use Optional.of(value) or Optional.absent()")
 @GwtCompatible(serializable = true)
 public abstract class Optional<T> implements Serializable {
   /**
@@ -226,6 +228,8 @@
    * possibleFoo.ifPresent(foo -> doSomethingWith(foo));
    * }</pre>
    *
+   * <p><b>Java 9 users:</b> some use cases can be written with calls to {@code optional.stream()}.
+   *
    * @since 11.0
    */
   public abstract Set<T> asSet();
@@ -280,6 +284,8 @@
    * {@code Optional} class; use {@code
    * optionals.stream().filter(Optional::isPresent).map(Optional::get)} instead.
    *
+   * <p><b>Java 9 users:</b> use {@code optionals.stream().flatMap(Optional::stream)} instead.
+   *
    * @since 11.0 (generics widened in 13.0)
    */
   @Beta
diff --git a/android/guava/src/com/google/common/base/Platform.java b/android/guava/src/com/google/common/base/Platform.java
index cdf267d..26c5c29 100644
--- a/android/guava/src/com/google/common/base/Platform.java
+++ b/android/guava/src/com/google/common/base/Platform.java
@@ -99,4 +99,6 @@
       return true;
     }
   }
+
+  static void checkGwtRpcEnabled() {}
 }
diff --git a/android/guava/src/com/google/common/base/Preconditions.java b/android/guava/src/com/google/common/base/Preconditions.java
index ca81c66..995d394 100644
--- a/android/guava/src/com/google/common/base/Preconditions.java
+++ b/android/guava/src/com/google/common/base/Preconditions.java
@@ -50,8 +50,8 @@
  * <p>so that a hypothetical bad caller of this method, such as:
  *
  * <pre>{@code
- *   void exampleBadCaller() {
- *     double d = sqrt(-1.0);
+ * void exampleBadCaller() {
+ *   double d = sqrt(-1.0);
  * }
  * }</pre>
  *
@@ -1460,12 +1460,12 @@
   }
 
   /**
-   * Ensures that {@code start} and {@code end} specify a valid <i>positions</i> in an array, list
-   * or string of size {@code size}, and are in order. A position index may range from zero to
-   * {@code size}, inclusive.
+   * Ensures that {@code start} and {@code end} specify valid <i>positions</i> in an array, list or
+   * string of size {@code size}, and are in order. A position index may range from zero to {@code
+   * size}, inclusive.
    *
    * @param start a user-supplied index identifying a starting position in an array, list or string
-   * @param end a user-supplied index identifying a ending position in an array, list or string
+   * @param end a user-supplied index identifying an ending position in an array, list or string
    * @param size the size of that array, list or string
    * @throws IndexOutOfBoundsException if either index is negative or is greater than {@code size},
    *     or if {@code end} is less than {@code start}
diff --git a/android/guava/src/com/google/common/base/Splitter.java b/android/guava/src/com/google/common/base/Splitter.java
index 1da372e..150c2fe 100644
--- a/android/guava/src/com/google/common/base/Splitter.java
+++ b/android/guava/src/com/google/common/base/Splitter.java
@@ -331,13 +331,13 @@
    * trimmed, including the last. Hence {@code Splitter.on(',').limit(3).trimResults().split(" a , b
    * , c , d ")} results in {@code ["a", "b", "c , d"]}.
    *
-   * @param limit the maximum number of items returned
+   * @param maxItems the maximum number of items returned
    * @return a splitter with the desired configuration
    * @since 9.0
    */
-  public Splitter limit(int limit) {
-    checkArgument(limit > 0, "must be greater than zero: %s", limit);
-    return new Splitter(strategy, omitEmptyStrings, trimmer, limit);
+  public Splitter limit(int maxItems) {
+    checkArgument(maxItems > 0, "must be greater than zero: %s", maxItems);
+    return new Splitter(strategy, omitEmptyStrings, trimmer, maxItems);
   }
 
   /**
diff --git a/android/guava/src/com/google/common/base/Stopwatch.java b/android/guava/src/com/google/common/base/Stopwatch.java
index 3391f90..4a6767d 100644
--- a/android/guava/src/com/google/common/base/Stopwatch.java
+++ b/android/guava/src/com/google/common/base/Stopwatch.java
@@ -29,15 +29,24 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * An object that measures elapsed time in nanoseconds. It is useful to measure elapsed time using
- * this class instead of direct calls to {@link System#nanoTime} for a few reasons:
+ * An object that accurately measures <i>elapsed time</i>: the measured duration between two
+ * successive readings of "now" in the same process.
+ *
+ * <p>In contrast, <i>wall time</i> is a reading of "now" as given by a method like
+ * {@link System#currentTimeMillis()}, best represented as an {@link Instant}. Such values
+ *
+ * <p><i>can</i> be subtracted to obtain a {@code Duration} (such as by {@code Duration.between}),
+ * but doing so does <i>not</i> give a reliable measurement of elapsed time, because wall time
+ * readings are inherently approximate, routinely affected by periodic clock corrections. Because
+ * this class (by default) uses {@link System#nanoTime}, it is unaffected by these changes.
+ *
+ * <p>Use this class instead of direct calls to {@link System#nanoTime} for two reasons:
  *
  * <ul>
- *   <li>An alternate time source can be substituted, for testing or performance reasons.
- *   <li>As documented by {@code nanoTime}, the value returned has no absolute meaning, and can only
- *       be interpreted as relative to another timestamp returned by {@code nanoTime} at a different
- *       time. {@code Stopwatch} is a more effective abstraction because it exposes only these
- *       relative values, not the absolute ones.
+ *   <li>The raw {@code long} values returned by {@code nanoTime} are meaningless and unsafe to use
+ *       in any other way than how {@code Stopwatch} uses them.
+ *   <li>An alternative source of nanosecond ticks can be substituted, for example for testing or
+ *       performance reasons, without affecting most of your code.
  * </ul>
  *
  * <p>Basic usage:
@@ -52,8 +61,8 @@
  * log.info("time: " + stopwatch); // formatted string like "12.3 ms"
  * }</pre>
  *
- * <p>Stopwatch methods are not idempotent; it is an error to start or stop a stopwatch that is
- * already in the desired state.
+ * <p>The state-changing methods are not idempotent; it is an error to start or stop a stopwatch
+ * that is already in the desired state.
  *
  * <p>When testing code that uses this class, use {@link #createUnstarted(Ticker)} or {@link
  * #createStarted(Ticker)} to supply a fake or mock ticker. This allows you to simulate any valid
diff --git a/android/guava/src/com/google/common/base/Strings.java b/android/guava/src/com/google/common/base/Strings.java
index 1c636dc..4758517 100644
--- a/android/guava/src/com/google/common/base/Strings.java
+++ b/android/guava/src/com/google/common/base/Strings.java
@@ -298,8 +298,11 @@
   }
 
   private static String lenientToString(@NullableDecl Object o) {
+    if (o == null) {
+      return "null";
+    }
     try {
-      return String.valueOf(o);
+      return o.toString();
     } catch (Exception e) {
       // Default toString() behavior - see Object.toString()
       String objectToString =
diff --git a/android/guava/src/com/google/common/cache/AbstractCache.java b/android/guava/src/com/google/common/cache/AbstractCache.java
index 0b54d25..d8ef032 100644
--- a/android/guava/src/com/google/common/cache/AbstractCache.java
+++ b/android/guava/src/com/google/common/cache/AbstractCache.java
@@ -238,12 +238,17 @@
     @Override
     public CacheStats snapshot() {
       return new CacheStats(
-          hitCount.sum(),
-          missCount.sum(),
-          loadSuccessCount.sum(),
-          loadExceptionCount.sum(),
-          totalLoadTime.sum(),
-          evictionCount.sum());
+          negativeToMaxValue(hitCount.sum()),
+          negativeToMaxValue(missCount.sum()),
+          negativeToMaxValue(loadSuccessCount.sum()),
+          negativeToMaxValue(loadExceptionCount.sum()),
+          negativeToMaxValue(totalLoadTime.sum()),
+          negativeToMaxValue(evictionCount.sum()));
+    }
+
+    /** Returns {@code value}, if non-negative. Otherwise, returns {@link Long#MAX_VALUE}. */
+    private static long negativeToMaxValue(long value) {
+      return (value >= 0) ? value : Long.MAX_VALUE;
     }
 
     /** Increments all counters by the values in {@code other}. */
diff --git a/android/guava/src/com/google/common/cache/Cache.java b/android/guava/src/com/google/common/cache/Cache.java
index 02922f1..69bd752 100644
--- a/android/guava/src/com/google/common/cache/Cache.java
+++ b/android/guava/src/com/google/common/cache/Cache.java
@@ -19,6 +19,7 @@
 import com.google.common.util.concurrent.ExecutionError;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 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;
@@ -36,6 +37,7 @@
  * @author Charles Fry
  * @since 10.0
  */
+@DoNotMock("Use CacheBuilder.newBuilder().build()")
 @GwtCompatible
 public interface Cache<K, V> {
 
diff --git a/android/guava/src/com/google/common/cache/CacheBuilder.java b/android/guava/src/com/google/common/cache/CacheBuilder.java
index 6e9c665..cd98515 100644
--- a/android/guava/src/com/google/common/cache/CacheBuilder.java
+++ b/android/guava/src/com/google/common/cache/CacheBuilder.java
@@ -39,7 +39,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A builder of {@link LoadingCache} and {@link Cache} instances having any combination of the
@@ -49,9 +49,8 @@
  *   <li>automatic loading of entries into the cache
  *   <li>least-recently-used eviction when a maximum size is exceeded
  *   <li>time-based expiration of entries, measured since last access or last write
- *   <li>keys automatically wrapped in {@linkplain WeakReference weak} references
- *   <li>values automatically wrapped in {@linkplain WeakReference weak} or {@linkplain
- *       SoftReference soft} references
+ *   <li>keys automatically wrapped in {@code WeakReference}
+ *   <li>values automatically wrapped in {@code WeakReference} or {@code SoftReference}
  *   <li>notification of evicted (or otherwise removed) entries
  *   <li>accumulation of cache access statistics
  * </ul>
@@ -232,10 +231,10 @@
   int concurrencyLevel = UNSET_INT;
   long maximumSize = UNSET_INT;
   long maximumWeight = UNSET_INT;
-  @MonotonicNonNullDecl Weigher<? super K, ? super V> weigher;
+  @NullableDecl Weigher<? super K, ? super V> weigher;
 
-  @MonotonicNonNullDecl Strength keyStrength;
-  @MonotonicNonNullDecl Strength valueStrength;
+  @NullableDecl Strength keyStrength;
+  @NullableDecl Strength valueStrength;
 
   @SuppressWarnings("GoodTime") // should be a java.time.Duration
   long expireAfterWriteNanos = UNSET_INT;
@@ -246,11 +245,11 @@
   @SuppressWarnings("GoodTime") // should be a java.time.Duration
   long refreshNanos = UNSET_INT;
 
-  @MonotonicNonNullDecl Equivalence<Object> keyEquivalence;
-  @MonotonicNonNullDecl Equivalence<Object> valueEquivalence;
+  @NullableDecl Equivalence<Object> keyEquivalence;
+  @NullableDecl Equivalence<Object> valueEquivalence;
 
-  @MonotonicNonNullDecl RemovalListener<? super K, ? super V> removalListener;
-  @MonotonicNonNullDecl Ticker ticker;
+  @NullableDecl RemovalListener<? super K, ? super V> removalListener;
+  @NullableDecl Ticker ticker;
 
   Supplier<? extends StatsCounter> statsCounterSupplier = NULL_STATS_COUNTER;
 
@@ -662,6 +661,7 @@
     return this;
   }
 
+  @SuppressWarnings("GoodTime") // nanos internally, should be Duration
   long getExpireAfterWriteNanos() {
     return (expireAfterWriteNanos == UNSET_INT) ? DEFAULT_EXPIRATION_NANOS : expireAfterWriteNanos;
   }
@@ -670,8 +670,10 @@
    * Specifies that each entry should be automatically removed from the cache once a fixed duration
    * has elapsed after the entry's creation, the most recent replacement of its value, or its last
    * access. Access time is reset by all cache read and write operations (including {@code
-   * Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by operations on the
-   * collection-views of {@link Cache#asMap}.
+   * Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by {@code
+   * containsKey(Object)}, nor by operations on the collection-views of {@link Cache#asMap}. So, for
+   * example, iterating through {@code Cache.asMap().entrySet()} does not reset access time for the
+   * entries you retrieve.
    *
    * <p>When {@code duration} is zero, this method hands off to {@link #maximumSize(long)
    * maximumSize}{@code (0)}, ignoring any otherwise-specified maximum size or weight. This can be
@@ -699,6 +701,7 @@
     return this;
   }
 
+  @SuppressWarnings("GoodTime") // nanos internally, should be Duration
   long getExpireAfterAccessNanos() {
     return (expireAfterAccessNanos == UNSET_INT)
         ? DEFAULT_EXPIRATION_NANOS
@@ -741,6 +744,7 @@
     return this;
   }
 
+  @SuppressWarnings("GoodTime") // nanos internally, should be Duration
   long getRefreshNanos() {
     return (refreshNanos == UNSET_INT) ? DEFAULT_REFRESH_NANOS : refreshNanos;
   }
diff --git a/android/guava/src/com/google/common/cache/CacheBuilderSpec.java b/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
index f596853..e804866 100644
--- a/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ b/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
@@ -27,7 +27,6 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -108,19 +107,19 @@
           .put("refreshInterval", new RefreshDurationParser())
           .build();
 
-  @MonotonicNonNullDecl @VisibleForTesting Integer initialCapacity;
-  @MonotonicNonNullDecl @VisibleForTesting Long maximumSize;
-  @MonotonicNonNullDecl @VisibleForTesting Long maximumWeight;
-  @MonotonicNonNullDecl @VisibleForTesting Integer concurrencyLevel;
-  @MonotonicNonNullDecl @VisibleForTesting Strength keyStrength;
-  @MonotonicNonNullDecl @VisibleForTesting Strength valueStrength;
-  @MonotonicNonNullDecl @VisibleForTesting Boolean recordStats;
+  @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 long writeExpirationDuration;
-  @MonotonicNonNullDecl @VisibleForTesting TimeUnit writeExpirationTimeUnit;
+  @VisibleForTesting @NullableDecl TimeUnit writeExpirationTimeUnit;
   @VisibleForTesting long accessExpirationDuration;
-  @MonotonicNonNullDecl @VisibleForTesting TimeUnit accessExpirationTimeUnit;
+  @VisibleForTesting @NullableDecl TimeUnit accessExpirationTimeUnit;
   @VisibleForTesting long refreshDuration;
-  @MonotonicNonNullDecl @VisibleForTesting TimeUnit refreshTimeUnit;
+  @VisibleForTesting @NullableDecl TimeUnit refreshTimeUnit;
   /** Specification; used for toParseableString(). */
   private final String specification;
 
diff --git a/android/guava/src/com/google/common/cache/CacheStats.java b/android/guava/src/com/google/common/cache/CacheStats.java
index 9fb1fb0..e0c39c3 100644
--- a/android/guava/src/com/google/common/cache/CacheStats.java
+++ b/android/guava/src/com/google/common/cache/CacheStats.java
@@ -15,6 +15,8 @@
 package com.google.common.cache;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.math.LongMath.saturatedAdd;
+import static com.google.common.math.LongMath.saturatedSubtract;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.MoreObjects;
@@ -98,9 +100,13 @@
   /**
    * Returns the number of times {@link Cache} lookup methods have returned either a cached or
    * uncached value. This is defined as {@code hitCount + missCount}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public long requestCount() {
-    return hitCount + missCount;
+    return saturatedAdd(hitCount, missCount);
   }
 
   /** Returns the number of times {@link Cache} lookup methods have returned a cached value. */
@@ -146,9 +152,13 @@
    * Returns the total number of times that {@link Cache} lookup methods attempted to load new
    * values. This includes both successful load operations, as well as those that threw exceptions.
    * This is defined as {@code loadSuccessCount + loadExceptionCount}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public long loadCount() {
-    return loadSuccessCount + loadExceptionCount;
+    return saturatedAdd(loadSuccessCount, loadExceptionCount);
   }
 
   /**
@@ -183,9 +193,13 @@
    * Returns the ratio of cache loading attempts which threw exceptions. This is defined as {@code
    * loadExceptionCount / (loadSuccessCount + loadExceptionCount)}, or {@code 0.0} when {@code
    * loadSuccessCount + loadExceptionCount == 0}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public double loadExceptionRate() {
-    long totalLoadCount = loadSuccessCount + loadExceptionCount;
+    long totalLoadCount = saturatedAdd(loadSuccessCount, loadExceptionCount);
     return (totalLoadCount == 0) ? 0.0 : (double) loadExceptionCount / totalLoadCount;
   }
 
@@ -202,9 +216,13 @@
   /**
    * Returns the average time spent loading new values. This is defined as {@code totalLoadTime /
    * (loadSuccessCount + loadExceptionCount)}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public double averageLoadPenalty() {
-    long totalLoadCount = loadSuccessCount + loadExceptionCount;
+    long totalLoadCount = saturatedAdd(loadSuccessCount, loadExceptionCount);
     return (totalLoadCount == 0) ? 0.0 : (double) totalLoadTime / totalLoadCount;
   }
 
@@ -223,28 +241,32 @@
    */
   public CacheStats minus(CacheStats other) {
     return new CacheStats(
-        Math.max(0, hitCount - other.hitCount),
-        Math.max(0, missCount - other.missCount),
-        Math.max(0, loadSuccessCount - other.loadSuccessCount),
-        Math.max(0, loadExceptionCount - other.loadExceptionCount),
-        Math.max(0, totalLoadTime - other.totalLoadTime),
-        Math.max(0, evictionCount - other.evictionCount));
+        Math.max(0, saturatedSubtract(hitCount, other.hitCount)),
+        Math.max(0, saturatedSubtract(missCount, other.missCount)),
+        Math.max(0, saturatedSubtract(loadSuccessCount, other.loadSuccessCount)),
+        Math.max(0, saturatedSubtract(loadExceptionCount, other.loadExceptionCount)),
+        Math.max(0, saturatedSubtract(totalLoadTime, other.totalLoadTime)),
+        Math.max(0, saturatedSubtract(evictionCount, other.evictionCount)));
   }
 
   /**
    * Returns a new {@code CacheStats} representing the sum of this {@code CacheStats} and {@code
    * other}.
    *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
+   *
    * @since 11.0
    */
   public CacheStats plus(CacheStats other) {
     return new CacheStats(
-        hitCount + other.hitCount,
-        missCount + other.missCount,
-        loadSuccessCount + other.loadSuccessCount,
-        loadExceptionCount + other.loadExceptionCount,
-        totalLoadTime + other.totalLoadTime,
-        evictionCount + other.evictionCount);
+        saturatedAdd(hitCount, other.hitCount),
+        saturatedAdd(missCount, other.missCount),
+        saturatedAdd(loadSuccessCount, other.loadSuccessCount),
+        saturatedAdd(loadExceptionCount, other.loadExceptionCount),
+        saturatedAdd(totalLoadTime, other.totalLoadTime),
+        saturatedAdd(evictionCount, other.evictionCount));
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/cache/LocalCache.java b/android/guava/src/com/google/common/cache/LocalCache.java
index aca43c8..86f9dbe 100644
--- a/android/guava/src/com/google/common/cache/LocalCache.java
+++ b/android/guava/src/com/google/common/cache/LocalCache.java
@@ -50,8 +50,8 @@
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.google.common.util.concurrent.Uninterruptibles;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
+import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.Weak;
-import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
@@ -81,7 +81,6 @@
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -994,7 +993,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1007,7 +1006,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1040,7 +1039,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1053,7 +1052,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1086,7 +1085,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1099,7 +1098,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1126,7 +1125,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1139,7 +1138,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1282,7 +1281,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1295,7 +1294,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1329,7 +1328,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1342,7 +1341,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1376,7 +1375,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1389,7 +1388,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1416,7 +1415,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1429,7 +1428,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1675,6 +1674,7 @@
    * This method is a convenience for testing. Code should call {@link Segment#copyEntry} directly.
    */
   // Guarded By Segment.this
+  @SuppressWarnings("GuardedBy")
   @VisibleForTesting
   ReferenceEntry<K, V> copyEntry(ReferenceEntry<K, V> original, ReferenceEntry<K, V> newNext) {
     int hash = original.getHash();
@@ -1883,7 +1883,7 @@
     int threshold;
 
     /** The per-segment table. */
-    @MonotonicNonNullDecl volatile AtomicReferenceArray<ReferenceEntry<K, V>> table;
+    @NullableDecl volatile AtomicReferenceArray<ReferenceEntry<K, V>> table;
 
     /** The maximum weight of this segment. UNSET_INT if there is no maximum. */
     final long maxSegmentWeight;
@@ -2109,7 +2109,7 @@
                     entryKey, hash, value, valueReference.getWeight(), RemovalCause.COLLECTED);
               } else if (map.isExpired(e, now)) {
                 // This is a duplicate check, as preWriteCleanup already purged expired
-                // entries, but let's accomodate an incorrect expiration queue.
+                // entries, but let's accommodate an incorrect expiration queue.
                 enqueueNotification(
                     entryKey, hash, value, valueReference.getWeight(), RemovalCause.EXPIRED);
               } else {
@@ -3525,7 +3525,7 @@
           @Override
           public void setWriteTime(long time) {}
 
-          ReferenceEntry<K, V> nextWrite = this;
+          @Weak ReferenceEntry<K, V> nextWrite = this;
 
           @Override
           public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -3537,7 +3537,7 @@
             this.nextWrite = next;
           }
 
-          ReferenceEntry<K, V> previousWrite = this;
+          @Weak ReferenceEntry<K, V> previousWrite = this;
 
           @Override
           public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -3584,7 +3584,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean remove(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       ReferenceEntry<K, V> previous = e.getPreviousInWriteQueue();
       ReferenceEntry<K, V> next = e.getNextInWriteQueue();
       connectWriteOrder(previous, next);
@@ -3596,7 +3596,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean contains(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       return e.getNextInWriteQueue() != NullEntry.INSTANCE;
     }
 
@@ -3664,7 +3664,7 @@
           @Override
           public void setAccessTime(long time) {}
 
-          ReferenceEntry<K, V> nextAccess = this;
+          @Weak ReferenceEntry<K, V> nextAccess = this;
 
           @Override
           public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -3676,7 +3676,7 @@
             this.nextAccess = next;
           }
 
-          ReferenceEntry<K, V> previousAccess = this;
+          @Weak ReferenceEntry<K, V> previousAccess = this;
 
           @Override
           public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -3723,7 +3723,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean remove(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       ReferenceEntry<K, V> previous = e.getPreviousInAccessQueue();
       ReferenceEntry<K, V> next = e.getNextInAccessQueue();
       connectAccessOrder(previous, next);
@@ -3735,7 +3735,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean contains(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       return e.getNextInAccessQueue() != NullEntry.INSTANCE;
     }
 
@@ -3815,9 +3815,7 @@
         }
         sum -= segments[i].modCount;
       }
-      if (sum != 0L) {
-        return false;
-      }
+      return sum == 0L;
     }
     return true;
   }
@@ -4148,32 +4146,32 @@
     }
   }
 
-  @MonotonicNonNullDecl Set<K> keySet;
+  @RetainedWith @NullableDecl Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
     // does not impact recency ordering
     Set<K> ks = keySet;
-    return (ks != null) ? ks : (keySet = new KeySet(this));
+    return (ks != null) ? ks : (keySet = new KeySet());
   }
 
-  @MonotonicNonNullDecl Collection<V> values;
+  @RetainedWith @NullableDecl Collection<V> values;
 
   @Override
   public Collection<V> values() {
     // does not impact recency ordering
     Collection<V> vs = values;
-    return (vs != null) ? vs : (values = new Values(this));
+    return (vs != null) ? vs : (values = new Values());
   }
 
-  @MonotonicNonNullDecl Set<Entry<K, V>> entrySet;
+  @RetainedWith @NullableDecl Set<Entry<K, V>> entrySet;
 
   @Override
   @GwtIncompatible // Not supported.
   public Set<Entry<K, V>> entrySet() {
     // does not impact recency ordering
     Set<Entry<K, V>> es = entrySet;
-    return (es != null) ? es : (entrySet = new EntrySet(this));
+    return (es != null) ? es : (entrySet = new EntrySet());
   }
 
   // Iterator Support
@@ -4182,8 +4180,8 @@
 
     int nextSegmentIndex;
     int nextTableIndex;
-    @MonotonicNonNullDecl Segment<K, V> currentSegment;
-    @MonotonicNonNullDecl AtomicReferenceArray<ReferenceEntry<K, V>> currentTable;
+    @NullableDecl Segment<K, V> currentSegment;
+    @NullableDecl AtomicReferenceArray<ReferenceEntry<K, V>> currentTable;
     @NullableDecl ReferenceEntry<K, V> nextEntry;
     @NullableDecl WriteThroughEntry nextExternal;
     @NullableDecl WriteThroughEntry lastReturned;
@@ -4364,25 +4362,19 @@
   }
 
   abstract class AbstractCacheSet<T> extends AbstractSet<T> {
-    @Weak final ConcurrentMap<?, ?> map;
-
-    AbstractCacheSet(ConcurrentMap<?, ?> map) {
-      this.map = map;
-    }
-
     @Override
     public int size() {
-      return map.size();
+      return LocalCache.this.size();
     }
 
     @Override
     public boolean isEmpty() {
-      return map.isEmpty();
+      return LocalCache.this.isEmpty();
     }
 
     @Override
     public void clear() {
-      map.clear();
+      LocalCache.this.clear();
     }
 
     // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android.
@@ -4406,13 +4398,8 @@
     return result;
   }
 
-  @WeakOuter
   final class KeySet extends AbstractCacheSet<K> {
 
-    KeySet(ConcurrentMap<?, ?> map) {
-      super(map);
-    }
-
     @Override
     public Iterator<K> iterator() {
       return new KeyIterator();
@@ -4420,36 +4407,29 @@
 
     @Override
     public boolean contains(Object o) {
-      return map.containsKey(o);
+      return LocalCache.this.containsKey(o);
     }
 
     @Override
     public boolean remove(Object o) {
-      return map.remove(o) != null;
+      return LocalCache.this.remove(o) != null;
     }
   }
 
-  @WeakOuter
   final class Values extends AbstractCollection<V> {
-    private final ConcurrentMap<?, ?> map;
-
-    Values(ConcurrentMap<?, ?> map) {
-      this.map = map;
-    }
-
     @Override
     public int size() {
-      return map.size();
+      return LocalCache.this.size();
     }
 
     @Override
     public boolean isEmpty() {
-      return map.isEmpty();
+      return LocalCache.this.isEmpty();
     }
 
     @Override
     public void clear() {
-      map.clear();
+      LocalCache.this.clear();
     }
 
     @Override
@@ -4459,7 +4439,7 @@
 
     @Override
     public boolean contains(Object o) {
-      return map.containsValue(o);
+      return LocalCache.this.containsValue(o);
     }
 
     // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android.
@@ -4476,13 +4456,8 @@
     }
   }
 
-  @WeakOuter
   final class EntrySet extends AbstractCacheSet<Entry<K, V>> {
 
-    EntrySet(ConcurrentMap<?, ?> map) {
-      super(map);
-    }
-
     @Override
     public Iterator<Entry<K, V>> iterator() {
       return new EntryIterator();
@@ -4541,7 +4516,7 @@
     @NullableDecl final Ticker ticker;
     final CacheLoader<? super K, V> loader;
 
-    @MonotonicNonNullDecl transient Cache<K, V> delegate;
+    @NullableDecl transient Cache<K, V> delegate;
 
     ManualSerializationProxy(LocalCache<K, V> cache) {
       this(
@@ -4646,7 +4621,7 @@
       implements LoadingCache<K, V>, Serializable {
     private static final long serialVersionUID = 1;
 
-    @MonotonicNonNullDecl transient LoadingCache<K, V> autoDelegate;
+    @NullableDecl transient LoadingCache<K, V> autoDelegate;
 
     LoadingSerializationProxy(LocalCache<K, V> cache) {
       super(cache);
diff --git a/android/guava/src/com/google/common/cache/ReferenceEntry.java b/android/guava/src/com/google/common/cache/ReferenceEntry.java
index 2318abd..f9027ab 100644
--- a/android/guava/src/com/google/common/cache/ReferenceEntry.java
+++ b/android/guava/src/com/google/common/cache/ReferenceEntry.java
@@ -64,6 +64,7 @@
    */
 
   /** Returns the time that this entry was last accessed, in ns. */
+  @SuppressWarnings("GoodTime")
   long getAccessTime();
 
   /** Sets the entry access time in ns. */
@@ -88,6 +89,7 @@
    * expired from the head of the list.
    */
 
+  @SuppressWarnings("GoodTime")
   /** Returns the time that this entry was last written, in ns. */
   long getWriteTime();
 
diff --git a/android/guava/src/com/google/common/collect/AbstractBiMap.java b/android/guava/src/com/google/common/collect/AbstractBiMap.java
index d20fafb..0b314ae 100644
--- a/android/guava/src/com/google/common/collect/AbstractBiMap.java
+++ b/android/guava/src/com/google/common/collect/AbstractBiMap.java
@@ -34,7 +34,6 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -50,8 +49,8 @@
 abstract class AbstractBiMap<K, V> extends ForwardingMap<K, V>
     implements BiMap<K, V>, Serializable {
 
-  @MonotonicNonNullDecl private transient Map<K, V> delegate;
-  @MonotonicNonNullDecl @RetainedWith transient AbstractBiMap<V, K> inverse;
+  @NullableDecl private transient Map<K, V> delegate;
+  @RetainedWith @NullableDecl transient AbstractBiMap<V, K> inverse;
 
   /** Package-private constructor for creating a map-backed bimap. */
   AbstractBiMap(Map<K, V> forward, Map<V, K> backward) {
@@ -187,7 +186,7 @@
     return inverse;
   }
 
-  @MonotonicNonNullDecl private transient Set<K> keySet;
+  @NullableDecl private transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -232,7 +231,7 @@
     }
   }
 
-  @MonotonicNonNullDecl private transient Set<V> valueSet;
+  @NullableDecl private transient Set<V> valueSet;
 
   @Override
   public Set<V> values() {
@@ -274,7 +273,7 @@
     }
   }
 
-  @MonotonicNonNullDecl private transient Set<Entry<K, V>> entrySet;
+  @NullableDecl private transient Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
diff --git a/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java b/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
index bd39a75..b72f135 100644
--- a/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
@@ -40,7 +40,6 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -1112,7 +1111,7 @@
   private abstract class Itr<T> implements Iterator<T> {
     final Iterator<Entry<K, Collection<V>>> keyIterator;
     @NullableDecl K key;
-    @MonotonicNonNullDecl Collection<V> collection;
+    @NullableDecl Collection<V> collection;
     Iterator<V> valueIterator;
 
     Itr() {
@@ -1429,7 +1428,7 @@
       return new SortedAsMap(sortedMap().tailMap(fromKey));
     }
 
-    @MonotonicNonNullDecl SortedSet<K> sortedKeySet;
+    @NullableDecl SortedSet<K> sortedKeySet;
 
     // returns a SortedSet, even though returning a Set would be sufficient to
     // satisfy the SortedMap.keySet() interface
diff --git a/android/guava/src/com/google/common/collect/AbstractMultimap.java b/android/guava/src/com/google/common/collect/AbstractMultimap.java
index 6dfd5f7..5d03ec9 100644
--- a/android/guava/src/com/google/common/collect/AbstractMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractMultimap.java
@@ -27,7 +27,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -106,7 +105,7 @@
     return result;
   }
 
-  @MonotonicNonNullDecl private transient Collection<Entry<K, V>> entries;
+  @NullableDecl private transient Collection<Entry<K, V>> entries;
 
   @Override
   public Collection<Entry<K, V>> entries() {
@@ -144,7 +143,7 @@
 
   abstract Iterator<Entry<K, V>> entryIterator();
 
-  @MonotonicNonNullDecl private transient Set<K> keySet;
+  @NullableDecl private transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -154,7 +153,7 @@
 
   abstract Set<K> createKeySet();
 
-  @MonotonicNonNullDecl private transient Multiset<K> keys;
+  @NullableDecl private transient Multiset<K> keys;
 
   @Override
   public Multiset<K> keys() {
@@ -164,7 +163,7 @@
 
   abstract Multiset<K> createKeys();
 
-  @MonotonicNonNullDecl private transient Collection<V> values;
+  @NullableDecl private transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -201,7 +200,7 @@
     return Maps.valueIterator(entries().iterator());
   }
 
-  @MonotonicNonNullDecl private transient Map<K, Collection<V>> asMap;
+  @NullableDecl private transient Map<K, Collection<V>> asMap;
 
   @Override
   public Map<K, Collection<V>> asMap() {
diff --git a/android/guava/src/com/google/common/collect/AbstractMultiset.java b/android/guava/src/com/google/common/collect/AbstractMultiset.java
index f0480e3..c0a7f5e 100644
--- a/android/guava/src/com/google/common/collect/AbstractMultiset.java
+++ b/android/guava/src/com/google/common/collect/AbstractMultiset.java
@@ -20,12 +20,12 @@
 
 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;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -124,7 +124,7 @@
 
   // Views
 
-  @MonotonicNonNullDecl private transient Set<E> elementSet;
+  @LazyInit @NullableDecl private transient Set<E> elementSet;
 
   @Override
   public Set<E> elementSet() {
@@ -158,7 +158,7 @@
 
   abstract Iterator<E> elementIterator();
 
-  @MonotonicNonNullDecl private transient Set<Entry<E>> entrySet;
+  @LazyInit @NullableDecl private transient Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
diff --git a/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java b/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
index c1e44f6..091bb8c 100644
--- a/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
@@ -21,7 +21,6 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NavigableSet;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -116,7 +115,7 @@
     return Multisets.iteratorImpl(descendingMultiset());
   }
 
-  @MonotonicNonNullDecl private transient SortedMultiset<E> descendingMultiset;
+  @NullableDecl private transient SortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
diff --git a/android/guava/src/com/google/common/collect/AbstractTable.java b/android/guava/src/com/google/common/collect/AbstractTable.java
index d96b32b..7cb34a6 100644
--- a/android/guava/src/com/google/common/collect/AbstractTable.java
+++ b/android/guava/src/com/google/common/collect/AbstractTable.java
@@ -16,6 +16,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.AbstractSet;
@@ -23,7 +24,6 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -106,7 +106,7 @@
     }
   }
 
-  @MonotonicNonNullDecl private transient Set<Cell<R, C, V>> cellSet;
+  @LazyInit @NullableDecl private transient Set<Cell<R, C, V>> cellSet;
 
   @Override
   public Set<Cell<R, C, V>> cellSet() {
@@ -162,7 +162,7 @@
     }
   }
 
-  @MonotonicNonNullDecl private transient Collection<V> values;
+  @LazyInit @NullableDecl private transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
diff --git a/android/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java b/android/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java
index 1bd4ba1..9a8cdfb 100644
--- a/android/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java
+++ b/android/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java
@@ -24,7 +24,7 @@
  * A dummy superclass to support GWT serialization of the element types of an {@link
  * ArrayListMultimap}. The GWT supersource for this class contains a field for each type.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/android/guava/src/com/google/common/collect/ArrayTable.java b/android/guava/src/com/google/common/collect/ArrayTable.java
index e91ab43..c9af17f 100644
--- a/android/guava/src/com/google/common/collect/ArrayTable.java
+++ b/android/guava/src/com/google/common/collect/ArrayTable.java
@@ -34,7 +34,6 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -141,7 +140,7 @@
      * TODO(jlevy): Support only one of rowKey / columnKey being empty? If we
      * do, when columnKeys is empty but rowKeys isn't, rowKeyList() can contain
      * elements but rowKeySet() will be empty and containsRow() won't
-     * acknolwedge them.
+     * acknowledge them.
      */
     rowKeyToIndex = Maps.indexMap(rowList);
     columnKeyToIndex = Maps.indexMap(columnList);
@@ -611,7 +610,7 @@
     return columnKeyToIndex.keySet();
   }
 
-  @MonotonicNonNullDecl private transient ColumnMap columnMap;
+  @NullableDecl private transient ColumnMap columnMap;
 
   @Override
   public Map<C, Map<R, V>> columnMap() {
@@ -699,7 +698,7 @@
     return rowKeyToIndex.keySet();
   }
 
-  @MonotonicNonNullDecl private transient RowMap rowMap;
+  @NullableDecl private transient RowMap rowMap;
 
   @Override
   public Map<R, Map<C, V>> rowMap() {
diff --git a/android/guava/src/com/google/common/collect/CartesianList.java b/android/guava/src/com/google/common/collect/CartesianList.java
index 41d50b1..63c7f1a 100644
--- a/android/guava/src/com/google/common/collect/CartesianList.java
+++ b/android/guava/src/com/google/common/collect/CartesianList.java
@@ -89,6 +89,28 @@
   }
 
   @Override
+  public int lastIndexOf(Object o) {
+    if (!(o instanceof List)) {
+      return -1;
+    }
+    List<?> list = (List<?>) o;
+    if (list.size() != axes.size()) {
+      return -1;
+    }
+    ListIterator<?> itr = list.listIterator();
+    int computedIndex = 0;
+    while (itr.hasNext()) {
+      int axisIndex = itr.nextIndex();
+      int elemIndex = axes.get(axisIndex).lastIndexOf(itr.next());
+      if (elemIndex == -1) {
+        return -1;
+      }
+      computedIndex += elemIndex * axesSizeProduct[axisIndex + 1];
+    }
+    return computedIndex;
+  }
+
+  @Override
   public ImmutableList<E> get(final int index) {
     checkElementIndex(index, size());
     return new ImmutableList<E>() {
@@ -118,7 +140,21 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object o) {
-    return indexOf(o) != -1;
+  public boolean contains(@NullableDecl Object object) {
+    if (!(object instanceof List)) {
+      return false;
+    }
+    List<?> list = (List<?>) object;
+    if (list.size() != axes.size()) {
+      return false;
+    }
+    int i = 0;
+    for (Object o : list) {
+      if (!axes.get(i).contains(o)) {
+        return false;
+      }
+      i++;
+    }
+    return true;
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ClassToInstanceMap.java b/android/guava/src/com/google/common/collect/ClassToInstanceMap.java
index 4c26253..8d454c0 100644
--- a/android/guava/src/com/google/common/collect/ClassToInstanceMap.java
+++ b/android/guava/src/com/google/common/collect/ClassToInstanceMap.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -40,6 +41,7 @@
  * @author Kevin Bourrillion
  * @since 2.0
  */
+@DoNotMock("Use ImmutableClassToInstanceMap or MutableClassToInstanceMap")
 @GwtCompatible
 public interface ClassToInstanceMap<B> extends Map<Class<? extends B>, B> {
   /**
diff --git a/android/guava/src/com/google/common/collect/Collections2.java b/android/guava/src/com/google/common/collect/Collections2.java
index b8c80c3..56b7a5b 100644
--- a/android/guava/src/com/google/common/collect/Collections2.java
+++ b/android/guava/src/com/google/common/collect/Collections2.java
@@ -329,11 +329,6 @@
     return new StringBuilder((int) Math.min(size * 8L, Ints.MAX_POWER_OF_TWO));
   }
 
-  /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> Collection<T> cast(Iterable<T> iterable) {
-    return (Collection<T>) iterable;
-  }
-
   /**
    * Returns a {@link Collection} of all the permutations of the specified {@link Iterable}.
    *
diff --git a/android/guava/src/com/google/common/collect/CompactHashMap.java b/android/guava/src/com/google/common/collect/CompactHashMap.java
index 1987470..1fa4f96 100644
--- a/android/guava/src/com/google/common/collect/CompactHashMap.java
+++ b/android/guava/src/com/google/common/collect/CompactHashMap.java
@@ -17,15 +17,18 @@
 package com.google.common.collect;
 
 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 com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
+import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
@@ -36,9 +39,10 @@
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -65,16 +69,16 @@
  * to prioritize memory over CPU.
  *
  * @author Louis Wasserman
+ * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
 class CompactHashMap<K, V> 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
-   * *Map variants. Followon optimizations, such as using 16-bit indices for small collections, will
-   * take more work to implement. This class is particularly hard to benchmark, because the benefit
-   * is not only in less allocation, but also having the GC do less work to scan the heap because of
-   * fewer references, which is particularly hard to quantify.
+   * *Map variants. This class is particularly hard to benchmark, because the benefit is not only in
+   * less allocation, but also having the GC do less work to scan the heap because of fewer
+   * references, which is particularly hard to quantify.
    */
 
   /** Creates an empty {@code CompactHashMap} instance. */
@@ -95,130 +99,172 @@
     return new CompactHashMap<>(expectedSize);
   }
 
-  private static final int MAXIMUM_CAPACITY = 1 << 30;
-
-  // TODO(user): decide, and inline, load factor. 0.75?
-  static final float DEFAULT_LOAD_FACTOR = 1.0f;
-
-  /** Bitmask that selects the low 32 bits. */
-  private static final long NEXT_MASK = (1L << 32) - 1;
-
-  /** Bitmask that selects the high 32 bits. */
-  private static final long HASH_MASK = ~NEXT_MASK;
-
-  // TODO(user): decide default size
-  static final int DEFAULT_SIZE = 3;
-
-  // used to indicate blank table entries
-  static final int UNSET = -1;
+  private static final Object NOT_FOUND = new Object();
 
   /**
-   * The hashtable. Its values are indexes to the keys, values, and entries arrays.
-   *
-   * <p>Currently, the UNSET value means "null pointer", and any non negative value x is the actual
-   * index.
-   *
-   * <p>Its size must be a power of two.
+   * Maximum allowed false positive probability of detecting a hash flooding attack given random
+   * input.
    */
-  @MonotonicNonNullDecl private transient int[] table;
+  @VisibleForTesting(
+      )
+  static final double HASH_FLOODING_FPP = 0.001;
 
   /**
-   * Contains the logical entries, in the range of [0, size()). The high 32 bits of each long is the
-   * smeared hash of the element, whereas the low 32 bits is the "next" pointer (pointing to the
-   * next entry in the bucket chain). The pointers in [size(), entries.length) are all "null"
-   * (UNSET).
+   * Maximum allowed length of a hash table bucket before falling back to a j.u.LinkedHashMap-based
+   * implementation. Experimentally determined.
    */
-  @VisibleForTesting @MonotonicNonNullDecl transient long[] entries;
+  private static final int MAX_HASH_BUCKET_LENGTH = 9;
+
+  /**
+   * The hashtable object. This can be either:
+   *
+   * <ul>
+   *   <li>a byte[], short[], or int[], with size a power of two, created by
+   *       CompactHashing.createTable, whose values are either
+   *       <ul>
+   *         <li>UNSET, meaning "null pointer"
+   *         <li>one plus an index into the keys, values, and entries arrays
+   *       </ul>
+   *   <li>another java.util.Map delegate implementation. In most modern JDKs, normal java.util hash
+   *       collections intelligently fall back to a binary search tree if hash table collisions are
+   *       detected. Rather than going to all the trouble of reimplementing this ourselves, we
+   *       simply switch over to use the JDK implementation wholesale if probable hash flooding is
+   *       detected, sacrificing the compactness guarantee in very rare cases in exchange for much
+   *       more reliable worst-case behavior.
+   *   <li>null, if no entries have yet been added to the map
+   * </ul>
+   */
+  @NullableDecl private transient Object table;
+
+  /**
+   * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
+   * part of the smeared hash of the key not covered by the hashtable mask, whereas the low bits are
+   * the "next" pointer (pointing to the next entry in the bucket chain), which will always be less
+   * than or equal to the hashtable mask.
+   *
+   * <pre>
+   * hash  = aaaaaaaa
+   * mask  = 0000ffff
+   * next  = 0000bbbb
+   * entry = aaaabbbb
+   * </pre>
+   *
+   * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
+   */
+  @VisibleForTesting @NullableDecl 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 @MonotonicNonNullDecl transient Object[] keys;
+  @VisibleForTesting @NullableDecl transient 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 @MonotonicNonNullDecl transient Object[] values;
-
-  /** The load factor. */
-  transient float loadFactor;
+  @VisibleForTesting @NullableDecl transient Object[] values;
 
   /**
-   * Keeps track of modifications of this set, 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.
+   * 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.
    */
-  transient int modCount;
-
-  /** When we have this many elements, resize the hashtable. */
-  private transient int threshold;
+  private transient int metadata;
 
   /** The number of elements contained in the set. */
   private transient int size;
 
   /** Constructs a new empty instance of {@code CompactHashMap}. */
   CompactHashMap() {
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
+    init(CompactHashing.DEFAULT_SIZE);
   }
 
   /**
    * Constructs a new instance of {@code CompactHashMap} with the specified capacity.
    *
-   * @param capacity the initial capacity of this {@code CompactHashMap}.
+   * @param expectedSize the initial capacity of this {@code CompactHashMap}.
    */
-  CompactHashMap(int capacity) {
-    this(capacity, DEFAULT_LOAD_FACTOR);
-  }
-
-  CompactHashMap(int expectedSize, float loadFactor) {
-    init(expectedSize, loadFactor);
+  CompactHashMap(int expectedSize) {
+    init(expectedSize);
   }
 
   /** Pseudoconstructor for serialization support. */
-  void init(int expectedSize, float loadFactor) {
-    Preconditions.checkArgument(expectedSize >= 0, "Initial capacity must be non-negative");
-    Preconditions.checkArgument(loadFactor > 0, "Illegal load factor");
-    int buckets = Hashing.closedTableSize(expectedSize, loadFactor);
-    this.table = newTable(buckets);
-    this.loadFactor = loadFactor;
+  void init(int expectedSize) {
+    Preconditions.checkArgument(expectedSize >= 0, "Expected size must be >= 0");
 
+    // Save expectedSize for use in allocArrays()
+    this.metadata = Ints.constrainToRange(expectedSize, 1, CompactHashing.MAX_SIZE);
+  }
+
+  /** Returns whether arrays need to be allocated. */
+  @VisibleForTesting
+  boolean needsAllocArrays() {
+    return table == null;
+  }
+
+  /** Handle lazy allocation of arrays. */
+  @CanIgnoreReturnValue
+  int allocArrays() {
+    Preconditions.checkState(needsAllocArrays(), "Arrays already allocated");
+
+    int expectedSize = metadata;
+    int buckets = CompactHashing.tableSize(expectedSize);
+    this.table = CompactHashing.createTable(buckets);
+    setHashTableMask(buckets - 1);
+
+    this.entries = new int[expectedSize];
     this.keys = new Object[expectedSize];
     this.values = new Object[expectedSize];
 
-    this.entries = newEntries(expectedSize);
-    this.threshold = Math.max(1, (int) (buckets * loadFactor));
+    return expectedSize;
   }
 
-  private static int[] newTable(int size) {
-    int[] array = new int[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  @SuppressWarnings("unchecked")
+  @VisibleForTesting
+  @NullableDecl
+  Map<K, V> delegateOrNull() {
+    if (table instanceof Map) {
+      return (Map<K, V>) table;
+    }
+    return null;
   }
 
-  private static long[] newEntries(int size) {
-    long[] array = new long[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  Map<K, V> createHashFloodingResistantDelegate(int tableSize) {
+    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]);
+    }
+    this.table = newDelegate;
+    this.entries = null;
+    this.keys = null;
+    this.values = null;
+    incrementModCount();
+    return newDelegate;
+  }
+
+  /** Stores the hash table mask as the number of bits needed to represent an index. */
+  private void setHashTableMask(int mask) {
+    int hashTableBits = Integer.SIZE - Integer.numberOfLeadingZeros(mask);
+    metadata =
+        CompactHashing.maskCombine(metadata, hashTableBits, CompactHashing.HASH_TABLE_BITS_MASK);
+  }
+
+  /** Gets the hash table mask using the stored number of hash table bits. */
   private int hashTableMask() {
-    return table.length - 1;
+    return (1 << (metadata & CompactHashing.HASH_TABLE_BITS_MASK)) - 1;
   }
 
-  private static int getHash(long entry) {
-    return (int) (entry >>> 32);
-  }
-
-  /** Returns the index, or UNSET if the pointer is "null" */
-  private static int getNext(long entry) {
-    return (int) entry;
-  }
-
-  /** Returns a new entry value by changing the "next" index of an existing entry */
-  private static long swapNext(long entry, int newNext) {
-    return (HASH_MASK & entry) | (NEXT_MASK & newNext);
+  void incrementModCount() {
+    metadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
   }
 
   /**
@@ -233,66 +279,86 @@
   @Override
   @NullableDecl
   public V put(@NullableDecl K key, @NullableDecl V value) {
-    long[] entries = this.entries;
+    if (needsAllocArrays()) {
+      allocArrays();
+    }
+    @NullableDecl 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 hash = smearedHash(key);
-    int tableIndex = hash & hashTableMask();
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
-    int next = table[tableIndex];
-    if (next == UNSET) {
-      table[tableIndex] = newEntryIndex;
+    int newSize = newEntryIndex + 1;
+    int hash = smearedHash(key);
+    int mask = hashTableMask();
+    int tableIndex = hash & mask;
+    int next = CompactHashing.tableGet(table, 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);
+      }
     } else {
-      int last;
-      long entry;
+      int entryIndex;
+      int entry;
+      int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+      int bucketLength = 0;
       do {
-        last = next;
-        entry = entries[next];
-        if (getHash(entry) == hash && Objects.equal(key, keys[next])) {
+        entryIndex = next - 1;
+        entry = entries[entryIndex];
+        if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+            && Objects.equal(key, keys[entryIndex])) {
           @SuppressWarnings("unchecked") // known to be a V
           @NullableDecl
-          V oldValue = (V) values[next];
+          V oldValue = (V) values[entryIndex];
 
-          values[next] = value;
-          accessEntry(next);
+          values[entryIndex] = value;
+          accessEntry(entryIndex);
           return oldValue;
         }
-        next = getNext(entry);
+        next = CompactHashing.getNext(entry, mask);
+        bucketLength++;
       } while (next != UNSET);
-      entries[last] = swapNext(entry, newEntryIndex);
+
+      if (bucketLength >= MAX_HASH_BUCKET_LENGTH) {
+        return convertToHashFloodingResistantImplementation().put(key, value);
+      }
+
+      if (newSize > mask) {
+        // Resize and add new entry
+        mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
+      } else {
+        entries[entryIndex] = CompactHashing.maskCombine(entry, newEntryIndex + 1, mask);
+      }
     }
-    if (newEntryIndex == Integer.MAX_VALUE) {
-      throw new IllegalStateException("Cannot contain more than Integer.MAX_VALUE elements!");
-    }
-    int newSize = newEntryIndex + 1;
     resizeMeMaybe(newSize);
-    insertEntry(newEntryIndex, key, value, hash);
+    insertEntry(newEntryIndex, key, value, hash, mask);
     this.size = newSize;
-    if (newEntryIndex >= threshold) {
-      resizeTable(2 * table.length);
-    }
-    modCount++;
+    incrementModCount();
     return null;
   }
 
   /**
    * 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) {
-    this.entries[entryIndex] = ((long) hash << 32) | (NEXT_MASK & UNSET);
+  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;
   }
 
-  /** Returns currentSize + 1, after resizing the entries storage if necessary. */
+  /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
     int entriesSize = entries.length;
     if (newSize > entriesSize) {
-      int newCapacity = entriesSize + Math.max(1, entriesSize >>> 1);
-      if (newCapacity < 0) {
-        newCapacity = Integer.MAX_VALUE;
-      }
+      // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
+      int newCapacity =
+          Math.min(CompactHashing.MAX_SIZE, (entriesSize + Math.max(1, entriesSize >>> 1)) | 1);
       if (newCapacity != entriesSize) {
         resizeEntries(newCapacity);
       }
@@ -304,154 +370,167 @@
    * 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);
-    long[] entries = this.entries;
-    int oldCapacity = entries.length;
-    entries = Arrays.copyOf(entries, newCapacity);
-    if (newCapacity > oldCapacity) {
-      Arrays.fill(entries, oldCapacity, newCapacity, UNSET);
-    }
-    this.entries = entries;
   }
 
-  private void resizeTable(int newCapacity) { // newCapacity always a power of two
-    int[] oldTable = table;
-    int oldCapacity = oldTable.length;
-    if (oldCapacity >= MAXIMUM_CAPACITY) {
-      threshold = Integer.MAX_VALUE;
-      return;
-    }
-    int newThreshold = 1 + (int) (newCapacity * loadFactor);
-    int[] newTable = newTable(newCapacity);
-    long[] entries = this.entries;
+  @CanIgnoreReturnValue
+  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+    Object newTable = CompactHashing.createTable(newCapacity);
+    int newMask = newCapacity - 1;
 
-    int mask = newTable.length - 1;
-    for (int i = 0; i < size; i++) {
-      long oldEntry = entries[i];
-      int hash = getHash(oldEntry);
-      int tableIndex = hash & mask;
-      int next = newTable[tableIndex];
-      newTable[tableIndex] = i;
-      entries[i] = ((long) hash << 32) | (NEXT_MASK & next);
+    if (targetEntryIndex != UNSET) {
+      // Add target first; it must be last in the chain because its entry hasn't yet been created
+      CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    this.threshold = newThreshold;
+    Object table = this.table;
+    int[] entries = this.entries;
+
+    // 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];
+
+        // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
+        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+
+        int newTableIndex = hash & newMask;
+        int newNext = CompactHashing.tableGet(newTable, newTableIndex);
+        CompactHashing.tableSet(newTable, newTableIndex, next);
+        entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
+
+        next = CompactHashing.getNext(entry, mask);
+      }
+    }
+
     this.table = newTable;
+    setHashTableMask(newMask);
+    return newMask;
   }
 
   private int indexOf(@NullableDecl Object key) {
-    int hash = smearedHash(key);
-    int next = table[hash & hashTableMask()];
-    while (next != UNSET) {
-      long entry = entries[next];
-      if (getHash(entry) == hash && Objects.equal(key, keys[next])) {
-        return next;
-      }
-      next = getNext(entry);
+    if (needsAllocArrays()) {
+      return -1;
     }
+    int hash = smearedHash(key);
+    int mask = hashTableMask();
+    int next = CompactHashing.tableGet(table, hash & mask);
+    if (next == UNSET) {
+      return -1;
+    }
+    int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+    do {
+      int entryIndex = next - 1;
+      int entry = entries[entryIndex];
+      if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+          && Objects.equal(key, keys[entryIndex])) {
+        return entryIndex;
+      }
+      next = CompactHashing.getNext(entry, mask);
+    } while (next != UNSET);
     return -1;
   }
 
   @Override
   public boolean containsKey(@NullableDecl Object key) {
-    return indexOf(key) != -1;
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.containsKey(key) : indexOf(key) != -1;
   }
 
-  @SuppressWarnings("unchecked") // values only contains Vs
+  @SuppressWarnings("unchecked") // known to be a V
   @Override
   public V get(@NullableDecl Object key) {
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.get(key);
+    }
     int index = indexOf(key);
+    if (index == -1) {
+      return null;
+    }
     accessEntry(index);
-    return (index == -1) ? null : (V) values[index];
+    return (V) values[index];
   }
 
   @CanIgnoreReturnValue
+  @SuppressWarnings("unchecked") // known to be a V
   @Override
   @NullableDecl
   public V remove(@NullableDecl Object key) {
-    return remove(key, smearedHash(key));
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.remove(key);
+    }
+    Object oldValue = removeHelper(key);
+    return (oldValue == NOT_FOUND) ? null : (V) oldValue;
   }
 
   @NullableDecl
-  private V remove(@NullableDecl Object key, int hash) {
-    int tableIndex = hash & hashTableMask();
-    int next = table[tableIndex];
-    if (next == UNSET) { // empty bucket
-      return null;
+  private Object removeHelper(@NullableDecl Object key) {
+    if (needsAllocArrays()) {
+      return NOT_FOUND;
     }
-    int last = UNSET;
-    do {
-      if (getHash(entries[next]) == hash) {
-        if (Objects.equal(key, keys[next])) {
-          @SuppressWarnings("unchecked") // values only contains Vs
-          @NullableDecl
-          V oldValue = (V) values[next];
+    int mask = hashTableMask();
+    int index =
+        CompactHashing.remove(
+            key, /* value= */ null, mask, table, entries, keys, /* values= */ null);
+    if (index == -1) {
+      return NOT_FOUND;
+    }
 
-          if (last == UNSET) {
-            // we need to update the root link from table[]
-            table[tableIndex] = getNext(entries[next]);
-          } else {
-            // we need to update the link from the chain
-            entries[last] = swapNext(entries[last], getNext(entries[next]));
-          }
+    @NullableDecl Object oldValue = values[index];
 
-          moveLastEntry(next);
-          size--;
-          modCount++;
-          return oldValue;
-        }
-      }
-      last = next;
-      next = getNext(entries[next]);
-    } while (next != UNSET);
-    return null;
-  }
+    moveLastEntry(index, mask);
+    size--;
+    incrementModCount();
 
-  @CanIgnoreReturnValue
-  private V removeEntry(int entryIndex) {
-    return remove(keys[entryIndex], getHash(entries[entryIndex]));
+    return oldValue;
   }
 
   /**
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
-  void moveLastEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      keys[dstIndex] = keys[srcIndex];
+      @NullableDecl Object key = keys[srcIndex];
+      keys[dstIndex] = key;
       values[dstIndex] = values[srcIndex];
       keys[srcIndex] = null;
       values[srcIndex] = null;
 
       // move the last entry to the removed spot, just like we moved the element
-      long lastEntry = entries[srcIndex];
-      entries[dstIndex] = lastEntry;
-      entries[srcIndex] = UNSET;
+      entries[dstIndex] = entries[srcIndex];
+      entries[srcIndex] = 0;
 
       // also need to update whoever's "next" pointer was pointing to the last entry place
-      // reusing "tableIndex" and "next"; these variables were no longer needed
-      int tableIndex = getHash(lastEntry) & hashTableMask();
-      int lastNext = table[tableIndex];
-      if (lastNext == srcIndex) {
+      int tableIndex = smearedHash(key) & mask;
+      int next = CompactHashing.tableGet(table, tableIndex);
+      int srcNext = srcIndex + 1;
+      if (next == srcNext) {
         // we need to update the root pointer
-        table[tableIndex] = dstIndex;
+        CompactHashing.tableSet(table, tableIndex, dstIndex + 1);
       } else {
         // we need to update a pointer in an entry
-        int previous;
-        long entry;
+        int entryIndex;
+        int entry;
         do {
-          previous = lastNext;
-          lastNext = getNext(entry = entries[lastNext]);
-        } while (lastNext != srcIndex);
-        // here, entries[previous] points to the old entry location; update it
-        entries[previous] = swapNext(entry, dstIndex);
+          entryIndex = next - 1;
+          entry = entries[entryIndex];
+          next = CompactHashing.getNext(entry, mask);
+        } while (next != srcNext);
+        // here, entries[entryIndex] points to the old entry location; update it
+        entries[entryIndex] = CompactHashing.maskCombine(entry, dstIndex + 1, mask);
       }
     } else {
       keys[dstIndex] = null;
       values[dstIndex] = null;
-      entries[dstIndex] = UNSET;
+      entries[dstIndex] = 0;
     }
   }
 
@@ -473,7 +552,7 @@
   }
 
   private abstract class Itr<T> implements Iterator<T> {
-    int expectedModCount = modCount;
+    int expectedMetadata = metadata;
     int currentIndex = firstEntryIndex();
     int indexToRemove = -1;
 
@@ -500,20 +579,24 @@
     public void remove() {
       checkForConcurrentModification();
       checkRemove(indexToRemove >= 0);
-      expectedModCount++;
-      removeEntry(indexToRemove);
+      incrementExpectedModCount();
+      CompactHashMap.this.remove(keys[indexToRemove]);
       currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
       indexToRemove = -1;
     }
 
+    void incrementExpectedModCount() {
+      expectedMetadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
+    }
+
     private void checkForConcurrentModification() {
-      if (modCount != expectedModCount) {
+      if (metadata != expectedMetadata) {
         throw new ConcurrentModificationException();
       }
     }
   }
 
-  @MonotonicNonNullDecl private transient Set<K> keySetView;
+  @NullableDecl private transient Set<K> keySetView;
 
   @Override
   public Set<K> keySet() {
@@ -528,7 +611,7 @@
   class KeySetView extends AbstractSet<K> {
     @Override
     public int size() {
-      return size;
+      return CompactHashMap.this.size();
     }
 
     @Override
@@ -538,13 +621,10 @@
 
     @Override
     public boolean remove(@NullableDecl Object o) {
-      int index = indexOf(o);
-      if (index == -1) {
-        return false;
-      } else {
-        removeEntry(index);
-        return true;
-      }
+      @NullableDecl Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.keySet().remove(o)
+          : CompactHashMap.this.removeHelper(o) != NOT_FOUND;
     }
 
     @Override
@@ -559,8 +639,12 @@
   }
 
   Iterator<K> keySetIterator() {
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.keySet().iterator();
+    }
     return new Itr<K>() {
-      @SuppressWarnings("unchecked") // keys only contains Ks
+      @SuppressWarnings("unchecked") // known to be a K
       @Override
       K getOutput(int entry) {
         return (K) keys[entry];
@@ -568,7 +652,7 @@
     };
   }
 
-  @MonotonicNonNullDecl private transient Set<Entry<K, V>> entrySetView;
+  @NullableDecl private transient Set<Entry<K, V>> entrySetView;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -584,7 +668,7 @@
 
     @Override
     public int size() {
-      return size;
+      return CompactHashMap.this.size();
     }
 
     @Override
@@ -599,7 +683,10 @@
 
     @Override
     public boolean contains(@NullableDecl Object o) {
-      if (o instanceof Entry) {
+      @NullableDecl 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());
@@ -609,19 +696,37 @@
 
     @Override
     public boolean remove(@NullableDecl Object o) {
-      if (o instanceof Entry) {
+      @NullableDecl Map<K, V> delegate = delegateOrNull();
+      if (delegate != null) {
+        return delegate.entrySet().remove(o);
+      } else if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
-        int index = indexOf(entry.getKey());
-        if (index != -1 && Objects.equal(values[index], entry.getValue())) {
-          removeEntry(index);
-          return true;
+        if (needsAllocArrays()) {
+          return false;
         }
+        int mask = hashTableMask();
+        int index =
+            CompactHashing.remove(
+                entry.getKey(), entry.getValue(), mask, table, entries, keys, values);
+        if (index == -1) {
+          return false;
+        }
+
+        moveLastEntry(index, mask);
+        size--;
+        incrementModCount();
+
+        return true;
       }
       return false;
     }
   }
 
   Iterator<Entry<K, V>> entrySetIterator() {
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.entrySet().iterator();
+    }
     return new Itr<Entry<K, V>>() {
       @Override
       Entry<K, V> getOutput(int entry) {
@@ -635,12 +740,13 @@
 
     private int lastKnownIndex;
 
-    @SuppressWarnings("unchecked") // keys only contains Ks
+    @SuppressWarnings("unchecked") // known to be a K
     MapEntry(int index) {
       this.key = (K) keys[index];
       this.lastKnownIndex = index;
     }
 
+    @NullableDecl
     @Override
     public K getKey() {
       return key;
@@ -654,16 +760,25 @@
       }
     }
 
-    @SuppressWarnings("unchecked") // values only contains Vs
+    @SuppressWarnings("unchecked") // known to be a V
     @Override
+    @NullableDecl
     public V getValue() {
+      @NullableDecl Map<K, V> delegate = delegateOrNull();
+      if (delegate != null) {
+        return delegate.get(key);
+      }
       updateLastKnownIndex();
       return (lastKnownIndex == -1) ? null : (V) values[lastKnownIndex];
     }
 
-    @SuppressWarnings("unchecked") // values only contains Vs
+    @SuppressWarnings("unchecked") // known to be a V
     @Override
     public V setValue(V value) {
+      @NullableDecl Map<K, V> delegate = delegateOrNull();
+      if (delegate != null) {
+        return delegate.put(key, value);
+      }
       updateLastKnownIndex();
       if (lastKnownIndex == -1) {
         put(key, value);
@@ -678,16 +793,21 @@
 
   @Override
   public int size() {
-    return size;
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.size() : size;
   }
 
   @Override
   public boolean isEmpty() {
-    return size == 0;
+    return size() == 0;
   }
 
   @Override
   public boolean containsValue(@NullableDecl Object value) {
+    @NullableDecl 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])) {
         return true;
@@ -696,7 +816,7 @@
     return false;
   }
 
-  @MonotonicNonNullDecl private transient Collection<V> valuesView;
+  @NullableDecl private transient Collection<V> valuesView;
 
   @Override
   public Collection<V> values() {
@@ -711,7 +831,7 @@
   class ValuesView extends AbstractCollection<V> {
     @Override
     public int size() {
-      return size;
+      return CompactHashMap.this.size();
     }
 
     @Override
@@ -726,8 +846,12 @@
   }
 
   Iterator<V> valuesIterator() {
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.values().iterator();
+    }
     return new Itr<V>() {
-      @SuppressWarnings("unchecked") // values only contains Vs
+      @SuppressWarnings("unchecked") // known to be a V
       @Override
       V getOutput(int entry) {
         return (V) values[entry];
@@ -740,56 +864,69 @@
    * current size.
    */
   public void trimToSize() {
+    if (needsAllocArrays()) {
+      return;
+    }
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      Map<K, V> newDelegate = createHashFloodingResistantDelegate(size());
+      newDelegate.putAll(delegate);
+      this.table = newDelegate;
+      return;
+    }
     int size = this.size;
     if (size < entries.length) {
       resizeEntries(size);
     }
-    // size / loadFactor gives the table size of the appropriate load factor,
-    // but that may not be a power of two. We floor it to a power of two by
-    // keeping its highest bit. But the smaller table may have a load factor
-    // larger than what we want; then we want to go to the next power of 2 if we can
-    int minimumTableSize = Math.max(1, Integer.highestOneBit((int) (size / loadFactor)));
-    if (minimumTableSize < MAXIMUM_CAPACITY) {
-      double load = (double) size / minimumTableSize;
-      if (load > loadFactor) {
-        minimumTableSize <<= 1; // increase to next power if possible
-      }
-    }
-
-    if (minimumTableSize < table.length) {
-      resizeTable(minimumTableSize);
+    int minimumTableSize = CompactHashing.tableSize(size);
+    int mask = hashTableMask();
+    if (minimumTableSize < mask) { // smaller table size will always be less than current mask
+      resizeTable(mask, minimumTableSize, UNSET, UNSET);
     }
   }
 
   @Override
   public void clear() {
-    modCount++;
-    Arrays.fill(keys, 0, size, null);
-    Arrays.fill(values, 0, size, null);
-    Arrays.fill(table, UNSET);
-    Arrays.fill(entries, UNSET);
-    this.size = 0;
+    if (needsAllocArrays()) {
+      return;
+    }
+    incrementModCount();
+    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      metadata =
+          Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
+      delegate.clear(); // invalidate any iterators left over!
+      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);
+      this.size = 0;
+    }
   }
 
-  /**
-   * The serial form currently mimics Android's java.util.HashMap version, e.g. see
-   * http://omapzoom.org/?p=platform/libcore.git;a=blob;f=luni/src/main/java/java/util/HashMap.java
-   */
   private void writeObject(ObjectOutputStream stream) throws IOException {
     stream.defaultWriteObject();
-    stream.writeInt(size);
-    for (int i = 0; i < size; i++) {
-      stream.writeObject(keys[i]);
-      stream.writeObject(values[i]);
+    stream.writeInt(size());
+    Iterator<Entry<K, V>> entryIterator = entrySetIterator();
+    while (entryIterator.hasNext()) {
+      Entry<K, V> e = entryIterator.next();
+      stream.writeObject(e.getKey());
+      stream.writeObject(e.getValue());
     }
   }
 
   @SuppressWarnings("unchecked")
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
     int elementCount = stream.readInt();
-    for (int i = elementCount; --i >= 0; ) {
+    if (elementCount < 0) {
+      throw new InvalidObjectException("Invalid size: " + elementCount);
+    }
+    init(elementCount);
+    for (int i = 0; i < elementCount; i++) {
       K key = (K) stream.readObject();
       V value = (V) stream.readObject();
       put(key, value);
diff --git a/android/guava/src/com/google/common/collect/CompactHashSet.java b/android/guava/src/com/google/common/collect/CompactHashSet.java
index a363e58..d4c585c 100644
--- a/android/guava/src/com/google/common/collect/CompactHashSet.java
+++ b/android/guava/src/com/google/common/collect/CompactHashSet.java
@@ -17,13 +17,17 @@
 package com.google.common.collect;
 
 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 com.google.common.annotations.GwtIncompatible;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.IOException;
+import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
@@ -33,8 +37,9 @@
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -62,6 +67,7 @@
  * to prioritize memory over CPU.
  *
  * @author Dimitris Andreou
+ * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
 class CompactHashSet<E> extends AbstractSet<E> implements Serializable {
@@ -69,7 +75,7 @@
 
   /** Creates an empty {@code CompactHashSet} instance. */
   public static <E> CompactHashSet<E> create() {
-    return new CompactHashSet<E>();
+    return new CompactHashSet<>();
   }
 
   /**
@@ -92,6 +98,7 @@
    * @param elements the elements that the set should contain
    * @return a new {@code CompactHashSet} containing those elements (minus duplicates)
    */
+  @SafeVarargs
   public static <E> CompactHashSet<E> create(E... elements) {
     CompactHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
@@ -108,65 +115,81 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
   public static <E> CompactHashSet<E> createWithExpectedSize(int expectedSize) {
-    return new CompactHashSet<E>(expectedSize);
+    return new CompactHashSet<>(expectedSize);
   }
 
-  private static final int MAXIMUM_CAPACITY = 1 << 30;
-
-  // TODO(user): decide, and inline, load factor. 0.75?
-  private static final float DEFAULT_LOAD_FACTOR = 1.0f;
-
-  /** Bitmask that selects the low 32 bits. */
-  private static final long NEXT_MASK = (1L << 32) - 1;
-
-  /** Bitmask that selects the high 32 bits. */
-  private static final long HASH_MASK = ~NEXT_MASK;
-
-  // TODO(user): decide default size
-  private static final int DEFAULT_SIZE = 3;
-
-  static final int UNSET = -1;
+  /**
+   * Maximum allowed false positive probability of detecting a hash flooding attack given random
+   * input.
+   */
+  @VisibleForTesting(
+      )
+  static final double HASH_FLOODING_FPP = 0.001;
 
   /**
-   * The hashtable. Its values are indexes to both the elements and entries arrays.
+   * Maximum allowed length of a hash table bucket before falling back to a j.u.LinkedHashSet based
+   * implementation. Experimentally determined.
+   */
+  private static final int MAX_HASH_BUCKET_LENGTH = 9;
+
+  /**
+   * The hashtable object. This can be either:
    *
-   * <p>Currently, the UNSET value means "null pointer", and any non negative value x is the actual
-   * index.
+   * <ul>
+   *   <li>a byte[], short[], or int[], with size a power of two, created by
+   *       CompactHashing.createTable, whose values are either
+   *       <ul>
+   *         <li>UNSET, meaning "null pointer"
+   *         <li>one plus an index into the entries and elements array
+   *       </ul>
+   *   <li>another java.util.Set delegate implementation. In most modern JDKs, normal java.util hash
+   *       collections intelligently fall back to a binary search tree if hash table collisions are
+   *       detected. Rather than going to all the trouble of reimplementing this ourselves, we
+   *       simply switch over to use the JDK implementation wholesale if probable hash flooding is
+   *       detected, sacrificing the compactness guarantee in very rare cases in exchange for much
+   *       more reliable worst-case behavior.
+   *   <li>null, if no entries have yet been added to the map
+   * </ul>
+   */
+  @NullableDecl private transient Object table;
+
+  /**
+   * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
+   * part of the smeared hash of the element not covered by the hashtable mask, whereas the low bits
+   * are the "next" pointer (pointing to the next entry in the bucket chain), which will always be
+   * less than or equal to the hashtable mask.
    *
-   * <p>Its size must be a power of two.
+   * <pre>
+   * hash  = aaaaaaaa
+   * mask  = 0000ffff
+   * next  = 0000bbbb
+   * entry = aaaabbbb
+   * </pre>
+   *
+   * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
    */
-  @MonotonicNonNullDecl private transient int[] table;
+  @NullableDecl private transient int[] entries;
 
   /**
-   * Contains the logical entries, in the range of [0, size()). The high 32 bits of each long is the
-   * smeared hash of the element, whereas the low 32 bits is the "next" pointer (pointing to the
-   * next entry in the bucket chain). The pointers in [size(), entries.length) are all "null"
-   * (UNSET).
+   * The elements contained in the set, in the range of [0, size()). The elements in [size(),
+   * elements.length) are all {@code null}.
    */
-  @MonotonicNonNullDecl private transient long[] entries;
-
-  /** The elements contained in the set, in the range of [0, size()). */
-  @MonotonicNonNullDecl transient Object[] elements;
-
-  /** The load factor. */
-  transient float loadFactor;
+  @VisibleForTesting @NullableDecl transient Object[] elements;
 
   /**
-   * Keeps track of modifications of this set, 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.
+   * 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.
    */
-  transient int modCount;
-
-  /** When we have this many elements, resize the hashtable. */
-  private transient int threshold;
+  private transient int metadata;
 
   /** The number of elements contained in the set. */
   private transient int size;
 
   /** Constructs a new empty instance of {@code CompactHashSet}. */
   CompactHashSet() {
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
+    init(CompactHashing.DEFAULT_SIZE);
   }
 
   /**
@@ -175,105 +198,164 @@
    * @param expectedSize the initial capacity of this {@code CompactHashSet}.
    */
   CompactHashSet(int expectedSize) {
-    init(expectedSize, DEFAULT_LOAD_FACTOR);
+    init(expectedSize);
   }
 
   /** Pseudoconstructor for serialization support. */
-  void init(int expectedSize, float loadFactor) {
-    Preconditions.checkArgument(expectedSize >= 0, "Initial capacity must be non-negative");
-    Preconditions.checkArgument(loadFactor > 0, "Illegal load factor");
-    int buckets = Hashing.closedTableSize(expectedSize, loadFactor);
-    this.table = newTable(buckets);
-    this.loadFactor = loadFactor;
+  void init(int expectedSize) {
+    Preconditions.checkArgument(expectedSize >= 0, "Expected size must be >= 0");
+
+    // Save expectedSize for use in allocArrays()
+    this.metadata = Ints.constrainToRange(expectedSize, 1, CompactHashing.MAX_SIZE);
+  }
+
+  /** Returns whether arrays need to be allocated. */
+  @VisibleForTesting
+  boolean needsAllocArrays() {
+    return table == null;
+  }
+
+  /** Handle lazy allocation of arrays. */
+  @CanIgnoreReturnValue
+  int allocArrays() {
+    Preconditions.checkState(needsAllocArrays(), "Arrays already allocated");
+
+    int expectedSize = metadata;
+    int buckets = CompactHashing.tableSize(expectedSize);
+    this.table = CompactHashing.createTable(buckets);
+    setHashTableMask(buckets - 1);
+
+    this.entries = new int[expectedSize];
     this.elements = new Object[expectedSize];
-    this.entries = newEntries(expectedSize);
-    this.threshold = Math.max(1, (int) (buckets * loadFactor));
+
+    return expectedSize;
   }
 
-  private static int[] newTable(int size) {
-    int[] array = new int[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  @SuppressWarnings("unchecked")
+  @VisibleForTesting
+  @NullableDecl
+  Set<E> delegateOrNull() {
+    if (table instanceof Set) {
+      return (Set<E>) table;
+    }
+    return null;
   }
 
-  private static long[] newEntries(int size) {
-    long[] array = new long[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  private Set<E> createHashFloodingResistantDelegate(int tableSize) {
+    return new LinkedHashSet<>(tableSize, 1.0f);
   }
 
-  private static int getHash(long entry) {
-    return (int) (entry >>> 32);
+  @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]);
+    }
+    this.table = newDelegate;
+    this.entries = null;
+    this.elements = null;
+    incrementModCount();
+    return newDelegate;
   }
 
-  /** Returns the index, or UNSET if the pointer is "null" */
-  private static int getNext(long entry) {
-    return (int) entry;
+  @VisibleForTesting
+  boolean isUsingHashFloodingResistance() {
+    return delegateOrNull() != null;
   }
 
-  /** Returns a new entry value by changing the "next" index of an existing entry */
-  private static long swapNext(long entry, int newNext) {
-    return (HASH_MASK & entry) | (NEXT_MASK & newNext);
+  /** Stores the hash table mask as the number of bits needed to represent an index. */
+  private void setHashTableMask(int mask) {
+    int hashTableBits = Integer.SIZE - Integer.numberOfLeadingZeros(mask);
+    metadata =
+        CompactHashing.maskCombine(metadata, hashTableBits, CompactHashing.HASH_TABLE_BITS_MASK);
   }
 
+  /** Gets the hash table mask using the stored number of hash table bits. */
   private int hashTableMask() {
-    return table.length - 1;
+    return (1 << (metadata & CompactHashing.HASH_TABLE_BITS_MASK)) - 1;
+  }
+
+  void incrementModCount() {
+    metadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
   }
 
   @CanIgnoreReturnValue
   @Override
   public boolean add(@NullableDecl E object) {
-    long[] entries = this.entries;
+    if (needsAllocArrays()) {
+      allocArrays();
+    }
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.add(object);
+    }
+    int[] entries = this.entries;
     Object[] elements = this.elements;
-    int hash = smearedHash(object);
-    int tableIndex = hash & hashTableMask();
+
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
-    int next = table[tableIndex];
+    int newSize = newEntryIndex + 1;
+    int hash = smearedHash(object);
+    int mask = hashTableMask();
+    int tableIndex = hash & mask;
+    int next = CompactHashing.tableGet(table, tableIndex);
     if (next == UNSET) { // uninitialized bucket
-      table[tableIndex] = newEntryIndex;
+      if (newSize > mask) {
+        // Resize and add new entry
+        mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
+      } else {
+        CompactHashing.tableSet(table, tableIndex, newEntryIndex + 1);
+      }
     } else {
-      int last;
-      long entry;
+      int entryIndex;
+      int entry;
+      int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+      int bucketLength = 0;
       do {
-        last = next;
-        entry = entries[next];
-        if (getHash(entry) == hash && Objects.equal(object, elements[next])) {
+        entryIndex = next - 1;
+        entry = entries[entryIndex];
+        if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+            && Objects.equal(object, elements[entryIndex])) {
           return false;
         }
-        next = getNext(entry);
+        next = CompactHashing.getNext(entry, mask);
+        bucketLength++;
       } while (next != UNSET);
-      entries[last] = swapNext(entry, newEntryIndex);
+
+      if (bucketLength >= MAX_HASH_BUCKET_LENGTH) {
+        return convertToHashFloodingResistantImplementation().add(object);
+      }
+
+      if (newSize > mask) {
+        // Resize and add new entry
+        mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
+      } else {
+        entries[entryIndex] = CompactHashing.maskCombine(entry, newEntryIndex + 1, mask);
+      }
     }
-    if (newEntryIndex == Integer.MAX_VALUE) {
-      throw new IllegalStateException("Cannot contain more than Integer.MAX_VALUE elements!");
-    }
-    int newSize = newEntryIndex + 1;
     resizeMeMaybe(newSize);
-    insertEntry(newEntryIndex, object, hash);
+    insertEntry(newEntryIndex, object, hash, mask);
     this.size = newSize;
-    if (newEntryIndex >= threshold) {
-      resizeTable(2 * table.length);
-    }
-    modCount++;
+    incrementModCount();
     return true;
   }
 
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry arrays.
    */
-  void insertEntry(int entryIndex, E object, int hash) {
-    this.entries[entryIndex] = ((long) hash << 32) | (NEXT_MASK & UNSET);
+  void insertEntry(int entryIndex, @NullableDecl E object, int hash, int mask) {
+    this.entries[entryIndex] = CompactHashing.maskCombine(hash, UNSET, mask);
     this.elements[entryIndex] = object;
   }
 
-  /** Returns currentSize + 1, after resizing the entries storage if necessary. */
+  /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
     int entriesSize = entries.length;
     if (newSize > entriesSize) {
-      int newCapacity = entriesSize + Math.max(1, entriesSize >>> 1);
-      if (newCapacity < 0) {
-        newCapacity = Integer.MAX_VALUE;
-      }
+      // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
+      int newCapacity =
+          Math.min(CompactHashing.MAX_SIZE, (entriesSize + Math.max(1, entriesSize >>> 1)) | 1);
       if (newCapacity != entriesSize) {
         resizeEntries(newCapacity);
       }
@@ -285,126 +367,137 @@
    * the current capacity.
    */
   void resizeEntries(int newCapacity) {
+    this.entries = Arrays.copyOf(entries, newCapacity);
     this.elements = Arrays.copyOf(elements, newCapacity);
-    long[] entries = this.entries;
-    int oldSize = entries.length;
-    entries = Arrays.copyOf(entries, newCapacity);
-    if (newCapacity > oldSize) {
-      Arrays.fill(entries, oldSize, newCapacity, UNSET);
-    }
-    this.entries = entries;
   }
 
-  private void resizeTable(int newCapacity) { // newCapacity always a power of two
-    int[] oldTable = table;
-    int oldCapacity = oldTable.length;
-    if (oldCapacity >= MAXIMUM_CAPACITY) {
-      threshold = Integer.MAX_VALUE;
-      return;
-    }
-    int newThreshold = 1 + (int) (newCapacity * loadFactor);
-    int[] newTable = newTable(newCapacity);
-    long[] entries = this.entries;
+  @CanIgnoreReturnValue
+  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+    Object newTable = CompactHashing.createTable(newCapacity);
+    int newMask = newCapacity - 1;
 
-    int mask = newTable.length - 1;
-    for (int i = 0; i < size; i++) {
-      long oldEntry = entries[i];
-      int hash = getHash(oldEntry);
-      int tableIndex = hash & mask;
-      int next = newTable[tableIndex];
-      newTable[tableIndex] = i;
-      entries[i] = ((long) hash << 32) | (NEXT_MASK & next);
+    if (targetEntryIndex != UNSET) {
+      // Add target first; it must be last in the chain because its entry hasn't yet been created
+      CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    this.threshold = newThreshold;
+    Object table = this.table;
+    int[] entries = this.entries;
+
+    // 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];
+
+        // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
+        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+
+        int newTableIndex = hash & newMask;
+        int newNext = CompactHashing.tableGet(newTable, newTableIndex);
+        CompactHashing.tableSet(newTable, newTableIndex, next);
+        entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
+
+        next = CompactHashing.getNext(entry, mask);
+      }
+    }
+
     this.table = newTable;
+    setHashTableMask(newMask);
+    return newMask;
   }
 
   @Override
   public boolean contains(@NullableDecl Object object) {
+    if (needsAllocArrays()) {
+      return false;
+    }
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.contains(object);
+    }
     int hash = smearedHash(object);
-    int next = table[hash & hashTableMask()];
-    while (next != UNSET) {
-      long entry = entries[next];
-      if (getHash(entry) == hash && Objects.equal(object, elements[next])) {
+    int mask = hashTableMask();
+    int next = CompactHashing.tableGet(table, hash & mask);
+    if (next == UNSET) {
+      return false;
+    }
+    int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+    do {
+      int entryIndex = next - 1;
+      int entry = entries[entryIndex];
+      if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+          && Objects.equal(object, elements[entryIndex])) {
         return true;
       }
-      next = getNext(entry);
-    }
+      next = CompactHashing.getNext(entry, mask);
+    } while (next != UNSET);
     return false;
   }
 
   @CanIgnoreReturnValue
   @Override
   public boolean remove(@NullableDecl Object object) {
-    return remove(object, smearedHash(object));
-  }
-
-  @CanIgnoreReturnValue
-  private boolean remove(Object object, int hash) {
-    int tableIndex = hash & hashTableMask();
-    int next = table[tableIndex];
-    if (next == UNSET) {
+    if (needsAllocArrays()) {
       return false;
     }
-    int last = UNSET;
-    do {
-      if (getHash(entries[next]) == hash && Objects.equal(object, elements[next])) {
-        if (last == UNSET) {
-          // we need to update the root link from table[]
-          table[tableIndex] = getNext(entries[next]);
-        } else {
-          // we need to update the link from the chain
-          entries[last] = swapNext(entries[last], getNext(entries[next]));
-        }
+    @NullableDecl 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);
+    if (index == -1) {
+      return false;
+    }
 
-        moveEntry(next);
-        size--;
-        modCount++;
-        return true;
-      }
-      last = next;
-      next = getNext(entries[next]);
-    } while (next != UNSET);
-    return false;
+    moveLastEntry(index, mask);
+    size--;
+    incrementModCount();
+
+    return true;
   }
 
   /**
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
-  void moveEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      elements[dstIndex] = elements[srcIndex];
+      @NullableDecl Object object = elements[srcIndex];
+      elements[dstIndex] = object;
       elements[srcIndex] = null;
 
       // move the last entry to the removed spot, just like we moved the element
-      long lastEntry = entries[srcIndex];
-      entries[dstIndex] = lastEntry;
-      entries[srcIndex] = UNSET;
+      entries[dstIndex] = entries[srcIndex];
+      entries[srcIndex] = 0;
 
       // also need to update whoever's "next" pointer was pointing to the last entry place
-      // reusing "tableIndex" and "next"; these variables were no longer needed
-      int tableIndex = getHash(lastEntry) & hashTableMask();
-      int lastNext = table[tableIndex];
-      if (lastNext == srcIndex) {
+      int tableIndex = smearedHash(object) & mask;
+      int next = CompactHashing.tableGet(table, tableIndex);
+      int srcNext = srcIndex + 1;
+      if (next == srcNext) {
         // we need to update the root pointer
-        table[tableIndex] = dstIndex;
+        CompactHashing.tableSet(table, tableIndex, dstIndex + 1);
       } else {
         // we need to update a pointer in an entry
-        int previous;
-        long entry;
+        int entryIndex;
+        int entry;
         do {
-          previous = lastNext;
-          lastNext = getNext(entry = entries[lastNext]);
-        } while (lastNext != srcIndex);
-        // here, entries[previous] points to the old entry location; update it
-        entries[previous] = swapNext(entry, dstIndex);
+          entryIndex = next - 1;
+          entry = entries[entryIndex];
+          next = CompactHashing.getNext(entry, mask);
+        } while (next != srcNext);
+        // here, entries[entryIndex] points to the old entry location; update it
+        entries[entryIndex] = CompactHashing.maskCombine(entry, dstIndex + 1, mask);
       }
     } else {
       elements[dstIndex] = null;
-      entries[dstIndex] = UNSET;
+      entries[dstIndex] = 0;
     }
   }
 
@@ -427,26 +520,30 @@
 
   @Override
   public Iterator<E> iterator() {
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.iterator();
+    }
     return new Iterator<E>() {
-      int expectedModCount = modCount;
-      int index = firstEntryIndex();
+      int expectedMetadata = metadata;
+      int currentIndex = firstEntryIndex();
       int indexToRemove = -1;
 
       @Override
       public boolean hasNext() {
-        return index >= 0;
+        return currentIndex >= 0;
       }
 
+      @SuppressWarnings("unchecked") // known to be Es
       @Override
-      @SuppressWarnings("unchecked")
       public E next() {
         checkForConcurrentModification();
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        indexToRemove = index;
-        E result = (E) elements[index];
-        index = getSuccessor(index);
+        indexToRemove = currentIndex;
+        E result = (E) elements[currentIndex];
+        currentIndex = getSuccessor(currentIndex);
         return result;
       }
 
@@ -454,14 +551,18 @@
       public void remove() {
         checkForConcurrentModification();
         checkRemove(indexToRemove >= 0);
-        expectedModCount++;
-        CompactHashSet.this.remove(elements[indexToRemove], getHash(entries[indexToRemove]));
-        index = adjustAfterRemove(index, indexToRemove);
+        incrementExpectedModCount();
+        CompactHashSet.this.remove(elements[indexToRemove]);
+        currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
         indexToRemove = -1;
       }
 
+      void incrementExpectedModCount() {
+        expectedMetadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
+      }
+
       private void checkForConcurrentModification() {
-        if (modCount != expectedModCount) {
+        if (metadata != expectedMetadata) {
           throw new ConcurrentModificationException();
         }
       }
@@ -470,23 +571,37 @@
 
   @Override
   public int size() {
-    return size;
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.size() : size;
   }
 
   @Override
   public boolean isEmpty() {
-    return size == 0;
+    return size() == 0;
   }
 
   @Override
   public Object[] toArray() {
-    return Arrays.copyOf(elements, size);
+    if (needsAllocArrays()) {
+      return new Object[0];
+    }
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.toArray() : Arrays.copyOf(elements, size);
   }
 
   @CanIgnoreReturnValue
   @Override
   public <T> T[] toArray(T[] a) {
-    return ObjectArrays.toArrayImpl(elements, 0, size, a);
+    if (needsAllocArrays()) {
+      if (a.length > 0) {
+        a[0] = null;
+      }
+      return a;
+    }
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    return (delegate != null)
+        ? delegate.toArray(a)
+        : ObjectArrays.toArrayImpl(elements, 0, size, a);
   }
 
   /**
@@ -494,43 +609,51 @@
    * current size.
    */
   public void trimToSize() {
+    if (needsAllocArrays()) {
+      return;
+    }
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      Set<E> newDelegate = createHashFloodingResistantDelegate(size());
+      newDelegate.addAll(delegate);
+      this.table = newDelegate;
+      return;
+    }
     int size = this.size;
     if (size < entries.length) {
       resizeEntries(size);
     }
-    // size / loadFactor gives the table size of the appropriate load factor,
-    // but that may not be a power of two. We floor it to a power of two by
-    // keeping its highest bit. But the smaller table may have a load factor
-    // larger than what we want; then we want to go to the next power of 2 if we can
-    int minimumTableSize = Math.max(1, Integer.highestOneBit((int) (size / loadFactor)));
-    if (minimumTableSize < MAXIMUM_CAPACITY) {
-      double load = (double) size / minimumTableSize;
-      if (load > loadFactor) {
-        minimumTableSize <<= 1; // increase to next power if possible
-      }
-    }
-
-    if (minimumTableSize < table.length) {
-      resizeTable(minimumTableSize);
+    int minimumTableSize = CompactHashing.tableSize(size);
+    int mask = hashTableMask();
+    if (minimumTableSize < mask) { // smaller table size will always be less than current mask
+      resizeTable(mask, minimumTableSize, UNSET, UNSET);
     }
   }
 
   @Override
   public void clear() {
-    modCount++;
-    Arrays.fill(elements, 0, size, null);
-    Arrays.fill(table, UNSET);
-    Arrays.fill(entries, UNSET);
-    this.size = 0;
+    if (needsAllocArrays()) {
+      return;
+    }
+    incrementModCount();
+    @NullableDecl Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      metadata =
+          Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
+      delegate.clear(); // invalidate any iterators left over!
+      table = null;
+      size = 0;
+    } else {
+      Arrays.fill(elements, 0, size, null);
+      CompactHashing.tableClear(table);
+      Arrays.fill(entries, 0, size, 0);
+      this.size = 0;
+    }
   }
 
-  /**
-   * The serial form currently mimics Android's java.util.HashSet version, e.g. see
-   * http://omapzoom.org/?p=platform/libcore.git;a=blob;f=luni/src/main/java/java/util/HashSet.java
-   */
   private void writeObject(ObjectOutputStream stream) throws IOException {
     stream.defaultWriteObject();
-    stream.writeInt(size);
+    stream.writeInt(size());
     for (E e : this) {
       stream.writeObject(e);
     }
@@ -539,9 +662,12 @@
   @SuppressWarnings("unchecked")
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
     int elementCount = stream.readInt();
-    for (int i = elementCount; --i >= 0; ) {
+    if (elementCount < 0) {
+      throw new InvalidObjectException("Invalid size: " + elementCount);
+    }
+    init(elementCount);
+    for (int i = 0; i < elementCount; i++) {
       E element = (E) stream.readObject();
       add(element);
     }
diff --git a/android/guava/src/com/google/common/collect/CompactHashing.java b/android/guava/src/com/google/common/collect/CompactHashing.java
new file mode 100644
index 0000000..7e83a05
--- /dev/null
+++ b/android/guava/src/com/google/common/collect/CompactHashing.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 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.collect;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Ints;
+import java.util.Arrays;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+/**
+ * Helper classes and static methods for implementing compact hash-based collections.
+ *
+ * @author Jon Noack
+ */
+@GwtIncompatible
+final class CompactHashing {
+  private CompactHashing() {}
+
+  /** Indicates blank table entries. */
+  static final byte UNSET = 0;
+
+  /** Number of bits used to store the numbers of hash table bits (max 30). */
+  private static final int HASH_TABLE_BITS_MAX_BITS = 5;
+
+  /** Use high bits of metadata for modification count. */
+  static final int MODIFICATION_COUNT_INCREMENT = (1 << HASH_TABLE_BITS_MAX_BITS);
+
+  /** Bitmask that selects the low bits of metadata to get hashTableBits. */
+  static final int HASH_TABLE_BITS_MASK = (1 << HASH_TABLE_BITS_MAX_BITS) - 1;
+
+  /** Maximum size of a compact hash-based collection (2^30 - 1 because 0 is UNSET). */
+  static final int MAX_SIZE = Ints.MAX_POWER_OF_TWO - 1;
+
+  /** Default size of a compact hash-based collection. */
+  static final int DEFAULT_SIZE = 3;
+
+  /**
+   * Minimum size of the hash table of a compact hash-based collection. Because small hash tables
+   * use a byte[], any smaller size uses the same amount of memory due to object padding.
+   */
+  private static final int MIN_HASH_TABLE_SIZE = 4;
+
+  private static final int BYTE_MAX_SIZE = 1 << Byte.SIZE; // 2^8 = 256
+  private static final int BYTE_MASK = (1 << Byte.SIZE) - 1; // 2^8 - 1 = 255
+
+  private static final int SHORT_MAX_SIZE = 1 << Short.SIZE; // 2^16 = 65_536
+  private static final int SHORT_MASK = (1 << Short.SIZE) - 1; // 2^16 - 1 = 65_535
+
+  /**
+   * Returns the power of 2 hashtable size required to hold the expected number of items or the
+   * minimum hashtable size, whichever is greater.
+   */
+  static int tableSize(int expectedSize) {
+    // We use entries next == 0 to indicate UNSET, so actual capacity is 1 less than requested.
+    return Math.max(MIN_HASH_TABLE_SIZE, Hashing.closedTableSize(expectedSize + 1, 1.0f));
+  }
+
+  /** Creates and returns a properly-sized array with the given number of buckets. */
+  static Object createTable(int buckets) {
+    if (buckets < 2
+        || buckets > Ints.MAX_POWER_OF_TWO
+        || Integer.highestOneBit(buckets) != buckets) {
+      throw new IllegalArgumentException("must be power of 2 between 2^1 and 2^30: " + buckets);
+    }
+    if (buckets <= BYTE_MAX_SIZE) {
+      return new byte[buckets];
+    } else if (buckets <= SHORT_MAX_SIZE) {
+      return new short[buckets];
+    } else {
+      return new int[buckets];
+    }
+  }
+
+  static void tableClear(Object table) {
+    if (table instanceof byte[]) {
+      Arrays.fill((byte[]) table, (byte) 0);
+    } else if (table instanceof short[]) {
+      Arrays.fill((short[]) table, (short) 0);
+    } else {
+      Arrays.fill((int[]) table, 0);
+    }
+  }
+
+  static int tableGet(Object table, int index) {
+    if (table instanceof byte[]) {
+      return ((byte[]) table)[index] & BYTE_MASK; // unsigned read
+    } else if (table instanceof short[]) {
+      return ((short[]) table)[index] & SHORT_MASK; // unsigned read
+    } else {
+      return ((int[]) table)[index];
+    }
+  }
+
+  static void tableSet(Object table, int index, int entry) {
+    if (table instanceof byte[]) {
+      ((byte[]) table)[index] = (byte) entry; // unsigned write
+    } else if (table instanceof short[]) {
+      ((short[]) table)[index] = (short) entry; // unsigned write
+    } else {
+      ((int[]) table)[index] = entry;
+    }
+  }
+
+  /**
+   * Returns a larger power of 2 hashtable size given the current mask.
+   *
+   * <p>For hashtable sizes less than or equal to 32, the returned power of 2 is 4x the current
+   * hashtable size to reduce expensive rehashing. Otherwise the returned power of 2 is 2x the
+   * current hashtable size.
+   */
+  static int newCapacity(int mask) {
+    return ((mask < 32) ? 4 : 2) * (mask + 1);
+  }
+
+  /** Returns the hash prefix given the current mask. */
+  static int getHashPrefix(int value, int mask) {
+    return value & ~mask;
+  }
+
+  /** Returns the index, or 0 if the entry is "null". */
+  static int getNext(int entry, int mask) {
+    return entry & mask;
+  }
+
+  /** Returns a new value combining the prefix and suffix using the given mask. */
+  static int maskCombine(int prefix, int suffix, int mask) {
+    return (prefix & ~mask) | (suffix & mask);
+  }
+
+  static int remove(
+      @NullableDecl Object key,
+      @NullableDecl Object value,
+      int mask,
+      Object table,
+      int[] entries,
+      Object[] keys,
+      @NullableDecl Object[] values) {
+    int hash = Hashing.smearedHash(key);
+    int tableIndex = hash & mask;
+    int next = tableGet(table, tableIndex);
+    if (next == UNSET) {
+      return -1;
+    }
+    int hashPrefix = getHashPrefix(hash, mask);
+    int lastEntryIndex = -1;
+    do {
+      int entryIndex = next - 1;
+      int entry = entries[entryIndex];
+      if (getHashPrefix(entry, mask) == hashPrefix
+          && Objects.equal(key, keys[entryIndex])
+          && (values == null || Objects.equal(value, values[entryIndex]))) {
+        int newNext = getNext(entry, mask);
+        if (lastEntryIndex == -1) {
+          // we need to update the root link from table[]
+          tableSet(table, tableIndex, newNext);
+        } else {
+          // we need to update the link from the chain
+          entries[lastEntryIndex] = maskCombine(entries[lastEntryIndex], newNext, mask);
+        }
+
+        return entryIndex;
+      }
+      lastEntryIndex = entryIndex;
+      next = getNext(entry, mask);
+    } while (next != UNSET);
+    return -1;
+  }
+}
diff --git a/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java b/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java
index c90c9df..9135524 100644
--- a/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java
+++ b/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java
@@ -13,12 +13,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * CompactLinkedHashMap is an implementation of a Map with insertion or LRU iteration order,
@@ -51,7 +55,7 @@
 
   /**
    * Creates a {@code CompactLinkedHashMap} instance, with a high enough "initial capacity" that it
-   * <i>should</i> hold {@code expectedSize} elements without growth.
+   * <i>should</i> hold {@code expectedSize} elements without rebuilding internal data structures.
    *
    * @param expectedSize the number of elements you expect to add to the returned set
    * @return a new, empty {@code CompactLinkedHashMap} with enough capacity to hold {@code
@@ -73,7 +77,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 @MonotonicNonNullDecl transient long[] links;
+  @VisibleForTesting @NullableDecl transient long[] links;
 
   /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
@@ -84,44 +88,62 @@
   private final boolean accessOrder;
 
   CompactLinkedHashMap() {
-    this(DEFAULT_SIZE);
+    this(CompactHashing.DEFAULT_SIZE);
   }
 
   CompactLinkedHashMap(int expectedSize) {
-    this(expectedSize, DEFAULT_LOAD_FACTOR, false);
+    this(expectedSize, false);
   }
 
-  CompactLinkedHashMap(int expectedSize, float loadFactor, boolean accessOrder) {
-    super(expectedSize, loadFactor);
+  CompactLinkedHashMap(int expectedSize, boolean accessOrder) {
+    super(expectedSize);
     this.accessOrder = accessOrder;
   }
 
   @Override
-  void init(int expectedSize, float loadFactor) {
-    super.init(expectedSize, loadFactor);
-    firstEntry = ENDPOINT;
-    lastEntry = ENDPOINT;
-    links = new long[expectedSize];
-    Arrays.fill(links, UNSET);
+  void init(int expectedSize) {
+    super.init(expectedSize);
+    this.firstEntry = ENDPOINT;
+    this.lastEntry = ENDPOINT;
+  }
+
+  @Override
+  int allocArrays() {
+    int expectedSize = super.allocArrays();
+    this.links = new long[expectedSize];
+    return expectedSize;
+  }
+
+  @Override
+  Map<K, V> createHashFloodingResistantDelegate(int tableSize) {
+    return new LinkedHashMap<K, V>(tableSize, 1.0f, accessOrder);
+  }
+
+  @Override
+  @CanIgnoreReturnValue
+  Map<K, V> convertToHashFloodingResistantImplementation() {
+    Map<K, V> result = super.convertToHashFloodingResistantImplementation();
+    links = null;
+    return result;
   }
 
   private int getPredecessor(int entry) {
-    return (int) (links[entry] >>> 32);
+    return ((int) (links[entry] >>> 32)) - 1;
   }
 
   @Override
   int getSuccessor(int entry) {
-    return (int) links[entry];
+    return ((int) links[entry]) - 1;
   }
 
   private void setSuccessor(int entry, int succ) {
     long succMask = (~0L) >>> 32;
-    links[entry] = (links[entry] & ~succMask) | (succ & succMask);
+    links[entry] = (links[entry] & ~succMask) | ((succ + 1) & succMask);
   }
 
   private void setPredecessor(int entry, int pred) {
     long predMask = ~0L << 32;
-    links[entry] = (links[entry] & ~predMask) | ((long) pred << 32);
+    links[entry] = (links[entry] & ~predMask) | ((long) (pred + 1) << 32);
   }
 
   private void setSucceeds(int pred, int succ) {
@@ -130,6 +152,7 @@
     } else {
       setSuccessor(pred, succ);
     }
+
     if (succ == ENDPOINT) {
       lastEntry = pred;
     } else {
@@ -138,8 +161,8 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, K key, V value, int hash) {
-    super.insertEntry(entryIndex, key, value, hash);
+  void insertEntry(int entryIndex, @NullableDecl K key, @NullableDecl V value, int hash, int mask) {
+    super.insertEntry(entryIndex, key, value, hash, mask);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
   }
@@ -152,19 +175,21 @@
       // ...and insert at the end.
       setSucceeds(lastEntry, index);
       setSucceeds(index, ENDPOINT);
-      modCount++;
+      incrementModCount();
     }
   }
 
   @Override
-  void moveLastEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
+    super.moveLastEntry(dstIndex, mask);
+
     setSucceeds(getPredecessor(dstIndex), getSuccessor(dstIndex));
     if (dstIndex < srcIndex) {
       setSucceeds(getPredecessor(srcIndex), dstIndex);
       setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    super.moveLastEntry(dstIndex);
+    links[srcIndex] = 0;
   }
 
   @Override
@@ -185,8 +210,14 @@
 
   @Override
   public void clear() {
-    super.clear();
+    if (needsAllocArrays()) {
+      return;
+    }
     this.firstEntry = ENDPOINT;
     this.lastEntry = ENDPOINT;
+    if (links != null) {
+      Arrays.fill(links, 0, size(), 0);
+    }
+    super.clear();
   }
 }
diff --git a/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java b/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java
index 70ac3cc..4f9aa4a 100644
--- a/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java
+++ b/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java
@@ -17,10 +17,12 @@
 package com.google.common.collect;
 
 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 org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import java.util.Set;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * CompactLinkedHashSet is an implementation of a Set, which a predictable iteration order that
@@ -48,7 +50,7 @@
 
   /** Creates an empty {@code CompactLinkedHashSet} instance. */
   public static <E> CompactLinkedHashSet<E> create() {
-    return new CompactLinkedHashSet<E>();
+    return new CompactLinkedHashSet<>();
   }
 
   /**
@@ -71,6 +73,7 @@
    * @param elements the elements that the set should contain
    * @return a new {@code CompactLinkedHashSet} containing those elements (minus duplicates)
    */
+  @SafeVarargs
   public static <E> CompactLinkedHashSet<E> create(E... elements) {
     CompactLinkedHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
@@ -87,28 +90,31 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
   public static <E> CompactLinkedHashSet<E> createWithExpectedSize(int expectedSize) {
-    return new CompactLinkedHashSet<E>(expectedSize);
+    return new CompactLinkedHashSet<>(expectedSize);
   }
 
   private static final int ENDPOINT = -2;
 
   // TODO(user): predecessors and successors should be collocated (reducing cache misses).
-  // Might also explore collocating all of [hash, next, predecessor, succesor] fields of an
+  // Might also explore collocating all of [hash, next, predecessor, successor] fields of an
   // entry in a *single* long[], though that reduces the maximum size of the set by a factor of 2
 
   /**
    * 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.
    */
-  @MonotonicNonNullDecl private transient int[] predecessor;
+  @NullableDecl 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.
    */
-  @MonotonicNonNullDecl private transient int[] successor;
+  @NullableDecl 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;
+
+  /** Pointer to the last node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int lastEntry;
 
   CompactLinkedHashSet() {
@@ -120,72 +126,96 @@
   }
 
   @Override
-  void init(int expectedSize, float loadFactor) {
-    super.init(expectedSize, loadFactor);
-    this.predecessor = new int[expectedSize];
-    this.successor = new int[expectedSize];
-
-    Arrays.fill(predecessor, UNSET);
-    Arrays.fill(successor, UNSET);
-    firstEntry = ENDPOINT;
-    lastEntry = ENDPOINT;
+  void init(int expectedSize) {
+    super.init(expectedSize);
+    this.firstEntry = ENDPOINT;
+    this.lastEntry = ENDPOINT;
   }
 
-  private void succeeds(int pred, int succ) {
+  @Override
+  int allocArrays() {
+    int expectedSize = super.allocArrays();
+    this.predecessor = new int[expectedSize];
+    this.successor = new int[expectedSize];
+    return expectedSize;
+  }
+
+  @Override
+  @CanIgnoreReturnValue
+  Set<E> convertToHashFloodingResistantImplementation() {
+    Set<E> result = super.convertToHashFloodingResistantImplementation();
+    this.predecessor = null;
+    this.successor = null;
+    return result;
+  }
+
+  private int getPredecessor(int entry) {
+    return predecessor[entry] - 1;
+  }
+
+  @Override
+  int getSuccessor(int entry) {
+    return successor[entry] - 1;
+  }
+
+  private void setSuccessor(int entry, int succ) {
+    successor[entry] = succ + 1;
+  }
+
+  private void setPredecessor(int entry, int pred) {
+    predecessor[entry] = pred + 1;
+  }
+
+  private void setSucceeds(int pred, int succ) {
     if (pred == ENDPOINT) {
       firstEntry = succ;
     } else {
-      successor[pred] = succ;
+      setSuccessor(pred, succ);
     }
 
     if (succ == ENDPOINT) {
       lastEntry = pred;
     } else {
-      predecessor[succ] = pred;
+      setPredecessor(succ, pred);
     }
   }
 
   @Override
-  void insertEntry(int entryIndex, E object, int hash) {
-    super.insertEntry(entryIndex, object, hash);
-    succeeds(lastEntry, entryIndex);
-    succeeds(entryIndex, ENDPOINT);
+  void insertEntry(int entryIndex, @NullableDecl E object, int hash, int mask) {
+    super.insertEntry(entryIndex, object, hash, mask);
+    setSucceeds(lastEntry, entryIndex);
+    setSucceeds(entryIndex, ENDPOINT);
   }
 
   @Override
-  void moveEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
-    super.moveEntry(dstIndex);
+    super.moveLastEntry(dstIndex, mask);
 
-    succeeds(predecessor[dstIndex], successor[dstIndex]);
-    if (srcIndex != dstIndex) {
-      succeeds(predecessor[srcIndex], dstIndex);
-      succeeds(dstIndex, successor[srcIndex]);
+    setSucceeds(getPredecessor(dstIndex), getSuccessor(dstIndex));
+    if (dstIndex < srcIndex) {
+      setSucceeds(getPredecessor(srcIndex), dstIndex);
+      setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    predecessor[srcIndex] = UNSET;
-    successor[srcIndex] = UNSET;
-  }
-
-  @Override
-  public void clear() {
-    super.clear();
-    firstEntry = ENDPOINT;
-    lastEntry = ENDPOINT;
-    Arrays.fill(predecessor, UNSET);
-    Arrays.fill(successor, UNSET);
+    predecessor[srcIndex] = 0;
+    successor[srcIndex] = 0;
   }
 
   @Override
   void resizeEntries(int newCapacity) {
     super.resizeEntries(newCapacity);
-    int oldCapacity = predecessor.length;
     predecessor = Arrays.copyOf(predecessor, newCapacity);
     successor = Arrays.copyOf(successor, newCapacity);
+  }
 
-    if (oldCapacity < newCapacity) {
-      Arrays.fill(predecessor, oldCapacity, newCapacity, UNSET);
-      Arrays.fill(successor, oldCapacity, newCapacity, UNSET);
-    }
+  @Override
+  int firstEntryIndex() {
+    return firstEntry;
+  }
+
+  @Override
+  int adjustAfterRemove(int indexBeforeRemove, int indexRemoved) {
+    return (indexBeforeRemove >= size()) ? indexRemoved : indexBeforeRemove;
   }
 
   @Override
@@ -199,17 +229,16 @@
   }
 
   @Override
-  int firstEntryIndex() {
-    return firstEntry;
-  }
-
-  @Override
-  int adjustAfterRemove(int indexBeforeRemove, int indexRemoved) {
-    return (indexBeforeRemove == size()) ? indexRemoved : indexBeforeRemove;
-  }
-
-  @Override
-  int getSuccessor(int entryIndex) {
-    return successor[entryIndex];
+  public void clear() {
+    if (needsAllocArrays()) {
+      return;
+    }
+    this.firstEntry = ENDPOINT;
+    this.lastEntry = ENDPOINT;
+    if (predecessor != null) {
+      Arrays.fill(predecessor, 0, size(), 0);
+      Arrays.fill(successor, 0, size(), 0);
+    }
+    super.clear();
   }
 }
diff --git a/android/guava/src/com/google/common/collect/Comparators.java b/android/guava/src/com/google/common/collect/Comparators.java
index 9facdf5..555e5b8 100644
--- a/android/guava/src/com/google/common/collect/Comparators.java
+++ b/android/guava/src/com/google/common/collect/Comparators.java
@@ -22,6 +22,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Provides static methods for working with {@link Comparator} instances. For many other helpful
@@ -103,4 +104,80 @@
     }
     return true;
   }
+
+  /**
+   * Returns the minimum of the two values. If the values compare as 0, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code minimum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if less than or equal to b.
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
+   * @since 30.0
+   */
+  @Beta
+  public static <T extends Comparable<? super T>> T min(T a, T b) {
+    return (a.compareTo(b) <= 0) ? a : b;
+  }
+
+  /**
+   * Returns the minimum of the two values, according to the given comparator. If the values compare
+   * as equal, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code minimum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if less than or equal to b
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i> using the given
+   *     comparator.
+   * @since 30.0
+   */
+  @Beta
+  public static <T> T min(@NullableDecl T a, @NullableDecl T b, Comparator<T> comparator) {
+    return (comparator.compare(a, b) <= 0) ? a : b;
+  }
+
+  /**
+   * Returns the maximum of the two values. If the values compare as 0, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code maximum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if greater than or equal to b.
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
+   * @since 30.0
+   */
+  @Beta
+  public static <T extends Comparable<? super T>> T max(T a, T b) {
+    return (a.compareTo(b) >= 0) ? a : b;
+  }
+
+  /**
+   * Returns the maximum of the two values, according to the given comparator. If the values compare
+   * as equal, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code maximum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if greater than or equal to b.
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i> using the given
+   *     comparator.
+   * @since 30.0
+   */
+  @Beta
+  public static <T> T max(@NullableDecl T a, @NullableDecl T b, Comparator<T> comparator) {
+    return (comparator.compare(a, b) >= 0) ? a : b;
+  }
 }
diff --git a/android/guava/src/com/google/common/collect/ComputationException.java b/android/guava/src/com/google/common/collect/ComputationException.java
index 29046f7..dc569da 100644
--- a/android/guava/src/com/google/common/collect/ComputationException.java
+++ b/android/guava/src/com/google/common/collect/ComputationException.java
@@ -24,7 +24,15 @@
  *
  * @author Bob Lee
  * @since 2.0
+ * @deprecated This exception is no longer thrown by {@code com.google.common}. Previously, it was
+ *     thrown by {@link MapMaker} computing maps. When support for computing maps was removed from
+ *     {@code MapMaker}, it was added to {@code CacheBuilder}, which throws {@code
+ *     ExecutionException}, {@code UncheckedExecutionException}, and {@code ExecutionError}. Any
+ *     code that is still catching {@code ComputationException} may need to be updated to catch some
+ *     of those types instead. (Note that this type, though deprecated, is not planned to be removed
+ *     from Guava.)
  */
+@Deprecated
 @GwtCompatible
 public class ComputationException extends RuntimeException {
   /** Creates a new instance with the given cause. */
diff --git a/android/guava/src/com/google/common/collect/DescendingMultiset.java b/android/guava/src/com/google/common/collect/DescendingMultiset.java
index 5b2fdc4..72a88af 100644
--- a/android/guava/src/com/google/common/collect/DescendingMultiset.java
+++ b/android/guava/src/com/google/common/collect/DescendingMultiset.java
@@ -22,7 +22,7 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A skeleton implementation of a descending multiset. Only needs {@code forwardMultiset()} and
@@ -34,7 +34,7 @@
 abstract class DescendingMultiset<E> extends ForwardingMultiset<E> implements SortedMultiset<E> {
   abstract SortedMultiset<E> forwardMultiset();
 
-  @MonotonicNonNullDecl private transient Comparator<? super E> comparator;
+  @NullableDecl private transient Comparator<? super E> comparator;
 
   @Override
   public Comparator<? super E> comparator() {
@@ -45,7 +45,7 @@
     return result;
   }
 
-  @MonotonicNonNullDecl private transient NavigableSet<E> elementSet;
+  @NullableDecl private transient NavigableSet<E> elementSet;
 
   @Override
   public NavigableSet<E> elementSet() {
@@ -106,7 +106,7 @@
 
   abstract Iterator<Entry<E>> entryIterator();
 
-  @MonotonicNonNullDecl private transient Set<Entry<E>> entrySet;
+  @NullableDecl private transient Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
diff --git a/android/guava/src/com/google/common/collect/EnumMultiset.java b/android/guava/src/com/google/common/collect/EnumMultiset.java
index 111de6e..af0deef 100644
--- a/android/guava/src/com/google/common/collect/EnumMultiset.java
+++ b/android/guava/src/com/google/common/collect/EnumMultiset.java
@@ -125,7 +125,7 @@
 
   @Override
   public int count(@NullableDecl Object element) {
-    if (element == null || !isActuallyE(element)) {
+    if (!isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
@@ -157,7 +157,7 @@
   @CanIgnoreReturnValue
   @Override
   public int remove(@NullableDecl Object element, int occurrences) {
-    if (element == null || !isActuallyE(element)) {
+    if (!isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
diff --git a/android/guava/src/com/google/common/collect/FluentIterable.java b/android/guava/src/com/google/common/collect/FluentIterable.java
index 94a7b91..66ae098 100644
--- a/android/guava/src/com/google/common/collect/FluentIterable.java
+++ b/android/guava/src/com/google/common/collect/FluentIterable.java
@@ -53,7 +53,7 @@
  * <p>Several lesser-used features are currently available only as static methods on the {@link
  * Iterables} class.
  *
- * <p><a name="streams"></a>
+ * <p><a id="streams"></a>
  *
  * <h3>Comparison to streams</h3>
  *
@@ -610,9 +610,8 @@
    * Returns an {@code ImmutableList} containing all of the elements from this fluent iterable in
    * proper sequence.
    *
-   * <p><b>{@code Stream} equivalent:</b> {@code ImmutableList.copyOf(stream.iterator())}, or after
-   * the next release of Guava, pass {@link ImmutableList#toImmutableList} to {@code
-   * stream.collect()}.
+   * <p><b>{@code Stream} equivalent:</b> {@code ImmutableList.copyOf(stream.iterator())}, or pass
+   * {@link ImmutableList#toImmutableList} to {@code stream.collect()}.
    *
    * @throws NullPointerException if any element is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableList()}).
@@ -627,9 +626,8 @@
    * ImmutableList} sorted by its natural ordering, use {@code toSortedList(Ordering.natural())}.
    *
    * <p><b>{@code Stream} equivalent:</b> {@code
-   * ImmutableList.copyOf(stream.sorted(comparator).iterator())}, or after the next release of
-   * Guava, pass {@link ImmutableList#toImmutableList} to {@code
-   * stream.sorted(comparator).collect()}.
+   * ImmutableList.copyOf(stream.sorted(comparator).iterator())}, or pass {@link
+   * ImmutableList#toImmutableList} to {@code stream.sorted(comparator).collect()}.
    *
    * @param comparator the function by which to sort list elements
    * @throws NullPointerException if any element of this iterable is {@code null}
@@ -643,9 +641,8 @@
    * Returns an {@code ImmutableSet} containing all of the elements from this fluent iterable with
    * duplicates removed.
    *
-   * <p><b>{@code Stream} equivalent:</b> {@code ImmutableSet.copyOf(stream.iterator())}, or after
-   * the next release of Guava, pass {@link ImmutableSet#toImmutableSet} to {@code
-   * stream.collect()}.
+   * <p><b>{@code Stream} equivalent:</b> {@code ImmutableSet.copyOf(stream.iterator())}, or pass
+   * {@link ImmutableSet#toImmutableSet} to {@code stream.collect()}.
    *
    * @throws NullPointerException if any element is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableSet()}).
@@ -661,8 +658,8 @@
    * by its natural ordering, use {@code toSortedSet(Ordering.natural())}.
    *
    * <p><b>{@code Stream} equivalent:</b> {@code ImmutableSortedSet.copyOf(comparator,
-   * stream.iterator())}, or after the next release of Guava, pass {@link
-   * ImmutableSortedSet#toImmutableSortedSet} to {@code stream.collect()}.
+   * stream.iterator())}, or pass {@link ImmutableSortedSet#toImmutableSortedSet} to {@code
+   * stream.collect()}.
    *
    * @param comparator the function by which to sort set elements
    * @throws NullPointerException if any element of this iterable is {@code null}
@@ -676,8 +673,7 @@
    * Returns an {@code ImmutableMultiset} containing all of the elements from this fluent iterable.
    *
    * <p><b>{@code Stream} equivalent:</b> {@code ImmutableMultiset.copyOf(stream.iterator())}, or
-   * after the next release of Guava, pass {@link ImmutableMultiset#toImmutableMultiset} to {@code
-   * stream.collect()}.
+   * pass {@link ImmutableMultiset#toImmutableMultiset} to {@code stream.collect()}.
    *
    * @throws NullPointerException if any element is null
    * @since 19.0
@@ -695,10 +691,9 @@
    * {@code valueFunction} will be applied to more than one instance of that key and, if it is,
    * which result will be mapped to that key in the returned map.
    *
-   * <p><b>{@code Stream} equivalent:</b> after the next release of Guava, use {@code
-   * stream.collect(ImmutableMap.toImmutableMap(k -> k, valueFunction))}. Before then you can use
-   * {@code ImmutableMap.copyOf(stream.collect(Collectors.toMap(k -> k, valueFunction)))}, but be
-   * aware that this may not preserve the order of entries.
+   * <p><b>{@code Stream} equivalent:</b> use {@code stream.collect(ImmutableMap.toImmutableMap(k ->
+   * k, valueFunction))}. {@code ImmutableMap.copyOf(stream.collect(Collectors.toMap(k -> k,
+   * valueFunction)))} behaves similarly, but may not preserve the order of entries.
    *
    * @throws NullPointerException if any element of this iterable is {@code null}, or if {@code
    *     valueFunction} produces {@code null} for any key
@@ -719,7 +714,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@code stream.collect(Collectors.groupingBy(keyFunction))}
    * behaves similarly, but returns a mutable {@code Map<K, List<E>>} instead, and may not preserve
-   * the order of entries).
+   * the order of entries.
    *
    * @param keyFunction the function used to produce the key for each value
    * @throws NullPointerException if any element of this iterable is {@code null}, or if {@code
@@ -748,10 +743,10 @@
    * <p>If your index may associate multiple values with each key, use {@link #index(Function)
    * index}.
    *
-   * <p><b>{@code Stream} equivalent:</b> after the next release of Guava, use {@code
-   * stream.collect(ImmutableMap.toImmutableMap(keyFunction, v -> v))}. Before then you can use
-   * {@code ImmutableMap.copyOf(stream.collect(Collectors.toMap(keyFunction, v -> v)))}, but be
-   * aware that this may not preserve the order of entries.
+   * <p><b>{@code Stream} equivalent:</b> use {@code
+   * stream.collect(ImmutableMap.toImmutableMap(keyFunction, v -> v))}. {@code
+   * ImmutableMap.copyOf(stream.collect(Collectors.toMap(keyFunction, v -> v)))}, but be aware that
+   * this may not preserve the order of entries.
    *
    * @param keyFunction the function used to produce the key for each value
    * @return a map mapping the result of evaluating the function {@code keyFunction} on each value
@@ -799,7 +794,7 @@
     checkNotNull(collection);
     Iterable<E> iterable = getDelegate();
     if (iterable instanceof Collection) {
-      collection.addAll(Collections2.cast(iterable));
+      collection.addAll((Collection<E>) iterable);
     } else {
       for (E item : iterable) {
         collection.add(item);
diff --git a/android/guava/src/com/google/common/collect/ForwardingMap.java b/android/guava/src/com/google/common/collect/ForwardingMap.java
index 761a541..4032bf9 100644
--- a/android/guava/src/com/google/common/collect/ForwardingMap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingMap.java
@@ -76,8 +76,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(Object object) {
-    return delegate().remove(object);
+  public V remove(Object key) {
+    return delegate().remove(key);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/GeneralRange.java b/android/guava/src/com/google/common/collect/GeneralRange.java
index fca07bc..6956187 100644
--- a/android/guava/src/com/google/common/collect/GeneralRange.java
+++ b/android/guava/src/com/google/common/collect/GeneralRange.java
@@ -23,7 +23,6 @@
 import com.google.common.base.Objects;
 import java.io.Serializable;
 import java.util.Comparator;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -245,7 +244,7 @@
         getUpperBoundType());
   }
 
-  @MonotonicNonNullDecl private transient GeneralRange<T> reverse;
+  @NullableDecl private transient GeneralRange<T> reverse;
 
   /** Returns the same range relative to the reversed comparator. */
   GeneralRange<T> reverse() {
diff --git a/android/guava/src/com/google/common/collect/HashBiMap.java b/android/guava/src/com/google/common/collect/HashBiMap.java
index 051b903..18951fe 100644
--- a/android/guava/src/com/google/common/collect/HashBiMap.java
+++ b/android/guava/src/com/google/common/collect/HashBiMap.java
@@ -20,6 +20,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Objects;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.IOException;
 import java.io.ObjectInputStream;
@@ -33,7 +34,6 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -232,6 +232,16 @@
     return findEntryByKey(key) != ABSENT;
   }
 
+  /**
+   * Returns {@code true} if this BiMap contains an entry whose value is equal to {@code value} (or,
+   * equivalently, if this inverse view contains a key that is equal to {@code value}).
+   *
+   * <p>Due to the property that values in a BiMap are unique, this will tend to execute in
+   * faster-than-linear time.
+   *
+   * @param value the object to search for in the values of this BiMap
+   * @return true if a mapping exists from a key to the specified value
+   */
   @Override
   public boolean containsValue(@NullableDecl Object value) {
     return findEntryByValue(value) != ABSENT;
@@ -889,7 +899,7 @@
     }
   }
 
-  @MonotonicNonNullDecl @RetainedWith private transient BiMap<V, K> inverse;
+  @LazyInit @RetainedWith @NullableDecl private transient BiMap<V, K> inverse;
 
   @Override
   public BiMap<V, K> inverse() {
diff --git a/android/guava/src/com/google/common/collect/HashMultimap.java b/android/guava/src/com/google/common/collect/HashMultimap.java
index 250f4f6..9297260 100644
--- a/android/guava/src/com/google/common/collect/HashMultimap.java
+++ b/android/guava/src/com/google/common/collect/HashMultimap.java
@@ -37,8 +37,9 @@
  * views are modifiable.
  *
  * <p>This class is not threadsafe when any concurrent operations update the multimap. Concurrent
- * read operations will work correctly. To allow concurrent update operations, wrap your multimap
- * with a call to {@link Multimaps#synchronizedSetMultimap}.
+ * read operations will work correctly if the last write <i>happens-before</i> any reads. To allow
+ * concurrent update operations, wrap your multimap with a call to {@link
+ * Multimaps#synchronizedSetMultimap}.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/android/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java b/android/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java
index 9c6b616..0922c38 100644
--- a/android/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java
+++ b/android/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java
@@ -24,7 +24,7 @@
  * A dummy superclass to support GWT serialization of the element types of a {@link HashMultimap}.
  * The GWT supersource for this class contains a field for each type.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/android/guava/src/com/google/common/collect/ImmutableBiMap.java b/android/guava/src/com/google/common/collect/ImmutableBiMap.java
index 738bda1..691ee4f 100644
--- a/android/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -351,15 +351,14 @@
    * <p>Since the bimap is immutable, ImmutableBiMap doesn't require special logic for keeping the
    * bimap and its inverse in sync during serialization, the way AbstractBiMap does.
    */
-  private static class SerializedForm extends ImmutableMap.SerializedForm {
-    SerializedForm(ImmutableBiMap<?, ?> bimap) {
+  private static class SerializedForm<K, V> extends ImmutableMap.SerializedForm<K, V> {
+    SerializedForm(ImmutableBiMap<K, V> bimap) {
       super(bimap);
     }
 
     @Override
-    Object readResolve() {
-      Builder<Object, Object> builder = new Builder<>();
-      return createMap(builder);
+    Builder<K, V> makeBuilder(int size) {
+      return new Builder<>(size);
     }
 
     private static final long serialVersionUID = 0;
@@ -367,6 +366,6 @@
 
   @Override
   Object writeReplace() {
-    return new SerializedForm(this);
+    return new SerializedForm<>(this);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java b/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
index 11d5b25..4836384 100644
--- a/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
@@ -151,8 +151,7 @@
       Map<? extends Class<? extends S>, ? extends S> map) {
     if (map instanceof ImmutableClassToInstanceMap) {
       @SuppressWarnings("unchecked") // covariant casts safe (unmodifiable)
-      // Eclipse won't compile if we cast to the parameterized type.
-      ImmutableClassToInstanceMap<B> cast = (ImmutableClassToInstanceMap) map;
+      ImmutableClassToInstanceMap<B> cast = (ImmutableClassToInstanceMap<B>) map;
       return cast;
     }
     return new Builder<B>().putAll(map).build();
diff --git a/android/guava/src/com/google/common/collect/ImmutableCollection.java b/android/guava/src/com/google/common/collect/ImmutableCollection.java
index 50194d0..31528d7 100644
--- a/android/guava/src/com/google/common/collect/ImmutableCollection.java
+++ b/android/guava/src/com/google/common/collect/ImmutableCollection.java
@@ -22,11 +22,13 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.AbstractCollection;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
@@ -156,6 +158,7 @@
  *
  * @since 2.0
  */
+@DoNotMock("Use ImmutableList.of or another implementation")
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
 // TODO(kevinb): I think we should push everything down to "BaseImmutableCollection" or something,
@@ -195,6 +198,7 @@
   }
 
   /** If this collection is backed by an array of its elements in insertion order, returns it. */
+  @NullableDecl
   Object[] internalArray() {
     return null;
   }
@@ -339,6 +343,7 @@
    *
    * @since 10.0
    */
+  @DoNotMock
   public abstract static class Builder<E> {
     static final int DEFAULT_INITIAL_CAPACITY = 4;
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableList.java b/android/guava/src/com/google/common/collect/ImmutableList.java
index c61531f..d86fe4f 100644
--- a/android/guava/src/com/google/common/collect/ImmutableList.java
+++ b/android/guava/src/com/google/common/collect/ImmutableList.java
@@ -69,7 +69,7 @@
 
   /**
    * Returns an immutable list containing a single element. This list behaves and performs
-   * comparably to {@link Collections#singleton}, but will not accept a null element. It is
+   * comparably to {@link Collections#singletonList}, but will not accept a null element. It is
    * preferable mainly for consistency and maintainability of your code.
    *
    * @throws NullPointerException if {@code element} is null
@@ -208,7 +208,7 @@
    * {@link Collection}, this method behaves exactly as {@link #copyOf(Collection)}; otherwise, it
    * behaves exactly as {@code copyOf(elements.iterator()}.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    */
   public static <E> ImmutableList<E> copyOf(Iterable<? extends E> elements) {
     checkNotNull(elements); // TODO(kevinb): is this here only for GWT?
@@ -232,7 +232,7 @@
    * <p>This method is safe to use even when {@code elements} is a synchronized or concurrent
    * collection that is currently being modified by another thread.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    */
   public static <E> ImmutableList<E> copyOf(Collection<? extends E> elements) {
     if (elements instanceof ImmutableCollection) {
@@ -246,7 +246,7 @@
   /**
    * Returns an immutable list containing the given elements, in order.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    */
   public static <E> ImmutableList<E> copyOf(Iterator<? extends E> elements) {
     // We special-case for 0 or 1 elements, but going further is madness.
@@ -264,7 +264,7 @@
   /**
    * Returns an immutable list containing the given elements, in order.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    * @since 3.0
    */
   public static <E> ImmutableList<E> copyOf(E[] elements) {
@@ -767,7 +767,7 @@
     /**
      * Adds each element of {@code elements} to the {@code ImmutableList}.
      *
-     * @param elements the {@code Iterable} to add to the {@code ImmutableList}
+     * @param elements the {@code Iterator} to add to the {@code ImmutableList}
      * @return this {@code Builder} object
      * @throws NullPointerException if {@code elements} is null or contains a null element
      */
diff --git a/android/guava/src/com/google/common/collect/ImmutableMap.java b/android/guava/src/com/google/common/collect/ImmutableMap.java
index 1f25b79..4464137 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMap.java
@@ -24,6 +24,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.WeakOuter;
@@ -37,7 +38,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.SortedMap;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -51,6 +51,7 @@
  * @author Kevin Bourrillion
  * @since 2.0
  */
+@DoNotMock("Use ImmutableMap.of or another implementation")
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
 public abstract class ImmutableMap<K, V> implements Map<K, V>, Serializable {
@@ -208,8 +209,9 @@
    *
    * @since 2.0
    */
+  @DoNotMock
   public static class Builder<K, V> {
-    @MonotonicNonNullDecl Comparator<? super V> valueComparator;
+    @NullableDecl Comparator<? super V> valueComparator;
     Object[] alternatingKeysAndValues;
     int size;
     boolean entriesUsed;
@@ -415,7 +417,6 @@
 
     @Override
     ImmutableSet<Entry<K, V>> createEntrySet() {
-      @WeakOuter
       class EntrySetImpl extends ImmutableMapEntrySet<K, V> {
         @Override
         ImmutableMap<K, V> map() {
@@ -524,7 +525,7 @@
     return (result != null) ? result : defaultValue;
   }
 
-  @LazyInit private transient ImmutableSet<Entry<K, V>> entrySet;
+  @LazyInit @RetainedWith private transient ImmutableSet<Entry<K, V>> entrySet;
 
   /**
    * Returns an immutable set of the mappings in this map. The iteration order is specified by the
@@ -705,37 +706,85 @@
    * reconstructed using public factory methods. This ensures that the implementation types remain
    * as implementation details.
    */
-  static class SerializedForm implements Serializable {
-    private final Object[] keys;
-    private final Object[] values;
+  static class SerializedForm<K, V> implements Serializable {
+    // This object retains references to collections returned by keySet() and value(). This saves
+    // bytes when the both the map and its keySet or value collection are written to the same
+    // instance of ObjectOutputStream.
 
-    SerializedForm(ImmutableMap<?, ?> map) {
-      keys = new Object[map.size()];
-      values = new Object[map.size()];
-      int i = 0;
-      for (Entry<?, ?> entry : map.entrySet()) {
-        keys[i] = entry.getKey();
-        values[i] = entry.getValue();
-        i++;
+    // TODO(b/160980469): remove support for the old serialization format after some time
+    private static final boolean USE_LEGACY_SERIALIZATION = true;
+
+    private final Object keys;
+    private final Object values;
+
+    SerializedForm(ImmutableMap<K, V> map) {
+      if (USE_LEGACY_SERIALIZATION) {
+        Object[] keys = new Object[map.size()];
+        Object[] values = new Object[map.size()];
+        int i = 0;
+        for (Entry<?, ?> entry : map.entrySet()) {
+          keys[i] = entry.getKey();
+          values[i] = entry.getValue();
+          i++;
+        }
+        this.keys = keys;
+        this.values = values;
+        return;
       }
+      this.keys = map.keySet();
+      this.values = map.values();
     }
 
-    Object readResolve() {
-      Builder<Object, Object> builder = new Builder<>(keys.length);
-      return createMap(builder);
+    @SuppressWarnings("unchecked")
+    final Object readResolve() {
+      if (!(this.keys instanceof ImmutableSet)) {
+        return legacyReadResolve();
+      }
+
+      ImmutableSet<K> keySet = (ImmutableSet<K>) this.keys;
+      ImmutableCollection<V> values = (ImmutableCollection<V>) this.values;
+
+      Builder<K, V> builder = makeBuilder(keySet.size());
+
+      UnmodifiableIterator<K> keyIter = keySet.iterator();
+      UnmodifiableIterator<V> valueIter = values.iterator();
+
+      while (keyIter.hasNext()) {
+        builder.put(keyIter.next(), valueIter.next());
+      }
+
+      return builder.build();
     }
 
-    Object createMap(Builder<Object, Object> builder) {
+    @SuppressWarnings("unchecked")
+    final Object legacyReadResolve() {
+      K[] keys = (K[]) this.keys;
+      V[] values = (V[]) this.values;
+
+      Builder<K, V> builder = makeBuilder(keys.length);
+
       for (int i = 0; i < keys.length; i++) {
         builder.put(keys[i], values[i]);
       }
       return builder.build();
     }
 
+    /**
+     * Returns a builder that builds the unserialized type. Subclasses should override this method.
+     */
+    Builder<K, V> makeBuilder(int size) {
+      return new Builder<>(size);
+    }
+
     private static final long serialVersionUID = 0;
   }
 
+  /**
+   * Returns a serializable form of this object. Non-public subclasses should not override this
+   * method. Publicly-accessible subclasses must override this method and should return a subclass
+   * of SerializedForm whose readResolve() method returns objects of the subclass type.
+   */
   Object writeReplace() {
-    return new SerializedForm(this);
+    return new SerializedForm<>(this);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java b/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
index 9a0fedd..72fc5cf 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
@@ -18,7 +18,6 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
-import com.google.j2objc.annotations.Weak;
 import java.io.Serializable;
 import java.util.Map.Entry;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
@@ -32,7 +31,7 @@
 @GwtCompatible(emulated = true)
 abstract class ImmutableMapEntrySet<K, V> extends ImmutableSet<Entry<K, V>> {
   static final class RegularEntrySet<K, V> extends ImmutableMapEntrySet<K, V> {
-    @Weak private final transient ImmutableMap<K, V> map;
+    private final transient ImmutableMap<K, V> map;
     private final transient ImmutableList<Entry<K, V>> entries;
 
     RegularEntrySet(ImmutableMap<K, V> map, Entry<K, V>[] entries) {
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultimap.java b/android/guava/src/com/google/common/collect/ImmutableMultimap.java
index 7ba3a9f..9234b1c 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultimap.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.DoNotMock;
 import com.google.j2objc.annotations.Weak;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
@@ -34,7 +35,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -49,7 +49,7 @@
  * <p><b>Note:</b> every {@link ImmutableMultimap} offers an {@link #inverse} view, so there is no
  * need for a distinct {@code ImmutableBiMultimap} type.
  *
- * <p><a name="iteration"></a>
+ * <p><a id="iteration"></a>
  *
  * <p><b>Key-grouped iteration.</b> All view collections follow the same iteration order. In all
  * current implementations, the iteration order always keeps multiple entries with the same key
@@ -136,10 +136,11 @@
    *
    * @since 2.0
    */
+  @DoNotMock
   public static class Builder<K, V> {
     Map<K, Collection<V>> builderMap;
-    @MonotonicNonNullDecl Comparator<? super K> keyComparator;
-    @MonotonicNonNullDecl Comparator<? super V> valueComparator;
+    @NullableDecl Comparator<? super K> keyComparator;
+    @NullableDecl Comparator<? super V> valueComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultiset.java b/android/guava/src/com/google/common/collect/ImmutableMultiset.java
index 66db58e..f559850 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultiset.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultiset.java
@@ -28,7 +28,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -187,7 +186,7 @@
     final Iterator<Entry<E>> entryIterator = entrySet().iterator();
     return new UnmodifiableIterator<E>() {
       int remaining;
-      @MonotonicNonNullDecl E element;
+      @NullableDecl E element;
 
       @Override
       public boolean hasNext() {
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java b/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
index 7aaab52..a8b1899 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
@@ -22,7 +22,7 @@
  * A dummy superclass to support GWT serialization of the element type of an {@link
  * ImmutableMultiset}. The GWT supersource for this class contains a field of type {@code E}.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/android/guava/src/com/google/common/collect/ImmutableRangeMap.java b/android/guava/src/com/google/common/collect/ImmutableRangeMap.java
index b6fb875..aa0495c 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.DoNotMock;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
@@ -82,6 +83,7 @@
    *
    * @since 14.0
    */
+  @DoNotMock
   public static final class Builder<K extends Comparable<?>, V> {
     private final List<Entry<Range<K>, V>> entries;
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableRangeSet.java b/android/guava/src/com/google/common/collect/ImmutableRangeSet.java
index c48677a..e512be7 100644
--- a/android/guava/src/com/google/common/collect/ImmutableRangeSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableRangeSet.java
@@ -34,7 +34,6 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -528,7 +527,7 @@
       this.domain = domain;
     }
 
-    @MonotonicNonNullDecl private transient Integer size;
+    @NullableDecl private transient Integer size;
 
     @Override
     public int size() {
diff --git a/android/guava/src/com/google/common/collect/ImmutableSet.java b/android/guava/src/com/google/common/collect/ImmutableSet.java
index 366223c..21d8144 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSet.java
@@ -467,8 +467,8 @@
      * @return this {@code Builder} object
      * @throws NullPointerException if {@code elements} is null or contains a null element
      */
-    @CanIgnoreReturnValue
     @Override
+    @CanIgnoreReturnValue
     public Builder<E> add(E... elements) {
       if (hashTable != null) {
         for (E e : elements) {
diff --git a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
index 9b2a579..622556c 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
@@ -35,7 +35,6 @@
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -357,8 +356,7 @@
     return MoreObjects.firstNonNull(set, emptySet);
   }
 
-  @LazyInit @MonotonicNonNullDecl @RetainedWith
-  private transient ImmutableSetMultimap<V, K> inverse;
+  @LazyInit @RetainedWith @NullableDecl private transient ImmutableSetMultimap<V, K> inverse;
 
   /**
    * {@inheritDoc}
@@ -409,7 +407,7 @@
     throw new UnsupportedOperationException();
   }
 
-  @MonotonicNonNullDecl private transient ImmutableSet<Entry<K, V>> entries;
+  @LazyInit @RetainedWith @NullableDecl private transient ImmutableSet<Entry<K, V>> entries;
 
   /**
    * Returns an immutable collection of all key-value pairs in the multimap. Its iterator traverses
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMap.java b/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
index 2d3e11a..a2f996c 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
@@ -24,7 +24,6 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import com.google.j2objc.annotations.WeakOuter;
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -582,7 +581,6 @@
 
   @Override
   ImmutableSet<Entry<K, V>> createEntrySet() {
-    @WeakOuter
     class EntrySet extends ImmutableMapEntrySet<K, V> {
       @Override
       public UnmodifiableIterator<Entry<K, V>> iterator() {
@@ -883,19 +881,17 @@
    * are reconstructed using public factory methods. This ensures that the implementation types
    * remain as implementation details.
    */
-  private static class SerializedForm extends ImmutableMap.SerializedForm {
-    private final Comparator<Object> comparator;
+  private static class SerializedForm<K, V> extends ImmutableMap.SerializedForm<K, V> {
+    private final Comparator<? super K> comparator;
 
-    @SuppressWarnings("unchecked")
-    SerializedForm(ImmutableSortedMap<?, ?> sortedMap) {
+    SerializedForm(ImmutableSortedMap<K, V> sortedMap) {
       super(sortedMap);
-      comparator = (Comparator<Object>) sortedMap.comparator();
+      comparator = sortedMap.comparator();
     }
 
     @Override
-    Object readResolve() {
-      Builder<Object, Object> builder = new Builder<>(comparator);
-      return createMap(builder);
+    Builder<K, V> makeBuilder(int size) {
+      return new Builder<>(comparator);
     }
 
     private static final long serialVersionUID = 0;
@@ -903,7 +899,7 @@
 
   @Override
   Object writeReplace() {
-    return new SerializedForm(this);
+    return new SerializedForm<>(this);
   }
 
   // This class is never actually serialized directly, but we have to make the
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedSet.java b/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
index d44de4d..485bfa5 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
@@ -543,7 +543,6 @@
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public ImmutableSortedSet<E> headSet(E toElement, boolean inclusive) {
     return headSetImpl(checkNotNull(toElement), inclusive);
@@ -593,7 +592,6 @@
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public ImmutableSortedSet<E> tailSet(E fromElement, boolean inclusive) {
     return tailSetImpl(checkNotNull(fromElement), inclusive);
@@ -618,14 +616,12 @@
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public E floor(E e) {
     return Iterators.getNext(headSet(e, true).descendingIterator(), null);
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public E ceiling(E e) {
     return Iterables.getFirst(tailSet(e, true), null);
diff --git a/android/guava/src/com/google/common/collect/ImmutableTable.java b/android/guava/src/com/google/common/collect/ImmutableTable.java
index 0e32ad8..a833423 100644
--- a/android/guava/src/com/google/common/collect/ImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/ImmutableTable.java
@@ -21,12 +21,12 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.MoreObjects;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+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.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -131,10 +131,11 @@
    *
    * @since 11.0
    */
+  @DoNotMock
   public static final class Builder<R, C, V> {
     private final List<Cell<R, C, V>> cells = Lists.newArrayList();
-    @MonotonicNonNullDecl private Comparator<? super R> rowComparator;
-    @MonotonicNonNullDecl private Comparator<? super C> columnComparator;
+    @NullableDecl private Comparator<? super R> rowComparator;
+    @NullableDecl private Comparator<? super C> columnComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
diff --git a/android/guava/src/com/google/common/collect/Interner.java b/android/guava/src/com/google/common/collect/Interner.java
index 0a06bfc..310bfca 100644
--- a/android/guava/src/com/google/common/collect/Interner.java
+++ b/android/guava/src/com/google/common/collect/Interner.java
@@ -19,15 +19,21 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
- * Provides equivalent behavior to {@link String#intern} for other immutable types. Common
- * implementations are available from the {@link Interners} class.
+ * Provides similar behavior to {@link String#intern} for any immutable type. Common implementations
+ * are available from the {@link Interners} class.
+ *
+ * <p>Note that {@code String.intern()} has some well-known performance limitations, and should
+ * generally be avoided. Prefer {@link Interners#newWeakInterner} or another {@code Interner}
+ * implementation even for {@code String} interning.
  *
  * @author Kevin Bourrillion
  * @since 3.0
  */
 @Beta
+@DoNotMock("Use Interners.new*Interner")
 @GwtIncompatible
 public interface Interner<E> {
   /**
diff --git a/android/guava/src/com/google/common/collect/Iterables.java b/android/guava/src/com/google/common/collect/Iterables.java
index 70b7516..08df7f2 100644
--- a/android/guava/src/com/google/common/collect/Iterables.java
+++ b/android/guava/src/com/google/common/collect/Iterables.java
@@ -352,7 +352,7 @@
   @CanIgnoreReturnValue
   public static <T> boolean addAll(Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
     if (elementsToAdd instanceof Collection) {
-      Collection<? extends T> c = Collections2.cast(elementsToAdd);
+      Collection<? extends T> c = (Collection<? extends T>) elementsToAdd;
       return addTo.addAll(c);
     }
     return Iterators.addAll(addTo, checkNotNull(elementsToAdd).iterator());
@@ -826,7 +826,7 @@
   @NullableDecl
   public static <T> T getLast(Iterable<? extends T> iterable, @NullableDecl T defaultValue) {
     if (iterable instanceof Collection) {
-      Collection<? extends T> c = Collections2.cast(iterable);
+      Collection<? extends T> c = (Collection<? extends T>) iterable;
       if (c.isEmpty()) {
         return defaultValue;
       } else if (iterable instanceof List) {
diff --git a/android/guava/src/com/google/common/collect/Iterators.java b/android/guava/src/com/google/common/collect/Iterators.java
index 839f1a3..ac36b20 100644
--- a/android/guava/src/com/google/common/collect/Iterators.java
+++ b/android/guava/src/com/google/common/collect/Iterators.java
@@ -1078,6 +1078,9 @@
    * <p>This method has no equivalent in {@link Iterables} because viewing an {@code Enumeration} as
    * an {@code Iterable} is impossible. However, the contents can be <i>copied</i> into a collection
    * using {@link Collections#list}.
+   *
+   * <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) {
     checkNotNull(enumeration);
diff --git a/android/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java b/android/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java
index d3c7898..bb4a2e4 100644
--- a/android/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java
+++ b/android/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java
@@ -24,7 +24,7 @@
  * A dummy superclass to support GWT serialization of the element types of a {@link
  * LinkedHashMultimap}. The GWT supersource for this class contains a field for each type.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/android/guava/src/com/google/common/collect/Lists.java b/android/guava/src/com/google/common/collect/Lists.java
index 98a9684..33f6533 100644
--- a/android/guava/src/com/google/common/collect/Lists.java
+++ b/android/guava/src/com/google/common/collect/Lists.java
@@ -125,7 +125,7 @@
     checkNotNull(elements); // for GWT
     // Let ArrayList's sizing logic work, if possible
     return (elements instanceof Collection)
-        ? new ArrayList<>(Collections2.cast(elements))
+        ? new ArrayList<>((Collection<? extends E>) elements)
         : newArrayList(elements.iterator());
   }
 
@@ -264,7 +264,9 @@
     // We copy elements to an ArrayList first, rather than incurring the
     // quadratic cost of adding them to the COWAL directly.
     Collection<? extends E> elementsCollection =
-        (elements instanceof Collection) ? Collections2.cast(elements) : newArrayList(elements);
+        (elements instanceof Collection)
+            ? (Collection<? extends E>) elements
+            : newArrayList(elements);
     return new CopyOnWriteArrayList<>(elementsCollection);
   }
 
diff --git a/android/guava/src/com/google/common/collect/MapDifference.java b/android/guava/src/com/google/common/collect/MapDifference.java
index eda9cc9..9933770 100644
--- a/android/guava/src/com/google/common/collect/MapDifference.java
+++ b/android/guava/src/com/google/common/collect/MapDifference.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -26,6 +27,7 @@
  * @author Kevin Bourrillion
  * @since 2.0
  */
+@DoNotMock("Use Maps.difference")
 @GwtCompatible
 public interface MapDifference<K, V> {
   /**
@@ -84,6 +86,7 @@
    *
    * @since 2.0
    */
+  @DoNotMock("Use Maps.difference")
   interface ValueDifference<V> {
     /** Returns the value from the left map (possibly null). */
     V leftValue();
diff --git a/android/guava/src/com/google/common/collect/MapMaker.java b/android/guava/src/com/google/common/collect/MapMaker.java
index 1c3a3fe..4f837a0 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.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A builder of {@link ConcurrentMap} instances that can have keys or values automatically wrapped
@@ -66,10 +66,10 @@
  * present in the map to be reclaimed by the garbage collector. Entries with reclaimed keys or
  * values may be removed from the map on each map modification or on occasional map accesses; such
  * entries may be counted by {@link Map#size}, but will never be visible to read or write
- * operations. A partially-reclaimed entry is never exposed to the user. Any {@link java.util.Entry}
+ * operations. A partially-reclaimed entry is never exposed to the user. Any {@link Map.Entry}
  * instance retrieved from the map's {@linkplain Map#entrySet entry set} is a snapshot of that
  * entry's state at the time of retrieval; such entries do, however, support {@link
- * java.util.Entry#setValue}, which simply calls {@link Map#put} on the entry's key.
+ * Map.Entry#setValue}, which simply calls {@link Map#put} on the entry's key.
  *
  * <p>The maps produced by {@code MapMaker} are serializable, and the deserialized maps retain all
  * the configuration properties of the original map. During deserialization, if the original map had
@@ -98,10 +98,10 @@
   int initialCapacity = UNSET_INT;
   int concurrencyLevel = UNSET_INT;
 
-  @MonotonicNonNullDecl Strength keyStrength;
-  @MonotonicNonNullDecl Strength valueStrength;
+  @NullableDecl Strength keyStrength;
+  @NullableDecl Strength valueStrength;
 
-  @MonotonicNonNullDecl Equivalence<Object> keyEquivalence;
+  @NullableDecl 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 d1dbf4a..b72d0ea 100644
--- a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
+++ b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
@@ -47,7 +47,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.concurrent.locks.ReentrantLock;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -64,7 +63,7 @@
  * @author Charles Fry
  * @author Doug Lea ({@code ConcurrentHashMap})
  */
-// TODO(kak/cpovirk): Consider removing @CanIgnoreReturnValue from this class.
+// TODO(kak): Consider removing @CanIgnoreReturnValue from this class.
 @GwtIncompatible
 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
 class MapMakerInternalMap<
@@ -1124,11 +1123,7 @@
     if (entry.getKey() == null) {
       return null;
     }
-    V value = entry.getValue();
-    if (value == null) {
-      return null;
-    }
-    return value;
+    return entry.getValue();
   }
 
   @SuppressWarnings("unchecked")
@@ -1198,7 +1193,7 @@
     int threshold;
 
     /** The per-segment table. */
-    @MonotonicNonNullDecl volatile AtomicReferenceArray<E> table;
+    @NullableDecl volatile AtomicReferenceArray<E> table;
 
     /** The maximum size of this map. MapMaker.UNSET_INT if there is no maximum. */
     final int maxSegmentSize;
@@ -2324,9 +2319,7 @@
         }
         sum -= segments[i].modCount;
       }
-      if (sum != 0L) {
-        return false;
-      }
+      return sum == 0L;
     }
     return true;
   }
@@ -2482,7 +2475,7 @@
     }
   }
 
-  @MonotonicNonNullDecl transient Set<K> keySet;
+  @NullableDecl transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -2490,7 +2483,7 @@
     return (ks != null) ? ks : (keySet = new KeySet());
   }
 
-  @MonotonicNonNullDecl transient Collection<V> values;
+  @NullableDecl transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -2498,7 +2491,7 @@
     return (vs != null) ? vs : (values = new Values());
   }
 
-  @MonotonicNonNullDecl transient Set<Entry<K, V>> entrySet;
+  @NullableDecl transient Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -2512,8 +2505,8 @@
 
     int nextSegmentIndex;
     int nextTableIndex;
-    @MonotonicNonNullDecl Segment<K, V, E, S> currentSegment;
-    @MonotonicNonNullDecl AtomicReferenceArray<E> currentTable;
+    @NullableDecl Segment<K, V, E, S> currentSegment;
+    @NullableDecl AtomicReferenceArray<E> currentTable;
     @NullableDecl E nextEntry;
     @NullableDecl WriteThroughEntry nextExternal;
     @NullableDecl WriteThroughEntry lastReturned;
diff --git a/android/guava/src/com/google/common/collect/Maps.java b/android/guava/src/com/google/common/collect/Maps.java
index 73b6357..f0bac2a 100644
--- a/android/guava/src/com/google/common/collect/Maps.java
+++ b/android/guava/src/com/google/common/collect/Maps.java
@@ -61,7 +61,6 @@
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -1468,8 +1467,8 @@
       implements BiMap<K, V>, Serializable {
     final Map<K, V> unmodifiableMap;
     final BiMap<? extends K, ? extends V> delegate;
-    @MonotonicNonNullDecl @RetainedWith BiMap<V, K> inverse;
-    @MonotonicNonNullDecl transient Set<V> values;
+    @RetainedWith @NullableDecl BiMap<V, K> inverse;
+    @NullableDecl transient Set<V> values;
 
     UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, @NullableDecl BiMap<V, K> inverse) {
       unmodifiableMap = Collections.unmodifiableMap(delegate);
@@ -3115,7 +3114,7 @@
     checkNotNull(map);
     if (map instanceof UnmodifiableNavigableMap) {
       @SuppressWarnings("unchecked") // covariant
-      NavigableMap<K, V> result = (NavigableMap) map;
+      NavigableMap<K, V> result = (NavigableMap<K, V>) map;
       return result;
     } else {
       return new UnmodifiableNavigableMap<>(map);
@@ -3207,7 +3206,7 @@
       throw new UnsupportedOperationException();
     }
 
-    @MonotonicNonNullDecl private transient UnmodifiableNavigableMap<K, V> descendingMap;
+    @NullableDecl private transient UnmodifiableNavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -3332,7 +3331,7 @@
      */
     abstract Set<Entry<K, V>> createEntrySet();
 
-    @MonotonicNonNullDecl private transient Set<Entry<K, V>> entrySet;
+    @NullableDecl private transient Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -3340,7 +3339,7 @@
       return (result == null) ? entrySet = createEntrySet() : result;
     }
 
-    @MonotonicNonNullDecl private transient Set<K> keySet;
+    @NullableDecl private transient Set<K> keySet;
 
     @Override
     public Set<K> keySet() {
@@ -3352,7 +3351,7 @@
       return new KeySet<>(this);
     }
 
-    @MonotonicNonNullDecl private transient Collection<V> values;
+    @NullableDecl private transient Collection<V> values;
 
     @Override
     public Collection<V> values() {
@@ -3849,7 +3848,7 @@
       return forward();
     }
 
-    @MonotonicNonNullDecl private transient Comparator<? super K> comparator;
+    @NullableDecl private transient Comparator<? super K> comparator;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -3945,7 +3944,7 @@
       return forward();
     }
 
-    @MonotonicNonNullDecl private transient Set<Entry<K, V>> entrySet;
+    @NullableDecl private transient Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -3976,7 +3975,7 @@
       return navigableKeySet();
     }
 
-    @MonotonicNonNullDecl private transient NavigableSet<K> navigableKeySet;
+    @NullableDecl private transient NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
diff --git a/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java b/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
index 9d4e65a..639775c 100644
--- a/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
+++ b/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
@@ -41,7 +41,6 @@
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -505,7 +504,7 @@
   @WeakOuter
   private class Heap {
     final Ordering<E> ordering;
-    @MonotonicNonNullDecl @Weak Heap otherHeap;
+    @Weak @NullableDecl Heap otherHeap;
 
     Heap(Ordering<E> ordering) {
       this.ordering = ordering;
@@ -752,8 +751,8 @@
     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.
-    @MonotonicNonNullDecl private Queue<E> forgetMeNot;
-    @MonotonicNonNullDecl private List<E> skipMe;
+    @NullableDecl private Queue<E> forgetMeNot;
+    @NullableDecl private List<E> skipMe;
     @NullableDecl private E lastFromForgetMeNot;
     private boolean canRemove;
 
diff --git a/android/guava/src/com/google/common/collect/Multimap.java b/android/guava/src/com/google/common/collect/Multimap.java
index c91922a..cdfa0f6 100644
--- a/android/guava/src/com/google/common/collect/Multimap.java
+++ b/android/guava/src/com/google/common/collect/Multimap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.CompatibleWith;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -155,6 +156,7 @@
  * @author Jared Levy
  * @since 2.0
  */
+@DoNotMock("Use ImmutableMultimap, HashMultimap, or another implementation")
 @GwtCompatible
 public interface Multimap<K, V> {
   // Query Operations
diff --git a/android/guava/src/com/google/common/collect/Multimaps.java b/android/guava/src/com/google/common/collect/Multimaps.java
index c0d921e..1f65d56 100644
--- a/android/guava/src/com/google/common/collect/Multimaps.java
+++ b/android/guava/src/com/google/common/collect/Multimaps.java
@@ -48,7 +48,6 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -540,11 +539,11 @@
   private static class UnmodifiableMultimap<K, V> extends ForwardingMultimap<K, V>
       implements Serializable {
     final Multimap<K, V> delegate;
-    @MonotonicNonNullDecl transient Collection<Entry<K, V>> entries;
-    @MonotonicNonNullDecl transient Multiset<K> keys;
-    @MonotonicNonNullDecl transient Set<K> keySet;
-    @MonotonicNonNullDecl transient Collection<V> values;
-    @MonotonicNonNullDecl transient Map<K, Collection<V>> map;
+    @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;
 
     UnmodifiableMultimap(final Multimap<K, V> delegate) {
       this.delegate = checkNotNull(delegate);
diff --git a/android/guava/src/com/google/common/collect/Multisets.java b/android/guava/src/com/google/common/collect/Multisets.java
index 5d275b4..0f31b74 100644
--- a/android/guava/src/com/google/common/collect/Multisets.java
+++ b/android/guava/src/com/google/common/collect/Multisets.java
@@ -38,7 +38,6 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -101,7 +100,7 @@
       return (Multiset<E>) delegate;
     }
 
-    @MonotonicNonNullDecl transient Set<E> elementSet;
+    @NullableDecl transient Set<E> elementSet;
 
     Set<E> createElementSet() {
       return Collections.<E>unmodifiableSet(delegate.elementSet());
@@ -113,7 +112,7 @@
       return (es == null) ? elementSet = createElementSet() : es;
     }
 
-    @MonotonicNonNullDecl transient Set<Multiset.Entry<E>> entrySet;
+    @NullableDecl transient Set<Multiset.Entry<E>> entrySet;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -1024,7 +1023,7 @@
         if (entryCount != 0) {
           // Safe as long as we never add a new entry, which we won't.
           @SuppressWarnings("unchecked")
-          Multiset<Object> multiset = (Multiset) multiset();
+          Multiset<Object> multiset = (Multiset<Object>) multiset();
           return multiset.setCount(element, entryCount, 0);
         }
       }
@@ -1045,7 +1044,7 @@
   static final class MultisetIteratorImpl<E> implements Iterator<E> {
     private final Multiset<E> multiset;
     private final Iterator<Entry<E>> entryIterator;
-    @MonotonicNonNullDecl private Entry<E> currentEntry;
+    @NullableDecl private Entry<E> currentEntry;
 
     /** Count of subsequent elements equal to current element */
     private int laterCount;
diff --git a/android/guava/src/com/google/common/collect/NaturalOrdering.java b/android/guava/src/com/google/common/collect/NaturalOrdering.java
index 177cd76..d979276 100644
--- a/android/guava/src/com/google/common/collect/NaturalOrdering.java
+++ b/android/guava/src/com/google/common/collect/NaturalOrdering.java
@@ -20,7 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /** An ordering that uses the natural order of the values. */
 @GwtCompatible(serializable = true)
@@ -28,8 +28,8 @@
 final class NaturalOrdering extends Ordering<Comparable> implements Serializable {
   static final NaturalOrdering INSTANCE = new NaturalOrdering();
 
-  @MonotonicNonNullDecl private transient Ordering<Comparable> nullsFirst;
-  @MonotonicNonNullDecl private transient Ordering<Comparable> nullsLast;
+  @NullableDecl private transient Ordering<Comparable> nullsFirst;
+  @NullableDecl private transient Ordering<Comparable> nullsLast;
 
   @Override
   public int compare(Comparable left, Comparable right) {
diff --git a/android/guava/src/com/google/common/collect/Ordering.java b/android/guava/src/com/google/common/collect/Ordering.java
index 9b42e75..187aacf 100644
--- a/android/guava/src/com/google/common/collect/Ordering.java
+++ b/android/guava/src/com/google/common/collect/Ordering.java
@@ -28,11 +28,14 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
@@ -534,9 +537,8 @@
    * least values, the first of those is returned. The iterator will be left exhausted: its {@code
    * hasNext()} method will return {@code false}.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).min(thisComparator).get()} instead (but note that it does
-   * not guarantee which tied minimum element is returned).
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).min(thisComparator).get()} instead
+   * (but note that it does not guarantee which tied minimum element is returned).
    *
    * @param iterator the iterator whose minimum element is to be determined
    * @throws NoSuchElementException if {@code iterator} is empty
@@ -560,8 +562,7 @@
    * least values, the first of those is returned.
    *
    * <p><b>Java 8 users:</b> If {@code iterable} is a {@link Collection}, use {@code
-   * Collections.min(collection, thisComparator)} instead. Otherwise, continue to use this method
-   * for now. After the next release of Guava, use {@code
+   * Collections.min(collection, thisComparator)} instead. Otherwise, use {@code
    * Streams.stream(iterable).min(thisComparator).get()} instead. Note that these alternatives do
    * not guarantee which tied minimum element is returned)
    *
@@ -581,8 +582,8 @@
    * <p><b>Implementation note:</b> this method is invoked by the default implementations of the
    * other {@code min} overloads, so overriding it will affect their behavior.
    *
-   * <p><b>Java 8 users:</b> Use {@code Collections.min(Arrays.asList(a, b), thisComparator)}
-   * instead (but note that it does not guarantee which tied minimum element is returned).
+   * <p><b>Note:</b> Consider using {@code Comparators.min(a, b, thisComparator)} instead. If {@code
+   * thisComparator} is {@link Ordering#natural}, then use {@code Comparators.min(a, b)}.
    *
    * @param a value to compare, returned if less than or equal to b.
    * @param b value to compare.
@@ -622,9 +623,8 @@
    * greatest values, the first of those is returned. The iterator will be left exhausted: its
    * {@code hasNext()} method will return {@code false}.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).max(thisComparator).get()} instead (but note that it does
-   * not guarantee which tied maximum element is returned).
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).max(thisComparator).get()} instead
+   * (but note that it does not guarantee which tied maximum element is returned).
    *
    * @param iterator the iterator whose maximum element is to be determined
    * @throws NoSuchElementException if {@code iterator} is empty
@@ -648,8 +648,7 @@
    * greatest values, the first of those is returned.
    *
    * <p><b>Java 8 users:</b> If {@code iterable} is a {@link Collection}, use {@code
-   * Collections.max(collection, thisComparator)} instead. Otherwise, continue to use this method
-   * for now. After the next release of Guava, use {@code
+   * Collections.max(collection, thisComparator)} instead. Otherwise, use {@code
    * Streams.stream(iterable).max(thisComparator).get()} instead. Note that these alternatives do
    * not guarantee which tied maximum element is returned)
    *
@@ -669,8 +668,8 @@
    * <p><b>Implementation note:</b> this method is invoked by the default implementations of the
    * other {@code max} overloads, so overriding it will affect their behavior.
    *
-   * <p><b>Java 8 users:</b> Use {@code Collections.max(Arrays.asList(a, b), thisComparator)}
-   * instead (but note that it does not guarantee which tied maximum element is returned).
+   * <p><b>Note:</b> Consider using {@code Comparators.max(a, b, thisComparator)} instead. If {@code
+   * thisComparator} is {@link Ordering#natural}, then use {@code Comparators.max(a, b)}.
    *
    * @param a value to compare, returned if greater than or equal to b.
    * @param b value to compare.
@@ -749,8 +748,8 @@
    * <p>The implementation does not necessarily use a <i>stable</i> sorting algorithm; when multiple
    * elements are equivalent, it is undefined which will come first.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).collect(Comparators.least(k, thisComparator))} instead.
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).collect(Comparators.least(k,
+   * thisComparator))} instead.
    *
    * @return an immutable {@code RandomAccess} list of the {@code k} least elements in ascending
    *     order
@@ -809,8 +808,8 @@
    * <p>The implementation does not necessarily use a <i>stable</i> sorting algorithm; when multiple
    * elements are equivalent, it is undefined which will come first.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).collect(Comparators.greatest(k, thisComparator))} instead.
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).collect(Comparators.greatest(k,
+   * thisComparator))} instead.
    *
    * @return an immutable {@code RandomAccess} list of the {@code k} greatest elements in
    *     <i>descending order</i>
diff --git a/android/guava/src/com/google/common/collect/PeekingIterator.java b/android/guava/src/com/google/common/collect/PeekingIterator.java
index bcb84a0..5a6c60b 100644
--- a/android/guava/src/com/google/common/collect/PeekingIterator.java
+++ b/android/guava/src/com/google/common/collect/PeekingIterator.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
@@ -31,6 +32,7 @@
  * @author Mick Killianey
  * @since 2.0
  */
+@DoNotMock("Use Iterators.peekingIterator")
 @GwtCompatible
 public interface PeekingIterator<E> extends Iterator<E> {
   /**
diff --git a/android/guava/src/com/google/common/collect/Platform.java b/android/guava/src/com/google/common/collect/Platform.java
index be59caf..e4d1c4c 100644
--- a/android/guava/src/com/google/common/collect/Platform.java
+++ b/android/guava/src/com/google/common/collect/Platform.java
@@ -109,5 +109,7 @@
     return exponent;
   }
 
+  static void checkGwtRpcEnabled() {}
+
   private Platform() {}
 }
diff --git a/android/guava/src/com/google/common/collect/Queues.java b/android/guava/src/com/google/common/collect/Queues.java
index 1059fe6..fdeb369 100644
--- a/android/guava/src/com/google/common/collect/Queues.java
+++ b/android/guava/src/com/google/common/collect/Queues.java
@@ -74,7 +74,7 @@
    */
   public static <E> ArrayDeque<E> newArrayDeque(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new ArrayDeque<E>(Collections2.cast(elements));
+      return new ArrayDeque<E>((Collection<? extends E>) elements);
     }
     ArrayDeque<E> deque = new ArrayDeque<E>();
     Iterables.addAll(deque, elements);
@@ -97,7 +97,7 @@
   public static <E> ConcurrentLinkedQueue<E> newConcurrentLinkedQueue(
       Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new ConcurrentLinkedQueue<E>(Collections2.cast(elements));
+      return new ConcurrentLinkedQueue<E>((Collection<? extends E>) elements);
     }
     ConcurrentLinkedQueue<E> queue = new ConcurrentLinkedQueue<E>();
     Iterables.addAll(queue, elements);
@@ -137,7 +137,7 @@
   @GwtIncompatible // LinkedBlockingDeque
   public static <E> LinkedBlockingDeque<E> newLinkedBlockingDeque(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new LinkedBlockingDeque<E>(Collections2.cast(elements));
+      return new LinkedBlockingDeque<E>((Collection<? extends E>) elements);
     }
     LinkedBlockingDeque<E> deque = new LinkedBlockingDeque<E>();
     Iterables.addAll(deque, elements);
@@ -173,7 +173,7 @@
   @GwtIncompatible // LinkedBlockingQueue
   public static <E> LinkedBlockingQueue<E> newLinkedBlockingQueue(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new LinkedBlockingQueue<E>(Collections2.cast(elements));
+      return new LinkedBlockingQueue<E>((Collection<? extends E>) elements);
     }
     LinkedBlockingQueue<E> queue = new LinkedBlockingQueue<E>();
     Iterables.addAll(queue, elements);
@@ -207,7 +207,7 @@
   public static <E extends Comparable> PriorityBlockingQueue<E> newPriorityBlockingQueue(
       Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new PriorityBlockingQueue<E>(Collections2.cast(elements));
+      return new PriorityBlockingQueue<E>((Collection<? extends E>) elements);
     }
     PriorityBlockingQueue<E> queue = new PriorityBlockingQueue<E>();
     Iterables.addAll(queue, elements);
@@ -237,7 +237,7 @@
   public static <E extends Comparable> PriorityQueue<E> newPriorityQueue(
       Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new PriorityQueue<E>(Collections2.cast(elements));
+      return new PriorityQueue<E>((Collection<? extends E>) elements);
     }
     PriorityQueue<E> queue = new PriorityQueue<E>();
     Iterables.addAll(queue, elements);
diff --git a/android/guava/src/com/google/common/collect/Range.java b/android/guava/src/com/google/common/collect/Range.java
index 2f7e88d..5300b77 100644
--- a/android/guava/src/com/google/common/collect/Range.java
+++ b/android/guava/src/com/google/common/collect/Range.java
@@ -91,6 +91,7 @@
  * <h3>Other notes</h3>
  *
  * <ul>
+ *   <li>All ranges are shallow-immutable.
  *   <li>Instances of this type are obtained using the static factory methods in this class.
  *   <li>Ranges are <i>convex</i>: whenever two values are contained, all values in between them
  *       must also be contained. More formally, for any {@code c1 <= c2 <= c3} of type {@code C},
@@ -576,6 +577,22 @@
    * @since 27.0
    */
   public Range<C> gap(Range<C> otherRange) {
+    /*
+     * For an explanation of the basic principle behind this check, see
+     * https://stackoverflow.com/a/35754308/28465
+     *
+     * In that explanation's notation, our `overlap` check would be `x1 < y2 && y1 < x2`. We've
+     * flipped one part of the check so that we're using "less than" in both cases (rather than a
+     * mix of "less than" and "greater than"). We've also switched to "strictly less than" rather
+     * than "less than or equal to" because of *handwave* the difference between "endpoints of
+     * inclusive ranges" and "Cuts."
+     */
+    if (lowerBound.compareTo(otherRange.upperBound) < 0
+        && otherRange.lowerBound.compareTo(upperBound) < 0) {
+      throw new IllegalArgumentException(
+          "Ranges have a nonempty intersection: " + this + ", " + otherRange);
+    }
+
     boolean isThisFirst = this.lowerBound.compareTo(otherRange.lowerBound) < 0;
     Range<C> firstRange = isThisFirst ? this : otherRange;
     Range<C> secondRange = isThisFirst ? otherRange : this;
diff --git a/android/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java b/android/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java
index 21bf769..222c128 100644
--- a/android/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java
+++ b/android/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java
@@ -23,7 +23,7 @@
  * A dummy superclass to support GWT serialization of the element type of a {@link Range}. The GWT
  * supersource for this class contains a field of type {@code C}.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/android/guava/src/com/google/common/collect/RangeMap.java b/android/guava/src/com/google/common/collect/RangeMap.java
index d1e5c31..e6c902e 100644
--- a/android/guava/src/com/google/common/collect/RangeMap.java
+++ b/android/guava/src/com/google/common/collect/RangeMap.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -35,6 +36,7 @@
  * @since 14.0
  */
 @Beta
+@DoNotMock("Use ImmutableRangeMap or TreeRangeMap")
 @GwtIncompatible
 public interface RangeMap<K extends Comparable, V> {
   /**
diff --git a/android/guava/src/com/google/common/collect/RangeSet.java b/android/guava/src/com/google/common/collect/RangeSet.java
index 19076a9..06c149c 100644
--- a/android/guava/src/com/google/common/collect/RangeSet.java
+++ b/android/guava/src/com/google/common/collect/RangeSet.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.Beta;
 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.compatqual.NullableDecl;
@@ -49,6 +50,7 @@
  * @since 14.0
  */
 @Beta
+@DoNotMock("Use ImmutableRangeSet or TreeRangeSet")
 @GwtIncompatible
 public interface RangeSet<C extends Comparable> {
 
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java b/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
index 2e058b0..2bdaf8b 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
@@ -30,7 +30,7 @@
 final class RegularImmutableBiMap<K, V> extends ImmutableBiMap<K, V> {
   static final RegularImmutableBiMap<Object, Object> EMPTY = new RegularImmutableBiMap<>();
 
-  private final transient int[] keyHashTable;
+  private final transient Object keyHashTable;
   @VisibleForTesting final transient Object[] alternatingKeysAndValues;
   private final transient int keyOffset; // 0 for K-to-V, 1 for V-to-K
   private final transient int size;
@@ -54,7 +54,7 @@
     int tableSize = (size >= 2) ? ImmutableSet.chooseTableSize(size) : 0;
     this.keyHashTable =
         RegularImmutableMap.createHashTable(alternatingKeysAndValues, size, tableSize, 0);
-    int[] valueHashTable =
+    Object valueHashTable =
         RegularImmutableMap.createHashTable(alternatingKeysAndValues, size, tableSize, 1);
     this.inverse =
         new RegularImmutableBiMap<V, K>(valueHashTable, alternatingKeysAndValues, size, this);
@@ -62,7 +62,7 @@
 
   /** V-to-K constructor. */
   private RegularImmutableBiMap(
-      int[] valueHashTable,
+      Object valueHashTable,
       Object[] alternatingKeysAndValues,
       int size,
       RegularImmutableBiMap<V, K> inverse) {
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableMap.java b/android/guava/src/com/google/common/collect/RegularImmutableMap.java
index 5613c30..4e1681e 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableMap.java
@@ -34,7 +34,14 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 final class RegularImmutableMap<K, V> extends ImmutableMap<K, V> {
-  private static final int ABSENT = -1;
+  private static final byte ABSENT = -1;
+
+  // Max size is halved due to indexing into double-sized alternatingKeysAndValues
+  private static final int BYTE_MAX_SIZE = 1 << (Byte.SIZE - 1); // 2^7 = 128
+  private static final int SHORT_MAX_SIZE = 1 << (Short.SIZE - 1); // 2^15 = 32_768
+
+  private static final int BYTE_MASK = (1 << Byte.SIZE) - 1; // 2^8 - 1 = 255
+  private static final int SHORT_MASK = (1 << Short.SIZE) - 1; // 2^16 - 1 = 65_535
 
   @SuppressWarnings("unchecked")
   static final ImmutableMap<Object, Object> EMPTY =
@@ -51,13 +58,13 @@
    * double the index of the entry in entrySet.asList.)
    *
    * The basic data structure is described in https://en.wikipedia.org/wiki/Open_addressing.
-   * The pointer to a key is stored in hashTable[Hashing.smear(key.hashCode())] % table.length,
+   * The pointer to a key is stored in hashTable[Hashing.smear(key.hashCode()) % table.length],
    * save that if that location is already full, we try the next index, and the next, until we
    * find an empty table position.  Since the table has a power-of-two size, we use
    * & (table.length - 1) instead of % table.length, though.
    */
 
-  private final transient int[] hashTable;
+  private final transient Object hashTable;
   @VisibleForTesting final transient Object[] alternatingKeysAndValues;
   private final transient int size;
 
@@ -71,7 +78,7 @@
     }
     checkPositionIndex(n, alternatingKeysAndValues.length >> 1);
     int tableSize = ImmutableSet.chooseTableSize(n);
-    int[] hashTable = createHashTable(alternatingKeysAndValues, n, tableSize, 0);
+    Object hashTable = createHashTable(alternatingKeysAndValues, n, tableSize, 0);
     return new RegularImmutableMap<K, V>(hashTable, alternatingKeysAndValues, n);
   }
 
@@ -79,7 +86,7 @@
    * Returns a hash table for the specified keys and values, and ensures that neither keys nor
    * values are null.
    */
-  static int[] createHashTable(
+  static Object createHashTable(
       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!
@@ -88,35 +95,101 @@
       return null;
     }
     int mask = tableSize - 1;
-    int[] hashTable = new int[tableSize];
-    Arrays.fill(hashTable, ABSENT);
-    for (int i = 0; i < n; i++) {
-      Object key = alternatingKeysAndValues[2 * i + keyOffset];
-      Object value = alternatingKeysAndValues[2 * i + (keyOffset ^ 1)];
-      checkEntryNotNull(key, value);
-      for (int h = Hashing.smear(key.hashCode()); ; h++) {
-        h &= mask;
-        int previous = hashTable[h];
-        if (previous == ABSENT) {
-          hashTable[h] = 2 * i + keyOffset;
-          break;
-        } else if (alternatingKeysAndValues[previous].equals(key)) {
-          throw new IllegalArgumentException(
-              "Multiple entries with same key: "
-                  + key
-                  + "="
-                  + value
-                  + " and "
-                  + alternatingKeysAndValues[previous]
-                  + "="
-                  + alternatingKeysAndValues[previous ^ 1]);
+    if (tableSize <= BYTE_MAX_SIZE) {
+      /*
+       * Use 8 bits per entry. The value is unsigned to allow use up to a size of 2^8.
+       *
+       * The absent indicator of -1 signed becomes 2^8 - 1 unsigned, which reduces the actual max
+       * size to 2^8 - 1. However, due to a load factor < 1 the limit is never approached.
+       */
+      byte[] hashTable = new byte[tableSize];
+      Arrays.fill(hashTable, ABSENT);
+
+      for (int i = 0; i < n; i++) {
+        int keyIndex = 2 * i + keyOffset;
+        Object key = alternatingKeysAndValues[keyIndex];
+        Object value = alternatingKeysAndValues[keyIndex ^ 1];
+        checkEntryNotNull(key, value);
+        for (int h = Hashing.smear(key.hashCode()); ; h++) {
+          h &= mask;
+          int previousKeyIndex = hashTable[h] & BYTE_MASK; // unsigned read
+          if (previousKeyIndex == BYTE_MASK) { // -1 signed becomes 255 unsigned
+            hashTable[h] = (byte) keyIndex;
+            break;
+          } else if (alternatingKeysAndValues[previousKeyIndex].equals(key)) {
+            throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
+          }
         }
       }
+      return hashTable;
+    } else if (tableSize <= SHORT_MAX_SIZE) {
+      /*
+       * Use 16 bits per entry. The value is unsigned to allow use up to a size of 2^16.
+       *
+       * The absent indicator of -1 signed becomes 2^16 - 1 unsigned, which reduces the actual max
+       * size to 2^16 - 1. However, due to a load factor < 1 the limit is never approached.
+       */
+      short[] hashTable = new short[tableSize];
+      Arrays.fill(hashTable, ABSENT);
+
+      for (int i = 0; i < n; i++) {
+        int keyIndex = 2 * i + keyOffset;
+        Object key = alternatingKeysAndValues[keyIndex];
+        Object value = alternatingKeysAndValues[keyIndex ^ 1];
+        checkEntryNotNull(key, value);
+        for (int h = Hashing.smear(key.hashCode()); ; h++) {
+          h &= mask;
+          int previousKeyIndex = hashTable[h] & SHORT_MASK; // unsigned read
+          if (previousKeyIndex == SHORT_MASK) { // -1 signed becomes 65_535 unsigned
+            hashTable[h] = (short) keyIndex;
+            break;
+          } else if (alternatingKeysAndValues[previousKeyIndex].equals(key)) {
+            throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
+          }
+        }
+      }
+      return hashTable;
+    } else {
+      /*
+       * Use 32 bits per entry.
+       */
+      int[] hashTable = new int[tableSize];
+      Arrays.fill(hashTable, ABSENT);
+
+      for (int i = 0; i < n; i++) {
+        int keyIndex = 2 * i + keyOffset;
+        Object key = alternatingKeysAndValues[keyIndex];
+        Object value = alternatingKeysAndValues[keyIndex ^ 1];
+        checkEntryNotNull(key, value);
+        for (int h = Hashing.smear(key.hashCode()); ; h++) {
+          h &= mask;
+          int previousKeyIndex = hashTable[h];
+          if (previousKeyIndex == ABSENT) {
+            hashTable[h] = keyIndex;
+            break;
+          } else if (alternatingKeysAndValues[previousKeyIndex].equals(key)) {
+            throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
+          }
+        }
+      }
+      return hashTable;
     }
-    return hashTable;
   }
 
-  private RegularImmutableMap(int[] hashTable, Object[] alternatingKeysAndValues, int size) {
+  private static IllegalArgumentException duplicateKeyException(
+      Object key, Object value, Object[] alternatingKeysAndValues, int previousKeyIndex) {
+    return new IllegalArgumentException(
+        "Multiple entries with same key: "
+            + key
+            + "="
+            + value
+            + " and "
+            + alternatingKeysAndValues[previousKeyIndex]
+            + "="
+            + alternatingKeysAndValues[previousKeyIndex ^ 1]);
+  }
+
+  private RegularImmutableMap(Object hashTable, Object[] alternatingKeysAndValues, int size) {
     this.hashTable = hashTable;
     this.alternatingKeysAndValues = alternatingKeysAndValues;
     this.size = size;
@@ -135,7 +208,7 @@
   }
 
   static Object get(
-      @NullableDecl int[] hashTable,
+      @NullableDecl Object hashTableObject,
       @NullableDecl Object[] alternatingKeysAndValues,
       int size,
       int keyOffset,
@@ -146,17 +219,44 @@
       return alternatingKeysAndValues[keyOffset].equals(key)
           ? alternatingKeysAndValues[keyOffset ^ 1]
           : null;
-    } else if (hashTable == null) {
+    } else if (hashTableObject == null) {
       return null;
     }
-    int mask = hashTable.length - 1;
-    for (int h = Hashing.smear(key.hashCode()); ; h++) {
-      h &= mask;
-      int index = hashTable[h];
-      if (index == ABSENT) {
-        return null;
-      } else if (alternatingKeysAndValues[index].equals(key)) {
-        return alternatingKeysAndValues[index ^ 1];
+    if (hashTableObject instanceof byte[]) {
+      byte[] hashTable = (byte[]) hashTableObject;
+      int mask = hashTable.length - 1;
+      for (int h = Hashing.smear(key.hashCode()); ; h++) {
+        h &= mask;
+        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)) {
+          return alternatingKeysAndValues[keyIndex ^ 1];
+        }
+      }
+    } else if (hashTableObject instanceof short[]) {
+      short[] hashTable = (short[]) hashTableObject;
+      int mask = hashTable.length - 1;
+      for (int h = Hashing.smear(key.hashCode()); ; h++) {
+        h &= mask;
+        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)) {
+          return alternatingKeysAndValues[keyIndex ^ 1];
+        }
+      }
+    } else {
+      int[] hashTable = (int[]) hashTableObject;
+      int mask = hashTable.length - 1;
+      for (int h = Hashing.smear(key.hashCode()); ; h++) {
+        h &= mask;
+        int keyIndex = hashTable[h];
+        if (keyIndex == ABSENT) {
+          return null;
+        } else if (alternatingKeysAndValues[keyIndex].equals(key)) {
+          return alternatingKeysAndValues[keyIndex ^ 1];
+        }
       }
     }
   }
diff --git a/android/guava/src/com/google/common/collect/Sets.java b/android/guava/src/com/google/common/collect/Sets.java
index 5e23b35..3fe27ba 100644
--- a/android/guava/src/com/google/common/collect/Sets.java
+++ b/android/guava/src/com/google/common/collect/Sets.java
@@ -48,7 +48,6 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -204,7 +203,7 @@
    */
   public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
     return (elements instanceof Collection)
-        ? new HashSet<E>(Collections2.cast(elements))
+        ? new HashSet<E>((Collection<? extends E>) elements)
         : newHashSet(elements.iterator());
   }
 
@@ -309,7 +308,7 @@
    */
   public static <E> LinkedHashSet<E> newLinkedHashSet(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new LinkedHashSet<E>(Collections2.cast(elements));
+      return new LinkedHashSet<E>((Collection<? extends E>) elements);
     }
     LinkedHashSet<E> set = newLinkedHashSet();
     Iterables.addAll(set, elements);
@@ -437,7 +436,7 @@
     // quadratic cost of adding them to the COWAS directly.
     Collection<? extends E> elementsCollection =
         (elements instanceof Collection)
-            ? Collections2.cast(elements)
+            ? (Collection<? extends E>) elements
             : Lists.newArrayList(elements);
     return new CopyOnWriteArraySet<E>(elementsCollection);
   }
@@ -1228,6 +1227,7 @@
    * @return the Cartesian product, as an immutable set containing immutable lists
    * @throws NullPointerException if {@code sets}, any one of the {@code sets}, or any element of a
    *     provided set is null
+   * @throws IllegalArgumentException if the cartesian product size exceeds the {@code int} range
    * @since 2.0
    */
   public static <B> Set<List<B>> cartesianProduct(List<? extends Set<? extends B>> sets) {
@@ -1284,6 +1284,7 @@
    * @return the Cartesian product, as an immutable set containing immutable lists
    * @throws NullPointerException if {@code sets}, any one of the {@code sets}, or any element of a
    *     provided set is null
+   * @throws IllegalArgumentException if the cartesian product size exceeds the {@code int} range
    * @since 2.0
    */
   @SafeVarargs
@@ -1337,6 +1338,25 @@
     }
 
     @Override
+    public boolean contains(@NullableDecl Object object) {
+      if (!(object instanceof List)) {
+        return false;
+      }
+      List<?> list = (List<?>) object;
+      if (list.size() != axes.size()) {
+        return false;
+      }
+      int i = 0;
+      for (Object o : list) {
+        if (!axes.get(i).contains(o)) {
+          return false;
+        }
+        i++;
+      }
+      return true;
+    }
+
+    @Override
     public boolean equals(@NullableDecl 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
@@ -1485,7 +1505,7 @@
     public boolean equals(@NullableDecl Object obj) {
       if (obj instanceof PowerSet) {
         PowerSet<?> that = (PowerSet<?>) obj;
-        return inputSet.equals(that.inputSet);
+        return inputSet.keySet().equals(that.inputSet.keySet());
       }
       return super.equals(obj);
     }
@@ -1722,7 +1742,7 @@
       throw new UnsupportedOperationException();
     }
 
-    @MonotonicNonNullDecl private transient UnmodifiableNavigableSet<E> descendingSet;
+    @NullableDecl private transient UnmodifiableNavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
diff --git a/android/guava/src/com/google/common/collect/SortedMultiset.java b/android/guava/src/com/google/common/collect/SortedMultiset.java
index 849ea50..2635b37 100644
--- a/android/guava/src/com/google/common/collect/SortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/SortedMultiset.java
@@ -32,7 +32,7 @@
  *
  * <p><b>Warning:</b> The comparison must be <i>consistent with equals</i> as explained by the
  * {@link Comparable} class specification. Otherwise, the resulting multiset will violate the {@link
- * Collection} contract, which it is specified in terms of {@link Object#equals}.
+ * Collection} contract, which is specified in terms of {@link Object#equals}.
  *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
diff --git a/android/guava/src/com/google/common/collect/SortedSetMultimap.java b/android/guava/src/com/google/common/collect/SortedSetMultimap.java
index ae7dd76..33be3d0 100644
--- a/android/guava/src/com/google/common/collect/SortedSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/SortedSetMultimap.java
@@ -22,6 +22,7 @@
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 import java.util.SortedSet;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -95,7 +96,11 @@
    *
    * <p><b>Note:</b> The returned map's values are guaranteed to be of type {@link SortedSet}. To
    * obtain this map with the more specific generic type {@code Map<K, SortedSet<V>>}, call {@link
-   * Multimaps#asMap(SortedSetMultimap)} instead.
+   * Multimaps#asMap(SortedSetMultimap)} instead. <b>However</b>, the returned map <i>itself</i> is
+   * not necessarily a {@link SortedMap}: A {@code SortedSetMultimap} must expose the <i>values</i>
+   * for a given key in sorted order, but it need not expose the <i>keys</i> in sorted order.
+   * Individual {@code SortedSetMultimap} implementations, like those built with {@link
+   * MultimapBuilder#treeKeys()}, may make additional guarantees.
    */
   @Override
   Map<K, Collection<V>> asMap();
diff --git a/android/guava/src/com/google/common/collect/StandardTable.java b/android/guava/src/com/google/common/collect/StandardTable.java
index 4ec3a58..efed27a 100644
--- a/android/guava/src/com/google/common/collect/StandardTable.java
+++ b/android/guava/src/com/google/common/collect/StandardTable.java
@@ -40,7 +40,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -594,7 +593,7 @@
     return rowMap().keySet();
   }
 
-  @MonotonicNonNullDecl private transient Set<C> columnKeySet;
+  @NullableDecl private transient Set<C> columnKeySet;
 
   /**
    * {@inheritDoc}
@@ -724,7 +723,7 @@
     return super.values();
   }
 
-  @MonotonicNonNullDecl private transient Map<R, Map<C, V>> rowMap;
+  @NullableDecl private transient Map<R, Map<C, V>> rowMap;
 
   @Override
   public Map<R, Map<C, V>> rowMap() {
@@ -803,7 +802,7 @@
     }
   }
 
-  @MonotonicNonNullDecl private transient ColumnMap columnMap;
+  @NullableDecl private transient ColumnMap columnMap;
 
   @Override
   public Map<C, Map<R, V>> columnMap() {
diff --git a/android/guava/src/com/google/common/collect/Synchronized.java b/android/guava/src/com/google/common/collect/Synchronized.java
index 1fc870a..c4cdb17 100644
--- a/android/guava/src/com/google/common/collect/Synchronized.java
+++ b/android/guava/src/com/google/common/collect/Synchronized.java
@@ -40,7 +40,6 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -421,8 +420,8 @@
 
   private static class SynchronizedMultiset<E> extends SynchronizedCollection<E>
       implements Multiset<E> {
-    @MonotonicNonNullDecl transient Set<E> elementSet;
-    @MonotonicNonNullDecl transient Set<Entry<E>> entrySet;
+    @NullableDecl transient Set<E> elementSet;
+    @NullableDecl transient Set<Entry<E>> entrySet;
 
     SynchronizedMultiset(Multiset<E> delegate, @NullableDecl Object mutex) {
       super(delegate, mutex);
@@ -517,11 +516,11 @@
 
   private static class SynchronizedMultimap<K, V> extends SynchronizedObject
       implements Multimap<K, V> {
-    @MonotonicNonNullDecl transient Set<K> keySet;
-    @MonotonicNonNullDecl transient Collection<V> valuesCollection;
-    @MonotonicNonNullDecl transient Collection<Entry<K, V>> entries;
-    @MonotonicNonNullDecl transient Map<K, Collection<V>> asMap;
-    @MonotonicNonNullDecl transient Multiset<K> keys;
+    @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;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -747,7 +746,7 @@
 
   private static class SynchronizedSetMultimap<K, V> extends SynchronizedMultimap<K, V>
       implements SetMultimap<K, V> {
-    @MonotonicNonNullDecl transient Set<Entry<K, V>> entrySet;
+    @NullableDecl transient Set<Entry<K, V>> entrySet;
 
     SynchronizedSetMultimap(SetMultimap<K, V> delegate, @NullableDecl Object mutex) {
       super(delegate, mutex);
@@ -962,9 +961,9 @@
   }
 
   private static class SynchronizedMap<K, V> extends SynchronizedObject implements Map<K, V> {
-    @MonotonicNonNullDecl transient Set<K> keySet;
-    @MonotonicNonNullDecl transient Collection<V> values;
-    @MonotonicNonNullDecl transient Set<Entry<K, V>> entrySet;
+    @NullableDecl transient Set<K> keySet;
+    @NullableDecl transient Collection<V> values;
+    @NullableDecl transient Set<Entry<K, V>> entrySet;
 
     SynchronizedMap(Map<K, V> delegate, @NullableDecl Object mutex) {
       super(delegate, mutex);
@@ -1160,8 +1159,8 @@
   @VisibleForTesting
   static class SynchronizedBiMap<K, V> extends SynchronizedMap<K, V>
       implements BiMap<K, V>, Serializable {
-    @MonotonicNonNullDecl private transient Set<V> valueSet;
-    @MonotonicNonNullDecl @RetainedWith private transient BiMap<V, K> inverse;
+    @NullableDecl private transient Set<V> valueSet;
+    @RetainedWith @NullableDecl private transient BiMap<V, K> inverse;
 
     private SynchronizedBiMap(
         BiMap<K, V> delegate, @NullableDecl Object mutex, @NullableDecl BiMap<V, K> inverse) {
@@ -1205,8 +1204,8 @@
   }
 
   private static class SynchronizedAsMap<K, V> extends SynchronizedMap<K, Collection<V>> {
-    @MonotonicNonNullDecl transient Set<Entry<K, Collection<V>>> asMapEntrySet;
-    @MonotonicNonNullDecl transient Collection<Collection<V>> asMapValues;
+    @NullableDecl transient Set<Entry<K, Collection<V>>> asMapEntrySet;
+    @NullableDecl transient Collection<Collection<V>> asMapValues;
 
     SynchronizedAsMap(Map<K, Collection<V>> delegate, @NullableDecl Object mutex) {
       super(delegate, mutex);
@@ -1293,7 +1292,7 @@
       return delegate().descendingIterator(); // manually synchronized
     }
 
-    @MonotonicNonNullDecl transient NavigableSet<E> descendingSet;
+    @NullableDecl transient NavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
@@ -1433,7 +1432,7 @@
       }
     }
 
-    @MonotonicNonNullDecl transient NavigableSet<K> descendingKeySet;
+    @NullableDecl transient NavigableSet<K> descendingKeySet;
 
     @Override
     public NavigableSet<K> descendingKeySet() {
@@ -1445,7 +1444,7 @@
       }
     }
 
-    @MonotonicNonNullDecl transient NavigableMap<K, V> descendingMap;
+    @NullableDecl transient NavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -1530,7 +1529,7 @@
       return navigableKeySet();
     }
 
-    @MonotonicNonNullDecl transient NavigableSet<K> navigableKeySet;
+    @NullableDecl transient NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
diff --git a/android/guava/src/com/google/common/collect/Table.java b/android/guava/src/com/google/common/collect/Table.java
index 3da7c46..1348794 100644
--- a/android/guava/src/com/google/common/collect/Table.java
+++ b/android/guava/src/com/google/common/collect/Table.java
@@ -20,6 +20,7 @@
 import com.google.common.base.Objects;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.CompatibleWith;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
@@ -52,6 +53,7 @@
  * @param <V> the type of the mapped values
  * @since 7.0
  */
+@DoNotMock("Use ImmutableTable, HashBasedTable, or another implementation")
 @GwtCompatible
 public interface Table<R, C, V> {
   // TODO(jlevy): Consider adding methods similar to ConcurrentMap methods.
@@ -96,6 +98,7 @@
    * @param rowKey key of row to search for
    * @param columnKey key of column to search for
    */
+  @NullableDecl
   V get(
       @NullableDecl @CompatibleWith("R") Object rowKey,
       @NullableDecl @CompatibleWith("C") Object columnKey);
diff --git a/android/guava/src/com/google/common/collect/TopKSelector.java b/android/guava/src/com/google/common/collect/TopKSelector.java
index 30f0c0d..5e4b200 100644
--- a/android/guava/src/com/google/common/collect/TopKSelector.java
+++ b/android/guava/src/com/google/common/collect/TopKSelector.java
@@ -57,7 +57,7 @@
    * relative to the natural ordering of the elements, and returns them via {@link #topK} in
    * ascending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
   public static <T extends Comparable<? super T>> TopKSelector<T> least(int k) {
     return least(k, Ordering.natural());
@@ -67,7 +67,7 @@
    * Returns a {@code TopKSelector} that collects the lowest {@code k} elements added to it,
    * relative to the specified comparator, and returns them via {@link #topK} in ascending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @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) {
     return new TopKSelector<T>(comparator, k);
@@ -78,7 +78,7 @@
    * relative to the natural ordering of the elements, and returns them via {@link #topK} in
    * descending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
   public static <T extends Comparable<? super T>> TopKSelector<T> greatest(int k) {
     return greatest(k, Ordering.natural());
@@ -88,7 +88,7 @@
    * Returns a {@code TopKSelector} that collects the greatest {@code k} elements added to it,
    * relative to the specified comparator, and returns them via {@link #topK} in descending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @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) {
     return new TopKSelector<T>(Ordering.from(comparator).reverse(), k);
@@ -114,8 +114,9 @@
   private TopKSelector(Comparator<? super T> comparator, int k) {
     this.comparator = checkNotNull(comparator, "comparator");
     this.k = k;
-    checkArgument(k >= 0, "k must be nonnegative, was %s", k);
-    this.buffer = (T[]) new Object[k * 2];
+    checkArgument(k >= 0, "k (%s) must be >= 0", k);
+    checkArgument(k <= Integer.MAX_VALUE / 2, "k (%s) must be <= Integer.MAX_VALUE / 2", k);
+    this.buffer = (T[]) new Object[IntMath.checkedMultiply(k, 2)];
     this.bufferSize = 0;
     this.threshold = null;
   }
diff --git a/android/guava/src/com/google/common/collect/TreeBasedTable.java b/android/guava/src/com/google/common/collect/TreeBasedTable.java
index 598f7ae..dc665eb 100644
--- a/android/guava/src/com/google/common/collect/TreeBasedTable.java
+++ b/android/guava/src/com/google/common/collect/TreeBasedTable.java
@@ -196,8 +196,8 @@
 
     int compare(Object a, Object b) {
       // pretend we can compare anything
-      @SuppressWarnings({"rawtypes", "unchecked"})
-      Comparator<Object> cmp = (Comparator) comparator();
+      @SuppressWarnings("unchecked")
+      Comparator<Object> cmp = (Comparator<Object>) comparator();
       return cmp.compare(a, b);
     }
 
diff --git a/android/guava/src/com/google/common/collect/TreeMultimap.java b/android/guava/src/com/google/common/collect/TreeMultimap.java
index 3dcaebd..85531e3 100644
--- a/android/guava/src/com/google/common/collect/TreeMultimap.java
+++ b/android/guava/src/com/google/common/collect/TreeMultimap.java
@@ -41,7 +41,7 @@
  *
  * <p><b>Warning:</b> The comparators or comparables used must be <i>consistent with equals</i> as
  * explained by the {@link Comparable} class specification. Otherwise, the resulting multiset will
- * violate the general contract of {@link SetMultimap}, which it is specified in terms of {@link
+ * violate the general contract of {@link SetMultimap}, which is specified in terms of {@link
  * Object#equals}.
  *
  * <p>The collections returned by {@code keySet} and {@code asMap} iterate through the keys
diff --git a/android/guava/src/com/google/common/collect/TreeRangeMap.java b/android/guava/src/com/google/common/collect/TreeRangeMap.java
index 391284c..8cb31b7 100644
--- a/android/guava/src/com/google/common/collect/TreeRangeMap.java
+++ b/android/guava/src/com/google/common/collect/TreeRangeMap.java
@@ -120,7 +120,6 @@
 
   @Override
   public void put(Range<K> range, V value) {
-    // don't short-circuit if the range is empty - it may be between two ranges we can coalesce.
     if (!range.isEmpty()) {
       checkNotNull(value);
       remove(range);
@@ -130,6 +129,7 @@
 
   @Override
   public void putCoalescing(Range<K> range, V value) {
+    // don't short-circuit if the range is empty - it may be between two ranges we can coalesce.
     if (entriesByLowerBound.isEmpty()) {
       put(range, value);
       return;
@@ -431,7 +431,7 @@
 
     @Override
     public void putCoalescing(Range<K> range, V value) {
-      if (entriesByLowerBound.isEmpty() || range.isEmpty() || !subRange.encloses(range)) {
+      if (entriesByLowerBound.isEmpty() || !subRange.encloses(range)) {
         put(range, value);
         return;
       }
diff --git a/android/guava/src/com/google/common/collect/TreeRangeSet.java b/android/guava/src/com/google/common/collect/TreeRangeSet.java
index 4ef092e..c5a438a 100644
--- a/android/guava/src/com/google/common/collect/TreeRangeSet.java
+++ b/android/guava/src/com/google/common/collect/TreeRangeSet.java
@@ -30,7 +30,6 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -77,8 +76,8 @@
     this.rangesByLowerBound = rangesByLowerCut;
   }
 
-  @MonotonicNonNullDecl private transient Set<Range<C>> asRanges;
-  @MonotonicNonNullDecl private transient Set<Range<C>> asDescendingSetOfRanges;
+  @NullableDecl private transient Set<Range<C>> asRanges;
+  @NullableDecl private transient Set<Range<C>> asDescendingSetOfRanges;
 
   @Override
   public Set<Range<C>> asRanges() {
@@ -270,7 +269,7 @@
     }
   }
 
-  @MonotonicNonNullDecl private transient RangeSet<C> complement;
+  @NullableDecl private transient RangeSet<C> complement;
 
   @Override
   public RangeSet<C> complement() {
@@ -897,7 +896,7 @@
           "Cannot add range %s to subRangeSet(%s)",
           rangeToAdd,
           restriction);
-      super.add(rangeToAdd);
+      TreeRangeSet.this.add(rangeToAdd);
     }
 
     @Override
diff --git a/android/guava/src/com/google/common/collect/TreeTraverser.java b/android/guava/src/com/google/common/collect/TreeTraverser.java
index 79d027e..550cdfc 100644
--- a/android/guava/src/com/google/common/collect/TreeTraverser.java
+++ b/android/guava/src/com/google/common/collect/TreeTraverser.java
@@ -67,9 +67,9 @@
  *     their equivalent on the result of {@code Traverser.forTree(tree)} where {@code tree}
  *     implements {@code SuccessorsFunction}, which has a similar API as {@link #children} or can be
  *     the same lambda function as passed into {@link #using(Function)}.
- *     <p>This class is scheduled to be removed in January 2019.
+ *     <p>This class is scheduled to be removed in October 2019.
  */
-// TODO(b/68134636): Remove by 2019-01
+// TODO(b/68134636): Remove by 2019-10
 @Deprecated
 @Beta
 @GwtCompatible
diff --git a/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java b/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
index 1d8f592..20286af 100644
--- a/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.Multisets.UnmodifiableMultiset;
 import java.util.Comparator;
 import java.util.NavigableSet;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Implementation of {@link Multisets#unmodifiableSortedMultiset(SortedMultiset)}, split out into
@@ -56,7 +56,7 @@
     return (NavigableSet<E>) super.elementSet();
   }
 
-  @MonotonicNonNullDecl private transient UnmodifiableSortedMultiset<E> descendingMultiset;
+  @NullableDecl private transient UnmodifiableSortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
diff --git a/android/guava/src/com/google/common/escape/Escaper.java b/android/guava/src/com/google/common/escape/Escaper.java
index 97abc75..0d32a09 100644
--- a/android/guava/src/com/google/common/escape/Escaper.java
+++ b/android/guava/src/com/google/common/escape/Escaper.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * An object that converts literal text into a format safe for inclusion in a particular context
@@ -53,6 +54,7 @@
  * @author David Beaumont
  * @since 15.0
  */
+@DoNotMock("Use Escapers.nullEscaper() or another methods from the *Escapers classes")
 @GwtCompatible
 public abstract class Escaper {
   // TODO(dbeaumont): evaluate custom implementations, considering package private constructor.
diff --git a/android/guava/src/com/google/common/escape/UnicodeEscaper.java b/android/guava/src/com/google/common/escape/UnicodeEscaper.java
index 73f0bef..0642162 100644
--- a/android/guava/src/com/google/common/escape/UnicodeEscaper.java
+++ b/android/guava/src/com/google/common/escape/UnicodeEscaper.java
@@ -90,7 +90,7 @@
    * <p><b>Note:</b> When implementing an escaper it is a good idea to override this method for
    * efficiency by inlining the implementation of {@link #nextEscapeIndex(CharSequence, int, int)}
    * directly. Doing this for {@link com.google.common.net.PercentEscaper} more than doubled the
-   * performance for unescaped strings (as measured by {@link CharEscapersBenchmark}).
+   * performance for unescaped strings (as measured by {@code CharEscapersBenchmark}).
    *
    * @param string the literal string to be escaped
    * @return the escaped form of {@code string}
diff --git a/android/guava/src/com/google/common/eventbus/Subscribe.java b/android/guava/src/com/google/common/eventbus/Subscribe.java
index 37337e6..52b999d 100644
--- a/android/guava/src/com/google/common/eventbus/Subscribe.java
+++ b/android/guava/src/com/google/common/eventbus/Subscribe.java
@@ -23,9 +23,10 @@
 /**
  * Marks a method as an event subscriber.
  *
- * <p>The type of event will be indicated by the method's first (and only) parameter. If this
- * annotation is applied to methods with zero parameters, or more than one parameter, the object
- * containing the method will not be able to register for event delivery from the {@link EventBus}.
+ * <p>The type of event will be indicated by the method's first (and only) parameter, which cannot
+ * be primitive. If this annotation is applied to methods with zero parameters, or more than one
+ * parameter, the object containing the method will not be able to register for event delivery from
+ * the {@link EventBus}.
  *
  * <p>Unless also annotated with @{@link AllowConcurrentEvents}, event subscriber methods will be
  * invoked serially by each event bus that they are registered with.
diff --git a/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java b/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java
index 99a4811..6a6ceac 100644
--- a/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java
+++ b/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Throwables.throwIfUnchecked;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -31,6 +32,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
+import com.google.common.primitives.Primitives;
 import com.google.common.reflect.TypeToken;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.google.j2objc.annotations.Weak;
@@ -170,7 +172,12 @@
   }
 
   private static ImmutableList<Method> getAnnotatedMethods(Class<?> clazz) {
-    return subscriberMethodsCache.getUnchecked(clazz);
+    try {
+      return subscriberMethodsCache.getUnchecked(clazz);
+    } catch (UncheckedExecutionException e) {
+      throwIfUnchecked(e.getCause());
+      throw e;
+    }
   }
 
   private static ImmutableList<Method> getAnnotatedMethodsNotCached(Class<?> clazz) {
@@ -183,11 +190,20 @@
           Class<?>[] parameterTypes = method.getParameterTypes();
           checkArgument(
               parameterTypes.length == 1,
-              "Method %s has @Subscribe annotation but has %s parameters."
+              "Method %s has @Subscribe annotation but has %s parameters. "
                   + "Subscriber methods must have exactly 1 parameter.",
               method,
               parameterTypes.length);
 
+          checkArgument(
+              !parameterTypes[0].isPrimitive(),
+              "@Subscribe method %s's parameter is %s. "
+                  + "Subscriber methods cannot accept primitives. "
+                  + "Consider changing the parameter to %s.",
+              method,
+              parameterTypes[0].getName(),
+              Primitives.wrap(parameterTypes[0]).getSimpleName());
+
           MethodIdentifier ident = new MethodIdentifier(method);
           if (!identifiers.containsKey(ident)) {
             identifiers.put(ident, method);
diff --git a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
index 2b22599..b68656b 100644
--- a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
+++ b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
@@ -98,10 +98,50 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return ElementOrder.unordered();
+  }
+
+  @Override
   public Set<EndpointPair<N>> incidentEdges(N node) {
     checkNotNull(node);
     checkArgument(nodes().contains(node), "Node %s is not an element of this graph.", node);
-    return IncidentEdgeSet.of(this, node);
+    return new IncidentEdgeSet<N>(this, node) {
+      @Override
+      public UnmodifiableIterator<EndpointPair<N>> iterator() {
+        if (graph.isDirected()) {
+          return Iterators.unmodifiableIterator(
+              Iterators.concat(
+                  Iterators.transform(
+                      graph.predecessors(node).iterator(),
+                      new Function<N, EndpointPair<N>>() {
+                        @Override
+                        public EndpointPair<N> apply(N predecessor) {
+                          return EndpointPair.ordered(predecessor, node);
+                        }
+                      }),
+                  Iterators.transform(
+                      // filter out 'node' from successors (already covered by predecessors, above)
+                      Sets.difference(graph.successors(node), ImmutableSet.of(node)).iterator(),
+                      new Function<N, EndpointPair<N>>() {
+                        @Override
+                        public EndpointPair<N> apply(N successor) {
+                          return EndpointPair.ordered(node, successor);
+                        }
+                      })));
+        } else {
+          return Iterators.unmodifiableIterator(
+              Iterators.transform(
+                  graph.adjacentNodes(node).iterator(),
+                  new Function<N, EndpointPair<N>>() {
+                    @Override
+                    public EndpointPair<N> apply(N adjacentNode) {
+                      return EndpointPair.unordered(node, adjacentNode);
+                    }
+                  }));
+        }
+      }
+    };
   }
 
   @Override
@@ -155,119 +195,4 @@
   protected final boolean isOrderingCompatible(EndpointPair<?> endpoints) {
     return endpoints.isOrdered() || !this.isDirected();
   }
-
-  private abstract static class IncidentEdgeSet<N> extends AbstractSet<EndpointPair<N>> {
-    protected final N node;
-    protected final BaseGraph<N> graph;
-
-    public static <N> IncidentEdgeSet<N> of(BaseGraph<N> graph, N node) {
-      return graph.isDirected() ? new Directed<>(graph, node) : new Undirected<>(graph, node);
-    }
-
-    private IncidentEdgeSet(BaseGraph<N> graph, N node) {
-      this.graph = graph;
-      this.node = node;
-    }
-
-    @Override
-    public boolean remove(Object o) {
-      throw new UnsupportedOperationException();
-    }
-
-    private static final class Directed<N> extends IncidentEdgeSet<N> {
-
-      private Directed(BaseGraph<N> graph, N node) {
-        super(graph, node);
-      }
-
-      @Override
-      public UnmodifiableIterator<EndpointPair<N>> iterator() {
-        return Iterators.unmodifiableIterator(
-            Iterators.concat(
-                Iterators.transform(
-                    graph.predecessors(node).iterator(),
-                    new Function<N, EndpointPair<N>>() {
-                      @Override
-                      public EndpointPair<N> apply(N predecessor) {
-                        return EndpointPair.ordered(predecessor, node);
-                      }
-                    }),
-                Iterators.transform(
-                    // filter out 'node' from successors (already covered by predecessors, above)
-                    Sets.difference(graph.successors(node), ImmutableSet.of(node)).iterator(),
-                    new Function<N, EndpointPair<N>>() {
-                      @Override
-                      public EndpointPair<N> apply(N successor) {
-                        return EndpointPair.ordered(node, successor);
-                      }
-                    })));
-      }
-
-      @Override
-      public int size() {
-        return graph.inDegree(node)
-            + graph.outDegree(node)
-            - (graph.successors(node).contains(node) ? 1 : 0);
-      }
-
-      @Override
-      public boolean contains(@NullableDecl Object obj) {
-        if (!(obj instanceof EndpointPair)) {
-          return false;
-        }
-
-        EndpointPair<?> endpointPair = (EndpointPair<?>) obj;
-        if (!endpointPair.isOrdered()) {
-          return false;
-        }
-
-        Object source = endpointPair.source();
-        Object target = endpointPair.target();
-        return (node.equals(source) && graph.successors(node).contains(target))
-            || (node.equals(target) && graph.predecessors(node).contains(source));
-      }
-    }
-
-    private static final class Undirected<N> extends IncidentEdgeSet<N> {
-      private Undirected(BaseGraph<N> graph, N node) {
-        super(graph, node);
-      }
-
-      @Override
-      public UnmodifiableIterator<EndpointPair<N>> iterator() {
-        return Iterators.unmodifiableIterator(
-            Iterators.transform(
-                graph.adjacentNodes(node).iterator(),
-                new Function<N, EndpointPair<N>>() {
-                  @Override
-                  public EndpointPair<N> apply(N adjacentNode) {
-                    return EndpointPair.unordered(node, adjacentNode);
-                  }
-                }));
-      }
-
-      @Override
-      public int size() {
-        return graph.adjacentNodes(node).size();
-      }
-
-      @Override
-      public boolean contains(@NullableDecl Object obj) {
-        if (!(obj instanceof EndpointPair)) {
-          return false;
-        }
-
-        EndpointPair<?> endpointPair = (EndpointPair<?>) obj;
-        if (endpointPair.isOrdered()) {
-          return false;
-        }
-        Set<N> adjacent = graph.adjacentNodes(node);
-        Object nodeU = endpointPair.nodeU();
-        Object nodeV = endpointPair.nodeV();
-
-        return (node.equals(nodeV) && adjacent.contains(nodeU))
-            || (node.equals(nodeU) && adjacent.contains(nodeV));
-      }
-    }
-  }
 }
diff --git a/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
index 1cba34f..8335d0c 100644
--- a/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
@@ -119,6 +119,9 @@
 
   @Override
   public void addInEdge(E edge, N node, boolean isSelfLoop) {
+    checkNotNull(edge);
+    checkNotNull(node);
+
     if (isSelfLoop) {
       checkPositive(++selfLoopCount);
     }
@@ -128,6 +131,9 @@
 
   @Override
   public void addOutEdge(E edge, N node) {
+    checkNotNull(edge);
+    checkNotNull(node);
+
     N previousNode = outEdgeMap.put(edge, node);
     checkState(previousNode == null);
   }
diff --git a/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java b/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java
index 4c726f4..84e461a 100644
--- a/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java
@@ -27,6 +27,8 @@
   final boolean directed;
   boolean allowsSelfLoops = false;
   ElementOrder<N> nodeOrder = ElementOrder.insertion();
+  ElementOrder<N> incidentEdgeOrder = ElementOrder.unordered();
+
   Optional<Integer> expectedNodeCount = Optional.absent();
 
   /**
diff --git a/android/guava/src/com/google/common/graph/AbstractNetwork.java b/android/guava/src/com/google/common/graph/AbstractNetwork.java
index a1c11ce..fad1514 100644
--- a/android/guava/src/com/google/common/graph/AbstractNetwork.java
+++ b/android/guava/src/com/google/common/graph/AbstractNetwork.java
@@ -107,6 +107,13 @@
       }
 
       @Override
+      public ElementOrder<N> incidentEdgeOrder() {
+        // TODO(b/142723300): Return AbstractNetwork.this.incidentEdgeOrder() once Network has that
+        //   method.
+        return ElementOrder.unordered();
+      }
+
+      @Override
       public boolean isDirected() {
         return AbstractNetwork.this.isDirected();
       }
@@ -209,7 +216,9 @@
 
   @Override
   public boolean hasEdgeConnecting(N nodeU, N nodeV) {
-    return !edgesConnecting(nodeU, nodeV).isEmpty();
+    checkNotNull(nodeU);
+    checkNotNull(nodeV);
+    return nodes().contains(nodeU) && successors(nodeU).contains(nodeV);
   }
 
   @Override
@@ -218,7 +227,7 @@
     if (!isOrderingCompatible(endpoints)) {
       return false;
     }
-    return !edgesConnecting(endpoints.nodeU(), endpoints.nodeV()).isEmpty();
+    return hasEdgeConnecting(endpoints.nodeU(), endpoints.nodeV());
   }
 
   /**
diff --git a/android/guava/src/com/google/common/graph/AbstractValueGraph.java b/android/guava/src/com/google/common/graph/AbstractValueGraph.java
index 6217847..be2b7cc 100644
--- a/android/guava/src/com/google/common/graph/AbstractValueGraph.java
+++ b/android/guava/src/com/google/common/graph/AbstractValueGraph.java
@@ -68,6 +68,11 @@
       }
 
       @Override
+      public ElementOrder<N> incidentEdgeOrder() {
+        return AbstractValueGraph.this.incidentEdgeOrder();
+      }
+
+      @Override
       public Set<N> adjacentNodes(N node) {
         return AbstractValueGraph.this.adjacentNodes(node);
       }
diff --git a/android/guava/src/com/google/common/graph/BaseGraph.java b/android/guava/src/com/google/common/graph/BaseGraph.java
index 3929ad0..1df5de7 100644
--- a/android/guava/src/com/google/common/graph/BaseGraph.java
+++ b/android/guava/src/com/google/common/graph/BaseGraph.java
@@ -56,6 +56,15 @@
   /** Returns the order of iteration for the elements of {@link #nodes()}. */
   ElementOrder<N> nodeOrder();
 
+  /**
+   * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of
+   * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link
+   * #successors(Object)} and {@link #incidentEdges(Object)}.
+   *
+   * @since 29.0
+   */
+  ElementOrder<N> incidentEdgeOrder();
+
   //
   // Element-level accessors
   //
@@ -63,6 +72,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this graph.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    */
   Set<N> adjacentNodes(N node);
@@ -95,6 +106,8 @@
   /**
    * Returns the edges in this graph whose endpoints include {@code node}.
    *
+   * <p>This is equal to the union of incoming and outgoing edges.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    * @since 24.0
    */
diff --git a/android/guava/src/com/google/common/graph/DirectedGraphConnections.java b/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
index d8686a8..12887b7 100644
--- a/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
@@ -16,6 +16,7 @@
 
 package com.google.common.graph;
 
+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.graph.GraphConstants.INNER_CAPACITY;
@@ -23,22 +24,29 @@
 import static com.google.common.graph.Graphs.checkNonNegative;
 import static com.google.common.graph.Graphs.checkPositive;
 
+import com.google.common.base.Function;
 import com.google.common.collect.AbstractIterator;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
 import java.util.AbstractSet;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * An implementation of {@link GraphConnections} for directed graphs.
  *
  * @author James Sexton
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
@@ -55,18 +63,88 @@
     }
   }
 
+  /**
+   * A value class representing single connection between the origin node and another node.
+   *
+   * <p>There can be two types of connections (predecessor and successor), which is represented by
+   * the two implementations.
+   */
+  private abstract static class NodeConnection<N> {
+    final N node;
+
+    NodeConnection(N node) {
+      this.node = checkNotNull(node);
+    }
+
+    static final class Pred<N> extends NodeConnection<N> {
+      Pred(N node) {
+        super(node);
+      }
+
+      @Override
+      public boolean equals(Object that) {
+        if (that instanceof Pred) {
+          return this.node.equals(((Pred<?>) that).node);
+        } else {
+          return false;
+        }
+      }
+
+      @Override
+      public int hashCode() {
+        // Adding the class hashCode to avoid a clash with Succ instances.
+        return Pred.class.hashCode() + node.hashCode();
+      }
+    }
+
+    static final class Succ<N> extends NodeConnection<N> {
+      Succ(N node) {
+        super(node);
+      }
+
+      @Override
+      public boolean equals(Object that) {
+        if (that instanceof Succ) {
+          return this.node.equals(((Succ<?>) that).node);
+        } else {
+          return false;
+        }
+      }
+
+      @Override
+      public int hashCode() {
+        // Adding the class hashCode to avoid a clash with Pred instances.
+        return Succ.class.hashCode() + node.hashCode();
+      }
+    }
+  }
+
   private static final Object PRED = new Object();
 
   // Every value in this map must either be an instance of PredAndSucc with a successorValue of
   // type V, PRED (representing predecessor), or an instance of type V (representing successor).
   private final Map<N, Object> adjacentNodeValues;
 
+  /**
+   * All node connections in this graph, in edge insertion order.
+   *
+   * <p>Note: This field and {@link #adjacentNodeValues} cannot be combined into a single
+   * LinkedHashMap because one target node may be mapped to both a predecessor and a successor. A
+   * 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;
+
   private int predecessorCount;
   private int successorCount;
 
   private DirectedGraphConnections(
-      Map<N, Object> adjacentNodeValues, int predecessorCount, int successorCount) {
+      Map<N, Object> adjacentNodeValues,
+      @NullableDecl List<NodeConnection<N>> orderedNodeConnections,
+      int predecessorCount,
+      int successorCount) {
     this.adjacentNodeValues = checkNotNull(adjacentNodeValues);
+    this.orderedNodeConnections = orderedNodeConnections;
     this.predecessorCount = checkNonNegative(predecessorCount);
     this.successorCount = checkNonNegative(successorCount);
     checkState(
@@ -74,30 +152,120 @@
             && successorCount <= adjacentNodeValues.size());
   }
 
-  static <N, V> DirectedGraphConnections<N, V> of() {
+  static <N, V> DirectedGraphConnections<N, V> of(ElementOrder<N> incidentEdgeOrder) {
     // We store predecessors and successors in the same map, so double the initial capacity.
     int initialCapacity = INNER_CAPACITY * 2;
-    return new DirectedGraphConnections<>(
-        new HashMap<N, Object>(initialCapacity, INNER_LOAD_FACTOR), 0, 0);
+
+    List<NodeConnection<N>> orderedNodeConnections;
+    switch (incidentEdgeOrder.type()) {
+      case UNORDERED:
+        orderedNodeConnections = null;
+        break;
+      case STABLE:
+        orderedNodeConnections = new ArrayList<NodeConnection<N>>();
+        break;
+      default:
+        throw new AssertionError(incidentEdgeOrder.type());
+    }
+
+    return new DirectedGraphConnections<N, V>(
+        /* adjacentNodeValues = */ new HashMap<N, Object>(initialCapacity, INNER_LOAD_FACTOR),
+        orderedNodeConnections,
+        /* predecessorCount = */ 0,
+        /* successorCount = */ 0);
   }
 
   static <N, V> DirectedGraphConnections<N, V> ofImmutable(
-      Set<N> predecessors, Map<N, V> successorValues) {
+      N thisNode, Iterable<EndpointPair<N>> incidentEdges, Function<N, V> successorNodeToValueFn) {
+    checkNotNull(thisNode);
+    checkNotNull(successorNodeToValueFn);
+
     Map<N, Object> adjacentNodeValues = new HashMap<>();
-    adjacentNodeValues.putAll(successorValues);
-    for (N predecessor : predecessors) {
-      Object value = adjacentNodeValues.put(predecessor, PRED);
-      if (value != null) {
-        adjacentNodeValues.put(predecessor, new PredAndSucc(value));
+    ImmutableList.Builder<NodeConnection<N>> orderedNodeConnectionsBuilder =
+        ImmutableList.builder();
+    int predecessorCount = 0;
+    int successorCount = 0;
+
+    for (EndpointPair<N> incidentEdge : incidentEdges) {
+      if (incidentEdge.nodeU().equals(thisNode) && incidentEdge.nodeV().equals(thisNode)) {
+        // incidentEdge is a self-loop
+
+        adjacentNodeValues.put(thisNode, new PredAndSucc(successorNodeToValueFn.apply(thisNode)));
+
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Pred<>(thisNode));
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Succ<>(thisNode));
+        predecessorCount++;
+        successorCount++;
+      } else if (incidentEdge.nodeV().equals(thisNode)) { // incidentEdge is an inEdge
+        N predecessor = incidentEdge.nodeU();
+
+        Object existingValue = adjacentNodeValues.put(predecessor, PRED);
+        if (existingValue != null) {
+          adjacentNodeValues.put(predecessor, new PredAndSucc(existingValue));
+        }
+
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Pred<>(predecessor));
+        predecessorCount++;
+      } else { // incidentEdge is an outEdge
+        checkArgument(incidentEdge.nodeU().equals(thisNode));
+
+        N successor = incidentEdge.nodeV();
+        V value = successorNodeToValueFn.apply(successor);
+
+        Object existingValue = adjacentNodeValues.put(successor, value);
+        if (existingValue != null) {
+          checkArgument(existingValue == PRED);
+          adjacentNodeValues.put(successor, new PredAndSucc(value));
+        }
+
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Succ<>(successor));
+        successorCount++;
       }
     }
+
     return new DirectedGraphConnections<>(
-        ImmutableMap.copyOf(adjacentNodeValues), predecessors.size(), successorValues.size());
+        adjacentNodeValues,
+        orderedNodeConnectionsBuilder.build(),
+        predecessorCount,
+        successorCount);
   }
 
   @Override
   public Set<N> adjacentNodes() {
-    return Collections.unmodifiableSet(adjacentNodeValues.keySet());
+    if (orderedNodeConnections == null) {
+      return Collections.unmodifiableSet(adjacentNodeValues.keySet());
+    } else {
+      return new AbstractSet<N>() {
+        @Override
+        public UnmodifiableIterator<N> iterator() {
+          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          final Set<N> seenNodes = new HashSet<>();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (nodeConnections.hasNext()) {
+                NodeConnection<N> nodeConnection = nodeConnections.next();
+                boolean added = seenNodes.add(nodeConnection.node);
+                if (added) {
+                  return nodeConnection.node;
+                }
+              }
+              return endOfData();
+            }
+          };
+        }
+
+        @Override
+        public int size() {
+          return adjacentNodeValues.size();
+        }
+
+        @Override
+        public boolean contains(@NullableDecl Object obj) {
+          return adjacentNodeValues.containsKey(obj);
+        }
+      };
+    }
   }
 
   @Override
@@ -105,19 +273,35 @@
     return new AbstractSet<N>() {
       @Override
       public UnmodifiableIterator<N> iterator() {
-        final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
-        return new AbstractIterator<N>() {
-          @Override
-          protected N computeNext() {
-            while (entries.hasNext()) {
-              Entry<N, Object> entry = entries.next();
-              if (isPredecessor(entry.getValue())) {
-                return entry.getKey();
+        if (orderedNodeConnections == null) {
+          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (entries.hasNext()) {
+                Entry<N, Object> entry = entries.next();
+                if (isPredecessor(entry.getValue())) {
+                  return entry.getKey();
+                }
               }
+              return endOfData();
             }
-            return endOfData();
-          }
-        };
+          };
+        } else {
+          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (nodeConnections.hasNext()) {
+                NodeConnection<N> nodeConnection = nodeConnections.next();
+                if (nodeConnection instanceof NodeConnection.Pred) {
+                  return nodeConnection.node;
+                }
+              }
+              return endOfData();
+            }
+          };
+        }
       }
 
       @Override
@@ -137,19 +321,35 @@
     return new AbstractSet<N>() {
       @Override
       public UnmodifiableIterator<N> iterator() {
-        final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
-        return new AbstractIterator<N>() {
-          @Override
-          protected N computeNext() {
-            while (entries.hasNext()) {
-              Entry<N, Object> entry = entries.next();
-              if (isSuccessor(entry.getValue())) {
-                return entry.getKey();
+        if (orderedNodeConnections == null) {
+          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (entries.hasNext()) {
+                Entry<N, Object> entry = entries.next();
+                if (isSuccessor(entry.getValue())) {
+                  return entry.getKey();
+                }
               }
+              return endOfData();
             }
-            return endOfData();
-          }
-        };
+          };
+        } else {
+          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (nodeConnections.hasNext()) {
+                NodeConnection<N> nodeConnection = nodeConnections.next();
+                if (nodeConnection instanceof NodeConnection.Succ) {
+                  return nodeConnection.node;
+                }
+              }
+              return endOfData();
+            }
+          };
+        }
       }
 
       @Override
@@ -164,9 +364,69 @@
     };
   }
 
+  @Override
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+    checkNotNull(thisNode);
+
+    final Iterator<EndpointPair<N>> resultWithDoubleSelfLoop;
+    if (orderedNodeConnections == null) {
+      resultWithDoubleSelfLoop =
+          Iterators.concat(
+              Iterators.transform(
+                  predecessors().iterator(),
+                  new Function<N, EndpointPair<N>>() {
+                    @Override
+                    public EndpointPair<N> apply(N predecessor) {
+                      return EndpointPair.ordered(predecessor, thisNode);
+                    }
+                  }),
+              Iterators.transform(
+                  successors().iterator(),
+                  new Function<N, EndpointPair<N>>() {
+                    @Override
+                    public EndpointPair<N> apply(N successor) {
+                      return EndpointPair.ordered(thisNode, successor);
+                    }
+                  }));
+    } else {
+      resultWithDoubleSelfLoop =
+          Iterators.transform(
+              orderedNodeConnections.iterator(),
+              new Function<NodeConnection<N>, EndpointPair<N>>() {
+                @Override
+                public EndpointPair<N> apply(NodeConnection<N> connection) {
+                  if (connection instanceof NodeConnection.Succ) {
+                    return EndpointPair.ordered(thisNode, connection.node);
+                  } else {
+                    return EndpointPair.ordered(connection.node, thisNode);
+                  }
+                }
+              });
+    }
+
+    final AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
+    return new AbstractIterator<EndpointPair<N>>() {
+      @Override
+      protected EndpointPair<N> computeNext() {
+        while (resultWithDoubleSelfLoop.hasNext()) {
+          EndpointPair<N> edge = resultWithDoubleSelfLoop.next();
+          if (edge.nodeU().equals(edge.nodeV())) {
+            if (!alreadySeenSelfLoop.getAndSet(true)) {
+              return edge;
+            }
+          } else {
+            return edge;
+          }
+        }
+        return endOfData();
+      }
+    };
+  }
+
   @SuppressWarnings("unchecked")
   @Override
   public V value(N node) {
+    checkNotNull(node);
     Object value = adjacentNodeValues.get(node);
     if (value == PRED) {
       return null;
@@ -180,45 +440,83 @@
   @SuppressWarnings("unchecked")
   @Override
   public void removePredecessor(N node) {
+    checkNotNull(node);
+
     Object previousValue = adjacentNodeValues.get(node);
+    boolean removedPredecessor;
+
     if (previousValue == PRED) {
       adjacentNodeValues.remove(node);
-      checkNonNegative(--predecessorCount);
+      removedPredecessor = true;
     } else if (previousValue instanceof PredAndSucc) {
       adjacentNodeValues.put((N) node, ((PredAndSucc) previousValue).successorValue);
+      removedPredecessor = true;
+    } else {
+      removedPredecessor = false;
+    }
+
+    if (removedPredecessor) {
       checkNonNegative(--predecessorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.remove(new NodeConnection.Pred<>(node));
+      }
     }
   }
 
   @SuppressWarnings("unchecked")
   @Override
   public V removeSuccessor(Object node) {
+    checkNotNull(node);
     Object previousValue = adjacentNodeValues.get(node);
+    Object removedValue;
+
     if (previousValue == null || previousValue == PRED) {
-      return null;
+      removedValue = null;
     } else if (previousValue instanceof PredAndSucc) {
       adjacentNodeValues.put((N) node, PRED);
-      checkNonNegative(--successorCount);
-      return (V) ((PredAndSucc) previousValue).successorValue;
+      removedValue = ((PredAndSucc) previousValue).successorValue;
     } else { // successor
       adjacentNodeValues.remove(node);
-      checkNonNegative(--successorCount);
-      return (V) previousValue;
+      removedValue = previousValue;
     }
+
+    if (removedValue != null) {
+      checkNonNegative(--successorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.remove(new NodeConnection.Succ<>((N) node));
+      }
+    }
+
+    return (V) removedValue;
   }
 
   @Override
   public void addPredecessor(N node, V unused) {
     Object previousValue = adjacentNodeValues.put(node, PRED);
+    boolean addedPredecessor;
+
     if (previousValue == null) {
-      checkPositive(++predecessorCount);
+      addedPredecessor = true;
     } else if (previousValue instanceof PredAndSucc) {
       // Restore previous PredAndSucc object.
       adjacentNodeValues.put(node, previousValue);
+      addedPredecessor = false;
     } else if (previousValue != PRED) { // successor
       // Do NOT use method parameter value 'unused'. In directed graphs, successors store the value.
       adjacentNodeValues.put(node, new PredAndSucc(previousValue));
+      addedPredecessor = true;
+    } else {
+      addedPredecessor = false;
+    }
+
+    if (addedPredecessor) {
       checkPositive(++predecessorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.add(new NodeConnection.Pred<>(node));
+      }
     }
   }
 
@@ -226,19 +524,29 @@
   @Override
   public V addSuccessor(N node, V value) {
     Object previousValue = adjacentNodeValues.put(node, value);
+    Object previousSuccessor;
+
     if (previousValue == null) {
-      checkPositive(++successorCount);
-      return null;
+      previousSuccessor = null;
     } else if (previousValue instanceof PredAndSucc) {
       adjacentNodeValues.put(node, new PredAndSucc(value));
-      return (V) ((PredAndSucc) previousValue).successorValue;
+      previousSuccessor = ((PredAndSucc) previousValue).successorValue;
     } else if (previousValue == PRED) {
       adjacentNodeValues.put(node, new PredAndSucc(value));
-      checkPositive(++successorCount);
-      return null;
+      previousSuccessor = null;
     } else { // successor
-      return (V) previousValue;
+      previousSuccessor = previousValue;
     }
+
+    if (previousSuccessor == null) {
+      checkPositive(++successorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.add(new NodeConnection.Succ<>(node));
+      }
+    }
+
+    return (V) previousSuccessor;
   }
 
   private static boolean isPredecessor(@NullableDecl Object value) {
diff --git a/android/guava/src/com/google/common/graph/ElementOrder.java b/android/guava/src/com/google/common/graph/ElementOrder.java
index 9847f59..568fb42 100644
--- a/android/guava/src/com/google/common/graph/ElementOrder.java
+++ b/android/guava/src/com/google/common/graph/ElementOrder.java
@@ -58,12 +58,15 @@
    *
    * <ul>
    *   <li>UNORDERED: no order is guaranteed.
+   *   <li>STABLE: ordering is guaranteed to follow a pattern that won't change between releases.
+   *       Some methods may have stronger guarantees.
    *   <li>INSERTION: insertion ordering is guaranteed.
    *   <li>SORTED: ordering according to a supplied comparator is guaranteed.
    * </ul>
    */
   public enum Type {
     UNORDERED,
+    STABLE,
     INSERTION,
     SORTED
   }
@@ -79,6 +82,46 @@
     return new ElementOrder<S>(Type.UNORDERED, null);
   }
 
+  /**
+   * Returns an instance which specifies that ordering is guaranteed to be always be the same across
+   * iterations, and across releases. Some methods may have stronger guarantees.
+   *
+   * <p>This instance is only useful in combination with {@code incidentEdgeOrder}, e.g. {@code
+   * graphBuilder.incidentEdgeOrder(ElementOrder.stable())}.
+   *
+   * <h3>In combination with {@code incidentEdgeOrder}</h3>
+   *
+   * <p>{@code incidentEdgeOrder(ElementOrder.stable())} guarantees the ordering of the returned
+   * collections of the following methods:
+   *
+   * <ul>
+   *   <li>For {@link Graph} and {@link ValueGraph}:
+   *       <ul>
+   *         <li>{@code edges()}: Stable order
+   *         <li>{@code adjacentNodes(node)}: Connecting edge insertion order
+   *         <li>{@code predecessors(node)}: Connecting edge insertion order
+   *         <li>{@code successors(node)}: Connecting edge insertion order
+   *         <li>{@code incidentEdges(node)}: Edge insertion order
+   *       </ul>
+   *   <li>For {@link Network}:
+   *       <ul>
+   *         <li>{@code adjacentNodes(node)}: Stable order
+   *         <li>{@code predecessors(node)}: Connecting edge insertion order
+   *         <li>{@code successors(node)}: Connecting edge insertion order
+   *         <li>{@code incidentEdges(node)}: Stable order
+   *         <li>{@code inEdges(node)}: Edge insertion order
+   *         <li>{@code outEdges(node)}: Edge insertion order
+   *         <li>{@code adjacentEdges(edge)}: Stable order
+   *         <li>{@code edgesConnecting(nodeU, nodeV)}: Edge insertion order
+   *       </ul>
+   * </ul>
+   *
+   * @since 29.0
+   */
+  public static <S> ElementOrder<S> stable() {
+    return new ElementOrder<S>(Type.STABLE, null);
+  }
+
   /** Returns an instance which specifies that insertion ordering is guaranteed. */
   public static <S> ElementOrder<S> insertion() {
     return new ElementOrder<S>(Type.INSERTION, null);
@@ -96,7 +139,7 @@
    * determined by {@code comparator}.
    */
   public static <S> ElementOrder<S> sorted(Comparator<S> comparator) {
-    return new ElementOrder<S>(Type.SORTED, comparator);
+    return new ElementOrder<S>(Type.SORTED, checkNotNull(comparator));
   }
 
   /** Returns the type of ordering used. */
@@ -149,6 +192,7 @@
       case UNORDERED:
         return Maps.newHashMapWithExpectedSize(expectedSize);
       case INSERTION:
+      case STABLE:
         return Maps.newLinkedHashMapWithExpectedSize(expectedSize);
       case SORTED:
         return Maps.newTreeMap(comparator());
diff --git a/android/guava/src/com/google/common/graph/ForwardingGraph.java b/android/guava/src/com/google/common/graph/ForwardingGraph.java
index a72abc0..4a3ab8c 100644
--- a/android/guava/src/com/google/common/graph/ForwardingGraph.java
+++ b/android/guava/src/com/google/common/graph/ForwardingGraph.java
@@ -58,6 +58,11 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return delegate().incidentEdgeOrder();
+  }
+
+  @Override
   public Set<N> adjacentNodes(N node) {
     return delegate().adjacentNodes(node);
   }
@@ -73,6 +78,11 @@
   }
 
   @Override
+  public Set<EndpointPair<N>> incidentEdges(N node) {
+    return delegate().incidentEdges(node);
+  }
+
+  @Override
   public int degree(N node) {
     return delegate().degree(node);
   }
diff --git a/android/guava/src/com/google/common/graph/ForwardingValueGraph.java b/android/guava/src/com/google/common/graph/ForwardingValueGraph.java
index 9d1dd52..2507890 100644
--- a/android/guava/src/com/google/common/graph/ForwardingValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ForwardingValueGraph.java
@@ -60,6 +60,11 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return delegate().incidentEdgeOrder();
+  }
+
+  @Override
   public Set<N> adjacentNodes(N node) {
     return delegate().adjacentNodes(node);
   }
diff --git a/android/guava/src/com/google/common/graph/Graph.java b/android/guava/src/com/google/common/graph/Graph.java
index 31a8e17..8ed35fb 100644
--- a/android/guava/src/com/google/common/graph/Graph.java
+++ b/android/guava/src/com/google/common/graph/Graph.java
@@ -17,6 +17,8 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
+import java.util.Collection;
 import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -100,6 +102,7 @@
  * @since 20.0
  */
 @Beta
+@DoNotMock("Use GraphBuilder to create a real instance")
 public interface Graph<N> extends BaseGraph<N> {
   //
   // Graph-level accessors
@@ -137,6 +140,16 @@
   @Override
   ElementOrder<N> nodeOrder();
 
+  /**
+   * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of
+   * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link
+   * #successors(Object)} and {@link #incidentEdges(Object)}.
+   *
+   * @since 29.0
+   */
+  @Override
+  ElementOrder<N> incidentEdgeOrder();
+
   //
   // Element-level accessors
   //
@@ -144,6 +157,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this graph.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    */
   @Override
@@ -177,6 +192,8 @@
   /**
    * Returns the edges in this graph whose endpoints include {@code node}.
    *
+   * <p>This is equal to the union of incoming and outgoing edges.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    * @since 24.0
    */
diff --git a/android/guava/src/com/google/common/graph/GraphBuilder.java b/android/guava/src/com/google/common/graph/GraphBuilder.java
index e285866..f00d7b1 100644
--- a/android/guava/src/com/google/common/graph/GraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/GraphBuilder.java
@@ -16,14 +16,17 @@
 
 package com.google.common.graph;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.graph.Graphs.checkNonNegative;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
- * A builder for constructing instances of {@link MutableGraph} with user-defined properties.
+ * A builder for constructing instances of {@link MutableGraph} or {@link ImmutableGraph} with
+ * user-defined properties.
  *
  * <p>A graph built by this class will have the following properties by default:
  *
@@ -32,13 +35,24 @@
  *   <li>orders {@link Graph#nodes()} in the order in which the elements were added
  * </ul>
  *
- * <p>Example of use:
+ * <p>Examples of use:
  *
  * <pre>{@code
+ * // Building a mutable graph
  * MutableGraph<String> graph = GraphBuilder.undirected().allowsSelfLoops(true).build();
  * graph.putEdge("bread", "bread");
  * graph.putEdge("chocolate", "peanut butter");
  * graph.putEdge("peanut butter", "jelly");
+ *
+ * // Building an immutable graph
+ * ImmutableGraph<String> immutableGraph =
+ *     GraphBuilder.undirected()
+ *         .allowsSelfLoops(true)
+ *         .<String>immutable()
+ *         .putEdge("bread", "bread")
+ *         .putEdge("chocolate", "peanut butter")
+ *         .putEdge("peanut butter", "jelly")
+ *         .build();
  * }</pre>
  *
  * @author James Sexton
@@ -49,6 +63,7 @@
  * @since 20.0
  */
 @Beta
+@DoNotMock
 public final class GraphBuilder<N> extends AbstractGraphBuilder<N> {
 
   /** Creates a new instance with the specified edge directionality. */
@@ -76,13 +91,31 @@
   public static <N> GraphBuilder<N> from(Graph<N> graph) {
     return new GraphBuilder<N>(graph.isDirected())
         .allowsSelfLoops(graph.allowsSelfLoops())
-        .nodeOrder(graph.nodeOrder());
+        .nodeOrder(graph.nodeOrder())
+        .incidentEdgeOrder(graph.incidentEdgeOrder());
+  }
+
+  /**
+   * Returns an {@link ImmutableGraph.Builder} with the properties of this {@link GraphBuilder}.
+   *
+   * <p>The returned builder can be used for populating an {@link ImmutableGraph}.
+   *
+   * <p>Note that the returned builder will always have {@link #incidentEdgeOrder} set to {@link
+   * ElementOrder#stable()}, regardless of the value that was set in this builder.
+   *
+   * @since 28.0
+   */
+  public <N1 extends N> ImmutableGraph.Builder<N1> immutable() {
+    GraphBuilder<N1> castBuilder = cast();
+    return new ImmutableGraph.Builder<>(castBuilder);
   }
 
   /**
    * Specifies whether the graph will allow self-loops (edges that connect a node to itself).
    * Attempting to add a self-loop to a graph that does not allow them will throw an {@link
    * UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public GraphBuilder<N> allowsSelfLoops(boolean allowsSelfLoops) {
     this.allowsSelfLoops = allowsSelfLoops;
@@ -99,16 +132,54 @@
     return this;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Graph#nodes()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Graph#nodes()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <N1 extends N> GraphBuilder<N1> nodeOrder(ElementOrder<N1> nodeOrder) {
     GraphBuilder<N1> newBuilder = cast();
     newBuilder.nodeOrder = checkNotNull(nodeOrder);
     return newBuilder;
   }
 
+  /**
+   * Specifies the order of iteration for the elements of {@link Graph#edges()}, {@link
+   * Graph#adjacentNodes(Object)}, {@link Graph#predecessors(Object)}, {@link
+   * Graph#successors(Object)} and {@link Graph#incidentEdges(Object)}.
+   *
+   * <p>The default value is {@link ElementOrder#unordered() unordered} for mutable graphs. For
+   * immutable graphs, this value is ignored; they always have a {@link ElementOrder#stable()
+   * stable} order.
+   *
+   * @throws IllegalArgumentException if {@code incidentEdgeOrder} is not either {@code
+   *     ElementOrder.unordered()} or {@code ElementOrder.stable()}.
+   * @since 29.0
+   */
+  public <N1 extends N> GraphBuilder<N1> incidentEdgeOrder(ElementOrder<N1> incidentEdgeOrder) {
+    checkArgument(
+        incidentEdgeOrder.type() == ElementOrder.Type.UNORDERED
+            || incidentEdgeOrder.type() == ElementOrder.Type.STABLE,
+        "The given elementOrder (%s) is unsupported. incidentEdgeOrder() only supports"
+            + " ElementOrder.unordered() and ElementOrder.stable().",
+        incidentEdgeOrder);
+    GraphBuilder<N1> newBuilder = cast();
+    newBuilder.incidentEdgeOrder = checkNotNull(incidentEdgeOrder);
+    return newBuilder;
+  }
+
   /** Returns an empty {@link MutableGraph} with the properties of this {@link GraphBuilder}. */
   public <N1 extends N> MutableGraph<N1> build() {
-    return new ConfigurableMutableGraph<N1>(this);
+    return new StandardMutableGraph<N1>(this);
+  }
+
+  GraphBuilder<N> copy() {
+    GraphBuilder<N> newBuilder = new GraphBuilder<>(directed);
+    newBuilder.allowsSelfLoops = allowsSelfLoops;
+    newBuilder.nodeOrder = nodeOrder;
+    newBuilder.expectedNodeCount = expectedNodeCount;
+    newBuilder.incidentEdgeOrder = incidentEdgeOrder;
+    return newBuilder;
   }
 
   @SuppressWarnings("unchecked")
diff --git a/android/guava/src/com/google/common/graph/GraphConnections.java b/android/guava/src/com/google/common/graph/GraphConnections.java
index 98cc812..d783c78 100644
--- a/android/guava/src/com/google/common/graph/GraphConnections.java
+++ b/android/guava/src/com/google/common/graph/GraphConnections.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.Iterator;
 import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -37,6 +38,13 @@
   Set<N> successors();
 
   /**
+   * Returns an iterator over the incident edges.
+   *
+   * @param thisNode The node that this all of the connections in this class are connected to.
+   */
+  Iterator<EndpointPair<N>> incidentEdgeIterator(N thisNode);
+
+  /**
    * Returns the value associated with the edge connecting the origin node to {@code node}, or null
    * if there is no such edge.
    */
diff --git a/android/guava/src/com/google/common/graph/Graphs.java b/android/guava/src/com/google/common/graph/Graphs.java
index 3eb4ef0..c278c71 100644
--- a/android/guava/src/com/google/common/graph/Graphs.java
+++ b/android/guava/src/com/google/common/graph/Graphs.java
@@ -20,17 +20,17 @@
 import static com.google.common.graph.GraphConstants.NODE_NOT_IN_GRAPH;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.ArrayDeque;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashSet;
+import java.util.Iterator;
 import java.util.Map;
-import java.util.Queue;
 import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -193,20 +193,7 @@
    */
   public static <N> Set<N> reachableNodes(Graph<N> graph, N node) {
     checkArgument(graph.nodes().contains(node), NODE_NOT_IN_GRAPH, node);
-    Set<N> visitedNodes = new LinkedHashSet<N>();
-    Queue<N> queuedNodes = new ArrayDeque<N>();
-    visitedNodes.add(node);
-    queuedNodes.add(node);
-    // Perform a breadth-first traversal rooted at the input node.
-    while (!queuedNodes.isEmpty()) {
-      N currentNode = queuedNodes.remove();
-      for (N successor : graph.successors(currentNode)) {
-        if (visitedNodes.add(successor)) {
-          queuedNodes.add(successor);
-        }
-      }
-    }
-    return Collections.unmodifiableSet(visitedNodes);
+    return ImmutableSet.copyOf(Traverser.forGraph(graph).breadthFirst(node));
   }
 
   // Graph mutation methods
@@ -293,6 +280,23 @@
     }
 
     @Override
+    public Set<EndpointPair<N>> incidentEdges(N node) {
+      return new IncidentEdgeSet<N>(this, node) {
+        @Override
+        public Iterator<EndpointPair<N>> iterator() {
+          return Iterators.transform(
+              delegate().incidentEdges(node).iterator(),
+              new Function<EndpointPair<N>, EndpointPair<N>>() {
+                @Override
+                public EndpointPair<N> apply(EndpointPair<N> edge) {
+                  return EndpointPair.of(delegate(), edge.nodeV(), edge.nodeU());
+                }
+              });
+        }
+      };
+    }
+
+    @Override
     public int inDegree(N node) {
       return delegate().outDegree(node); // transpose
     }
diff --git a/android/guava/src/com/google/common/graph/ImmutableGraph.java b/android/guava/src/com/google/common/graph/ImmutableGraph.java
index c878a5c..4027ca8 100644
--- a/android/guava/src/com/google/common/graph/ImmutableGraph.java
+++ b/android/guava/src/com/google/common/graph/ImmutableGraph.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.common.graph.GraphConstants.Presence;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 
 /**
@@ -38,6 +39,7 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  * @author Omar Darwish
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @since 20.0
  */
@@ -56,7 +58,7 @@
     return (graph instanceof ImmutableGraph)
         ? (ImmutableGraph<N>) graph
         : new ImmutableGraph<N>(
-            new ConfigurableValueGraph<N, Presence>(
+            new StandardValueGraph<N, Presence>(
                 GraphBuilder.from(graph), getNodeConnections(graph), graph.edges().size()));
   }
 
@@ -70,6 +72,11 @@
     return checkNotNull(graph);
   }
 
+  @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return ElementOrder.stable();
+  }
+
   private static <N> ImmutableMap<N, GraphConnections<N, Presence>> getNodeConnections(
       Graph<N> graph) {
     // ImmutableMap.Builder maintains the order of the elements as inserted, so the map will have
@@ -82,11 +89,12 @@
     return nodeConnections.build();
   }
 
+  @SuppressWarnings("unchecked")
   private static <N> GraphConnections<N, Presence> connectionsOf(Graph<N> graph, N node) {
-    Function<Object, Presence> edgeValueFn = Functions.constant(Presence.EDGE_EXISTS);
+    Function<N, Presence> edgeValueFn =
+        (Function<N, Presence>) Functions.constant(Presence.EDGE_EXISTS);
     return graph.isDirected()
-        ? DirectedGraphConnections.ofImmutable(
-            graph.predecessors(node), Maps.asMap(graph.successors(node), edgeValueFn))
+        ? DirectedGraphConnections.ofImmutable(node, graph.incidentEdges(node), edgeValueFn)
         : UndirectedGraphConnections.ofImmutable(
             Maps.asMap(graph.adjacentNodes(node), edgeValueFn));
   }
@@ -95,4 +103,98 @@
   protected BaseGraph<N> delegate() {
     return backingGraph;
   }
+
+  /**
+   * A builder for creating {@link ImmutableGraph} instances, especially {@code static final}
+   * graphs. Example:
+   *
+   * <pre>{@code
+   * static final ImmutableGraph<Country> COUNTRY_ADJACENCY_GRAPH =
+   *     GraphBuilder.undirected()
+   *         .<Country>immutable()
+   *         .putEdge(FRANCE, GERMANY)
+   *         .putEdge(FRANCE, BELGIUM)
+   *         .putEdge(GERMANY, BELGIUM)
+   *         .addNode(ICELAND)
+   *         .build();
+   * }</pre>
+   *
+   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple times to build
+   * multiple graphs in series. Each new graph contains all the elements of the ones created before
+   * it.
+   *
+   * @since 28.0
+   */
+  public static class Builder<N> {
+
+    private final MutableGraph<N> mutableGraph;
+
+    Builder(GraphBuilder<N> graphBuilder) {
+      // The incidentEdgeOrder for immutable graphs is always stable. However, we don't want to
+      // modify this builder, so we make a copy instead.
+      this.mutableGraph = graphBuilder.copy().incidentEdgeOrder(ElementOrder.<N>stable()).build();
+    }
+
+    /**
+     * Adds {@code node} if it is not already present.
+     *
+     * <p><b>Nodes must be unique</b>, just as {@code Map} keys must be. They must also be non-null.
+     *
+     * @return this {@code Builder} object
+     */
+    @CanIgnoreReturnValue
+    public Builder<N> addNode(N node) {
+      mutableGraph.addNode(node);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code nodeU} to {@code nodeV} if one is not already present.
+     *
+     * <p>If the graph is directed, the resultant edge will be directed; otherwise, it will be
+     * undirected.
+     *
+     * <p>If {@code nodeU} and {@code nodeV} are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} {@code nodeU} and {@code nodeV} to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     */
+    @CanIgnoreReturnValue
+    public Builder<N> putEdge(N nodeU, N nodeV) {
+      mutableGraph.putEdge(nodeU, nodeV);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code endpoints} (in the order, if any, specified by {@code
+     * endpoints}) if one is not already present.
+     *
+     * <p>If this graph is directed, {@code endpoints} must be ordered and the added edge will be
+     * directed; if it is undirected, the added edge will be undirected.
+     *
+     * <p>If this graph is directed, {@code endpoints} must be ordered.
+     *
+     * <p>If either or both endpoints are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} each missing endpoint to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
+     */
+    @CanIgnoreReturnValue
+    public Builder<N> putEdge(EndpointPair<N> endpoints) {
+      mutableGraph.putEdge(endpoints);
+      return this;
+    }
+
+    /**
+     * Returns a newly-created {@code ImmutableGraph} based on the contents of this {@code Builder}.
+     */
+    public ImmutableGraph<N> build() {
+      return ImmutableGraph.copyOf(mutableGraph);
+    }
+  }
 }
diff --git a/android/guava/src/com/google/common/graph/ImmutableNetwork.java b/android/guava/src/com/google/common/graph/ImmutableNetwork.java
index 3d5da1c..b35d722 100644
--- a/android/guava/src/com/google/common/graph/ImmutableNetwork.java
+++ b/android/guava/src/com/google/common/graph/ImmutableNetwork.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import java.util.Map;
 
@@ -37,14 +38,15 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  * @author Omar Darwish
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  * @since 20.0
  */
 @Beta
 @Immutable(containerOf = {"N", "E"})
-@SuppressWarnings("Immutable") // Extends ConfigurableNetwork but uses ImmutableMaps.
-public final class ImmutableNetwork<N, E> extends ConfigurableNetwork<N, E> {
+@SuppressWarnings("Immutable") // Extends StandardNetwork but uses ImmutableMaps.
+public final class ImmutableNetwork<N, E> extends StandardNetwork<N, E> {
 
   private ImmutableNetwork(Network<N, E> network) {
     super(
@@ -138,4 +140,115 @@
       }
     };
   }
+
+  /**
+   * A builder for creating {@link ImmutableNetwork} instances, especially {@code static final}
+   * networks. Example:
+   *
+   * <pre>{@code
+   * static final ImmutableNetwork<City, Train> TRAIN_NETWORK =
+   *     NetworkBuilder.undirected()
+   *         .allowsParallelEdges(true)
+   *         .<City, Train>immutable()
+   *         .addEdge(PARIS, BRUSSELS, Thalys.trainNumber("1111"))
+   *         .addEdge(PARIS, BRUSSELS, RegionalTrain.trainNumber("2222"))
+   *         .addEdge(LONDON, PARIS, Eurostar.trainNumber("3333"))
+   *         .addEdge(LONDON, BRUSSELS, Eurostar.trainNumber("4444"))
+   *         .addNode(REYKJAVIK)
+   *         .build();
+   * }</pre>
+   *
+   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple times to build
+   * multiple networks in series. Each new network contains all the elements of the ones created
+   * before it.
+   *
+   * @since 28.0
+   */
+  public static class Builder<N, E> {
+
+    private final MutableNetwork<N, E> mutableNetwork;
+
+    Builder(NetworkBuilder<N, E> networkBuilder) {
+      this.mutableNetwork = networkBuilder.build();
+    }
+
+    /**
+     * Adds {@code node} if it is not already present.
+     *
+     * <p><b>Nodes must be unique</b>, just as {@code Map} keys must be. They must also be non-null.
+     *
+     * @return this {@code Builder} object
+     */
+    @CanIgnoreReturnValue
+    public ImmutableNetwork.Builder<N, E> addNode(N node) {
+      mutableNetwork.addNode(node);
+      return this;
+    }
+
+    /**
+     * Adds {@code edge} connecting {@code nodeU} to {@code nodeV}.
+     *
+     * <p>If the network is directed, {@code edge} will be directed in this network; otherwise, it
+     * will be undirected.
+     *
+     * <p><b>{@code edge} must be unique to this network</b>, just as a {@code Map} key must be. It
+     * must also be non-null.
+     *
+     * <p>If {@code nodeU} and {@code nodeV} are not already present in this network, this method
+     * will silently {@link #addNode(Object) add} {@code nodeU} and {@code nodeV} to the network.
+     *
+     * <p>If {@code edge} already connects {@code nodeU} to {@code nodeV} (in the specified order if
+     * this network {@link #isDirected()}, else in any order), then this method will have no effect.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if {@code edge} already exists in the network and does not
+     *     connect {@code nodeU} to {@code nodeV}
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsParallelEdges()} or {@link #allowsSelfLoops()}
+     */
+    @CanIgnoreReturnValue
+    public ImmutableNetwork.Builder<N, E> addEdge(N nodeU, N nodeV, E edge) {
+      mutableNetwork.addEdge(nodeU, nodeV, edge);
+      return this;
+    }
+
+    /**
+     * Adds {@code edge} connecting {@code endpoints}. In an undirected network, {@code edge} will
+     * also connect {@code nodeV} to {@code nodeU}.
+     *
+     * <p>If this network is directed, {@code edge} will be directed in this network; if it is
+     * undirected, {@code edge} will be undirected in this network.
+     *
+     * <p>If this network is directed, {@code endpoints} must be ordered.
+     *
+     * <p><b>{@code edge} must be unique to this network</b>, just as a {@code Map} key must be. It
+     * must also be non-null.
+     *
+     * <p>If either or both endpoints are not already present in this network, this method will
+     * silently {@link #addNode(Object) add} each missing endpoint to the network.
+     *
+     * <p>If {@code edge} already connects an endpoint pair equal to {@code endpoints}, then this
+     * method will have no effect.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if {@code edge} already exists in the network and connects
+     *     some other endpoint pair that is not equal to {@code endpoints}
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsParallelEdges()} or {@link #allowsSelfLoops()}
+     * @throws IllegalArgumentException if the endpoints are unordered and the network is directed
+     */
+    @CanIgnoreReturnValue
+    public ImmutableNetwork.Builder<N, E> addEdge(EndpointPair<N> endpoints, E edge) {
+      mutableNetwork.addEdge(endpoints, edge);
+      return this;
+    }
+
+    /**
+     * Returns a newly-created {@code ImmutableNetwork} based on the contents of this {@code
+     * Builder}.
+     */
+    public ImmutableNetwork<N, E> build() {
+      return ImmutableNetwork.copyOf(mutableNetwork);
+    }
+  }
 }
diff --git a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
index be46c08..f2e2386 100644
--- a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 
 /**
@@ -34,14 +35,15 @@
  * provided by this class.
  *
  * @author James Sexton
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  * @since 20.0
  */
 @Beta
 @Immutable(containerOf = {"N", "V"})
-@SuppressWarnings("Immutable") // Extends ConfigurableValueGraph but uses ImmutableMaps.
-public final class ImmutableValueGraph<N, V> extends ConfigurableValueGraph<N, V> {
+@SuppressWarnings("Immutable") // Extends StandardValueGraph but uses ImmutableMaps.
+public final class ImmutableValueGraph<N, V> extends StandardValueGraph<N, V> {
 
   private ImmutableValueGraph(ValueGraph<N, V> graph) {
     super(ValueGraphBuilder.from(graph), getNodeConnections(graph), graph.edges().size());
@@ -65,6 +67,11 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return ElementOrder.stable();
+  }
+
+  @Override
   public ImmutableGraph<N> asGraph() {
     return new ImmutableGraph<N>(this); // safe because the view is effectively immutable
   }
@@ -92,8 +99,109 @@
         };
     return graph.isDirected()
         ? DirectedGraphConnections.ofImmutable(
-            graph.predecessors(node), Maps.asMap(graph.successors(node), successorNodeToValueFn))
+            node, graph.incidentEdges(node), successorNodeToValueFn)
         : UndirectedGraphConnections.ofImmutable(
             Maps.asMap(graph.adjacentNodes(node), successorNodeToValueFn));
   }
+
+  /**
+   * A builder for creating {@link ImmutableValueGraph} instances, especially {@code static final}
+   * graphs. Example:
+   *
+   * <pre>{@code
+   * static final ImmutableValueGraph<City, Distance> CITY_ROAD_DISTANCE_GRAPH =
+   *     ValueGraphBuilder.undirected()
+   *         .<City, Distance>immutable()
+   *         .putEdgeValue(PARIS, BERLIN, kilometers(1060))
+   *         .putEdgeValue(PARIS, BRUSSELS, kilometers(317))
+   *         .putEdgeValue(BERLIN, BRUSSELS, kilometers(764))
+   *         .addNode(REYKJAVIK)
+   *         .build();
+   * }</pre>
+   *
+   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple times to build
+   * multiple graphs in series. Each new graph contains all the elements of the ones created before
+   * it.
+   *
+   * @since 28.0
+   */
+  public static class Builder<N, V> {
+
+    private final MutableValueGraph<N, V> mutableValueGraph;
+
+    Builder(ValueGraphBuilder<N, V> graphBuilder) {
+      // The incidentEdgeOrder for immutable graphs is always stable. However, we don't want to
+      // modify this builder, so we make a copy instead.
+      this.mutableValueGraph =
+          graphBuilder.copy().incidentEdgeOrder(ElementOrder.<N>stable()).build();
+    }
+
+    /**
+     * Adds {@code node} if it is not already present.
+     *
+     * <p><b>Nodes must be unique</b>, just as {@code Map} keys must be. They must also be non-null.
+     *
+     * @return this {@code Builder} object
+     */
+    @CanIgnoreReturnValue
+    public ImmutableValueGraph.Builder<N, V> addNode(N node) {
+      mutableValueGraph.addNode(node);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code nodeU} to {@code nodeV} if one is not already present, and
+     * sets a value for that edge to {@code value} (overwriting the existing value, if any).
+     *
+     * <p>If the graph is directed, the resultant edge will be directed; otherwise, it will be
+     * undirected.
+     *
+     * <p>Values do not have to be unique. However, values must be non-null.
+     *
+     * <p>If {@code nodeU} and {@code nodeV} are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} {@code nodeU} and {@code nodeV} to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     */
+    @CanIgnoreReturnValue
+    public ImmutableValueGraph.Builder<N, V> putEdgeValue(N nodeU, N nodeV, V value) {
+      mutableValueGraph.putEdgeValue(nodeU, nodeV, value);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code endpoints} if one is not already present, and sets a value for
+     * that edge to {@code value} (overwriting the existing value, if any).
+     *
+     * <p>If the graph is directed, the resultant edge will be directed; otherwise, it will be
+     * undirected.
+     *
+     * <p>If this graph is directed, {@code endpoints} must be ordered.
+     *
+     * <p>Values do not have to be unique. However, values must be non-null.
+     *
+     * <p>If either or both endpoints are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} each missing endpoint to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
+     */
+    @CanIgnoreReturnValue
+    public ImmutableValueGraph.Builder<N, V> putEdgeValue(EndpointPair<N> endpoints, V value) {
+      mutableValueGraph.putEdgeValue(endpoints, value);
+      return this;
+    }
+
+    /**
+     * Returns a newly-created {@code ImmutableValueGraph} based on the contents of this {@code
+     * Builder}.
+     */
+    public ImmutableValueGraph<N, V> build() {
+      return ImmutableValueGraph.copyOf(mutableValueGraph);
+    }
+  }
 }
diff --git a/android/guava/src/com/google/common/graph/IncidentEdgeSet.java b/android/guava/src/com/google/common/graph/IncidentEdgeSet.java
new file mode 100644
index 0000000..ba91c3b
--- /dev/null
+++ b/android/guava/src/com/google/common/graph/IncidentEdgeSet.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 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.graph;
+
+import java.util.AbstractSet;
+import java.util.Set;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+/**
+ * Abstract base class for an incident edges set that allows different implementations of {@link
+ * AbstractSet#iterator()}.
+ */
+abstract class IncidentEdgeSet<N> extends AbstractSet<EndpointPair<N>> {
+  protected final N node;
+  protected final BaseGraph<N> graph;
+
+  IncidentEdgeSet(BaseGraph<N> graph, N node) {
+    this.graph = graph;
+    this.node = node;
+  }
+
+  @Override
+  public boolean remove(Object o) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public int size() {
+    if (graph.isDirected()) {
+      return graph.inDegree(node)
+          + graph.outDegree(node)
+          - (graph.successors(node).contains(node) ? 1 : 0);
+    } else {
+      return graph.adjacentNodes(node).size();
+    }
+  }
+
+  @Override
+  public boolean contains(@NullableDecl Object obj) {
+    if (!(obj instanceof EndpointPair)) {
+      return false;
+    }
+    EndpointPair<?> endpointPair = (EndpointPair<?>) obj;
+
+    if (graph.isDirected()) {
+      if (!endpointPair.isOrdered()) {
+        return false;
+      }
+
+      Object source = endpointPair.source();
+      Object target = endpointPair.target();
+      return (node.equals(source) && graph.successors(node).contains(target))
+          || (node.equals(target) && graph.predecessors(node).contains(source));
+    } else {
+      if (endpointPair.isOrdered()) {
+        return false;
+      }
+      Set<N> adjacent = graph.adjacentNodes(node);
+      Object nodeU = endpointPair.nodeU();
+      Object nodeV = endpointPair.nodeV();
+
+      return (node.equals(nodeV) && adjacent.contains(nodeU))
+          || (node.equals(nodeU) && adjacent.contains(nodeV));
+    }
+  }
+}
diff --git a/android/guava/src/com/google/common/graph/MapIteratorCache.java b/android/guava/src/com/google/common/graph/MapIteratorCache.java
index 5aa117f..e53a7cd 100644
--- a/android/guava/src/com/google/common/graph/MapIteratorCache.java
+++ b/android/guava/src/com/google/common/graph/MapIteratorCache.java
@@ -44,28 +44,34 @@
 class MapIteratorCache<K, V> {
   private final Map<K, V> backingMap;
 
-  // Per JDK: "the behavior of a map entry is undefined if the backing map has been modified after
-  // the entry was returned by the iterator, except through the setValue operation on the map entry"
-  // As such, this field must be cleared before every map mutation.
-  @NullableDecl private transient Entry<K, V> entrySetCache;
+  /*
+   * Per JDK: "the behavior of a map entry is undefined if the backing map has been modified after
+   * the entry was returned by the iterator, except through the setValue operation on the map entry"
+   * As such, this field must be cleared before every map mutation.
+   *
+   * Note about volatile: volatile doesn't make it safe to read from a mutable graph in one thread
+   * 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;
 
   MapIteratorCache(Map<K, V> backingMap) {
     this.backingMap = checkNotNull(backingMap);
   }
 
   @CanIgnoreReturnValue
-  public V put(@NullableDecl K key, @NullableDecl V value) {
+  public final V put(@NullableDecl K key, @NullableDecl V value) {
     clearCache();
     return backingMap.put(key, value);
   }
 
   @CanIgnoreReturnValue
-  public V remove(@NullableDecl Object key) {
+  public final V remove(@NullableDecl Object key) {
     clearCache();
     return backingMap.remove(key);
   }
 
-  public void clear() {
+  public final void clear() {
     clearCache();
     backingMap.clear();
   }
@@ -98,7 +104,7 @@
           @Override
           public K next() {
             Entry<K, V> entry = entryIterator.next(); // store local reference for thread-safety
-            entrySetCache = entry;
+            cacheEntry = entry;
             return entry.getKey();
           }
         };
@@ -119,7 +125,7 @@
   // Internal methods ('protected' is still package-visible, but treat as only subclass-visible)
 
   protected V getIfCached(@NullableDecl Object key) {
-    Entry<K, V> entry = entrySetCache; // store local reference for thread-safety
+    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.
     if (entry != null && entry.getKey() == key) {
@@ -129,6 +135,6 @@
   }
 
   protected void clearCache() {
-    entrySetCache = null;
+    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 5a52b86..01c45f7 100644
--- a/android/guava/src/com/google/common/graph/MapRetrievalCache.java
+++ b/android/guava/src/com/google/common/graph/MapRetrievalCache.java
@@ -26,8 +26,9 @@
  * @author James Sexton
  */
 class MapRetrievalCache<K, V> extends MapIteratorCache<K, V> {
-  @NullableDecl private transient CacheEntry<K, V> cacheEntry1;
-  @NullableDecl private transient CacheEntry<K, V> cacheEntry2;
+  // See the note about volatile in the superclass.
+  @NullableDecl private transient volatile CacheEntry<K, V> cacheEntry1;
+  @NullableDecl private transient volatile CacheEntry<K, V> cacheEntry2;
 
   MapRetrievalCache(Map<K, V> backingMap) {
     super(backingMap);
diff --git a/android/guava/src/com/google/common/graph/Network.java b/android/guava/src/com/google/common/graph/Network.java
index 7ff638a..a7c9086 100644
--- a/android/guava/src/com/google/common/graph/Network.java
+++ b/android/guava/src/com/google/common/graph/Network.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -101,6 +102,7 @@
  * @since 20.0
  */
 @Beta
+@DoNotMock("Use NetworkBuilder to create a real instance")
 public interface Network<N, E> extends SuccessorsFunction<N>, PredecessorsFunction<N> {
   //
   // Network-level accessors
@@ -159,6 +161,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this network.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this network
    */
   Set<N> adjacentNodes(N node);
@@ -192,6 +196,8 @@
    * Returns the edges whose {@link #incidentNodes(Object) incident nodes} in this network include
    * {@code node}.
    *
+   * <p>This is equal to the union of {@link #inEdges(Object)} and {@link #outEdges(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this network
    */
   Set<E> incidentEdges(N node);
diff --git a/android/guava/src/com/google/common/graph/NetworkBuilder.java b/android/guava/src/com/google/common/graph/NetworkBuilder.java
index c2b10c7..d289ee2 100644
--- a/android/guava/src/com/google/common/graph/NetworkBuilder.java
+++ b/android/guava/src/com/google/common/graph/NetworkBuilder.java
@@ -23,7 +23,8 @@
 import com.google.common.base.Optional;
 
 /**
- * A builder for constructing instances of {@link MutableNetwork} with user-defined properties.
+ * A builder for constructing instances of {@link MutableNetwork} or {@link ImmutableNetwork} with
+ * user-defined properties.
  *
  * <p>A network built by this class will have the following properties by default:
  *
@@ -34,14 +35,25 @@
  *       elements were added
  * </ul>
  *
- * <p>Example of use:
+ * <p>Examples of use:
  *
  * <pre>{@code
- * MutableNetwork<String, Integer> flightNetwork =
+ * // Building a mutable network
+ * MutableNetwork<String, Integer> network =
  *     NetworkBuilder.directed().allowsParallelEdges(true).build();
  * flightNetwork.addEdge("LAX", "ATL", 3025);
  * flightNetwork.addEdge("LAX", "ATL", 1598);
  * flightNetwork.addEdge("ATL", "LAX", 2450);
+ *
+ * // Building a immutable network
+ * ImmutableNetwork<String, Integer> immutableNetwork =
+ *     NetworkBuilder.directed()
+ *         .allowsParallelEdges(true)
+ *         .<String, Integer>immutable()
+ *         .addEdge("LAX", "ATL", 3025)
+ *         .addEdge("LAX", "ATL", 1598)
+ *         .addEdge("ATL", "LAX", 2450)
+ *         .build();
  * }</pre>
  *
  * @author James Sexton
@@ -49,7 +61,7 @@
  * @param <N> The most general node type this builder will support. This is normally {@code Object}
  *     unless it is constrained by using a method like {@link #nodeOrder}, or the builder is
  *     constructed based on an existing {@code Network} using {@link #from(Network)}.
- * @param <N> The most general edge type this builder will support. This is normally {@code Object}
+ * @param <E> The most general edge type this builder will support. This is normally {@code Object}
  *     unless it is constrained by using a method like {@link #edgeOrder}, or the builder is
  *     constructed based on an existing {@code Network} using {@link #from(Network)}.
  * @since 20.0
@@ -92,8 +104,22 @@
   }
 
   /**
+   * Returns an {@link ImmutableNetwork.Builder} with the properties of this {@link NetworkBuilder}.
+   *
+   * <p>The returned builder can be used for populating an {@link ImmutableNetwork}.
+   *
+   * @since 28.0
+   */
+  public <N1 extends N, E1 extends E> ImmutableNetwork.Builder<N1, E1> immutable() {
+    NetworkBuilder<N1, E1> castBuilder = cast();
+    return new ImmutableNetwork.Builder<>(castBuilder);
+  }
+
+  /**
    * Specifies whether the network will allow parallel edges. Attempting to add a parallel edge to a
    * network that does not allow them will throw an {@link UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public NetworkBuilder<N, E> allowsParallelEdges(boolean allowsParallelEdges) {
     this.allowsParallelEdges = allowsParallelEdges;
@@ -104,6 +130,8 @@
    * Specifies whether the network will allow self-loops (edges that connect a node to itself).
    * Attempting to add a self-loop to a network that does not allow them will throw an {@link
    * UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public NetworkBuilder<N, E> allowsSelfLoops(boolean allowsSelfLoops) {
     this.allowsSelfLoops = allowsSelfLoops;
@@ -130,14 +158,22 @@
     return this;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Network#nodes()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Network#nodes()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <N1 extends N> NetworkBuilder<N1, E> nodeOrder(ElementOrder<N1> nodeOrder) {
     NetworkBuilder<N1, E> newBuilder = cast();
     newBuilder.nodeOrder = checkNotNull(nodeOrder);
     return newBuilder;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Network#edges()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Network#edges()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <E1 extends E> NetworkBuilder<N, E1> edgeOrder(ElementOrder<E1> edgeOrder) {
     NetworkBuilder<N, E1> newBuilder = cast();
     newBuilder.edgeOrder = checkNotNull(edgeOrder);
@@ -146,7 +182,7 @@
 
   /** Returns an empty {@link MutableNetwork} with the properties of this {@link NetworkBuilder}. */
   public <N1 extends N, E1 extends E> MutableNetwork<N1, E1> build() {
-    return new ConfigurableMutableNetwork<>(this);
+    return new StandardMutableNetwork<>(this);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/android/guava/src/com/google/common/graph/PredecessorsFunction.java b/android/guava/src/com/google/common/graph/PredecessorsFunction.java
index b8f7ea5..f9ca48a 100644
--- a/android/guava/src/com/google/common/graph/PredecessorsFunction.java
+++ b/android/guava/src/com/google/common/graph/PredecessorsFunction.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * A functional interface for <a
@@ -78,6 +79,7 @@
  * @since 23.0
  */
 @Beta
+@DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
 public interface PredecessorsFunction<N> {
 
   /**
diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableGraph.java b/android/guava/src/com/google/common/graph/StandardMutableGraph.java
similarity index 85%
rename from android/guava/src/com/google/common/graph/ConfigurableMutableGraph.java
rename to android/guava/src/com/google/common/graph/StandardMutableGraph.java
index db6bca7..41acccf 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableMutableGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardMutableGraph.java
@@ -19,7 +19,7 @@
 import com.google.common.graph.GraphConstants.Presence;
 
 /**
- * Configurable implementation of {@link MutableGraph} that supports both directed and undirected
+ * Standard implementation of {@link MutableGraph} that supports both directed and undirected
  * graphs. Instances of this class should be constructed with {@link GraphBuilder}.
  *
  * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
@@ -28,12 +28,12 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
-final class ConfigurableMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
+final class StandardMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
   private final MutableValueGraph<N, Presence> backingValueGraph;
 
   /** Constructs a {@link MutableGraph} with the properties specified in {@code builder}. */
-  ConfigurableMutableGraph(AbstractGraphBuilder<? super N> builder) {
-    this.backingValueGraph = new ConfigurableMutableValueGraph<>(builder);
+  StandardMutableGraph(AbstractGraphBuilder<? super N> builder) {
+    this.backingValueGraph = new StandardMutableValueGraph<>(builder);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java b/android/guava/src/com/google/common/graph/StandardMutableNetwork.java
similarity index 95%
rename from android/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java
rename to android/guava/src/com/google/common/graph/StandardMutableNetwork.java
index 1fcacbe..8cfe9c5 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java
+++ b/android/guava/src/com/google/common/graph/StandardMutableNetwork.java
@@ -27,7 +27,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 /**
- * Configurable implementation of {@link MutableNetwork} that supports both directed and undirected
+ * Standard implementation of {@link MutableNetwork} that supports both directed and undirected
  * graphs. Instances of this class should be constructed with {@link NetworkBuilder}.
  *
  * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
@@ -39,11 +39,11 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
-final class ConfigurableMutableNetwork<N, E> extends ConfigurableNetwork<N, E>
+final class StandardMutableNetwork<N, E> extends StandardNetwork<N, E>
     implements MutableNetwork<N, E> {
 
   /** Constructs a mutable graph with the properties specified in {@code builder}. */
-  ConfigurableMutableNetwork(NetworkBuilder<? super N, ? super E> builder) {
+  StandardMutableNetwork(NetworkBuilder<? super N, ? super E> builder) {
     super(builder);
   }
 
diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java b/android/guava/src/com/google/common/graph/StandardMutableValueGraph.java
similarity index 88%
rename from android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java
rename to android/guava/src/com/google/common/graph/StandardMutableValueGraph.java
index 38b31b7..558d8d6 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardMutableValueGraph.java
@@ -26,8 +26,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 /**
- * Configurable implementation of {@link MutableValueGraph} that supports both directed and
- * undirected graphs. Instances of this class should be constructed with {@link ValueGraphBuilder}.
+ * Standard implementation of {@link MutableValueGraph} that supports both directed and undirected
+ * graphs. Instances of this class should be constructed with {@link ValueGraphBuilder}.
  *
  * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
  * which is in O(d_node) where d_node is the degree of {@code node}.
@@ -38,12 +38,20 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
-final class ConfigurableMutableValueGraph<N, V> extends ConfigurableValueGraph<N, V>
+final class StandardMutableValueGraph<N, V> extends StandardValueGraph<N, V>
     implements MutableValueGraph<N, V> {
 
+  private final ElementOrder<N> incidentEdgeOrder;
+
   /** Constructs a mutable graph with the properties specified in {@code builder}. */
-  ConfigurableMutableValueGraph(AbstractGraphBuilder<? super N> builder) {
+  StandardMutableValueGraph(AbstractGraphBuilder<? super N> builder) {
     super(builder);
+    incidentEdgeOrder = builder.incidentEdgeOrder.cast();
+  }
+
+  @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return incidentEdgeOrder;
   }
 
   @Override
@@ -167,7 +175,7 @@
 
   private GraphConnections<N, V> newConnections() {
     return isDirected()
-        ? DirectedGraphConnections.<N, V>of()
-        : UndirectedGraphConnections.<N, V>of();
+        ? DirectedGraphConnections.<N, V>of(incidentEdgeOrder)
+        : UndirectedGraphConnections.<N, V>of(incidentEdgeOrder);
   }
 }
diff --git a/android/guava/src/com/google/common/graph/ConfigurableNetwork.java b/android/guava/src/com/google/common/graph/StandardNetwork.java
similarity index 96%
rename from android/guava/src/com/google/common/graph/ConfigurableNetwork.java
rename to android/guava/src/com/google/common/graph/StandardNetwork.java
index 7d08df1..0fc292b 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableNetwork.java
+++ b/android/guava/src/com/google/common/graph/StandardNetwork.java
@@ -30,7 +30,7 @@
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
- * Configurable implementation of {@link Network} that supports the options supplied by {@link
+ * Standard implementation of {@link Network} that supports the options supplied by {@link
  * NetworkBuilder}.
  *
  * <p>This class maintains a map of nodes to {@link NetworkConnections}. This class also maintains a
@@ -48,7 +48,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
-class ConfigurableNetwork<N, E> extends AbstractNetwork<N, E> {
+class StandardNetwork<N, E> extends AbstractNetwork<N, E> {
   private final boolean isDirected;
   private final boolean allowsParallelEdges;
   private final boolean allowsSelfLoops;
@@ -62,7 +62,7 @@
   protected final MapIteratorCache<E, N> edgeToReferenceNode; // referenceNode == source if directed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
-  ConfigurableNetwork(NetworkBuilder<? super N, ? super E> builder) {
+  StandardNetwork(NetworkBuilder<? super N, ? super E> builder) {
     this(
         builder,
         builder.nodeOrder.<N, NetworkConnections<N, E>>createMap(
@@ -74,7 +74,7 @@
    * Constructs a graph with the properties specified in {@code builder}, initialized with the given
    * node and edge maps.
    */
-  ConfigurableNetwork(
+  StandardNetwork(
       NetworkBuilder<? super N, ? super E> builder,
       Map<N, NetworkConnections<N, E>> nodeConnections,
       Map<E, N> edgeToReferenceNode) {
diff --git a/android/guava/src/com/google/common/graph/ConfigurableValueGraph.java b/android/guava/src/com/google/common/graph/StandardValueGraph.java
similarity index 89%
rename from android/guava/src/com/google/common/graph/ConfigurableValueGraph.java
rename to android/guava/src/com/google/common/graph/StandardValueGraph.java
index 666c064..4eed0be 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardValueGraph.java
@@ -20,13 +20,14 @@
 import static com.google.common.graph.GraphConstants.DEFAULT_NODE_COUNT;
 import static com.google.common.graph.Graphs.checkNonNegative;
 
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
- * Configurable implementation of {@link ValueGraph} that supports the options supplied by {@link
+ * Standard implementation of {@link ValueGraph} that supports the options supplied by {@link
  * AbstractGraphBuilder}.
  *
  * <p>This class maintains a map of nodes to {@link GraphConnections}.
@@ -42,7 +43,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
-class ConfigurableValueGraph<N, V> extends AbstractValueGraph<N, V> {
+class StandardValueGraph<N, V> extends AbstractValueGraph<N, V> {
   private final boolean isDirected;
   private final boolean allowsSelfLoops;
   private final ElementOrder<N> nodeOrder;
@@ -52,7 +53,7 @@
   protected long edgeCount; // must be updated when edges are added or removed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
-  ConfigurableValueGraph(AbstractGraphBuilder<? super N> builder) {
+  StandardValueGraph(AbstractGraphBuilder<? super N> builder) {
     this(
         builder,
         builder.nodeOrder.<N, GraphConnections<N, V>>createMap(
@@ -64,7 +65,7 @@
    * Constructs a graph with the properties specified in {@code builder}, initialized with the given
    * node map.
    */
-  ConfigurableValueGraph(
+  StandardValueGraph(
       AbstractGraphBuilder<? super N> builder,
       Map<N, GraphConnections<N, V>> nodeConnections,
       long edgeCount) {
@@ -115,6 +116,18 @@
   }
 
   @Override
+  public Set<EndpointPair<N>> incidentEdges(N node) {
+    final GraphConnections<N, V> connections = checkedConnections(node);
+
+    return new IncidentEdgeSet<N>(this, node) {
+      @Override
+      public Iterator<EndpointPair<N>> iterator() {
+        return connections.incidentEdgeIterator(node);
+      }
+    };
+  }
+
+  @Override
   public boolean hasEdgeConnecting(N nodeU, N nodeV) {
     return hasEdgeConnecting_internal(checkNotNull(nodeU), checkNotNull(nodeV));
   }
diff --git a/android/guava/src/com/google/common/graph/SuccessorsFunction.java b/android/guava/src/com/google/common/graph/SuccessorsFunction.java
index ed60a5d..f74f437 100644
--- a/android/guava/src/com/google/common/graph/SuccessorsFunction.java
+++ b/android/guava/src/com/google/common/graph/SuccessorsFunction.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * A functional interface for <a
@@ -78,6 +79,7 @@
  * @since 23.0
  */
 @Beta
+@DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
 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 713e54b..0d8e6f9 100644
--- a/android/guava/src/com/google/common/graph/Traverser.java
+++ b/android/guava/src/com/google/common/graph/Traverser.java
@@ -22,13 +22,11 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.UnmodifiableIterator;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.Queue;
 import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -62,7 +60,15 @@
  * @since 23.1
  */
 @Beta
+@DoNotMock(
+    "Call forGraph or forTree, passing a lambda or a Graph with the desired edges (built with"
+        + " GraphBuilder)")
 public abstract class Traverser<N> {
+  private final SuccessorsFunction<N> successorFunction;
+
+  private Traverser(SuccessorsFunction<N> successorFunction) {
+    this.successorFunction = checkNotNull(successorFunction);
+  }
 
   /**
    * Creates a new traverser for the given general {@code graph}.
@@ -88,9 +94,13 @@
    *
    * @param graph {@link SuccessorsFunction} representing a general graph that may have cycles.
    */
-  public static <N> Traverser<N> forGraph(SuccessorsFunction<N> graph) {
-    checkNotNull(graph);
-    return new GraphTraverser<>(graph);
+  public static <N> Traverser<N> forGraph(final SuccessorsFunction<N> graph) {
+    return new Traverser<N>(graph) {
+      @Override
+      Traversal<N> newTraversal() {
+        return Traversal.inGraph(graph);
+      }
+    };
   }
 
   /**
@@ -166,15 +176,19 @@
    * @param tree {@link SuccessorsFunction} representing a directed acyclic graph that has at most
    *     one path between any two nodes
    */
-  public static <N> Traverser<N> forTree(SuccessorsFunction<N> tree) {
-    checkNotNull(tree);
+  public static <N> Traverser<N> forTree(final SuccessorsFunction<N> tree) {
     if (tree instanceof BaseGraph) {
       checkArgument(((BaseGraph<?>) tree).isDirected(), "Undirected graphs can never be trees.");
     }
     if (tree instanceof Network) {
       checkArgument(((Network<?, ?>) tree).isDirected(), "Undirected networks can never be trees.");
     }
-    return new TreeTraverser<>(tree);
+    return new Traverser<N>(tree) {
+      @Override
+      Traversal<N> newTraversal() {
+        return Traversal.inTree(tree);
+      }
+    };
   }
 
   /**
@@ -208,7 +222,9 @@
    *
    * @throws IllegalArgumentException if {@code startNode} is not an element of the graph
    */
-  public abstract Iterable<N> breadthFirst(N startNode);
+  public final Iterable<N> breadthFirst(N startNode) {
+    return breadthFirst(ImmutableSet.of(startNode));
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from any of the {@code
@@ -220,7 +236,15 @@
    * @see #breadthFirst(Object)
    * @since 24.1
    */
-  public abstract Iterable<N> breadthFirst(Iterable<? extends N> startNodes);
+  public final Iterable<N> breadthFirst(Iterable<? extends N> startNodes) {
+    final ImmutableSet<N> validated = validate(startNodes);
+    return new Iterable<N>() {
+      @Override
+      public Iterator<N> iterator() {
+        return newTraversal().breadthFirst(validated.iterator());
+      }
+    };
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from {@code startNode}, in
@@ -253,7 +277,9 @@
    *
    * @throws IllegalArgumentException if {@code startNode} is not an element of the graph
    */
-  public abstract Iterable<N> depthFirstPreOrder(N startNode);
+  public final Iterable<N> depthFirstPreOrder(N startNode) {
+    return depthFirstPreOrder(ImmutableSet.of(startNode));
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from any of the {@code
@@ -265,7 +291,15 @@
    * @see #depthFirstPreOrder(Object)
    * @since 24.1
    */
-  public abstract Iterable<N> depthFirstPreOrder(Iterable<? extends N> startNodes);
+  public final Iterable<N> depthFirstPreOrder(Iterable<? extends N> startNodes) {
+    final ImmutableSet<N> validated = validate(startNodes);
+    return new Iterable<N>() {
+      @Override
+      public Iterator<N> iterator() {
+        return newTraversal().preOrder(validated.iterator());
+      }
+    };
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from {@code startNode}, in
@@ -298,7 +332,9 @@
    *
    * @throws IllegalArgumentException if {@code startNode} is not an element of the graph
    */
-  public abstract Iterable<N> depthFirstPostOrder(N startNode);
+  public final Iterable<N> depthFirstPostOrder(N startNode) {
+    return depthFirstPostOrder(ImmutableSet.of(startNode));
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from any of the {@code
@@ -310,352 +346,157 @@
    * @see #depthFirstPostOrder(Object)
    * @since 24.1
    */
-  public abstract Iterable<N> depthFirstPostOrder(Iterable<? extends N> startNodes);
-
-  // Avoid subclasses outside of this class
-  private Traverser() {}
-
-  private static final class GraphTraverser<N> extends Traverser<N> {
-    private final SuccessorsFunction<N> graph;
-
-    GraphTraverser(SuccessorsFunction<N> graph) {
-      this.graph = checkNotNull(graph);
-    }
-
-    @Override
-    public Iterable<N> breadthFirst(final N startNode) {
-      checkNotNull(startNode);
-      return breadthFirst(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> breadthFirst(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInGraph(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new BreadthFirstIterator(startNodes);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPreOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInGraph(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstIterator(startNodes, Order.PREORDER);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPostOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInGraph(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstIterator(startNodes, Order.POSTORDER);
-        }
-      };
-    }
-
-    @SuppressWarnings("CheckReturnValue")
-    private void checkThatNodeIsInGraph(N startNode) {
-      // successors() throws an IllegalArgumentException for nodes that are not an element of the
-      // graph.
-      graph.successors(startNode);
-    }
-
-    private final class BreadthFirstIterator extends UnmodifiableIterator<N> {
-      private final Queue<N> queue = new ArrayDeque<>();
-      private final Set<N> visited = new HashSet<>();
-
-      BreadthFirstIterator(Iterable<? extends N> roots) {
-        for (N root : roots) {
-          // add all roots to the queue, skipping duplicates
-          if (visited.add(root)) {
-            queue.add(root);
-          }
-        }
-      }
-
+  public final Iterable<N> depthFirstPostOrder(Iterable<? extends N> startNodes) {
+    final ImmutableSet<N> validated = validate(startNodes);
+    return new Iterable<N>() {
       @Override
-      public boolean hasNext() {
-        return !queue.isEmpty();
+      public Iterator<N> iterator() {
+        return newTraversal().postOrder(validated.iterator());
       }
-
-      @Override
-      public N next() {
-        N current = queue.remove();
-        for (N neighbor : graph.successors(current)) {
-          if (visited.add(neighbor)) {
-            queue.add(neighbor);
-          }
-        }
-        return current;
-      }
-    }
-
-    private final class DepthFirstIterator extends AbstractIterator<N> {
-      private final Deque<NodeAndSuccessors> stack = new ArrayDeque<>();
-      private final Set<N> visited = new HashSet<>();
-      private final Order order;
-
-      DepthFirstIterator(Iterable<? extends N> roots, Order order) {
-        stack.push(new NodeAndSuccessors(null, roots));
-        this.order = order;
-      }
-
-      @Override
-      protected N computeNext() {
-        while (true) {
-          if (stack.isEmpty()) {
-            return endOfData();
-          }
-          NodeAndSuccessors nodeAndSuccessors = stack.getFirst();
-          boolean firstVisit = visited.add(nodeAndSuccessors.node);
-          boolean lastVisit = !nodeAndSuccessors.successorIterator.hasNext();
-          boolean produceNode =
-              (firstVisit && order == Order.PREORDER) || (lastVisit && order == Order.POSTORDER);
-          if (lastVisit) {
-            stack.pop();
-          } else {
-            // we need to push a neighbor, but only if we haven't already seen it
-            N successor = nodeAndSuccessors.successorIterator.next();
-            if (!visited.contains(successor)) {
-              stack.push(withSuccessors(successor));
-            }
-          }
-          if (produceNode && nodeAndSuccessors.node != null) {
-            return nodeAndSuccessors.node;
-          }
-        }
-      }
-
-      NodeAndSuccessors withSuccessors(N node) {
-        return new NodeAndSuccessors(node, graph.successors(node));
-      }
-
-      /** A simple tuple of a node and a partially iterated {@link Iterator} of its successors. */
-      private final class NodeAndSuccessors {
-        @NullableDecl final N node;
-        final Iterator<? extends N> successorIterator;
-
-        NodeAndSuccessors(@NullableDecl N node, Iterable<? extends N> successors) {
-          this.node = node;
-          this.successorIterator = successors.iterator();
-        }
-      }
-    }
+    };
   }
 
-  private static final class TreeTraverser<N> extends Traverser<N> {
-    private final SuccessorsFunction<N> tree;
+  abstract Traversal<N> newTraversal();
 
-    TreeTraverser(SuccessorsFunction<N> tree) {
-      this.tree = checkNotNull(tree);
+  @SuppressWarnings("CheckReturnValue")
+  private ImmutableSet<N> validate(Iterable<? extends N> startNodes) {
+    ImmutableSet<N> copy = ImmutableSet.copyOf(startNodes);
+    for (N node : copy) {
+      successorFunction.successors(node); // Will throw if node doesn't exist
     }
-
-    @Override
-    public Iterable<N> breadthFirst(final N startNode) {
-      checkNotNull(startNode);
-      return breadthFirst(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> breadthFirst(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInTree(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new BreadthFirstIterator(startNodes);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPreOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N node : startNodes) {
-        checkThatNodeIsInTree(node);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstPreOrderIterator(startNodes);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPostOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInTree(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstPostOrderIterator(startNodes);
-        }
-      };
-    }
-
-    @SuppressWarnings("CheckReturnValue")
-    private void checkThatNodeIsInTree(N startNode) {
-      // successors() throws an IllegalArgumentException for nodes that are not an element of the
-      // graph.
-      tree.successors(startNode);
-    }
-
-    private final class BreadthFirstIterator extends UnmodifiableIterator<N> {
-      private final Queue<N> queue = new ArrayDeque<>();
-
-      BreadthFirstIterator(Iterable<? extends N> roots) {
-        for (N root : roots) {
-          queue.add(root);
-        }
-      }
-
-      @Override
-      public boolean hasNext() {
-        return !queue.isEmpty();
-      }
-
-      @Override
-      public N next() {
-        N current = queue.remove();
-        Iterables.addAll(queue, tree.successors(current));
-        return current;
-      }
-    }
-
-    private final class DepthFirstPreOrderIterator extends UnmodifiableIterator<N> {
-      private final Deque<Iterator<? extends N>> stack = new ArrayDeque<>();
-
-      DepthFirstPreOrderIterator(Iterable<? extends N> roots) {
-        stack.addLast(roots.iterator());
-      }
-
-      @Override
-      public boolean hasNext() {
-        return !stack.isEmpty();
-      }
-
-      @Override
-      public N next() {
-        Iterator<? extends N> iterator = stack.getLast(); // throws NoSuchElementException if empty
-        N result = checkNotNull(iterator.next());
-        if (!iterator.hasNext()) {
-          stack.removeLast();
-        }
-        Iterator<? extends N> childIterator = tree.successors(result).iterator();
-        if (childIterator.hasNext()) {
-          stack.addLast(childIterator);
-        }
-        return result;
-      }
-    }
-
-    private final class DepthFirstPostOrderIterator extends AbstractIterator<N> {
-      private final ArrayDeque<NodeAndChildren> stack = new ArrayDeque<>();
-
-      DepthFirstPostOrderIterator(Iterable<? extends N> roots) {
-        stack.addLast(new NodeAndChildren(null, roots));
-      }
-
-      @Override
-      protected N computeNext() {
-        while (!stack.isEmpty()) {
-          NodeAndChildren top = stack.getLast();
-          if (top.childIterator.hasNext()) {
-            N child = top.childIterator.next();
-            stack.addLast(withChildren(child));
-          } else {
-            stack.removeLast();
-            if (top.node != null) {
-              return top.node;
-            }
-          }
-        }
-        return endOfData();
-      }
-
-      NodeAndChildren withChildren(N node) {
-        return new NodeAndChildren(node, tree.successors(node));
-      }
-
-      /** A simple tuple of a node and a partially iterated {@link Iterator} of its children. */
-      private final class NodeAndChildren {
-        @NullableDecl final N node;
-        final Iterator<? extends N> childIterator;
-
-        NodeAndChildren(@NullableDecl N node, Iterable<? extends N> children) {
-          this.node = node;
-          this.childIterator = children.iterator();
-        }
-      }
-    }
+    return copy;
   }
 
-  private enum Order {
-    PREORDER,
-    POSTORDER
+  /**
+   * Abstracts away the difference between traversing a graph vs. a tree. For a tree, we just take
+   * the next element from the next non-empty iterator; for graph, we need to loop through the next
+   * non-empty iterator to find first unvisited node.
+   */
+  private abstract static class Traversal<N> {
+    final SuccessorsFunction<N> successorFunction;
+
+    Traversal(SuccessorsFunction<N> successorFunction) {
+      this.successorFunction = successorFunction;
+    }
+
+    static <N> Traversal<N> inGraph(SuccessorsFunction<N> graph) {
+      final Set<N> visited = new HashSet<>();
+      return new Traversal<N>(graph) {
+        @Override
+        N visitNext(Deque<Iterator<? extends N>> horizon) {
+          Iterator<? extends N> top = horizon.getFirst();
+          while (top.hasNext()) {
+            N element = checkNotNull(top.next());
+            if (visited.add(element)) {
+              return element;
+            }
+          }
+          horizon.removeFirst();
+          return null;
+        }
+      };
+    }
+
+    static <N> Traversal<N> inTree(SuccessorsFunction<N> tree) {
+      return new Traversal<N>(tree) {
+        @Override
+        N visitNext(Deque<Iterator<? extends N>> horizon) {
+          Iterator<? extends N> top = horizon.getFirst();
+          if (top.hasNext()) {
+            return checkNotNull(top.next());
+          }
+          horizon.removeFirst();
+          return null;
+        }
+      };
+    }
+
+    final Iterator<N> breadthFirst(Iterator<? extends N> startNodes) {
+      return topDown(startNodes, InsertionOrder.BACK);
+    }
+
+    final Iterator<N> preOrder(Iterator<? extends N> startNodes) {
+      return topDown(startNodes, InsertionOrder.FRONT);
+    }
+
+    /**
+     * In top-down traversal, an ancestor node is always traversed before any of its descendant
+     * nodes. The traversal order among descendant nodes (particularly aunts and nieces) are
+     * determined by the {@code InsertionOrder} parameter: nieces are placed at the FRONT before
+     * aunts for pre-order; while in BFS they are placed at the BACK after aunts.
+     */
+    private Iterator<N> topDown(Iterator<? extends N> startNodes, final InsertionOrder order) {
+      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+      horizon.add(startNodes);
+      return new AbstractIterator<N>() {
+        @Override
+        protected N computeNext() {
+          do {
+            N next = visitNext(horizon);
+            if (next != null) {
+              Iterator<? extends N> successors = successorFunction.successors(next).iterator();
+              if (successors.hasNext()) {
+                // BFS: horizon.addLast(successors)
+                // Pre-order: horizon.addFirst(successors)
+                order.insertInto(horizon, successors);
+              }
+              return next;
+            }
+          } while (!horizon.isEmpty());
+          return endOfData();
+        }
+      };
+    }
+
+    final Iterator<N> postOrder(Iterator<? extends N> startNodes) {
+      final Deque<N> ancestorStack = new ArrayDeque<>();
+      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+      horizon.add(startNodes);
+      return new AbstractIterator<N>() {
+        @Override
+        protected N computeNext() {
+          for (N next = visitNext(horizon); next != null; next = visitNext(horizon)) {
+            Iterator<? extends N> successors = successorFunction.successors(next).iterator();
+            if (!successors.hasNext()) {
+              return next;
+            }
+            horizon.addFirst(successors);
+            ancestorStack.push(next);
+          }
+          return ancestorStack.isEmpty() ? endOfData() : ancestorStack.pop();
+        }
+      };
+    }
+
+    /**
+     * Visits the next node from the top iterator of {@code horizon} and returns the visited node.
+     * Null is returned to indicate reaching the end of the top iterator.
+     *
+     * <p>For example, if horizon is {@code [[a, b], [c, d], [e]]}, {@code visitNext()} will return
+     * {@code [a, b, null, c, d, null, e, null]} sequentially, encoding the topological structure.
+     * (Note, however, that the callers of {@code visitNext()} often insert additional iterators
+     * into {@code horizon} between calls to {@code visitNext()}. This causes them to receive
+     * additional values interleaved with those shown above.)
+     */
+    @NullableDecl
+    abstract N visitNext(Deque<Iterator<? extends N>> horizon);
+  }
+
+  /** Poor man's method reference for {@code Deque::addFirst} and {@code Deque::addLast}. */
+  private enum InsertionOrder {
+    FRONT {
+      @Override
+      <T> void insertInto(Deque<T> deque, T value) {
+        deque.addFirst(value);
+      }
+    },
+    BACK {
+      @Override
+      <T> void insertInto(Deque<T> deque, T value) {
+        deque.addLast(value);
+      }
+    };
+
+    abstract <T> void insertInto(Deque<T> deque, T value);
   }
 }
diff --git a/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java b/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
index 9636ccb..49689f9 100644
--- a/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
@@ -20,9 +20,13 @@
 import static com.google.common.graph.GraphConstants.INNER_CAPACITY;
 import static com.google.common.graph.GraphConstants.INNER_LOAD_FACTOR;
 
+import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterators;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -40,8 +44,17 @@
     this.adjacentNodeValues = checkNotNull(adjacentNodeValues);
   }
 
-  static <N, V> UndirectedGraphConnections<N, V> of() {
-    return new UndirectedGraphConnections<>(new HashMap<N, V>(INNER_CAPACITY, INNER_LOAD_FACTOR));
+  static <N, V> UndirectedGraphConnections<N, V> of(ElementOrder<N> incidentEdgeOrder) {
+    switch (incidentEdgeOrder.type()) {
+      case UNORDERED:
+        return new UndirectedGraphConnections<>(
+            new HashMap<N, V>(INNER_CAPACITY, INNER_LOAD_FACTOR));
+      case STABLE:
+        return new UndirectedGraphConnections<>(
+            new LinkedHashMap<N, V>(INNER_CAPACITY, INNER_LOAD_FACTOR));
+      default:
+        throw new AssertionError(incidentEdgeOrder.type());
+    }
   }
 
   static <N, V> UndirectedGraphConnections<N, V> ofImmutable(Map<N, V> adjacentNodeValues) {
@@ -64,6 +77,18 @@
   }
 
   @Override
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+    return Iterators.transform(
+        adjacentNodeValues.keySet().iterator(),
+        new Function<N, EndpointPair<N>>() {
+          @Override
+          public EndpointPair<N> apply(N incidentNode) {
+            return EndpointPair.unordered(thisNode, incidentNode);
+          }
+        });
+  }
+
+  @Override
   public V value(N node) {
     return adjacentNodeValues.get(node);
   }
diff --git a/android/guava/src/com/google/common/graph/ValueGraph.java b/android/guava/src/com/google/common/graph/ValueGraph.java
index 7df111c..b7dd61c 100644
--- a/android/guava/src/com/google/common/graph/ValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ValueGraph.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import java.util.Collection;
 import java.util.Set;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -149,6 +150,16 @@
   @Override
   ElementOrder<N> nodeOrder();
 
+  /**
+   * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of
+   * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link
+   * #successors(Object)} and {@link #incidentEdges(Object)}.
+   *
+   * @since 29.0
+   */
+  @Override
+  ElementOrder<N> incidentEdgeOrder();
+
   //
   // Element-level accessors
   //
@@ -156,6 +167,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this graph.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    */
   @Override
@@ -189,6 +202,8 @@
   /**
    * Returns the edges in this graph whose endpoints include {@code node}.
    *
+   * <p>This is equal to the union of incoming and outgoing edges.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    * @since 24.0
    */
diff --git a/android/guava/src/com/google/common/graph/ValueGraphBuilder.java b/android/guava/src/com/google/common/graph/ValueGraphBuilder.java
index c41422a..4fc752d 100644
--- a/android/guava/src/com/google/common/graph/ValueGraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/ValueGraphBuilder.java
@@ -16,6 +16,7 @@
 
 package com.google.common.graph;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.graph.Graphs.checkNonNegative;
 
@@ -23,7 +24,8 @@
 import com.google.common.base.Optional;
 
 /**
- * A builder for constructing instances of {@link MutableValueGraph} with user-defined properties.
+ * A builder for constructing instances of {@link MutableValueGraph} or {@link ImmutableValueGraph}
+ * with user-defined properties.
  *
  * <p>A graph built by this class will have the following properties by default:
  *
@@ -32,14 +34,25 @@
  *   <li>orders {@link Graph#nodes()} in the order in which the elements were added
  * </ul>
  *
- * <p>Example of use:
+ * <p>Examples of use:
  *
  * <pre>{@code
+ * // Building a mutable value graph
  * MutableValueGraph<String, Double> graph =
  *     ValueGraphBuilder.undirected().allowsSelfLoops(true).build();
  * graph.putEdgeValue("San Francisco", "San Francisco", 0.0);
  * graph.putEdgeValue("San Jose", "San Jose", 0.0);
  * graph.putEdgeValue("San Francisco", "San Jose", 48.4);
+ *
+ * // Building an immutable value graph
+ * ImmutableValueGraph<String, Double> immutableGraph =
+ *     ValueGraphBuilder.undirected()
+ *         .allowsSelfLoops(true)
+ *         .<String, Double>immutable()
+ *         .putEdgeValue("San Francisco", "San Francisco", 0.0)
+ *         .putEdgeValue("San Jose", "San Jose", 0.0)
+ *         .putEdgeValue("San Francisco", "San Jose", 48.4)
+ *         .build();
  * }</pre>
  *
  * @author James Sexton
@@ -81,13 +94,32 @@
   public static <N, V> ValueGraphBuilder<N, V> from(ValueGraph<N, V> graph) {
     return new ValueGraphBuilder<N, V>(graph.isDirected())
         .allowsSelfLoops(graph.allowsSelfLoops())
-        .nodeOrder(graph.nodeOrder());
+        .nodeOrder(graph.nodeOrder())
+        .incidentEdgeOrder(graph.incidentEdgeOrder());
+  }
+
+  /**
+   * Returns an {@link ImmutableValueGraph.Builder} with the properties of this {@link
+   * ValueGraphBuilder}.
+   *
+   * <p>The returned builder can be used for populating an {@link ImmutableValueGraph}.
+   *
+   * <p>Note that the returned builder will always have {@link #incidentEdgeOrder} set to {@link
+   * ElementOrder#stable()}, regardless of the value that was set in this builder.
+   *
+   * @since 28.0
+   */
+  public <N1 extends N, V1 extends V> ImmutableValueGraph.Builder<N1, V1> immutable() {
+    ValueGraphBuilder<N1, V1> castBuilder = cast();
+    return new ImmutableValueGraph.Builder<>(castBuilder);
   }
 
   /**
    * Specifies whether the graph will allow self-loops (edges that connect a node to itself).
    * Attempting to add a self-loop to a graph that does not allow them will throw an {@link
    * UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public ValueGraphBuilder<N, V> allowsSelfLoops(boolean allowsSelfLoops) {
     this.allowsSelfLoops = allowsSelfLoops;
@@ -104,7 +136,11 @@
     return this;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Graph#nodes()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Graph#nodes()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <N1 extends N> ValueGraphBuilder<N1, V> nodeOrder(ElementOrder<N1> nodeOrder) {
     ValueGraphBuilder<N1, V> newBuilder = cast();
     newBuilder.nodeOrder = checkNotNull(nodeOrder);
@@ -112,11 +148,45 @@
   }
 
   /**
+   * Specifies the order of iteration for the elements of {@link ValueGraph#edges()}, {@link
+   * ValueGraph#adjacentNodes(Object)}, {@link ValueGraph#predecessors(Object)}, {@link
+   * ValueGraph#successors(Object)} and {@link ValueGraph#incidentEdges(Object)}.
+   *
+   * <p>The default value is {@link ElementOrder#unordered() unordered} for mutable graphs. For
+   * immutable graphs, this value is ignored; they always have a {@link ElementOrder#stable()
+   * stable} order.
+   *
+   * @throws IllegalArgumentException if {@code incidentEdgeOrder} is not either {@code
+   *     ElementOrder.unordered()} or {@code ElementOrder.stable()}.
+   * @since 29.0
+   */
+  public <N1 extends N> ValueGraphBuilder<N1, V> incidentEdgeOrder(
+      ElementOrder<N1> incidentEdgeOrder) {
+    checkArgument(
+        incidentEdgeOrder.type() == ElementOrder.Type.UNORDERED
+            || incidentEdgeOrder.type() == ElementOrder.Type.STABLE,
+        "The given elementOrder (%s) is unsupported. incidentEdgeOrder() only supports"
+            + " ElementOrder.unordered() and ElementOrder.stable().",
+        incidentEdgeOrder);
+    ValueGraphBuilder<N1, V> newBuilder = cast();
+    newBuilder.incidentEdgeOrder = checkNotNull(incidentEdgeOrder);
+    return newBuilder;
+  }
+  /**
    * Returns an empty {@link MutableValueGraph} with the properties of this {@link
    * ValueGraphBuilder}.
    */
   public <N1 extends N, V1 extends V> MutableValueGraph<N1, V1> build() {
-    return new ConfigurableMutableValueGraph<>(this);
+    return new StandardMutableValueGraph<>(this);
+  }
+
+  ValueGraphBuilder<N, V> copy() {
+    ValueGraphBuilder<N, V> newBuilder = new ValueGraphBuilder<>(directed);
+    newBuilder.allowsSelfLoops = allowsSelfLoops;
+    newBuilder.nodeOrder = nodeOrder;
+    newBuilder.expectedNodeCount = expectedNodeCount;
+    newBuilder.incidentEdgeOrder = incidentEdgeOrder;
+    return newBuilder;
   }
 
   @SuppressWarnings("unchecked")
diff --git a/android/guava/src/com/google/common/hash/AbstractByteHasher.java b/android/guava/src/com/google/common/hash/AbstractByteHasher.java
index 668320e..48d48c4 100644
--- a/android/guava/src/com/google/common/hash/AbstractByteHasher.java
+++ b/android/guava/src/com/google/common/hash/AbstractByteHasher.java
@@ -54,7 +54,7 @@
   protected void update(ByteBuffer b) {
     if (b.hasArray()) {
       update(b.array(), b.arrayOffset() + b.position(), b.remaining());
-      b.position(b.limit());
+      Java8Compatibility.position(b, b.limit());
     } else {
       for (int remaining = b.remaining(); remaining > 0; remaining--) {
         update(b.get());
@@ -67,7 +67,7 @@
     try {
       update(scratch.array(), 0, bytes);
     } finally {
-      scratch.clear();
+      Java8Compatibility.clear(scratch);
     }
     return this;
   }
diff --git a/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
index 525ead8..048e6c2 100644
--- a/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
+++ b/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
@@ -98,7 +98,7 @@
       public Hasher putBytes(ByteBuffer bytes) {
         int pos = bytes.position();
         for (Hasher hasher : hashers) {
-          bytes.position(pos);
+          Java8Compatibility.position(bytes, pos);
           hasher.putBytes(bytes);
         }
         return this;
diff --git a/android/guava/src/com/google/common/hash/AbstractHasher.java b/android/guava/src/com/google/common/hash/AbstractHasher.java
index 3452fb3..326aa8d 100644
--- a/android/guava/src/com/google/common/hash/AbstractHasher.java
+++ b/android/guava/src/com/google/common/hash/AbstractHasher.java
@@ -73,7 +73,7 @@
   public Hasher putBytes(ByteBuffer b) {
     if (b.hasArray()) {
       putBytes(b.array(), b.arrayOffset() + b.position(), b.remaining());
-      b.position(b.limit());
+      Java8Compatibility.position(b, b.limit());
     } else {
       for (int remaining = b.remaining(); remaining > 0; remaining--) {
         putByte(b.get());
diff --git a/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java b/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java
index ae05d1c..67de74b 100644
--- a/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java
+++ b/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java
@@ -80,13 +80,13 @@
    * <p>This implementation simply pads with zeros and delegates to {@link #process(ByteBuffer)}.
    */
   protected void processRemaining(ByteBuffer bb) {
-    bb.position(bb.limit()); // move at the end
-    bb.limit(chunkSize + 7); // get ready to pad with longs
+    Java8Compatibility.position(bb, bb.limit()); // move at the end
+    Java8Compatibility.limit(bb, chunkSize + 7); // get ready to pad with longs
     while (bb.position() < chunkSize) {
       bb.putLong(0);
     }
-    bb.limit(chunkSize);
-    bb.flip();
+    Java8Compatibility.limit(bb, chunkSize);
+    Java8Compatibility.flip(bb);
     process(bb);
   }
 
@@ -179,10 +179,10 @@
   @Override
   public final HashCode hash() {
     munch();
-    buffer.flip();
+    Java8Compatibility.flip(buffer);
     if (buffer.remaining() > 0) {
       processRemaining(buffer);
-      buffer.position(buffer.limit());
+      Java8Compatibility.position(buffer, buffer.limit());
     }
     return makeHash();
   }
@@ -203,7 +203,7 @@
   }
 
   private void munch() {
-    buffer.flip();
+    Java8Compatibility.flip(buffer);
     while (buffer.remaining() >= chunkSize) {
       // we could limit the buffer to ensure process() does not read more than
       // chunkSize number of bytes, but we trust the implementations
diff --git a/android/guava/src/com/google/common/hash/BloomFilter.java b/android/guava/src/com/google/common/hash/BloomFilter.java
index e8c9bba..27187f7 100644
--- a/android/guava/src/com/google/common/hash/BloomFilter.java
+++ b/android/guava/src/com/google/common/hash/BloomFilter.java
@@ -176,7 +176,6 @@
    * @since 14.0 (since 11.0 as expectedFalsePositiveProbability())
    */
   public double expectedFpp() {
-    // You down with FPP? (Yeah you know me!) Who's down with FPP? (Every last homie!)
     return Math.pow((double) bits.bitCount() / bitSize(), numHashFunctions);
   }
 
diff --git a/android/guava/src/com/google/common/hash/BloomFilterStrategies.java b/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
index db0f258..ade2940 100644
--- a/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
+++ b/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
@@ -151,7 +151,12 @@
     private final LongAddable bitCount;
 
     LockFreeBitArray(long bits) {
-      this(new long[Ints.checkedCast(LongMath.divide(bits, 64, RoundingMode.CEILING))]);
+      checkArgument(bits > 0, "data length is zero!");
+      // Avoid delegating to this(long[]), since AtomicLongArray(long[]) will clone its input and
+      // thus double memory usage.
+      this.data =
+          new AtomicLongArray(Ints.checkedCast(LongMath.divide(bits, 64, RoundingMode.CEILING)));
+      this.bitCount = LongAddables.create();
     }
 
     // Used by serialization
diff --git a/android/guava/src/com/google/common/hash/Funnel.java b/android/guava/src/com/google/common/hash/Funnel.java
index 077ef7a..2c6a7b9 100644
--- a/android/guava/src/com/google/common/hash/Funnel.java
+++ b/android/guava/src/com/google/common/hash/Funnel.java
@@ -15,6 +15,7 @@
 package com.google.common.hash;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 
 /**
@@ -41,6 +42,7 @@
  * @since 11.0
  */
 @Beta
+@DoNotMock("Implement with a lambda")
 public interface Funnel<T> extends Serializable {
 
   /**
diff --git a/android/guava/src/com/google/common/hash/Java8Compatibility.java b/android/guava/src/com/google/common/hash/Java8Compatibility.java
new file mode 100644
index 0000000..52f71e7
--- /dev/null
+++ b/android/guava/src/com/google/common/hash/Java8Compatibility.java
@@ -0,0 +1,43 @@
+/*
+ * 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.hash;
+
+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
+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/hash/LittleEndianByteArray.java b/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
index 91f5737..22ef4f0 100644
--- a/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
+++ b/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
@@ -232,16 +232,16 @@
     LittleEndianBytes theGetter = JavaLittleEndianBytes.INSTANCE;
     try {
       /*
-        UnsafeByteArray uses Unsafe.getLong() in an unsupported way, which is known to cause crashes
-        on Android when running in 32-bit mode. For maximum safety, we shouldn't use
-        Unsafe.getLong() at all, but the performance benefit on x86_64 is too great to ignore, so as
-        a compromise, we enable the optimization only on platforms that we specifically know to
-        work.
-
-        In the future, the use of Unsafe.getLong() should be replaced by ByteBuffer.getLong(), which
-        will have an efficient native implementation in JDK 9.
-
-      */
+       * UnsafeByteArray uses Unsafe.getLong() in an unsupported way, which is known to cause
+       * crashes on Android when running in 32-bit mode. For maximum safety, we shouldn't use
+       * Unsafe.getLong() at all, but the performance benefit on x86_64 is too great to ignore, so
+       * as a compromise, we enable the optimization only on platforms that we specifically know to
+       * work.
+       *
+       * In the future, the use of Unsafe.getLong() should be replaced by ByteBuffer.getLong(),
+       * which will have an efficient native implementation in JDK 9.
+       *
+       */
       final String arch = System.getProperty("os.arch");
       if ("amd64".equals(arch)) {
         theGetter =
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 83e60e7..4403b20 100644
--- a/android/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
+++ b/android/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
@@ -166,7 +166,7 @@
     }
 
     @Override
-    public HashCode makeHash() {
+    protected HashCode makeHash() {
       h1 ^= length;
       h2 ^= length;
 
diff --git a/android/guava/src/com/google/common/hash/SipHashFunction.java b/android/guava/src/com/google/common/hash/SipHashFunction.java
index 6dd126a..546fae2 100644
--- a/android/guava/src/com/google/common/hash/SipHashFunction.java
+++ b/android/guava/src/com/google/common/hash/SipHashFunction.java
@@ -143,7 +143,7 @@
     }
 
     @Override
-    public HashCode makeHash() {
+    protected HashCode makeHash() {
       // End with a byte encoding the positive integer b mod 256.
       finalM ^= b << 56;
       processM(finalM);
diff --git a/android/guava/src/com/google/common/io/BaseEncoding.java b/android/guava/src/com/google/common/io/BaseEncoding.java
index d7f87e6..f926c17 100644
--- a/android/guava/src/com/google/common/io/BaseEncoding.java
+++ b/android/guava/src/com/google/common/io/BaseEncoding.java
@@ -28,13 +28,13 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Ascii;
 import com.google.common.base.Objects;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -772,6 +772,27 @@
         }
 
         @Override
+        public int read(byte[] buf, int off, int len) throws IOException {
+          // Overriding this to work around the fact that InputStream's default implementation of
+          // this method will silently swallow exceptions thrown by the single-byte read() method
+          // (other than on the first call to it), which in this case can cause invalid encoded
+          // strings to not throw an exception.
+          // See https://github.com/google/guava/issues/3542
+          checkPositionIndexes(off, off + len, buf.length);
+
+          int i = off;
+          for (; i < off + len; i++) {
+            int b = read();
+            if (b == -1) {
+              int read = i - off;
+              return read == 0 ? -1 : read;
+            }
+            buf[i] = (byte) b;
+          }
+          return i - off;
+        }
+
+        @Override
         public void close() throws IOException {
           reader.close();
         }
@@ -810,8 +831,8 @@
       return new SeparatedBaseEncoding(this, separator, afterEveryChars);
     }
 
-    @MonotonicNonNullDecl private transient BaseEncoding upperCase;
-    @MonotonicNonNullDecl private transient BaseEncoding lowerCase;
+    @LazyInit @NullableDecl private transient BaseEncoding upperCase;
+    @LazyInit @NullableDecl private transient BaseEncoding lowerCase;
 
     @Override
     public BaseEncoding upperCase() {
@@ -1032,12 +1053,12 @@
   @GwtIncompatible // Writer
   static Writer separatingWriter(
       final Writer delegate, final String separator, final int afterEveryChars) {
-    final Appendable seperatingAppendable =
+    final Appendable separatingAppendable =
         separatingAppendable(delegate, separator, afterEveryChars);
     return new Writer() {
       @Override
       public void write(int c) throws IOException {
-        seperatingAppendable.append((char) c);
+        separatingAppendable.append((char) c);
       }
 
       @Override
diff --git a/android/guava/src/com/google/common/io/ByteProcessor.java b/android/guava/src/com/google/common/io/ByteProcessor.java
index 23f0e3e..115c735 100644
--- a/android/guava/src/com/google/common/io/ByteProcessor.java
+++ b/android/guava/src/com/google/common/io/ByteProcessor.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.IOException;
 
 /**
@@ -29,6 +30,7 @@
  * @since 1.0
  */
 @Beta
+@DoNotMock("Implement it normally")
 @GwtIncompatible
 public interface ByteProcessor<T> {
   /**
diff --git a/android/guava/src/com/google/common/io/ByteSource.java b/android/guava/src/com/google/common/io/ByteSource.java
index c60077e..19f3a43 100644
--- a/android/guava/src/com/google/common/io/ByteSource.java
+++ b/android/guava/src/com/google/common/io/ByteSource.java
@@ -215,10 +215,7 @@
     }
   }
 
-  /**
-   * Counts the bytes in the given input stream using skip if possible. Returns SKIP_FAILED if the
-   * first call to skip threw, in which case skip may just not be supported.
-   */
+  /** Counts the bytes in the given input stream using skip if possible. */
   private long countBySkipping(InputStream in) throws IOException {
     long count = 0;
     long skipped;
@@ -419,6 +416,11 @@
    * 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
+   * 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.
+   *
    * @since 15.0 (since 14.0 as {@code ByteStreams.asByteSource(byte[])}).
    */
   public static ByteSource wrap(byte[] b) {
@@ -528,7 +530,9 @@
       checkArgument(offset >= 0, "offset (%s) may not be negative", offset);
       checkArgument(length >= 0, "length (%s) may not be negative", length);
       long maxLength = this.length - offset;
-      return ByteSource.this.slice(this.offset + offset, Math.min(length, maxLength));
+      return maxLength <= 0
+          ? ByteSource.empty()
+          : ByteSource.this.slice(this.offset + offset, Math.min(length, maxLength));
     }
 
     @Override
diff --git a/android/guava/src/com/google/common/io/ByteStreams.java b/android/guava/src/com/google/common/io/ByteStreams.java
index e6601be..bdb24db 100644
--- a/android/guava/src/com/google/common/io/ByteStreams.java
+++ b/android/guava/src/com/google/common/io/ByteStreams.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.checkPositionIndex;
+import static com.google.common.base.Preconditions.checkPositionIndexes;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -39,7 +40,7 @@
 import java.nio.channels.WritableByteChannel;
 import java.util.ArrayDeque;
 import java.util.Arrays;
-import java.util.Deque;
+import java.util.Queue;
 
 /**
  * Provides utility methods for working with byte arrays and I/O streams.
@@ -144,11 +145,11 @@
     ByteBuffer buf = ByteBuffer.wrap(createBuffer());
     long total = 0;
     while (from.read(buf) != -1) {
-      buf.flip();
+      Java8Compatibility.flip(buf);
       while (buf.hasRemaining()) {
         total += to.write(buf);
       }
-      buf.clear();
+      Java8Compatibility.clear(buf);
     }
     return total;
   }
@@ -164,9 +165,9 @@
    * a total combined length of {@code totalLen} bytes) followed by all bytes remaining in the given
    * input stream.
    */
-  private static byte[] toByteArrayInternal(InputStream in, Deque<byte[]> bufs, int totalLen)
+  private static byte[] toByteArrayInternal(InputStream in, Queue<byte[]> bufs, int totalLen)
       throws IOException {
-    // Starting with an 8k buffer, double the size of each sucessive buffer. Buffers are retained
+    // Starting with an 8k buffer, double the size of each successive buffer. Buffers are retained
     // in a deque so that there's no copying between buffers while reading and so all of the bytes
     // in each new allocated buffer are available for reading from the stream.
     for (int bufSize = BUFFER_SIZE;
@@ -195,11 +196,11 @@
     }
   }
 
-  private static byte[] combineBuffers(Deque<byte[]> bufs, int totalLen) {
+  private static byte[] combineBuffers(Queue<byte[]> bufs, int totalLen) {
     byte[] result = new byte[totalLen];
     int remaining = totalLen;
     while (remaining > 0) {
-      byte[] buf = bufs.removeFirst();
+      byte[] buf = bufs.remove();
       int bytesToCopy = Math.min(remaining, buf.length);
       int resultOffset = totalLen - remaining;
       System.arraycopy(buf, 0, result, resultOffset, bytesToCopy);
@@ -252,7 +253,7 @@
     }
 
     // the stream was longer, so read the rest normally
-    Deque<byte[]> bufs = new ArrayDeque<byte[]>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
+    Queue<byte[]> bufs = new ArrayDeque<byte[]>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
     bufs.add(bytes);
     bufs.add(new byte[] {(byte) b});
     return toByteArrayInternal(in, bufs, bytes.length + 1);
@@ -490,18 +491,18 @@
    * @since 17.0
    */
   @Beta
-  public static ByteArrayDataOutput newDataOutput(ByteArrayOutputStream byteArrayOutputSteam) {
-    return new ByteArrayDataOutputStream(checkNotNull(byteArrayOutputSteam));
+  public static ByteArrayDataOutput newDataOutput(ByteArrayOutputStream byteArrayOutputStream) {
+    return new ByteArrayDataOutputStream(checkNotNull(byteArrayOutputStream));
   }
 
   private static class ByteArrayDataOutputStream implements ByteArrayDataOutput {
 
     final DataOutput output;
-    final ByteArrayOutputStream byteArrayOutputSteam;
+    final ByteArrayOutputStream byteArrayOutputStream;
 
-    ByteArrayDataOutputStream(ByteArrayOutputStream byteArrayOutputSteam) {
-      this.byteArrayOutputSteam = byteArrayOutputSteam;
-      output = new DataOutputStream(byteArrayOutputSteam);
+    ByteArrayDataOutputStream(ByteArrayOutputStream byteArrayOutputStream) {
+      this.byteArrayOutputStream = byteArrayOutputStream;
+      output = new DataOutputStream(byteArrayOutputStream);
     }
 
     @Override
@@ -632,7 +633,7 @@
 
     @Override
     public byte[] toByteArray() {
-      return byteArrayOutputSteam.toByteArray();
+      return byteArrayOutputStream.toByteArray();
     }
   }
 
@@ -816,7 +817,8 @@
    */
   static long skipUpTo(InputStream in, final long n) throws IOException {
     long totalSkipped = 0;
-    byte[] buf = createBuffer();
+    // A buffer is allocated if skipSafely does not skip any bytes.
+    byte[] buf = null;
 
     while (totalSkipped < n) {
       long remaining = n - totalSkipped;
@@ -825,7 +827,13 @@
       if (skipped == 0) {
         // Do a buffered read since skipSafely could return 0 repeatedly, for example if
         // in.available() always returns 0 (the default).
-        int skip = (int) Math.min(remaining, buf.length);
+        int skip = (int) Math.min(remaining, BUFFER_SIZE);
+        if (buf == null) {
+          // Allocate a buffer bounded by the maximum size that can be requested, for
+          // example an array of BUFFER_SIZE is unnecessary when the value of remaining
+          // is smaller.
+          buf = new byte[skip];
+        }
         if ((skipped = in.read(buf, 0, skip)) == -1) {
           // Reached EOF
           break;
@@ -894,6 +902,8 @@
    * @param len an int specifying the number of bytes to read
    * @return the number of bytes read
    * @throws IOException if an I/O error occurs
+   * @throws IndexOutOfBoundsException if {@code off} is negative, if {@code len} is negative, or if
+   *     {@code off + len} is greater than {@code b.length}
    */
   @Beta
   @CanIgnoreReturnValue
@@ -903,8 +913,9 @@
     checkNotNull(in);
     checkNotNull(b);
     if (len < 0) {
-      throw new IndexOutOfBoundsException("len is negative");
+      throw new IndexOutOfBoundsException(String.format("len (%s) cannot be negative", len));
     }
+    checkPositionIndexes(off, off + len, b.length);
     int total = 0;
     while (total < len) {
       int result = in.read(b, off + total, len - total);
diff --git a/android/guava/src/com/google/common/io/CharStreams.java b/android/guava/src/com/google/common/io/CharStreams.java
index bc4dd51..e54284e 100644
--- a/android/guava/src/com/google/common/io/CharStreams.java
+++ b/android/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 org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Provides utility methods for working with character streams.
@@ -82,10 +83,10 @@
       long total = 0;
       CharBuffer buf = createBuffer();
       while (from.read(buf) != -1) {
-        buf.flip();
+        Java8Compatibility.flip(buf);
         to.append(buf);
         total += buf.remaining();
-        buf.clear();
+        Java8Compatibility.clear(buf);
       }
       return total;
     }
@@ -242,7 +243,7 @@
     CharBuffer buf = createBuffer();
     while ((read = readable.read(buf)) != -1) {
       total += read;
-      buf.clear();
+      Java8Compatibility.clear(buf);
     }
     return total;
   }
@@ -306,14 +307,13 @@
     }
 
     @Override
-    public Writer append(CharSequence csq) {
-      checkNotNull(csq);
+    public Writer append(@NullableDecl CharSequence csq) {
       return this;
     }
 
     @Override
-    public Writer append(CharSequence csq, int start, int end) {
-      checkPositionIndexes(start, end, csq.length());
+    public Writer append(@NullableDecl 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/Closer.java b/android/guava/src/com/google/common/io/Closer.java
index 1fdb0a8..ff5db89 100644
--- a/android/guava/src/com/google/common/io/Closer.java
+++ b/android/guava/src/com/google/common/io/Closer.java
@@ -27,7 +27,6 @@
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.logging.Level;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -106,7 +105,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);
-  @MonotonicNonNullDecl private Throwable thrown;
+  @NullableDecl private Throwable thrown;
 
   @VisibleForTesting
   Closer(Suppressor suppressor) {
@@ -265,9 +264,9 @@
       return addSuppressed != null;
     }
 
-    static final Method addSuppressed = getAddSuppressed();
+    static final Method addSuppressed = addSuppressedMethodOrNull();
 
-    private static Method getAddSuppressed() {
+    private static Method addSuppressedMethodOrNull() {
       try {
         return Throwable.class.getMethod("addSuppressed", Throwable.class);
       } catch (Throwable e) {
diff --git a/android/guava/src/com/google/common/io/FileBackedOutputStream.java b/android/guava/src/com/google/common/io/FileBackedOutputStream.java
index e303110..b72c40e 100644
--- a/android/guava/src/com/google/common/io/FileBackedOutputStream.java
+++ b/android/guava/src/com/google/common/io/FileBackedOutputStream.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -31,6 +32,17 @@
  * An {@link OutputStream} that starts buffering to a byte array, but switches to file buffering
  * once the data reaches a configurable size.
  *
+ * <p>Temporary files created by this stream may live in the local filesystem until either:
+ *
+ * <ul>
+ *   <li>{@link #reset} is called (removing the data in this stream and deleting the file), or...
+ *   <li>this stream (or, more precisely, its {@link #asByteSource} view) is finalized during
+ *       garbage collection, <strong>AND</strong> this stream was not constructed with {@linkplain
+ *       #FileBackedOutputStream(int) the 1-arg constructor} or the {@linkplain
+ *       #FileBackedOutputStream(int, boolean) 2-arg constructor} passing {@code false} in the
+ *       second parameter.
+ * </ul>
+ *
  * <p>This class is thread-safe.
  *
  * @author Chris Nokleberg
@@ -39,14 +51,20 @@
 @Beta
 @GwtIncompatible
 public final class FileBackedOutputStream extends OutputStream {
-
   private final int fileThreshold;
   private final boolean resetOnFinalize;
   private final ByteSource source;
+  @NullableDecl private final File parentDirectory;
 
+  @GuardedBy("this")
   private OutputStream out;
+
+  @GuardedBy("this")
   private MemoryOutput memory;
-  @NullableDecl private File file;
+
+  @GuardedBy("this")
+  @NullableDecl
+  private File file;
 
   /** ByteArrayOutputStream that exposes its internals. */
   private static class MemoryOutput extends ByteArrayOutputStream {
@@ -81,11 +99,17 @@
    *
    * @param fileThreshold the number of bytes before the stream should switch to buffering to a file
    * @param resetOnFinalize if true, the {@link #reset} method will be called when the {@link
-   *     ByteSource} returned by {@link #asByteSource} is finalized
+   *     ByteSource} returned by {@link #asByteSource} is finalized.
    */
   public FileBackedOutputStream(int fileThreshold, boolean resetOnFinalize) {
+    this(fileThreshold, resetOnFinalize, null);
+  }
+
+  private FileBackedOutputStream(
+      int fileThreshold, boolean resetOnFinalize, @NullableDecl File parentDirectory) {
     this.fileThreshold = fileThreshold;
     this.resetOnFinalize = resetOnFinalize;
+    this.parentDirectory = parentDirectory;
     memory = new MemoryOutput();
     out = memory;
 
@@ -191,9 +215,10 @@
    * Checks if writing {@code len} bytes would go over threshold, and switches to file buffering if
    * so.
    */
+  @GuardedBy("this")
   private void update(int len) throws IOException {
     if (file == null && (memory.getCount() + len > fileThreshold)) {
-      File temp = File.createTempFile("FileBackedOutputStream", null);
+      File temp = File.createTempFile("FileBackedOutputStream", null, parentDirectory);
       if (resetOnFinalize) {
         // Finalizers are not guaranteed to be called on system shutdown;
         // this is insurance.
diff --git a/android/guava/src/com/google/common/io/Files.java b/android/guava/src/com/google/common/io/Files.java
index 34e03f6..73eb656 100644
--- a/android/guava/src/com/google/common/io/Files.java
+++ b/android/guava/src/com/google/common/io/Files.java
@@ -24,9 +24,9 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import com.google.common.collect.TreeTraverser;
 import com.google.common.graph.SuccessorsFunction;
 import com.google.common.graph.Traverser;
 import com.google.common.hash.HashCode;
@@ -246,7 +246,7 @@
    * @return a string containing all the characters from the file
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(file, charset).read()}. This method is scheduled to be
-   *     removed in January 2019.
+   *     removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -278,7 +278,7 @@
    *     helpful predefined constants
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSink(to, charset).write(from)}. This method is scheduled to be
-   *     removed in January 2019.
+   *     removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -335,7 +335,7 @@
    * @param to the appendable object
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(from, charset).copyTo(to)}. This method is scheduled to
-   *     be removed in January 2019.
+   *     be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -353,7 +353,7 @@
    *     helpful predefined constants
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSink(to, charset, FileWriteMode.APPEND).write(from)}. This
-   *     method is scheduled to be removed in January 2019.
+   *     method is scheduled to be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -398,6 +398,11 @@
    * be exploited to create security vulnerabilities, especially when executable files are to be
    * written into the directory.
    *
+   * <p>Depending on the environmment that this code is run in, the system temporary directory (and
+   * thus the directory this method creates) may be more visible that a program would like - files
+   * written to this directory may be read or overwritten by hostile programs running on the same
+   * machine.
+   *
    * <p>This method assumes that the temporary volume is writable, has free inodes and free blocks,
    * and that it will not be called thousands of times per second.
    *
@@ -406,8 +411,15 @@
    *
    * @return the newly-created directory
    * @throws IllegalStateException if the directory could not be created
+   * @deprecated For Android users, see the <a
+   *     href="https://developer.android.com/training/data-storage" target="_blank">Data and File
+   *     Storage overview</a> to select an appropriate temporary directory (perhaps {@code
+   *     context.getCacheDir()}). For developers on Java 7 or later, use {@link
+   *     java.nio.file.Files#createTempDirectory}, transforming it to a {@link File} using {@link
+   *     java.nio.file.Path#toFile() toFile()} if needed.
    */
   @Beta
+  @Deprecated
   public static File createTempDir() {
     File baseDir = new File(System.getProperty("java.io.tmpdir"));
     @SuppressWarnings("GoodTime") // reading system time without TimeSource
@@ -513,7 +525,7 @@
    * @return the first line, or null if the file is empty
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(file, charset).readFirstLine()}. This method is
-   *     scheduled to be removed in January 2019.
+   *     scheduled to be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -571,7 +583,7 @@
    * @return the output of processing the lines
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(file, charset).readLines(callback)}. This method is
-   *     scheduled to be removed in January 2019.
+   *     scheduled to be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -591,7 +603,7 @@
    * @return the result of the byte processor
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asByteSource(file).read(processor)}. This method is scheduled to be
-   *     removed in January 2019.
+   *     removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -610,7 +622,7 @@
    * @throws IOException if an I/O error occurs
    * @since 12.0
    * @deprecated Prefer {@code asByteSource(file).hash(hashFunction)}. This method is scheduled to
-   *     be removed in January 2019.
+   *     be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -813,36 +825,6 @@
   }
 
   /**
-   * Returns a {@link TreeTraverser} instance for {@link File} trees.
-   *
-   * <p><b>Warning:</b> {@code File} provides no support for symbolic links, and as such there is no
-   * way to ensure that a symbolic link to a directory is not followed when traversing the tree. In
-   * this case, iterables created by this traverser could contain files that are outside of the
-   * given directory or even be infinite if there is a symbolic link loop.
-   *
-   * @since 15.0
-   * @deprecated The returned {@link TreeTraverser} type is deprecated. Use the replacement method
-   *     {@link #fileTraverser()} instead with the same semantics as this method.
-   */
-  @Deprecated
-  static TreeTraverser<File> fileTreeTraverser() {
-    return FILE_TREE_TRAVERSER;
-  }
-
-  private static final TreeTraverser<File> FILE_TREE_TRAVERSER =
-      new TreeTraverser<File>() {
-        @Override
-        public Iterable<File> children(File file) {
-          return fileTreeChildren(file);
-        }
-
-        @Override
-        public String toString() {
-          return "Files.fileTreeTraverser()";
-        }
-      };
-
-  /**
    * Returns a {@link Traverser} instance for the file and directory tree. The returned traverser
    * starts from a {@link File} and will return all files and directories it encounters.
    *
@@ -873,22 +855,18 @@
       new SuccessorsFunction<File>() {
         @Override
         public Iterable<File> successors(File file) {
-          return fileTreeChildren(file);
+          // check isDirectory() just because it may be faster than listFiles() on a non-directory
+          if (file.isDirectory()) {
+            File[] files = file.listFiles();
+            if (files != null) {
+              return Collections.unmodifiableList(Arrays.asList(files));
+            }
+          }
+
+          return ImmutableList.of();
         }
       };
 
-  private static Iterable<File> fileTreeChildren(File file) {
-    // check isDirectory() just because it may be faster than listFiles() on a non-directory
-    if (file.isDirectory()) {
-      File[] files = file.listFiles();
-      if (files != null) {
-        return Collections.unmodifiableList(Arrays.asList(files));
-      }
-    }
-
-    return Collections.emptyList();
-  }
-
   /**
    * Returns a predicate that returns the result of {@link File#isDirectory} on input files.
    *
diff --git a/android/guava/src/com/google/common/io/Java8Compatibility.java b/android/guava/src/com/google/common/io/Java8Compatibility.java
new file mode 100644
index 0000000..62b5c2e
--- /dev/null
+++ b/android/guava/src/com/google/common/io/Java8Compatibility.java
@@ -0,0 +1,43 @@
+/*
+ * 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.io;
+
+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
+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/io/LineReader.java b/android/guava/src/com/google/common/io/LineReader.java
index 8514a29..1c8cef0 100644
--- a/android/guava/src/com/google/common/io/LineReader.java
+++ b/android/guava/src/com/google/common/io/LineReader.java
@@ -70,7 +70,7 @@
   @CanIgnoreReturnValue // to skip a line
   public String readLine() throws IOException {
     while (lines.peek() == null) {
-      cbuf.clear();
+      Java8Compatibility.clear(cbuf);
       // The default implementation of Reader#read(CharBuffer) allocates a
       // temporary char[], so we call Reader#read(char[], int, int) instead.
       int read = (reader != null) ? reader.read(buf, 0, buf.length) : readable.read(cbuf);
diff --git a/android/guava/src/com/google/common/io/ReaderInputStream.java b/android/guava/src/com/google/common/io/ReaderInputStream.java
index 9cbca93..eeb64e4 100644
--- a/android/guava/src/com/google/common/io/ReaderInputStream.java
+++ b/android/guava/src/com/google/common/io/ReaderInputStream.java
@@ -104,7 +104,7 @@
     encoder.reset();
 
     charBuffer = CharBuffer.allocate(bufferSize);
-    charBuffer.flip();
+    Java8Compatibility.flip(charBuffer);
 
     byteBuffer = ByteBuffer.allocate(bufferSize);
   }
@@ -143,7 +143,7 @@
           return (totalBytesRead > 0) ? totalBytesRead : -1;
         }
         draining = false;
-        byteBuffer.clear();
+        Java8Compatibility.clear(byteBuffer);
       }
 
       while (true) {
@@ -189,8 +189,8 @@
   private static CharBuffer grow(CharBuffer buf) {
     char[] copy = Arrays.copyOf(buf.array(), buf.capacity() * 2);
     CharBuffer bigger = CharBuffer.wrap(copy);
-    bigger.position(buf.position());
-    bigger.limit(buf.limit());
+    Java8Compatibility.position(bigger, buf.position());
+    Java8Compatibility.limit(bigger, buf.limit());
     return bigger;
   }
 
@@ -207,7 +207,7 @@
     if (availableCapacity(charBuffer) == 0) {
       if (charBuffer.position() > 0) {
         // (2) There is room in the buffer. Move existing bytes to the beginning.
-        charBuffer.compact().flip();
+        Java8Compatibility.flip(charBuffer.compact());
       } else {
         // (3) Entire buffer is full, need bigger buffer.
         charBuffer = grow(charBuffer);
@@ -220,7 +220,7 @@
     if (numChars == -1) {
       endOfInput = true;
     } else {
-      charBuffer.limit(limit + numChars);
+      Java8Compatibility.limit(charBuffer, limit + numChars);
     }
   }
 
@@ -235,7 +235,7 @@
    * overflow must be due to a small output buffer.
    */
   private void startDraining(boolean overflow) {
-    byteBuffer.flip();
+    Java8Compatibility.flip(byteBuffer);
     if (overflow && byteBuffer.remaining() == 0) {
       byteBuffer = ByteBuffer.allocate(byteBuffer.capacity() * 2);
     } else {
diff --git a/android/guava/src/com/google/common/io/Resources.java b/android/guava/src/com/google/common/io/Resources.java
index 133fad7..d64bf3d 100644
--- a/android/guava/src/com/google/common/io/Resources.java
+++ b/android/guava/src/com/google/common/io/Resources.java
@@ -202,6 +202,7 @@
    *
    * @throws IllegalArgumentException if the resource is not found
    */
+  @CanIgnoreReturnValue // being used to check if a resource exists
   public static URL getResource(Class<?> contextClass, String resourceName) {
     URL url = contextClass.getResource(resourceName);
     checkArgument(
diff --git a/android/guava/src/com/google/common/math/BigDecimalMath.java b/android/guava/src/com/google/common/math/BigDecimalMath.java
new file mode 100644
index 0000000..b5c23f8
--- /dev/null
+++ b/android/guava/src/com/google/common/math/BigDecimalMath.java
@@ -0,0 +1,81 @@
+/*
+ * 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.math;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * A class for arithmetic on {@link BigDecimal} that is not covered by its built-in methods.
+ *
+ * @author Louis Wasserman
+ * @since 30.0
+ */
+@GwtIncompatible
+public class BigDecimalMath {
+  private BigDecimalMath() {}
+
+  /**
+   * Returns {@code x}, rounded to a {@code double} with the specified rounding mode. If {@code x}
+   * is precisely representable as a {@code double}, its {@code double} value will be returned;
+   * otherwise, the rounding will choose between the two nearest representable values with {@code
+   * mode}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_DOWN}, {@code HALF_UP}, and {@code HALF_EVEN},
+   * infinite {@code double} values are considered infinitely far away. For example, 2^2000 is not
+   * representable as a double, but {@code roundToDouble(BigDecimal.valueOf(2).pow(2000), HALF_UP)}
+   * will return {@code Double.MAX_VALUE}, not {@code Double.POSITIVE_INFINITY}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_EVEN}, this implementation uses the IEEE 754
+   * default rounding mode: if the two nearest representable values are equally near, the one with
+   * the least significant bit zero is chosen. (In such cases, both of the nearest representable
+   * values are even integers; this method returns the one that is a multiple of a greater power of
+   * two.)
+   *
+   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
+   *     is not precisely representable as a {@code double}
+   * @since 30.0
+   */
+  public static double roundToDouble(BigDecimal x, RoundingMode mode) {
+    return BigDecimalToDoubleRounder.INSTANCE.roundToDouble(x, mode);
+  }
+
+  private static class BigDecimalToDoubleRounder extends ToDoubleRounder<BigDecimal> {
+    static final BigDecimalToDoubleRounder INSTANCE = new BigDecimalToDoubleRounder();
+
+    private BigDecimalToDoubleRounder() {}
+
+    @Override
+    double roundToDoubleArbitrarily(BigDecimal bigDecimal) {
+      return bigDecimal.doubleValue();
+    }
+
+    @Override
+    int sign(BigDecimal bigDecimal) {
+      return bigDecimal.signum();
+    }
+
+    @Override
+    BigDecimal toX(double d, RoundingMode mode) {
+      return new BigDecimal(d);
+    }
+
+    @Override
+    BigDecimal minus(BigDecimal a, BigDecimal b) {
+      return a.subtract(b);
+    }
+  }
+}
diff --git a/android/guava/src/com/google/common/math/BigIntegerMath.java b/android/guava/src/com/google/common/math/BigIntegerMath.java
index b0c0766..bf443e9 100644
--- a/android/guava/src/com/google/common/math/BigIntegerMath.java
+++ b/android/guava/src/com/google/common/math/BigIntegerMath.java
@@ -21,7 +21,9 @@
 import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
 import static java.math.RoundingMode.CEILING;
 import static java.math.RoundingMode.FLOOR;
+import static java.math.RoundingMode.HALF_DOWN;
 import static java.math.RoundingMode.HALF_EVEN;
+import static java.math.RoundingMode.UNNECESSARY;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -56,7 +58,7 @@
    */
   @Beta
   public static BigInteger ceilingPowerOfTwo(BigInteger x) {
-    return BigInteger.ZERO.setBit(log2(x, RoundingMode.CEILING));
+    return BigInteger.ZERO.setBit(log2(x, CEILING));
   }
 
   /**
@@ -68,7 +70,7 @@
    */
   @Beta
   public static BigInteger floorPowerOfTwo(BigInteger x) {
-    return BigInteger.ZERO.setBit(log2(x, RoundingMode.FLOOR));
+    return BigInteger.ZERO.setBit(log2(x, FLOOR));
   }
 
   /** Returns {@code true} if {@code x} represents a power of two. */
@@ -307,6 +309,59 @@
   }
 
   /**
+   * Returns {@code x}, rounded to a {@code double} with the specified rounding mode. If {@code x}
+   * is precisely representable as a {@code double}, its {@code double} value will be returned;
+   * otherwise, the rounding will choose between the two nearest representable values with {@code
+   * mode}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_DOWN}, {@code HALF_UP}, and {@code HALF_EVEN},
+   * infinite {@code double} values are considered infinitely far away. For example, 2^2000 is not
+   * representable as a double, but {@code roundToDouble(BigInteger.valueOf(2).pow(2000), HALF_UP)}
+   * will return {@code Double.MAX_VALUE}, not {@code Double.POSITIVE_INFINITY}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_EVEN}, this implementation uses the IEEE 754
+   * default rounding mode: if the two nearest representable values are equally near, the one with
+   * the least significant bit zero is chosen. (In such cases, both of the nearest representable
+   * values are even integers; this method returns the one that is a multiple of a greater power of
+   * two.)
+   *
+   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
+   *     is not precisely representable as a {@code double}
+   * @since 30.0
+   */
+  @GwtIncompatible
+  public static double roundToDouble(BigInteger x, RoundingMode mode) {
+    return BigIntegerToDoubleRounder.INSTANCE.roundToDouble(x, mode);
+  }
+
+  @GwtIncompatible
+  private static class BigIntegerToDoubleRounder extends ToDoubleRounder<BigInteger> {
+    static final BigIntegerToDoubleRounder INSTANCE = new BigIntegerToDoubleRounder();
+
+    private BigIntegerToDoubleRounder() {}
+
+    @Override
+    double roundToDoubleArbitrarily(BigInteger bigInteger) {
+      return DoubleUtils.bigToDouble(bigInteger);
+    }
+
+    @Override
+    int sign(BigInteger bigInteger) {
+      return bigInteger.signum();
+    }
+
+    @Override
+    BigInteger toX(double d, RoundingMode mode) {
+      return DoubleMath.roundToBigInteger(d, mode);
+    }
+
+    @Override
+    BigInteger minus(BigInteger a, BigInteger b) {
+      return a.subtract(b);
+    }
+  }
+
+  /**
    * Returns the result of dividing {@code p} by {@code q}, rounding using the specified {@code
    * RoundingMode}.
    *
@@ -432,7 +487,7 @@
     long numeratorAccum = n;
     long denominatorAccum = 1;
 
-    int bits = LongMath.log2(n, RoundingMode.CEILING);
+    int bits = LongMath.log2(n, CEILING);
 
     int numeratorBits = bits;
 
diff --git a/android/guava/src/com/google/common/math/DoubleUtils.java b/android/guava/src/com/google/common/math/DoubleUtils.java
index 246bb96..4183195 100644
--- a/android/guava/src/com/google/common/math/DoubleUtils.java
+++ b/android/guava/src/com/google/common/math/DoubleUtils.java
@@ -131,11 +131,7 @@
   /** Returns its argument if it is non-negative, zero if it is negative. */
   static double ensureNonNegative(double value) {
     checkArgument(!isNaN(value));
-    if (value > 0.0) {
-      return value;
-    } else {
-      return 0.0;
-    }
+    return Math.max(value, 0.0);
   }
 
   @VisibleForTesting static final long ONE_BITS = 0x3ff0000000000000L;
diff --git a/android/guava/src/com/google/common/math/LongMath.java b/android/guava/src/com/google/common/math/LongMath.java
index b16db71..420b48a 100644
--- a/android/guava/src/com/google/common/math/LongMath.java
+++ b/android/guava/src/com/google/common/math/LongMath.java
@@ -29,6 +29,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.primitives.Longs;
 import com.google.common.primitives.UnsignedLongs;
 import java.math.BigInteger;
 import java.math.RoundingMode;
@@ -1004,8 +1005,29 @@
       checkNonNegative("n", n);
       return false;
     }
-    if (n == 2 || n == 3 || n == 5 || n == 7 || n == 11 || n == 13) {
-      return true;
+    if (n < 66) {
+      // Encode all primes less than 66 into mask without 0 and 1.
+      long mask =
+          (1L << (2 - 2))
+              | (1L << (3 - 2))
+              | (1L << (5 - 2))
+              | (1L << (7 - 2))
+              | (1L << (11 - 2))
+              | (1L << (13 - 2))
+              | (1L << (17 - 2))
+              | (1L << (19 - 2))
+              | (1L << (23 - 2))
+              | (1L << (29 - 2))
+              | (1L << (31 - 2))
+              | (1L << (37 - 2))
+              | (1L << (41 - 2))
+              | (1L << (43 - 2))
+              | (1L << (47 - 2))
+              | (1L << (53 - 2))
+              | (1L << (59 - 2))
+              | (1L << (61 - 2));
+      // Look up n within the mask.
+      return ((mask >> ((int) n - 2)) & 1) != 0;
     }
 
     if ((SIEVE_30 & (1 << (n % 30))) != 0) {
@@ -1069,10 +1091,10 @@
       @Override
       long mulMod(long a, long b, long m) {
         /*
-         * NOTE(lowasser, 2015-Feb-12): Benchmarks suggest that changing this to
-         * UnsignedLongs.remainder and increasing the threshold to 2^32 doesn't pay for itself, and
-         * adding another enum constant hurts performance further -- I suspect because bimorphic
-         * implementation is a sweet spot for the JVM.
+         * lowasser, 2015-Feb-12: Benchmarks suggest that changing this to UnsignedLongs.remainder
+         * and increasing the threshold to 2^32 doesn't pay for itself, and adding another enum
+         * constant hurts performance further -- I suspect because bimorphic implementation is a
+         * sweet spot for the JVM.
          */
         return (a * b) % m;
       }
@@ -1203,5 +1225,125 @@
     }
   }
 
+  /**
+   * Returns {@code x}, rounded to a {@code double} with the specified rounding mode. If {@code x}
+   * is precisely representable as a {@code double}, its {@code double} value will be returned;
+   * otherwise, the rounding will choose between the two nearest representable values with {@code
+   * mode}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_EVEN}, this implementation uses the IEEE 754
+   * default rounding mode: if the two nearest representable values are equally near, the one with
+   * the least significant bit zero is chosen. (In such cases, both of the nearest representable
+   * values are even integers; this method returns the one that is a multiple of a greater power of
+   * two.)
+   *
+   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
+   *     is not precisely representable as a {@code double}
+   * @since 30.0
+   */
+  @SuppressWarnings("deprecation")
+  @GwtIncompatible
+  public static double roundToDouble(long x, RoundingMode mode) {
+    // Logic adapted from ToDoubleRounder.
+    double roundArbitrarily = (double) x;
+    long roundArbitrarilyAsLong = (long) roundArbitrarily;
+    int cmpXToRoundArbitrarily;
+
+    if (roundArbitrarilyAsLong == Long.MAX_VALUE) {
+      /*
+       * For most values, the conversion from roundArbitrarily to roundArbitrarilyAsLong is
+       * lossless. In that case we can compare x to roundArbitrarily using Longs.compare(x,
+       * roundArbitrarilyAsLong). The exception is for values where the conversion to double rounds
+       * up to give roundArbitrarily equal to 2^63, so the conversion back to long overflows and
+       * roundArbitrarilyAsLong is Long.MAX_VALUE. (This is the only way this condition can occur as
+       * otherwise the conversion back to long pads with zero bits.) In this case we know that
+       * roundArbitrarily > x. (This is important when x == Long.MAX_VALUE ==
+       * roundArbitrarilyAsLong.)
+       */
+      cmpXToRoundArbitrarily = -1;
+    } else {
+      cmpXToRoundArbitrarily = Longs.compare(x, roundArbitrarilyAsLong);
+    }
+
+    switch (mode) {
+      case UNNECESSARY:
+        checkRoundingUnnecessary(cmpXToRoundArbitrarily == 0);
+        return roundArbitrarily;
+      case FLOOR:
+        return (cmpXToRoundArbitrarily >= 0)
+            ? roundArbitrarily
+            : DoubleUtils.nextDown(roundArbitrarily);
+      case CEILING:
+        return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+      case DOWN:
+        if (x >= 0) {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        }
+      case UP:
+        if (x >= 0) {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        }
+      case HALF_DOWN:
+      case HALF_UP:
+      case HALF_EVEN:
+        {
+          long roundFloor;
+          double roundFloorAsDouble;
+          long roundCeiling;
+          double roundCeilingAsDouble;
+
+          if (cmpXToRoundArbitrarily >= 0) {
+            roundFloorAsDouble = roundArbitrarily;
+            roundFloor = roundArbitrarilyAsLong;
+            roundCeilingAsDouble = Math.nextUp(roundArbitrarily);
+            roundCeiling = (long) Math.ceil(roundCeilingAsDouble);
+          } else {
+            roundCeilingAsDouble = roundArbitrarily;
+            roundCeiling = roundArbitrarilyAsLong;
+            roundFloorAsDouble = DoubleUtils.nextDown(roundArbitrarily);
+            roundFloor = (long) Math.floor(roundFloorAsDouble);
+          }
+
+          long deltaToFloor = x - roundFloor;
+          long deltaToCeiling = roundCeiling - x;
+
+          if (roundCeiling == Long.MAX_VALUE) {
+            // correct for Long.MAX_VALUE as discussed above: roundCeilingAsDouble must be 2^63, but
+            // roundCeiling is 2^63-1.
+            deltaToCeiling++;
+          }
+
+          int diff = Longs.compare(deltaToFloor, deltaToCeiling);
+          if (diff < 0) { // closer to floor
+            return roundFloorAsDouble;
+          } else if (diff > 0) { // closer to ceiling
+            return roundCeilingAsDouble;
+          }
+          // halfway between the representable values; do the half-whatever logic
+          switch (mode) {
+            case HALF_EVEN:
+              return ((DoubleUtils.getSignificand(roundFloorAsDouble) & 1L) == 0)
+                  ? roundFloorAsDouble
+                  : roundCeilingAsDouble;
+            case HALF_DOWN:
+              return (x >= 0) ? roundFloorAsDouble : roundCeilingAsDouble;
+            case HALF_UP:
+              return (x >= 0) ? roundCeilingAsDouble : roundFloorAsDouble;
+            default:
+              throw new AssertionError("impossible");
+          }
+        }
+    }
+    throw new AssertionError("impossible");
+  }
+
   private LongMath() {}
 }
diff --git a/android/guava/src/com/google/common/math/PairedStatsAccumulator.java b/android/guava/src/com/google/common/math/PairedStatsAccumulator.java
index 967e3f1..a988495 100644
--- a/android/guava/src/com/google/common/math/PairedStatsAccumulator.java
+++ b/android/guava/src/com/google/common/math/PairedStatsAccumulator.java
@@ -21,6 +21,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.primitives.Doubles;
 
 /**
  * A mutable object which accumulates paired double values (e.g. points on a plane) and tracks some
@@ -236,12 +237,6 @@
   }
 
   private static double ensureInUnitRange(double value) {
-    if (value >= 1.0) {
-      return 1.0;
-    }
-    if (value <= -1.0) {
-      return -1.0;
-    }
-    return value;
+    return Doubles.constrainToRange(value, -1.0, 1.0);
   }
 }
diff --git a/android/guava/src/com/google/common/math/Quantiles.java b/android/guava/src/com/google/common/math/Quantiles.java
index d99c993..7aac58f 100644
--- a/android/guava/src/com/google/common/math/Quantiles.java
+++ b/android/guava/src/com/google/common/math/Quantiles.java
@@ -27,7 +27,7 @@
 import com.google.common.primitives.Ints;
 import java.math.RoundingMode;
 import java.util.Collection;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -186,6 +186,7 @@
      * @param indexes the quantile indexes, each of which must be in the inclusive range [0, q] for
      *     q-quantiles; the order of the indexes is unimportant, duplicates will be ignored, and the
      *     set will be snapshotted when this method is called
+     * @throws IllegalArgumentException if {@code indexes} is empty
      */
     public ScaleAndIndexes indexes(int... indexes) {
       return new ScaleAndIndexes(scale, indexes.clone());
@@ -198,6 +199,7 @@
      * @param indexes the quantile indexes, each of which must be in the inclusive range [0, q] for
      *     q-quantiles; the order of the indexes is unimportant, duplicates will be ignored, and the
      *     set will be snapshotted when this method is called
+     * @throws IllegalArgumentException if {@code indexes} is empty
      */
     public ScaleAndIndexes indexes(Collection<Integer> indexes) {
       return new ScaleAndIndexes(scale, Ints.toArray(indexes));
@@ -318,6 +320,7 @@
       for (int index : indexes) {
         checkIndex(index, scale);
       }
+      checkArgument(indexes.length > 0, "Indexes must be a non empty array");
       this.scale = scale;
       this.indexes = indexes;
     }
@@ -328,8 +331,10 @@
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will be
      *     cast to doubles (with any associated lost of precision), and which will not be mutated by
      *     this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(Collection<? extends Number> dataset) {
       return computeInPlace(Doubles.toArray(dataset));
@@ -340,8 +345,10 @@
      *
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will not
      *     be mutated by this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(double... dataset) {
       return computeInPlace(dataset.clone());
@@ -353,8 +360,10 @@
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will be
      *     cast to doubles (with any associated lost of precision), and which will not be mutated by
      *     this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(long... dataset) {
       return computeInPlace(longsToDoubles(dataset));
@@ -365,8 +374,10 @@
      *
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will be
      *     cast to doubles, and which will not be mutated by this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(int... dataset) {
       return computeInPlace(intsToDoubles(dataset));
@@ -377,13 +388,15 @@
      *
      * @param dataset the dataset to do the calculation on, which must be non-empty, and which will
      *     be arbitrarily reordered by this method call
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order that the indexes were passed to the
+     *     {@code indexes} method.
      */
     public Map<Integer, Double> computeInPlace(double... dataset) {
       checkArgument(dataset.length > 0, "Cannot calculate quantiles of an empty dataset");
       if (containsNaN(dataset)) {
-        Map<Integer, Double> nanMap = new HashMap<>();
+        Map<Integer, Double> nanMap = new LinkedHashMap<>();
         for (int index : indexes) {
           nanMap.put(index, NaN);
         }
@@ -422,7 +435,7 @@
       sort(requiredSelections, 0, requiredSelectionsCount);
       selectAllInPlace(
           requiredSelections, 0, requiredSelectionsCount - 1, dataset, 0, dataset.length - 1);
-      Map<Integer, Double> ret = new HashMap<>();
+      Map<Integer, Double> ret = new LinkedHashMap<>();
       for (int i = 0; i < indexes.length; i++) {
         int quotient = quotients[i];
         int remainder = remainders[i];
diff --git a/android/guava/src/com/google/common/math/Stats.java b/android/guava/src/com/google/common/math/Stats.java
index 69469b1..9493938 100644
--- a/android/guava/src/com/google/common/math/Stats.java
+++ b/android/guava/src/com/google/common/math/Stats.java
@@ -103,7 +103,8 @@
   }
 
   /**
-   * Returns statistics over a dataset containing the given values.
+   * Returns statistics over a dataset containing the given values. The iterator will be completely
+   * consumed by this method.
    *
    * @param values a series of values, which will be converted to {@code double} values (this may
    *     cause loss of precision)
@@ -169,8 +170,8 @@
    * If it contains {@link Double#NEGATIVE_INFINITY} and finite values only or {@link
    * Double#NEGATIVE_INFINITY} only, the result is {@link Double#NEGATIVE_INFINITY}.
    *
-   * <p>If you only want to calculate the mean, use {#meanOf} instead of creating a {@link Stats}
-   * instance.
+   * <p>If you only want to calculate the mean, use {@link #meanOf} instead of creating a {@link
+   * Stats} instance.
    *
    * @throws IllegalStateException if the dataset is empty
    */
@@ -347,11 +348,11 @@
       return false;
     }
     Stats other = (Stats) obj;
-    return (count == other.count)
-        && (doubleToLongBits(mean) == doubleToLongBits(other.mean))
-        && (doubleToLongBits(sumOfSquaresOfDeltas) == doubleToLongBits(other.sumOfSquaresOfDeltas))
-        && (doubleToLongBits(min) == doubleToLongBits(other.min))
-        && (doubleToLongBits(max) == doubleToLongBits(other.max));
+    return count == other.count
+        && doubleToLongBits(mean) == doubleToLongBits(other.mean)
+        && doubleToLongBits(sumOfSquaresOfDeltas) == doubleToLongBits(other.sumOfSquaresOfDeltas)
+        && doubleToLongBits(min) == doubleToLongBits(other.min)
+        && doubleToLongBits(max) == doubleToLongBits(other.max);
   }
 
   /**
diff --git a/android/guava/src/com/google/common/math/StatsAccumulator.java b/android/guava/src/com/google/common/math/StatsAccumulator.java
index a3977ca..54468cf 100644
--- a/android/guava/src/com/google/common/math/StatsAccumulator.java
+++ b/android/guava/src/com/google/common/math/StatsAccumulator.java
@@ -136,27 +136,47 @@
     if (values.count() == 0) {
       return;
     }
+    merge(values.count(), values.mean(), values.sumOfSquaresOfDeltas(), values.min(), values.max());
+  }
 
+  /**
+   * Adds the given statistics to the dataset, as if the individual values used to compute the
+   * statistics had been added directly.
+   *
+   * @since 28.2
+   */
+  public void addAll(StatsAccumulator values) {
+    if (values.count() == 0) {
+      return;
+    }
+    merge(values.count(), values.mean(), values.sumOfSquaresOfDeltas(), values.min(), values.max());
+  }
+
+  private void merge(
+      long otherCount,
+      double otherMean,
+      double otherSumOfSquaresOfDeltas,
+      double otherMin,
+      double otherMax) {
     if (count == 0) {
-      count = values.count();
-      mean = values.mean();
-      sumOfSquaresOfDeltas = values.sumOfSquaresOfDeltas();
-      min = values.min();
-      max = values.max();
+      count = otherCount;
+      mean = otherMean;
+      sumOfSquaresOfDeltas = otherSumOfSquaresOfDeltas;
+      min = otherMin;
+      max = otherMax;
     } else {
-      count += values.count();
-      if (isFinite(mean) && isFinite(values.mean())) {
+      count += otherCount;
+      if (isFinite(mean) && isFinite(otherMean)) {
         // This is a generalized version of the calculation in add(double) above.
-        double delta = values.mean() - mean;
-        mean += delta * values.count() / count;
-        sumOfSquaresOfDeltas +=
-            values.sumOfSquaresOfDeltas() + delta * (values.mean() - mean) * values.count();
+        double delta = otherMean - mean;
+        mean += delta * otherCount / count;
+        sumOfSquaresOfDeltas += otherSumOfSquaresOfDeltas + delta * (otherMean - mean) * otherCount;
       } else {
-        mean = calculateNewMeanNonFinite(mean, values.mean());
+        mean = calculateNewMeanNonFinite(mean, otherMean);
         sumOfSquaresOfDeltas = NaN;
       }
-      min = Math.min(min, values.min());
-      max = Math.max(max, values.max());
+      min = Math.min(min, otherMin);
+      max = Math.max(max, otherMax);
     }
   }
 
diff --git a/android/guava/src/com/google/common/math/ToDoubleRounder.java b/android/guava/src/com/google/common/math/ToDoubleRounder.java
new file mode 100644
index 0000000..7525e3f
--- /dev/null
+++ b/android/guava/src/com/google/common/math/ToDoubleRounder.java
@@ -0,0 +1,152 @@
+/*
+ * 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.math;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.math.RoundingMode;
+
+/**
+ * Helper type to implement rounding {@code X} to a representable {@code double} value according to
+ * a {@link RoundingMode}.
+ */
+@GwtIncompatible
+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,
+   * or the least double greater than or equal to the precise value of x.
+   */
+  abstract double roundToDoubleArbitrarily(X x);
+
+  /** Returns the sign of x: either -1, 0, or 1. */
+  abstract int sign(X x);
+
+  /** Returns d's value as an X, rounded with the specified mode. */
+  abstract X toX(double d, RoundingMode mode);
+
+  /** Returns a - b, guaranteed that both arguments are nonnegative. */
+  abstract X minus(X a, X b);
+
+  /** Rounds {@code x} to a {@code double}. */
+  final double roundToDouble(X x, RoundingMode mode) {
+    checkNotNull(x, "x");
+    checkNotNull(mode, "mode");
+    double roundArbitrarily = roundToDoubleArbitrarily(x);
+    if (Double.isInfinite(roundArbitrarily)) {
+      switch (mode) {
+        case DOWN:
+        case HALF_EVEN:
+        case HALF_DOWN:
+        case HALF_UP:
+          return Double.MAX_VALUE * sign(x);
+        case FLOOR:
+          return (roundArbitrarily == Double.POSITIVE_INFINITY)
+              ? Double.MAX_VALUE
+              : Double.NEGATIVE_INFINITY;
+        case CEILING:
+          return (roundArbitrarily == Double.POSITIVE_INFINITY)
+              ? Double.POSITIVE_INFINITY
+              : -Double.MAX_VALUE;
+        case UP:
+          return roundArbitrarily;
+        case UNNECESSARY:
+          throw new ArithmeticException(x + " cannot be represented precisely as a double");
+      }
+    }
+    X roundArbitrarilyAsX = toX(roundArbitrarily, RoundingMode.UNNECESSARY);
+    int cmpXToRoundArbitrarily = x.compareTo(roundArbitrarilyAsX);
+    switch (mode) {
+      case UNNECESSARY:
+        checkRoundingUnnecessary(cmpXToRoundArbitrarily == 0);
+        return roundArbitrarily;
+      case FLOOR:
+        return (cmpXToRoundArbitrarily >= 0)
+            ? roundArbitrarily
+            : DoubleUtils.nextDown(roundArbitrarily);
+      case CEILING:
+        return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+      case DOWN:
+        if (sign(x) >= 0) {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        }
+      case UP:
+        if (sign(x) >= 0) {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        }
+      case HALF_DOWN:
+      case HALF_UP:
+      case HALF_EVEN:
+        {
+          X roundFloor;
+          double roundFloorAsDouble;
+          X roundCeiling;
+          double roundCeilingAsDouble;
+
+          if (cmpXToRoundArbitrarily >= 0) {
+            roundFloorAsDouble = roundArbitrarily;
+            roundFloor = roundArbitrarilyAsX;
+            roundCeilingAsDouble = Math.nextUp(roundArbitrarily);
+            if (roundCeilingAsDouble == Double.POSITIVE_INFINITY) {
+              return roundFloorAsDouble;
+            }
+            roundCeiling = toX(roundCeilingAsDouble, RoundingMode.CEILING);
+          } else {
+            roundCeilingAsDouble = roundArbitrarily;
+            roundCeiling = roundArbitrarilyAsX;
+            roundFloorAsDouble = DoubleUtils.nextDown(roundArbitrarily);
+            if (roundFloorAsDouble == Double.NEGATIVE_INFINITY) {
+              return roundCeilingAsDouble;
+            }
+            roundFloor = toX(roundFloorAsDouble, RoundingMode.FLOOR);
+          }
+
+          X deltaToFloor = minus(x, roundFloor);
+          X deltaToCeiling = minus(roundCeiling, x);
+          int diff = deltaToFloor.compareTo(deltaToCeiling);
+          if (diff < 0) { // closer to floor
+            return roundFloorAsDouble;
+          } else if (diff > 0) { // closer to ceiling
+            return roundCeilingAsDouble;
+          }
+          // halfway between the representable values; do the half-whatever logic
+          switch (mode) {
+            case HALF_EVEN:
+              // roundFloorAsDouble and roundCeilingAsDouble are neighbors, so precisely
+              // one of them should have an even long representation
+              return ((Double.doubleToRawLongBits(roundFloorAsDouble) & 1L) == 0)
+                  ? roundFloorAsDouble
+                  : roundCeilingAsDouble;
+            case HALF_DOWN:
+              return (sign(x) >= 0) ? roundFloorAsDouble : roundCeilingAsDouble;
+            case HALF_UP:
+              return (sign(x) >= 0) ? roundCeilingAsDouble : roundFloorAsDouble;
+            default:
+              throw new AssertionError("impossible");
+          }
+        }
+    }
+    throw new AssertionError("impossible");
+  }
+}
diff --git a/android/guava/src/com/google/common/net/HttpHeaders.java b/android/guava/src/com/google/common/net/HttpHeaders.java
index c48cc4a..11a5b50 100644
--- a/android/guava/src/com/google/common/net/HttpHeaders.java
+++ b/android/guava/src/com/google/common/net/HttpHeaders.java
@@ -74,6 +74,13 @@
   /** The HTTP {@code Cookie} header field name. */
   public static final String COOKIE = "Cookie";
   /**
+   * The HTTP <a href="https://fetch.spec.whatwg.org/#cross-origin-resource-policy-header">{@code
+   * Cross-Origin-Resource-Policy}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String CROSS_ORIGIN_RESOURCE_POLICY = "Cross-Origin-Resource-Policy";
+  /**
    * The HTTP <a href="https://tools.ietf.org/html/rfc8470">{@code Early-Data}</a> header field
    * name.
    *
@@ -158,12 +165,22 @@
   /**
    * The HTTP <a href="https://www.w3.org/TR/service-workers/#update-algorithm">{@code
    * Service-Worker}</a> header field name.
+   *
+   * @since 20.0
    */
   public static final String SERVICE_WORKER = "Service-Worker";
   /** The HTTP {@code TE} header field name. */
   public static final String TE = "TE";
   /** The HTTP {@code Upgrade} header field name. */
   public static final String UPGRADE = "Upgrade";
+  /**
+   * The HTTP <a href="https://w3c.github.io/webappsec-upgrade-insecure-requests/#preference">{@code
+   * Upgrade-Insecure-Requests}</a> header field name.
+   *
+   * @since 28.1
+   */
+  public static final String UPGRADE_INSECURE_REQUESTS = "Upgrade-Insecure-Requests";
+
   /** The HTTP {@code User-Agent} header field name. */
   public static final String USER_AGENT = "User-Agent";
 
@@ -249,6 +266,27 @@
    * @since 20.0
    */
   public static final String X_WEBKIT_CSP_REPORT_ONLY = "X-WebKit-CSP-Report-Only";
+  /**
+   * The HTTP <a href="https://wicg.github.io/cross-origin-embedder-policy/#COEP">{@code
+   * Cross-Origin-Embedder-Policy}</a> header field name.
+   *
+   * @since 30.0
+   */
+  public static final String CROSS_ORIGIN_EMBEDDER_POLICY = "Cross-Origin-Embedder-Policy";
+  /**
+   * The HTTP <a href="https://wicg.github.io/cross-origin-embedder-policy/#COEP-RO">{@code
+   * Cross-Origin-Embedder-Policy-Report-Only}</a> header field name.
+   *
+   * @since 30.0
+   */
+  public static final String CROSS_ORIGIN_EMBEDDER_POLICY_REPORT_ONLY =
+      "Cross-Origin-Embedder-Policy-Report-Only";
+  /**
+   * The HTTP Cross-Origin-Opener-Policy header field name.
+   *
+   * @since 28.2
+   */
+  public static final String CROSS_ORIGIN_OPENER_POLICY = "Cross-Origin-Opener-Policy";
   /** The HTTP {@code ETag} header field name. */
   public static final String ETAG = "ETag";
   /** The HTTP {@code Expires} header field name. */
@@ -412,36 +450,111 @@
   public static final String PING_TO = "Ping-To";
 
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-Dest}</a> header
-   * field name.
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">{@code
+   * Purpose}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String PURPOSE = "Purpose";
+  /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">{@code
+   * X-Purpose}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String X_PURPOSE = "X-Purpose";
+  /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">{@code
+   * X-Moz}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String X_MOZ = "X-Moz";
+
+  /**
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua">{@code Sec-CH-UA}</a>
+   * header field name.
+   *
+   * @since 30.0
+   */
+  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
+   * 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
+   * 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
+   * 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
+   * 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
+   * 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
+   * 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://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Dest}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_DEST = "Sec-Fetch-Dest";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-Mode}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Mode}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_MODE = "Sec-Fetch-Mode";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-Site}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Site}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_SITE = "Sec-Fetch-Site";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-User}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-User}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_USER = "Sec-Fetch-User";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Metadata}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Metadata}</a>
+   * header field name.
    *
    * @since 26.0
    */
@@ -467,4 +580,45 @@
    * @since 25.1
    */
   public static final String SEC_REFERRED_TOKEN_BINDING_ID = "Sec-Referred-Token-Binding-ID";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Accept}</a> header
+   * field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_ACCEPT = "Sec-WebSocket-Accept";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Extensions}</a>
+   * header field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_EXTENSIONS = "Sec-WebSocket-Extensions";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Key}</a> header
+   * field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_KEY = "Sec-WebSocket-Key";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Protocol}</a>
+   * header field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_PROTOCOL = "Sec-WebSocket-Protocol";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Version}</a> header
+   * field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_VERSION = "Sec-WebSocket-Version";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc8586">{@code CDN-Loop}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String CDN_LOOP = "CDN-Loop";
 }
diff --git a/android/guava/src/com/google/common/net/InetAddresses.java b/android/guava/src/com/google/common/net/InetAddresses.java
index 40f7474..a4a16e2 100644
--- a/android/guava/src/com/google/common/net/InetAddresses.java
+++ b/android/guava/src/com/google/common/net/InetAddresses.java
@@ -19,19 +19,18 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.CharMatcher;
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
 import com.google.common.hash.Hashing;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Ints;
+import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.List;
 import java.util.Locale;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -101,8 +100,10 @@
 public final class InetAddresses {
   private static final int IPV4_PART_COUNT = 4;
   private static final int IPV6_PART_COUNT = 8;
-  private static final Splitter IPV4_SPLITTER = Splitter.on('.').limit(IPV4_PART_COUNT);
-  private static final Splitter IPV6_SPLITTER = Splitter.on(':').limit(IPV6_PART_COUNT + 2);
+  private static final char IPV4_DELIMITER = '.';
+  private static final char IPV6_DELIMITER = ':';
+  private static final CharMatcher IPV4_DELIMITER_MATCHER = CharMatcher.is(IPV4_DELIMITER);
+  private static final CharMatcher IPV6_DELIMITER_MATCHER = CharMatcher.is(IPV6_DELIMITER);
   private static final Inet4Address LOOPBACK4 = (Inet4Address) forString("127.0.0.1");
   private static final Inet4Address ANY4 = (Inet4Address) forString("0.0.0.0");
 
@@ -130,6 +131,8 @@
    *
    * <p>This deliberately avoids all nameservice lookups (e.g. no DNS).
    *
+   * <p>Anything after a {@code %} in an IPv6 address is ignored (assumed to be a Scope ID).
+   *
    * @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
@@ -157,11 +160,13 @@
     return ipStringToBytes(ipString) != null;
   }
 
+  /** Returns {@code null} if unable to parse into a {@code byte[]}. */
   @NullableDecl
   private static byte[] ipStringToBytes(String ipString) {
     // Make a first pass to categorize the characters in this string.
     boolean hasColon = false;
     boolean hasDot = false;
+    int percentIndex = -1;
     for (int i = 0; i < ipString.length(); i++) {
       char c = ipString.charAt(i);
       if (c == '.') {
@@ -171,6 +176,9 @@
           return null; // Colons must not appear after dots.
         }
         hasColon = true;
+      } else if (c == '%') {
+        percentIndex = i;
+        break; // everything after a '%' is ignored (it's a Scope ID): http://superuser.com/a/99753
       } else if (Character.digit(c, 16) == -1) {
         return null; // Everything else must be a decimal or hex digit.
       }
@@ -184,8 +192,14 @@
           return null;
         }
       }
+      if (percentIndex != -1) {
+        ipString = ipString.substring(0, percentIndex);
+      }
       return textToNumericFormatV6(ipString);
     } else if (hasDot) {
+      if (percentIndex != -1) {
+        return null; // Scope IDs are not supported for IPV4
+      }
       return textToNumericFormatV4(ipString);
     }
     return null;
@@ -193,76 +207,94 @@
 
   @NullableDecl
   private static byte[] textToNumericFormatV4(String ipString) {
-    byte[] bytes = new byte[IPV4_PART_COUNT];
-    int i = 0;
-    try {
-      for (String octet : IPV4_SPLITTER.split(ipString)) {
-        bytes[i++] = parseOctet(octet);
-      }
-    } catch (NumberFormatException ex) {
-      return null;
+    if (IPV4_DELIMITER_MATCHER.countIn(ipString) + 1 != IPV4_PART_COUNT) {
+      return null; // Wrong number of parts
     }
 
-    return i == IPV4_PART_COUNT ? bytes : null;
+    byte[] bytes = new byte[IPV4_PART_COUNT];
+    int start = 0;
+    // Iterate through the parts of the ip string.
+    // Invariant: start is always the beginning of an octet.
+    for (int i = 0; i < IPV4_PART_COUNT; i++) {
+      int end = ipString.indexOf(IPV4_DELIMITER, start);
+      if (end == -1) {
+        end = ipString.length();
+      }
+      try {
+        bytes[i] = parseOctet(ipString, start, end);
+      } catch (NumberFormatException ex) {
+        return null;
+      }
+      start = end + 1;
+    }
+
+    return bytes;
   }
 
   @NullableDecl
   private static byte[] textToNumericFormatV6(String ipString) {
-    // An address can have [2..8] colons, and N colons make N+1 parts.
-    List<String> parts = IPV6_SPLITTER.splitToList(ipString);
-    if (parts.size() < 3 || parts.size() > IPV6_PART_COUNT + 1) {
+    // An address can have [2..8] colons.
+    int delimiterCount = IPV6_DELIMITER_MATCHER.countIn(ipString);
+    if (delimiterCount < 2 || delimiterCount > IPV6_PART_COUNT) {
       return null;
     }
-
-    // Disregarding the endpoints, find "::" with nothing in between.
-    // This indicates that a run of zeroes has been skipped.
-    int skipIndex = -1;
-    for (int i = 1; i < parts.size() - 1; i++) {
-      if (parts.get(i).length() == 0) {
-        if (skipIndex >= 0) {
+    int partsSkipped = IPV6_PART_COUNT - (delimiterCount + 1); // estimate; may be modified later
+    boolean hasSkip = false;
+    // Scan for the appearance of ::, to mark a skip-format IPV6 string and adjust the partsSkipped
+    // estimate.
+    for (int i = 0; i < ipString.length() - 1; i++) {
+      if (ipString.charAt(i) == IPV6_DELIMITER && ipString.charAt(i + 1) == IPV6_DELIMITER) {
+        if (hasSkip) {
           return null; // Can't have more than one ::
         }
-        skipIndex = i;
+        hasSkip = true;
+        partsSkipped++; // :: means we skipped an extra part in between the two delimiters.
+        if (i == 0) {
+          partsSkipped++; // Begins with ::, so we skipped the part preceding the first :
+        }
+        if (i == ipString.length() - 2) {
+          partsSkipped++; // Ends with ::, so we skipped the part after the last :
+        }
       }
     }
-
-    int partsHi; // Number of parts to copy from above/before the "::"
-    int partsLo; // Number of parts to copy from below/after the "::"
-    if (skipIndex >= 0) {
-      // If we found a "::", then check if it also covers the endpoints.
-      partsHi = skipIndex;
-      partsLo = parts.size() - skipIndex - 1;
-      if (parts.get(0).length() == 0 && --partsHi != 0) {
-        return null; // ^: requires ^::
-      }
-      if (Iterables.getLast(parts).length() == 0 && --partsLo != 0) {
-        return null; // :$ requires ::$
-      }
-    } else {
-      // Otherwise, allocate the entire address to partsHi. The endpoints
-      // could still be empty, but parseHextet() will check for that.
-      partsHi = parts.size();
-      partsLo = 0;
+    if (ipString.charAt(0) == IPV6_DELIMITER && ipString.charAt(1) != IPV6_DELIMITER) {
+      return null; // ^: requires ^::
+    }
+    if (ipString.charAt(ipString.length() - 1) == IPV6_DELIMITER
+        && ipString.charAt(ipString.length() - 2) != IPV6_DELIMITER) {
+      return null; // :$ requires ::$
+    }
+    if (hasSkip && partsSkipped <= 0) {
+      return null; // :: must expand to at least one '0'
+    }
+    if (!hasSkip && delimiterCount + 1 != IPV6_PART_COUNT) {
+      return null; // Incorrect number of parts
     }
 
-    // If we found a ::, then we must have skipped at least one part.
-    // Otherwise, we must have exactly the right number of parts.
-    int partsSkipped = IPV6_PART_COUNT - (partsHi + partsLo);
-    if (!(skipIndex >= 0 ? partsSkipped >= 1 : partsSkipped == 0)) {
-      return null;
-    }
-
-    // Now parse the hextets into a byte array.
     ByteBuffer rawBytes = ByteBuffer.allocate(2 * IPV6_PART_COUNT);
     try {
-      for (int i = 0; i < partsHi; i++) {
-        rawBytes.putShort(parseHextet(parts.get(i)));
+      // Iterate through the parts of the ip string.
+      // Invariant: start is always the beginning of a hextet, or the second ':' of the skip
+      // sequence "::"
+      int start = 0;
+      if (ipString.charAt(0) == IPV6_DELIMITER) {
+        start = 1;
       }
-      for (int i = 0; i < partsSkipped; i++) {
-        rawBytes.putShort((short) 0);
-      }
-      for (int i = partsLo; i > 0; i--) {
-        rawBytes.putShort(parseHextet(parts.get(parts.size() - i)));
+      while (start < ipString.length()) {
+        int end = ipString.indexOf(IPV6_DELIMITER, start);
+        if (end == -1) {
+          end = ipString.length();
+        }
+        if (ipString.charAt(start) == IPV6_DELIMITER) {
+          // expand zeroes
+          for (int i = 0; i < partsSkipped; i++) {
+            rawBytes.putShort((short) 0);
+          }
+
+        } else {
+          rawBytes.putShort(parseHextet(ipString, start, end));
+        }
+        start = end + 1;
       }
     } catch (NumberFormatException ex) {
       return null;
@@ -284,23 +316,45 @@
     return initialPart + penultimate + ":" + ultimate;
   }
 
-  private static byte parseOctet(String ipPart) {
-    // Note: we already verified that this string contains only hex digits.
-    int octet = Integer.parseInt(ipPart);
+  private static byte parseOctet(String ipString, int start, int end) {
+    // Note: we already verified that this string contains only hex digits, but the string may still
+    // contain non-decimal characters.
+    int length = end - start;
+    if (length <= 0 || length > 3) {
+      throw new NumberFormatException();
+    }
     // Disallow leading zeroes, because no clear standard exists on
     // whether these should be interpreted as decimal or octal.
-    if (octet > 255 || (ipPart.startsWith("0") && ipPart.length() > 1)) {
+    if (length > 1 && ipString.charAt(start) == '0') {
+      throw new NumberFormatException();
+    }
+    int octet = 0;
+    for (int i = start; i < end; i++) {
+      octet *= 10;
+      int digit = Character.digit(ipString.charAt(i), 10);
+      if (digit < 0) {
+        throw new NumberFormatException();
+      }
+      octet += digit;
+    }
+    if (octet > 255) {
       throw new NumberFormatException();
     }
     return (byte) octet;
   }
 
-  private static short parseHextet(String ipPart) {
+  // Parse a hextet out of the ipString from start (inclusive) to end (exclusive)
+  private static short parseHextet(String ipString, int start, int end) {
     // Note: we already verified that this string contains only hex digits.
-    int hextet = Integer.parseInt(ipPart, 16);
-    if (hextet > 0xffff) {
+    int length = end - start;
+    if (length <= 0 || length > 4) {
       throw new NumberFormatException();
     }
+    int hextet = 0;
+    for (int i = start; i < end; i++) {
+      hextet = hextet << 4;
+      hextet |= Character.digit(ipString.charAt(i), 16);
+    }
     return (short) hextet;
   }
 
@@ -815,8 +869,13 @@
    *
    * <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 the upper 64 bits into {@code 224.0.0.0/3} (64 bits into 29
-   * bits).
+   * This function does so by hashing 64 bits of the IPv6 address into {@code 224.0.0.0/3} (64 bits
+   * into 29 bits):
+   *
+   * <ul>
+   *   <li>If the IPv6 address contains an embedded IPv4 address, the function hashes that.
+   *   <li>Otherwise, it hashes the upper 64 bits of the IPv6 address.
+   * </ul>
    *
    * <p>A "coerced" IPv4 address is equivalent to itself.
    *
@@ -853,7 +912,6 @@
     if (hasEmbeddedIPv4ClientAddress(ip6)) {
       addressAsLong = getEmbeddedIPv4ClientAddress(ip6).hashCode();
     } else {
-
       // Just extract the high 64 bits (assuming the rest is user-modifiable).
       addressAsLong = ByteBuffer.wrap(ip6.getAddress(), 0, 8).getLong();
     }
@@ -896,6 +954,19 @@
   }
 
   /**
+   * Returns a BigInteger representing the address.
+   *
+   * <p>Unlike {@code coerceToInteger}, IPv6 addresses are not coerced to IPv4 addresses.
+   *
+   * @param address {@link InetAddress} to convert
+   * @return {@code BigInteger} representation of the address
+   * @since 28.2
+   */
+  public static BigInteger toBigInteger(InetAddress address) {
+    return new BigInteger(1, address.getAddress());
+  }
+
+  /**
    * Returns an Inet4Address having the integer value specified by the argument.
    *
    * @param address {@code int}, the 32bit integer address to be converted
@@ -906,6 +977,71 @@
   }
 
   /**
+   * Returns the {@code Inet4Address} corresponding to a given {@code BigInteger}.
+   *
+   * @param address BigInteger representing the IPv4 address
+   * @return Inet4Address representation of the given BigInteger
+   * @throws IllegalArgumentException if the BigInteger is not between 0 and 2^32-1
+   * @since 28.2
+   */
+  public static Inet4Address fromIPv4BigInteger(BigInteger address) {
+    return (Inet4Address) fromBigInteger(address, false);
+  }
+  /**
+   * Returns the {@code Inet6Address} corresponding to a given {@code BigInteger}.
+   *
+   * @param address BigInteger representing the IPv6 address
+   * @return Inet6Address representation of the given BigInteger
+   * @throws IllegalArgumentException if the BigInteger is not between 0 and 2^128-1
+   * @since 28.2
+   */
+  public static Inet6Address fromIPv6BigInteger(BigInteger address) {
+    return (Inet6Address) fromBigInteger(address, true);
+  }
+
+  /**
+   * Converts a BigInteger to either an IPv4 or IPv6 address. If the IP is IPv4, it must be
+   * constrainted to 32 bits, otherwise it is constrained to 128 bits.
+   *
+   * @param address the address represented as a big integer
+   * @param isIpv6 whether the created address should be IPv4 or IPv6
+   * @return the BigInteger converted to an address
+   * @throws IllegalArgumentException if the BigInteger is not between 0 and maximum value for IPv4
+   *     or IPv6 respectively
+   */
+  private static InetAddress fromBigInteger(BigInteger address, boolean isIpv6) {
+    checkArgument(address.signum() >= 0, "BigInteger must be greater than or equal to 0");
+
+    int numBytes = isIpv6 ? 16 : 4;
+
+    byte[] addressBytes = address.toByteArray();
+    byte[] targetCopyArray = new byte[numBytes];
+
+    int srcPos = Math.max(0, addressBytes.length - numBytes);
+    int copyLength = addressBytes.length - srcPos;
+    int destPos = numBytes - copyLength;
+
+    // Check the extra bytes in the BigInteger are all zero.
+    for (int i = 0; i < srcPos; i++) {
+      if (addressBytes[i] != 0x00) {
+        throw formatIllegalArgumentException(
+            "BigInteger cannot be converted to InetAddress because it has more than %d"
+                + " bytes: %s",
+            numBytes, address);
+      }
+    }
+
+    // Copy the bytes into the least significant positions.
+    System.arraycopy(addressBytes, srcPos, targetCopyArray, destPos, copyLength);
+
+    try {
+      return InetAddress.getByAddress(targetCopyArray);
+    } catch (UnknownHostException impossible) {
+      throw new AssertionError(impossible);
+    }
+  }
+
+  /**
    * Returns an address from a <b>little-endian ordered</b> byte array (the opposite of what {@link
    * InetAddress#getByAddress} expects).
    *
diff --git a/android/guava/src/com/google/common/net/InternetDomainName.java b/android/guava/src/com/google/common/net/InternetDomainName.java
index 2ca0ef2..cc7a36d 100644
--- a/android/guava/src/com/google/common/net/InternetDomainName.java
+++ b/android/guava/src/com/google/common/net/InternetDomainName.java
@@ -72,7 +72,7 @@
  * @since 5.0
  */
 @Beta
-@GwtCompatible
+@GwtCompatible(emulated = true)
 @Immutable
 public final class InternetDomainName {
 
@@ -237,8 +237,13 @@
 
   private static final CharMatcher DASH_MATCHER = CharMatcher.anyOf("-_");
 
+  private static final CharMatcher DIGIT_MATCHER = CharMatcher.inRange('0', '9');
+
+  private static final CharMatcher LETTER_MATCHER =
+      CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'));
+
   private static final CharMatcher PART_CHAR_MATCHER =
-      CharMatcher.javaLetterOrDigit().or(DASH_MATCHER);
+      DIGIT_MATCHER.or(LETTER_MATCHER).or(DASH_MATCHER);
 
   /**
    * Helper method for {@link #validateSyntax(List)}. Validates that one part of a domain name is
@@ -261,7 +266,7 @@
      * GWT claims to support java.lang.Character's char-classification methods, but it actually only
      * works for ASCII. So for now, assume any non-ASCII characters are valid. The only place this
      * seems to be documented is here:
-     * http://osdir.com/ml/GoogleWebToolkitContributors/2010-03/msg00178.html
+     * https://groups.google.com/d/topic/google-web-toolkit-contributors/1UEzsryq1XI
      *
      * <p>ASCII characters in the part are expected to be valid per RFC 1035, with underscore also
      * being allowed due to widespread practice.
@@ -287,7 +292,7 @@
      * address like 127.0.0.1 from looking like a valid domain name.
      */
 
-    if (isFinalPart && CharMatcher.digit().matches(part.charAt(0))) {
+    if (isFinalPart && DIGIT_MATCHER.matches(part.charAt(0))) {
       return false;
     }
 
diff --git a/android/guava/src/com/google/common/net/MediaType.java b/android/guava/src/com/google/common/net/MediaType.java
index 9c5881c..a5b710f 100644
--- a/android/guava/src/com/google/common/net/MediaType.java
+++ b/android/guava/src/com/google/common/net/MediaType.java
@@ -55,8 +55,8 @@
  * type or subtype value. A media type may not have wildcard type with a declared subtype. The
  * {@code *} character has no special meaning as part of a parameter. All values for type, subtype,
  * parameter attributes or parameter values must be valid according to RFCs <a
- * href="http://www.ietf.org/rfc/rfc2045.txt">2045</a> and <a
- * href="http://www.ietf.org/rfc/rfc2046.txt">2046</a>.
+ * href="https://tools.ietf.org/html/rfc2045">2045</a> and <a
+ * href="https://tools.ietf.org/html/rfc2046">2046</a>.
  *
  * <p>All portions of the media type that are case-insensitive (type, subtype, parameter attributes)
  * are normalized to lowercase. The value of the {@code charset} parameter is normalized to
@@ -101,6 +101,7 @@
   private static final String IMAGE_TYPE = "image";
   private static final String TEXT_TYPE = "text";
   private static final String VIDEO_TYPE = "video";
+  private static final String FONT_TYPE = "font";
 
   private static final String WILDCARD = "*";
 
@@ -141,6 +142,13 @@
   public static final MediaType ANY_VIDEO_TYPE = createConstant(VIDEO_TYPE, WILDCARD);
   public static final MediaType ANY_APPLICATION_TYPE = createConstant(APPLICATION_TYPE, WILDCARD);
 
+  /**
+   * Wildcard matching any "font" top-level media type.
+   *
+   * @since 30.0
+   */
+  public static final MediaType ANY_FONT_TYPE = createConstant(FONT_TYPE, WILDCARD);
+
   /* text types */
   public static final MediaType CACHE_MANIFEST_UTF_8 =
       createConstantUtf8(TEXT_TYPE, "cache-manifest");
@@ -189,6 +197,7 @@
    */
   public static final MediaType VTT_UTF_8 = createConstantUtf8(TEXT_TYPE, "vtt");
 
+  /* image types */
   /**
    * <a href="https://en.wikipedia.org/wiki/BMP_file_format">Bitmap file format</a> ({@code bmp}
    * files).
@@ -242,6 +251,20 @@
    */
   public static final MediaType WEBP = createConstant(IMAGE_TYPE, "webp");
 
+  /**
+   * <a href="https://www.iana.org/assignments/media-types/image/heif">HEIF image format</a>.
+   *
+   * @since 28.1
+   */
+  public static final MediaType HEIF = createConstant(IMAGE_TYPE, "heif");
+
+  /**
+   * <a href="https://tools.ietf.org/html/rfc3745">JP2K image format</a>.
+   *
+   * @since 28.1
+   */
+  public static final MediaType JP2K = createConstant(IMAGE_TYPE, "jp2");
+
   /* audio types */
   public static final MediaType MP4_AUDIO = createConstant(AUDIO_TYPE, "mp4");
   public static final MediaType MPEG_AUDIO = createConstant(AUDIO_TYPE, "mpeg");
@@ -426,6 +449,14 @@
    */
   public static final MediaType APPLICATION_BINARY = createConstant(APPLICATION_TYPE, "binary");
 
+  /**
+   * Media type for the <a href="https://tools.ietf.org/html/rfc7946">GeoJSON Format</a>, a
+   * geospatial data interchange format based on JSON.
+   *
+   * @since 28.0
+   */
+  public static final MediaType GEO_JSON = createConstant(APPLICATION_TYPE, "geo+json");
+
   public static final MediaType GZIP = createConstant(APPLICATION_TYPE, "x-gzip");
 
   /**
@@ -515,6 +546,18 @@
   public static final MediaType MICROSOFT_WORD = createConstant(APPLICATION_TYPE, "msword");
 
   /**
+   * Media type for <a
+   * href="https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP">Dynamic Adaptive
+   * Streaming over HTTP (DASH)</a>. This is <a
+   * href="https://www.iana.org/assignments/media-types/application/dash+xml">registered</a> with
+   * the IANA.
+   *
+   * @since 28.2
+   */
+  public static final MediaType MEDIA_PRESENTATION_DESCRIPTION =
+      createConstant(APPLICATION_TYPE, "dash+xml");
+
+  /**
    * WASM applications. For more information see <a href="https://webassembly.org/">the Web Assembly
    * overview</a>.
    *
@@ -560,6 +603,17 @@
       createConstant(APPLICATION_TYPE, "vnd.oasis.opendocument.spreadsheet");
   public static final MediaType OPENDOCUMENT_TEXT =
       createConstant(APPLICATION_TYPE, "vnd.oasis.opendocument.text");
+
+  /**
+   * <a href="https://tools.ietf.org/id/draft-ellermann-opensearch-01.html">OpenSearch</a>
+   * Description files are XML files that describe how a website can be used as a search engine by
+   * consumers (e.g. web browsers).
+   *
+   * @since 28.2
+   */
+  public static final MediaType OPENSEARCH_DESCRIPTION_UTF_8 =
+      createConstantUtf8(APPLICATION_TYPE, "opensearchdescription+xml");
+
   public static final MediaType PDF = createConstant(APPLICATION_TYPE, "pdf");
   public static final MediaType POSTSCRIPT = createConstant(APPLICATION_TYPE, "postscript");
 
@@ -583,10 +637,9 @@
   public static final MediaType RTF_UTF_8 = createConstantUtf8(APPLICATION_TYPE, "rtf");
 
   /**
-   * SFNT fonts (which includes <a href="http://en.wikipedia.org/wiki/TrueType/">TrueType</a> and <a
-   * href="http://en.wikipedia.org/wiki/OpenType/">OpenType</a> fonts). This is <a
-   * href="http://www.iana.org/assignments/media-types/application/font-sfnt">registered</a> with
-   * the IANA.
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares {@link #FONT_SFNT
+   * font/sfnt} to be the correct media type for SFNT, but this may be necessary in certain
+   * situations for compatibility.
    *
    * @since 17.0
    */
@@ -619,18 +672,18 @@
   public static final MediaType TAR = createConstant(APPLICATION_TYPE, "x-tar");
 
   /**
-   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF) <a
-   * href="http://www.w3.org/TR/WOFF/">defined</a> by the W3C. This is <a
-   * href="http://www.iana.org/assignments/media-types/application/font-woff">registered</a> with
-   * the IANA.
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares {@link #FONT_WOFF
+   * font/woff} to be the correct media type for WOFF, but this may be necessary in certain
+   * situations for compatibility.
    *
    * @since 17.0
    */
   public static final MediaType WOFF = createConstant(APPLICATION_TYPE, "font-woff");
 
   /**
-   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF)
-   * version 2 <a href="https://www.w3.org/TR/WOFF2/">defined</a> by the W3C.
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares {@link #FONT_WOFF2
+   * font/woff2} to be the correct media type for WOFF2, but this may be necessary in certain
+   * situations for compatibility.
    *
    * @since 20.0
    */
@@ -650,6 +703,62 @@
 
   public static final MediaType ZIP = createConstant(APPLICATION_TYPE, "zip");
 
+  /* font types */
+
+  /**
+   * A collection of font outlines as defined by <a href="https://tools.ietf.org/html/rfc8081">RFC
+   * 8081</a>.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_COLLECTION = createConstant(FONT_TYPE, "collection");
+
+  /**
+   * <a href="https://en.wikipedia.org/wiki/OpenType">Open Type Font Format</a> (OTF) as defined by
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a>.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_OTF = createConstant(FONT_TYPE, "otf");
+
+  /**
+   * <a href="https://en.wikipedia.org/wiki/SFNT">Spline or Scalable Font Format</a> (SFNT). <a
+   * href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares this to be the correct media
+   * type for SFNT, but {@link #SFNT application/font-sfnt} may be necessary in certain situations
+   * for compatibility.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_SFNT = createConstant(FONT_TYPE, "sfnt");
+
+  /**
+   * <a href="https://en.wikipedia.org/wiki/TrueType">True Type Font Format</a> (TTF) as defined by
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a>.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_TTF = createConstant(FONT_TYPE, "ttf");
+
+  /**
+   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF). <a
+   * href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares this to be the correct media
+   * type for SFNT, but {@link #WOFF application/font-woff} may be necessary in certain situations
+   * for compatibility.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_WOFF = createConstant(FONT_TYPE, "woff");
+
+  /**
+   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF2).
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares this to be the correct
+   * media type for SFNT, but {@link #WOFF2 application/font-woff2} may be necessary in certain
+   * situations for compatibility.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_WOFF2 = createConstant(FONT_TYPE, "woff2");
+
   private final String type;
   private final String subtype;
   private final ImmutableListMultimap<String, String> parameters;
@@ -887,6 +996,15 @@
   }
 
   /**
+   * Creates a media type with the "font" type and the given subtype.
+   *
+   * @throws IllegalArgumentException if subtype is invalid
+   */
+  static MediaType createFontType(String subtype) {
+    return create(FONT_TYPE, subtype);
+  }
+
+  /**
    * Creates a media type with the "image" type and the given subtype.
    *
    * @throws IllegalArgumentException if subtype is invalid
@@ -915,10 +1033,13 @@
 
   private static String normalizeToken(String token) {
     checkArgument(TOKEN_MATCHER.matchesAllOf(token));
+    checkArgument(!token.isEmpty());
     return Ascii.toLowerCase(token);
   }
 
   private static String normalizeParameterValue(String attribute, String value) {
+    checkNotNull(value); // for GWT
+    checkArgument(ascii().matchesAllOf(value), "parameter values must be ASCII: %s", value);
     return CHARSET_ATTRIBUTE.equals(attribute) ? Ascii.toLowerCase(value) : value;
   }
 
@@ -1066,7 +1187,9 @@
               new Function<String, String>() {
                 @Override
                 public String apply(String value) {
-                  return TOKEN_MATCHER.matchesAllOf(value) ? value : escapeAndQuote(value);
+                  return (TOKEN_MATCHER.matchesAllOf(value) && !value.isEmpty())
+                      ? value
+                      : escapeAndQuote(value);
                 }
               });
       PARAMETER_JOINER.appendTo(builder, quotedParameters.entries());
diff --git a/android/guava/src/com/google/common/net/PercentEscaper.java b/android/guava/src/com/google/common/net/PercentEscaper.java
index a931a52..554d04d 100644
--- a/android/guava/src/com/google/common/net/PercentEscaper.java
+++ b/android/guava/src/com/google/common/net/PercentEscaper.java
@@ -64,7 +64,7 @@
 
   /**
    * An array of flags where for any {@code char c} if {@code safeOctets[c]} is true then {@code c}
-   * should remain unmodified in the output. If {@code c > safeOctets.length} then it should be
+   * should remain unmodified in the output. If {@code c >= safeOctets.length} then it should be
    * escaped.
    */
   private final boolean[] safeOctets;
diff --git a/android/guava/src/com/google/common/primitives/Doubles.java b/android/guava/src/com/google/common/primitives/Doubles.java
index 1a43503..a886fe9 100644
--- a/android/guava/src/com/google/common/primitives/Doubles.java
+++ b/android/guava/src/com/google/common/primitives/Doubles.java
@@ -18,6 +18,7 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static com.google.common.base.Strings.lenientFormat;
 import static java.lang.Double.NEGATIVE_INFINITY;
 import static java.lang.Double.POSITIVE_INFINITY;
 
@@ -46,7 +47,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
-public final class Doubles {
+public final class Doubles extends DoublesMethodsForWeb {
   private Doubles() {}
 
   /**
@@ -207,6 +208,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static double min(double... array) {
     checkArgument(array.length > 0);
     double min = array[0];
@@ -225,6 +228,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static double max(double... array) {
     checkArgument(array.length > 0);
     double max = array[0];
@@ -249,8 +254,13 @@
    */
   @Beta
   public static double constrainToRange(double value, double min, double max) {
-    checkArgument(min <= max, "min (%s) must be less than or equal to max (%s)", min, max);
-    return Math.min(Math.max(value, min), max);
+    // avoid auto-boxing by not using Preconditions.checkArgument(); see Guava issue 3984
+    // Reject NaN by testing for the good case (min <= max) instead of the bad (min > max).
+    if (min <= max) {
+      return Math.min(Math.max(value, min), max);
+    }
+    throw new IllegalArgumentException(
+        lenientFormat("min (%s) must be less than or equal to max (%s)", min, max));
   }
 
   /**
@@ -687,6 +697,7 @@
    * @param string the string representation of a {@code double} value
    * @return the floating point value represented by {@code string}, or {@code null} if {@code
    *     string} has a length of zero or cannot be parsed as a {@code double} value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 14.0
    */
   @Beta
diff --git a/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java b/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
new file mode 100644
index 0000000..04d9651
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Doubles}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+abstract class DoublesMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/primitives/Floats.java b/android/guava/src/com/google/common/primitives/Floats.java
index fc75aef..e379ebd 100644
--- a/android/guava/src/com/google/common/primitives/Floats.java
+++ b/android/guava/src/com/google/common/primitives/Floats.java
@@ -18,6 +18,7 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static com.google.common.base.Strings.lenientFormat;
 import static java.lang.Float.NEGATIVE_INFINITY;
 import static java.lang.Float.POSITIVE_INFINITY;
 
@@ -46,7 +47,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
-public final class Floats {
+public final class Floats extends FloatsMethodsForWeb {
   private Floats() {}
 
   /**
@@ -204,6 +205,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static float min(float... array) {
     checkArgument(array.length > 0);
     float min = array[0];
@@ -222,6 +225,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static float max(float... array) {
     checkArgument(array.length > 0);
     float max = array[0];
@@ -246,8 +251,13 @@
    */
   @Beta
   public static float constrainToRange(float value, float min, float max) {
-    checkArgument(min <= max, "min (%s) must be less than or equal to max (%s)", min, max);
-    return Math.min(Math.max(value, min), max);
+    // avoid auto-boxing by not using Preconditions.checkArgument(); see Guava issue 3984
+    // Reject NaN by testing for the good case (min <= max) instead of the bad (min > max).
+    if (min <= max) {
+      return Math.min(Math.max(value, min), max);
+    }
+    throw new IllegalArgumentException(
+        lenientFormat("min (%s) must be less than or equal to max (%s)", min, max));
   }
 
   /**
@@ -646,6 +656,7 @@
    * @param string the string representation of a {@code float} value
    * @return the floating point value represented by {@code string}, or {@code null} if {@code
    *     string} has a length of zero or cannot be parsed as a {@code float} value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 14.0
    */
   @Beta
diff --git a/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java b/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
new file mode 100644
index 0000000..acdb42f
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Floats}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+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 adfd9b0..63efc45 100644
--- a/android/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
+++ b/android/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
@@ -265,9 +265,7 @@
     private void ensureRoomFor(int numberToAdd) {
       int newCount = count + numberToAdd; // TODO(kevinb): check overflow now?
       if (newCount > array.length) {
-        double[] newArray = new double[expandedCapacity(array.length, newCount)];
-        System.arraycopy(array, 0, newArray, 0, count);
-        this.array = newArray;
+        array = Arrays.copyOf(array, expandedCapacity(array.length, newCount));
       }
     }
 
diff --git a/android/guava/src/com/google/common/primitives/ImmutableIntArray.java b/android/guava/src/com/google/common/primitives/ImmutableIntArray.java
index f500314..02d9b50 100644
--- a/android/guava/src/com/google/common/primitives/ImmutableIntArray.java
+++ b/android/guava/src/com/google/common/primitives/ImmutableIntArray.java
@@ -262,9 +262,7 @@
     private void ensureRoomFor(int numberToAdd) {
       int newCount = count + numberToAdd; // TODO(kevinb): check overflow now?
       if (newCount > array.length) {
-        int[] newArray = new int[expandedCapacity(array.length, newCount)];
-        System.arraycopy(array, 0, newArray, 0, count);
-        this.array = newArray;
+        array = Arrays.copyOf(array, expandedCapacity(array.length, newCount));
       }
     }
 
diff --git a/android/guava/src/com/google/common/primitives/ImmutableLongArray.java b/android/guava/src/com/google/common/primitives/ImmutableLongArray.java
index 1f3e079..ce0e4b6 100644
--- a/android/guava/src/com/google/common/primitives/ImmutableLongArray.java
+++ b/android/guava/src/com/google/common/primitives/ImmutableLongArray.java
@@ -264,9 +264,7 @@
     private void ensureRoomFor(int numberToAdd) {
       int newCount = count + numberToAdd; // TODO(kevinb): check overflow now?
       if (newCount > array.length) {
-        long[] newArray = new long[expandedCapacity(array.length, newCount)];
-        System.arraycopy(array, 0, newArray, 0, count);
-        this.array = newArray;
+        array = Arrays.copyOf(array, expandedCapacity(array.length, newCount));
       }
     }
 
diff --git a/android/guava/src/com/google/common/primitives/Ints.java b/android/guava/src/com/google/common/primitives/Ints.java
index b538d33..93b5ba0 100644
--- a/android/guava/src/com/google/common/primitives/Ints.java
+++ b/android/guava/src/com/google/common/primitives/Ints.java
@@ -21,6 +21,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Converter;
 import java.io.Serializable;
 import java.util.AbstractList;
@@ -42,8 +43,8 @@
  * @author Kevin Bourrillion
  * @since 1.0
  */
-@GwtCompatible
-public final class Ints {
+@GwtCompatible(emulated = true)
+public final class Ints extends IntsMethodsForWeb {
   private Ints() {}
 
   /**
@@ -218,6 +219,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static int min(int... array) {
     checkArgument(array.length > 0);
     int min = array[0];
@@ -237,6 +240,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static int max(int... array) {
     checkArgument(array.length > 0);
     int max = array[0];
@@ -697,6 +702,7 @@
    * @param string the string representation of an integer value
    * @return the integer value represented by {@code string}, or {@code null} if {@code string} has
    *     a length of zero or cannot be parsed as an integer value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 11.0
    */
   @Beta
@@ -722,6 +728,7 @@
    *     {@code string} has a length of zero or cannot be parsed as an integer value
    * @throws IllegalArgumentException if {@code radix < Character.MIN_RADIX} or {@code radix >
    *     Character.MAX_RADIX}
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 19.0
    */
   @Beta
diff --git a/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java b/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
new file mode 100644
index 0000000..cb87bd2
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Ints}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+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 23697f0..81838ce 100644
--- a/android/guava/src/com/google/common/primitives/Longs.java
+++ b/android/guava/src/com/google/common/primitives/Longs.java
@@ -328,10 +328,10 @@
     static {
       byte[] result = new byte[128];
       Arrays.fill(result, (byte) -1);
-      for (int i = 0; i <= 9; i++) {
+      for (int i = 0; i < 10; i++) {
         result['0' + i] = (byte) i;
       }
-      for (int i = 0; i <= 26; i++) {
+      for (int i = 0; i < 26; i++) {
         result['A' + i] = (byte) (10 + i);
         result['a' + i] = (byte) (10 + i);
       }
@@ -357,6 +357,7 @@
    * @param string the string representation of a long value
    * @return the long value represented by {@code string}, or {@code null} if {@code string} has a
    *     length of zero or cannot be parsed as a long value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 14.0
    */
   @Beta
@@ -382,6 +383,7 @@
    *     {@code string} has a length of zero or cannot be parsed as a long value
    * @throws IllegalArgumentException if {@code radix < Character.MIN_RADIX} or {@code radix >
    *     Character.MAX_RADIX}
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 19.0
    */
   @Beta
diff --git a/android/guava/src/com/google/common/primitives/Platform.java b/android/guava/src/com/google/common/primitives/Platform.java
new file mode 100644
index 0000000..82b902b
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/Platform.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/** Methods factored out so that they can be emulated differently in GWT. */
+@GwtCompatible(emulated = true)
+final class Platform {
+  static void checkGwtRpcEnabled() {}
+
+  private Platform() {}
+}
diff --git a/android/guava/src/com/google/common/primitives/Shorts.java b/android/guava/src/com/google/common/primitives/Shorts.java
index 18309cd..dc58138 100644
--- a/android/guava/src/com/google/common/primitives/Shorts.java
+++ b/android/guava/src/com/google/common/primitives/Shorts.java
@@ -44,7 +44,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
-public final class Shorts {
+public final class Shorts extends ShortsMethodsForWeb {
   private Shorts() {}
 
   /**
@@ -218,6 +218,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static short min(short... array) {
     checkArgument(array.length > 0);
     short min = array[0];
@@ -237,6 +239,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static short max(short... array) {
     checkArgument(array.length > 0);
     short max = array[0];
diff --git a/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java b/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
new file mode 100644
index 0000000..c362768
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Shorts}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+abstract class ShortsMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/primitives/UnsignedBytes.java b/android/guava/src/com/google/common/primitives/UnsignedBytes.java
index f252423..4275f8a 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedBytes.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedBytes.java
@@ -121,11 +121,11 @@
   }
 
   /**
-   * Returns the least value present in {@code array}.
+   * Returns the least value present in {@code array}, treating values as unsigned.
    *
    * @param array a <i>nonempty</i> array of {@code byte} values
    * @return the value present in {@code array} that is less than or equal to every other value in
-   *     the array
+   *     the array according to {@link #compare}
    * @throws IllegalArgumentException if {@code array} is empty
    */
   public static byte min(byte... array) {
@@ -141,11 +141,11 @@
   }
 
   /**
-   * Returns the greatest value present in {@code array}.
+   * Returns the greatest value present in {@code array}, treating values as unsigned.
    *
    * @param array a <i>nonempty</i> array of {@code byte} values
    * @return the value present in {@code array} that is greater than or equal to every other value
-   *     in the array
+   *     in the array according to {@link #compare}
    * @throws IllegalArgumentException if {@code array} is empty
    */
   public static byte max(byte... array) {
diff --git a/android/guava/src/com/google/common/reflect/ClassPath.java b/android/guava/src/com/google/common/reflect/ClassPath.java
index 495d3f6..427914c 100644
--- a/android/guava/src/com/google/common/reflect/ClassPath.java
+++ b/android/guava/src/com/google/common/reflect/ClassPath.java
@@ -46,7 +46,7 @@
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.Map.Entry;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.jar.Attributes;
@@ -178,19 +178,21 @@
    */
   @Beta
   public static class ResourceInfo {
+    private final File file;
     private final String resourceName;
 
     final ClassLoader loader;
 
-    static ResourceInfo of(String resourceName, ClassLoader loader) {
+    static ResourceInfo of(File file, String resourceName, ClassLoader loader) {
       if (resourceName.endsWith(CLASS_FILE_NAME_EXTENSION)) {
-        return new ClassInfo(resourceName, loader);
+        return new ClassInfo(file, resourceName, loader);
       } else {
-        return new ResourceInfo(resourceName, loader);
+        return new ResourceInfo(file, resourceName, loader);
       }
     }
 
-    ResourceInfo(String resourceName, ClassLoader loader) {
+    ResourceInfo(File file, String resourceName, ClassLoader loader) {
+      this.file = checkNotNull(file);
       this.resourceName = checkNotNull(resourceName);
       this.loader = checkNotNull(loader);
     }
@@ -239,6 +241,11 @@
       return resourceName;
     }
 
+    /** Returns the file that includes this resource. */
+    final File getFile() {
+      return file;
+    }
+
     @Override
     public int hashCode() {
       return resourceName.hashCode();
@@ -269,8 +276,8 @@
   public static final class ClassInfo extends ResourceInfo {
     private final String className;
 
-    ClassInfo(String resourceName, ClassLoader loader) {
-      super(resourceName, loader);
+    ClassInfo(File file, String resourceName, ClassLoader loader) {
+      super(file, resourceName, loader);
       this.className = getClassName(resourceName);
     }
 
@@ -296,7 +303,7 @@
         String innerClassName = className.substring(lastDollarSign + 1);
         // local and anonymous classes are prefixed with number (1,2,3...), anonymous classes are
         // entirely numeric whereas local classes have the user supplied name as a suffix
-        return CharMatcher.digit().trimLeadingFrom(innerClassName);
+        return CharMatcher.inRange('0', '9').trimLeadingFrom(innerClassName);
       }
       String packageName = getPackageName();
       if (packageName.isEmpty()) {
@@ -346,11 +353,11 @@
   abstract static class Scanner {
 
     // We only scan each file once independent of the classloader that resource might be associated
-    // with.
-    private final Set<File> scannedUris = Sets.newHashSet();
+    // with. Use concurrent set so that subclasses can be thread-safe.
+    private final Set<File> scannedUris = Sets.newConcurrentHashSet();
 
     public final void scan(ClassLoader classloader) throws IOException {
-      for (Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
+      for (Map.Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
         scan(entry.getKey(), entry.getValue());
       }
     }
@@ -362,13 +369,13 @@
       }
     }
 
-    /** Called when a directory is scanned for resource files. */
-    protected abstract void scanDirectory(ClassLoader loader, File directory) throws IOException;
+    /**
+     * Called each time a resource (uniqueness not guaranteed if the class path includes redundant
+     * entries)
+     */
+    protected abstract void scanResource(ResourceInfo resource) throws IOException;
 
-    /** Called when a jar file is scanned for resource entries. */
-    protected abstract void scanJarFile(ClassLoader loader, JarFile file) throws IOException;
-
-    private void scanFrom(File file, ClassLoader classloader) throws IOException {
+    protected void scanFrom(File file, ClassLoader classloader) throws IOException {
       try {
         if (!file.exists()) {
           return;
@@ -500,35 +507,20 @@
     static URL getClassPathEntry(File jarFile, String path) throws MalformedURLException {
       return new URL(jarFile.toURI().toURL(), path);
     }
-  }
 
-  @VisibleForTesting
-  static final class DefaultScanner extends Scanner {
-    private final SetMultimap<ClassLoader, String> resources =
-        MultimapBuilder.hashKeys().linkedHashSetValues().build();
-
-    ImmutableSet<ResourceInfo> getResources() {
-      ImmutableSet.Builder<ResourceInfo> builder = ImmutableSet.builder();
-      for (Entry<ClassLoader, String> entry : resources.entries()) {
-        builder.add(ResourceInfo.of(entry.getValue(), entry.getKey()));
-      }
-      return builder.build();
-    }
-
-    @Override
-    protected void scanJarFile(ClassLoader classloader, JarFile file) {
+    @VisibleForTesting
+    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
       Enumeration<JarEntry> entries = file.entries();
       while (entries.hasMoreElements()) {
         JarEntry entry = entries.nextElement();
         if (entry.isDirectory() || entry.getName().equals(JarFile.MANIFEST_NAME)) {
           continue;
         }
-        resources.get(classloader).add(entry.getName());
+        scanResource(ResourceInfo.of(new File(file.getName()), entry.getName(), classloader));
       }
     }
 
-    @Override
-    protected void scanDirectory(ClassLoader classloader, File directory) throws IOException {
+    private void scanDirectory(ClassLoader classloader, File directory) throws IOException {
       Set<File> currentPath = new HashSet<>();
       currentPath.add(directory.getCanonicalFile());
       scanDirectory(directory, classloader, "", currentPath);
@@ -566,7 +558,7 @@
         } else {
           String resourceName = packagePrefix + name;
           if (!resourceName.equals(JarFile.MANIFEST_NAME)) {
-            resources.get(classloader).add(resourceName);
+            scanResource(ResourceInfo.of(f, resourceName, classloader));
           }
         }
       }
@@ -574,6 +566,21 @@
   }
 
   @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
+    protected void scanResource(ResourceInfo resource) {
+      resources.put(resource.loader, resource);
+    }
+  }
+
+  @VisibleForTesting
   static String getClassName(String filename) {
     int classNameEnd = filename.length() - CLASS_FILE_NAME_EXTENSION.length();
     return filename.substring(0, classNameEnd).replace('/', '.');
diff --git a/android/guava/src/com/google/common/reflect/Parameter.java b/android/guava/src/com/google/common/reflect/Parameter.java
index 64810e4..8f05ef6 100644
--- a/android/guava/src/com/google/common/reflect/Parameter.java
+++ b/android/guava/src/com/google/common/reflect/Parameter.java
@@ -87,7 +87,7 @@
   // @Override on JDK8
   @Override
   public Annotation[] getDeclaredAnnotations() {
-    return annotations.toArray(new Annotation[annotations.size()]);
+    return annotations.toArray(new Annotation[0]);
   }
 
   /** @since 18.0 */
diff --git a/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java b/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java
index 7dc0ffd..80396bc 100644
--- a/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java
+++ b/android/guava/src/com/google/common/reflect/TypeToInstanceMap.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
@@ -39,6 +40,7 @@
  * @since 13.0
  */
 @Beta
+@DoNotMock("Use ImmutableTypeToInstanceMap or MutableTypeToInstanceMap")
 public interface TypeToInstanceMap<B> extends Map<TypeToken<? extends B>, B> {
 
   /**
diff --git a/android/guava/src/com/google/common/reflect/TypeToken.java b/android/guava/src/com/google/common/reflect/TypeToken.java
index 664ab4a..daf498c 100644
--- a/android/guava/src/com/google/common/reflect/TypeToken.java
+++ b/android/guava/src/com/google/common/reflect/TypeToken.java
@@ -46,7 +46,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -104,10 +103,10 @@
   private final Type runtimeType;
 
   /** Resolver for resolving parameter and field types with {@link #runtimeType} as context. */
-  @MonotonicNonNullDecl private transient TypeResolver invariantTypeResolver;
+  @NullableDecl private transient TypeResolver invariantTypeResolver;
 
   /** Resolver for resolving covariant types with {@link #runtimeType} as context. */
-  @MonotonicNonNullDecl private transient TypeResolver covariantTypeResolver;
+  @NullableDecl private transient TypeResolver covariantTypeResolver;
 
   /**
    * Constructs a new type token of {@code T}.
@@ -656,7 +655,7 @@
    */
   public class TypeSet extends ForwardingSet<TypeToken<? super T>> implements Serializable {
 
-    @MonotonicNonNullDecl private transient ImmutableSet<TypeToken<? super T>> types;
+    @NullableDecl private transient ImmutableSet<TypeToken<? super T>> types;
 
     TypeSet() {}
 
@@ -702,7 +701,7 @@
   private final class InterfaceSet extends TypeSet {
 
     private final transient TypeSet allTypes;
-    @MonotonicNonNullDecl private transient ImmutableSet<TypeToken<? super T>> interfaces;
+    @NullableDecl private transient ImmutableSet<TypeToken<? super T>> interfaces;
 
     InterfaceSet(TypeSet allTypes) {
       this.allTypes = allTypes;
@@ -755,7 +754,7 @@
 
   private final class ClassSet extends TypeSet {
 
-    @MonotonicNonNullDecl private transient ImmutableSet<TypeToken<? super T>> classes;
+    @NullableDecl private transient ImmutableSet<TypeToken<? super T>> classes;
 
     @Override
     protected Set<TypeToken<? super T>> delegate() {
@@ -1211,9 +1210,9 @@
   }
 
   private TypeToken<? extends T> getSubtypeFromLowerBounds(Class<?> subclass, Type[] lowerBounds) {
-    for (Type lowerBound : lowerBounds) {
+    if (lowerBounds.length > 0) {
       @SuppressWarnings("unchecked") // T's lower bound is <? extends T>
-      TypeToken<? extends T> bound = (TypeToken<? extends T>) of(lowerBound);
+      TypeToken<? extends T> bound = (TypeToken<? extends T>) of(lowerBounds[0]);
       // Java supports only one lowerbound anyway.
       return bound.getSubtype(subclass);
     }
diff --git a/android/guava/src/com/google/common/reflect/Types.java b/android/guava/src/com/google/common/reflect/Types.java
index dd74ae8..4fc3910 100644
--- a/android/guava/src/com/google/common/reflect/Types.java
+++ b/android/guava/src/com/google/common/reflect/Types.java
@@ -351,6 +351,12 @@
    * TypeResolver#resolveType} will not be able to call {@code getAnnotatedBounds()} on it, but that
    * should hopefully be rare.
    *
+   * <p>TODO(b/147144588): We are currently also missing the methods inherited from {@link
+   * AnnotatedElement}, which {@code TypeVariable} began to extend only in Java 8. Those methods
+   * refer only to types present in Java 7, so we could implement them in {@code TypeVariableImpl}
+   * today. (We could probably then make {@code TypeVariableImpl} implement {@code AnnotatedElement}
+   * so that we get partial compile-time checking.)
+   *
    * <p>This workaround should be removed at a distant future time when we no longer support Java
    * versions earlier than 8.
    */
@@ -514,7 +520,7 @@
   }
 
   private static Type[] toArray(Collection<Type> types) {
-    return types.toArray(new Type[types.size()]);
+    return types.toArray(new Type[0]);
   }
 
   private static Iterable<Type> filterUpperBounds(Iterable<Type> bounds) {
@@ -591,7 +597,14 @@
           return (String) getTypeName.invoke(type);
         } catch (NoSuchMethodException e) {
           throw new AssertionError("Type.getTypeName should be available in Java 8");
-        } catch (InvocationTargetException | IllegalAccessException e) {
+          /*
+           * Do not merge the 2 catch blocks below. javac would infer a type of
+           * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
+           * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
+           */
+        } catch (InvocationTargetException e) {
+          throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
           throw new RuntimeException(e);
         }
       }
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 96aa567..740a0d5 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
@@ -21,6 +21,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
+import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
+import com.google.common.util.concurrent.internal.InternalFutures;
 import com.google.errorprone.annotations.ForOverride;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -70,10 +72,9 @@
     ListenableFuture<? extends V> localInputFuture = inputFuture;
     Class<X> localExceptionType = exceptionType;
     F localFallback = fallback;
-    if (localInputFuture == null
-        | localExceptionType == null
-        | localFallback == null
-        | isCancelled()) {
+    if (localInputFuture == null | localExceptionType == null | localFallback == null
+        // This check, unlike all the others, is a volatile read
+        || isCancelled()) {
       return;
     }
     inputFuture = null;
@@ -82,9 +83,25 @@
     V sourceResult = null;
     Throwable throwable = null;
     try {
-      sourceResult = getDone(localInputFuture);
+      if (localInputFuture instanceof InternalFutureFailureAccess) {
+        throwable =
+            InternalFutures.tryInternalFastPathGetFailure(
+                (InternalFutureFailureAccess) localInputFuture);
+      }
+      if (throwable == null) {
+        sourceResult = getDone(localInputFuture);
+      }
     } catch (ExecutionException e) {
-      throwable = checkNotNull(e.getCause());
+      throwable = e.getCause();
+      if (throwable == null) {
+        throwable =
+            new NullPointerException(
+                "Future type "
+                    + localInputFuture.getClass()
+                    + " threw "
+                    + e.getClass()
+                    + " without a cause");
+      }
     } catch (Throwable e) { // this includes cancellation exception
       throwable = e;
     }
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractCheckedFuture.java b/android/guava/src/com/google/common/util/concurrent/AbstractCheckedFuture.java
deleted file mode 100644
index 5242ca6..0000000
--- a/android/guava/src/com/google/common/util/concurrent/AbstractCheckedFuture.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.util.concurrent;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.GwtIncompatible;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A delegating wrapper around a {@link ListenableFuture} that adds support for the {@link
- * #checkedGet()} and {@link #checkedGet(long, TimeUnit)} methods.
- *
- * @author Sven Mawson
- * @since 1.0
- * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
- *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
- *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
- *     Additionally, it has a surprising policy about which exceptions to map and which to leave
- *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
- *     use, possibly specializing them to the particular exception type they use. We recommend that
- *     most people use {@code ListenableFuture} and perform any exception wrapping themselves. This
- *     class is scheduled for removal from Guava in January 2019.
- */
-// TODO(b/72241575): Remove by 2019-01
-@Beta
-@Deprecated
-@GwtIncompatible
-public abstract class AbstractCheckedFuture<V, X extends Exception>
-    extends ForwardingListenableFuture.SimpleForwardingListenableFuture<V>
-    implements CheckedFuture<V, X> {
-  /** Constructs an {@code AbstractCheckedFuture} that wraps a delegate. */
-  protected AbstractCheckedFuture(ListenableFuture<V> delegate) {
-    super(delegate);
-  }
-
-  /**
-   * Translates from an {@link InterruptedException}, {@link CancellationException} or {@link
-   * ExecutionException} thrown by {@code get} to an exception of type {@code X} to be thrown by
-   * {@code checkedGet}. Subclasses must implement this method.
-   *
-   * <p>If {@code e} is an {@code InterruptedException}, the calling {@code checkedGet} method has
-   * already restored the interrupt after catching the exception. If an implementation of {@link
-   * #mapException(Exception)} wishes to swallow the interrupt, it can do so by calling {@link
-   * Thread#interrupted()}.
-   *
-   * <p>Subclasses may choose to throw, rather than return, a subclass of {@code RuntimeException}
-   * to allow creating a CheckedFuture that throws both checked and unchecked exceptions.
-   */
-  // We might like @ForOverride here, but some subclasses invoke this from their get() methods.
-  protected abstract X mapException(Exception e);
-
-  /**
-   * {@inheritDoc}
-   *
-   * <p>This implementation calls {@link #get()} and maps that method's standard exceptions to
-   * instances of type {@code X} using {@link #mapException}.
-   *
-   * <p>In addition, if {@code get} throws an {@link InterruptedException}, this implementation will
-   * set the current thread's interrupt status before calling {@code mapException}.
-   *
-   * @throws X if {@link #get()} throws an {@link InterruptedException}, {@link
-   *     CancellationException}, or {@link ExecutionException}
-   */
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet() throws X {
-    try {
-      return get();
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      throw mapException(e);
-    } catch (CancellationException | ExecutionException e) {
-      throw mapException(e);
-    }
-  }
-
-  /**
-   * {@inheritDoc}
-   *
-   * <p>This implementation calls {@link #get(long, TimeUnit)} and maps that method's standard
-   * exceptions (excluding {@link TimeoutException}, which is propagated) to instances of type
-   * {@code X} using {@link #mapException}.
-   *
-   * <p>In addition, if {@code get} throws an {@link InterruptedException}, this implementation will
-   * set the current thread's interrupt status before calling {@code mapException}.
-   *
-   * @throws X if {@link #get()} throws an {@link InterruptedException}, {@link
-   *     CancellationException}, or {@link ExecutionException}
-   */
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet(long timeout, TimeUnit unit) throws TimeoutException, X {
-    try {
-      return get(timeout, unit);
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      throw mapException(e);
-    } catch (CancellationException | ExecutionException e) {
-      throw mapException(e);
-    }
-  }
-}
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 f92200a..2bd392c 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
@@ -32,7 +32,6 @@
  * @author Jesse Wilson
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractExecutionThreadService implements Service {
   private static final Logger logger =
@@ -140,7 +139,14 @@
    * Invoked to request the service to stop.
    *
    * <p>By default this method does nothing.
+   *
+   * <p>Currently, this method is invoked while holding a lock. If an implementation of this method
+   * blocks, it can prevent this service from changing state. If you need to performing a blocking
+   * operation in order to trigger shutdown, consider instead registering a listener and
+   * implementing {@code stopping}. Note, however, that {@code stopping} does not run at exactly the
+   * same times as {@code triggerShutdown}.
    */
+  @Beta
   protected void triggerShutdown() {}
 
   /**
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 6504c8b..e799241 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
@@ -16,10 +16,13 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Throwables.throwIfUnchecked;
+import static java.lang.Integer.toHexString;
+import static java.lang.System.identityHashCode;
 import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.base.Strings;
 import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
 import com.google.common.util.concurrent.internal.InternalFutures;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -68,9 +71,20 @@
     implements ListenableFuture<V> {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
-  private static final boolean GENERATE_CANCELLATION_CAUSES =
-      Boolean.parseBoolean(
-          System.getProperty("guava.concurrent.generate_cancellation_cause", "false"));
+  private static final boolean GENERATE_CANCELLATION_CAUSES;
+
+  static {
+    // System.getProperty may throw if the security policy does not permit access.
+    boolean generateCancellationCauses;
+    try {
+      generateCancellationCauses =
+          Boolean.parseBoolean(
+              System.getProperty("guava.concurrent.generate_cancellation_cause", "false"));
+    } catch (SecurityException e) {
+      generateCancellationCauses = false;
+    }
+    GENERATE_CANCELLATION_CAUSES = generateCancellationCauses;
+  }
 
   /**
    * Tag interface marking trusted subclasses. This enables some optimizations. The implementation
@@ -417,7 +431,7 @@
           node.setNext(oldHead);
           if (ATOMIC_HELPER.casWaiters(this, oldHead, node)) {
             while (true) {
-              LockSupport.parkNanos(this, remainingNanos);
+              OverflowAvoidingLockSupport.parkNanos(this, remainingNanos);
               // Check interruption first, if we woke up due to interruption we need to honor that.
               if (Thread.interrupted()) {
                 removeWaiter(node);
@@ -583,6 +597,9 @@
    * #wasInterrupted} as necessary. This ensures that the work is done even if the future is
    * cancelled without a call to {@code cancel}, such as by calling {@code
    * setFuture(cancelledFuture)}.
+   *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
    */
   @CanIgnoreReturnValue
   @Override
@@ -603,7 +620,7 @@
       while (true) {
         if (ATOMIC_HELPER.casValue(abstractFuture, localValue, valueToSet)) {
           rValue = true;
-          // We call interuptTask before calling complete(), which is consistent with
+          // We call interruptTask before calling complete(), which is consistent with
           // FutureTask
           if (mayInterruptIfRunning) {
             abstractFuture.interruptTask();
@@ -716,6 +733,9 @@
    * yet. That result, though not yet known, cannot be overridden by a call to a {@code set*}
    * method, only by a call to {@link #cancel}.
    *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
+   *
    * @param value the value to be used as the result
    * @return true if the attempt was accepted, completing the {@code Future}
    */
@@ -738,6 +758,9 @@
    * known yet. That result, though not yet known, cannot be overridden by a call to a {@code set*}
    * method, only by a call to {@link #cancel}.
    *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
+   *
    * @param throwable the exception to be used as the failed result
    * @return true if the attempt was accepted, completing the {@code Future}
    */
@@ -772,12 +795,14 @@
    * invoke the {@link #interruptTask} method, and the {@link #wasInterrupted} method will not
    * return {@code true}.
    *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
+   *
    * @param future the future to delegate to
    * @return true if the attempt was accepted, indicating that the {@code Future} was not previously
    *     cancelled or set.
    * @since 19.0
    */
-  @Beta
   @CanIgnoreReturnValue
   protected boolean setFuture(ListenableFuture<? extends V> future) {
     checkNotNull(future);
@@ -1059,29 +1084,20 @@
   // TODO(user): move parts into a default method on ListenableFuture?
   @Override
   public String toString() {
-    StringBuilder builder = new StringBuilder().append(super.toString()).append("[status=");
+    // TODO(cpovirk): Presize to something plausible?
+    StringBuilder builder = new StringBuilder();
+    if (getClass().getName().startsWith("com.google.common.util.concurrent.")) {
+      builder.append(getClass().getSimpleName());
+    } else {
+      builder.append(getClass().getName());
+    }
+    builder.append('@').append(toHexString(identityHashCode(this))).append("[status=");
     if (isCancelled()) {
       builder.append("CANCELLED");
     } else if (isDone()) {
       addDoneString(builder);
     } else {
-      String pendingDescription;
-      try {
-        pendingDescription = pendingToString();
-      } catch (RuntimeException e) {
-        // Don't call getMessage or toString() on the exception, in case the exception thrown by the
-        // subclass is implemented with bugs similar to the subclass.
-        pendingDescription = "Exception thrown from implementation: " + e.getClass();
-      }
-      // The future may complete during or before the call to getPendingToString, so we use null
-      // as a signal that we should try checking if the future is done again.
-      if (pendingDescription != null && !pendingDescription.isEmpty()) {
-        builder.append("PENDING, info=[").append(pendingDescription).append("]");
-      } else if (isDone()) {
-        addDoneString(builder);
-      } else {
-        builder.append("PENDING");
-      }
+      addPendingString(builder); // delegates to addDoneString if future completes mid-way
     }
     return builder.append("]").toString();
   }
@@ -1089,15 +1105,13 @@
   /**
    * Provide a human-readable explanation of why this future has not yet completed.
    *
-   * @return null if an explanation cannot be provided because the future is done.
+   * @return null if an explanation cannot be provided (e.g. because the future is done).
    * @since 23.0
    */
   @NullableDecl
   protected String pendingToString() {
-    Object localValue = value;
-    if (localValue instanceof SetFuture) {
-      return "setFuture=[" + userObjectToString(((SetFuture) localValue).future) + "]";
-    } else if (this instanceof ScheduledFuture) {
+    // TODO(diamondm) consider moving this into addPendingString so it's always in the output
+    if (this instanceof ScheduledFuture) {
       return "remaining delay=["
           + ((ScheduledFuture) this).getDelay(TimeUnit.MILLISECONDS)
           + " ms]";
@@ -1105,10 +1119,47 @@
     return null;
   }
 
+  private void addPendingString(StringBuilder builder) {
+    // Capture current builder length so it can be truncated if this future ends up completing while
+    // the toString is being calculated
+    int truncateLength = builder.length();
+
+    builder.append("PENDING");
+
+    Object localValue = value;
+    if (localValue instanceof SetFuture) {
+      builder.append(", setFuture=[");
+      appendUserObject(builder, ((SetFuture) localValue).future);
+      builder.append("]");
+    } else {
+      String pendingDescription;
+      try {
+        pendingDescription = Strings.emptyToNull(pendingToString());
+      } catch (RuntimeException | StackOverflowError e) {
+        // Don't call getMessage or toString() on the exception, in case the exception thrown by the
+        // subclass is implemented with bugs similar to the subclass.
+        pendingDescription = "Exception thrown from implementation: " + e.getClass();
+      }
+      if (pendingDescription != null) {
+        builder.append(", info=[").append(pendingDescription).append("]");
+      }
+    }
+
+    // The future may complete while calculating the toString, so we check once more to see if the
+    // future is done
+    if (isDone()) {
+      // Truncate anything that was appended before realizing this future is done
+      builder.delete(truncateLength, builder.length());
+      addDoneString(builder);
+    }
+  }
+
   private void addDoneString(StringBuilder builder) {
     try {
       V value = getUninterruptibly(this);
-      builder.append("SUCCESS, result=[").append(userObjectToString(value)).append("]");
+      builder.append("SUCCESS, result=[");
+      appendResultObject(builder, value);
+      builder.append("]");
     } catch (ExecutionException e) {
       builder.append("FAILURE, cause=[").append(e.getCause()).append("]");
     } catch (CancellationException e) {
@@ -1118,16 +1169,41 @@
     }
   }
 
-  /** Helper for printing user supplied objects into our toString method. */
-  private String userObjectToString(Object o) {
-    // This is some basic recursion detection for when people create cycles via set/setFuture
-    // This is however only partial protection though since it only detects self loops.  We could
-    // detect arbitrary cycles using a thread local or possibly by catching StackOverflowExceptions
-    // but this should be a good enough solution (it is also what jdk collections do in these cases)
-    if (o == this) {
-      return "this future";
+  /**
+   * Any object can be the result of a Future, and not every object has a reasonable toString()
+   * 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) {
+    if (o == null) {
+      builder.append("null");
+    } else if (o == this) {
+      builder.append("this future");
+    } else {
+      builder
+          .append(o.getClass().getName())
+          .append("@")
+          .append(Integer.toHexString(System.identityHashCode(o)));
     }
-    return String.valueOf(o);
+  }
+
+  /** Helper for printing user supplied objects into our toString method. */
+  private void appendUserObject(StringBuilder builder, 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
+    // what jdk collections do in these cases)
+    try {
+      if (o == this) {
+        builder.append("this future");
+      } else {
+        builder.append(o);
+      }
+    } catch (RuntimeException | StackOverflowError e) {
+      // Don't call getMessage or toString() on the exception, in case the exception thrown by the
+      // user object is implemented with bugs similar to the user object.
+      builder.append("Exception thrown from implementation: ").append(e.getClass());
+    }
   }
 
   /**
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 4df45a3..7416a9b 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -31,7 +30,6 @@
  * @author Chris Nokleberg
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractIdleService implements Service {
 
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 00fa5cb..70d4fb7 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
@@ -18,7 +18,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -35,7 +34,6 @@
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.MonotonicNonNullDecl;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -95,7 +93,6 @@
  * @author Luke Sandberg
  * @since 11.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractScheduledService implements Service {
   private static final Logger logger = Logger.getLogger(AbstractScheduledService.class.getName());
@@ -173,8 +170,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.
-    @MonotonicNonNullDecl private volatile Future<?> runningTask;
-    @MonotonicNonNullDecl private volatile ScheduledExecutorService executorService;
+    @NullableDecl private volatile Future<?> runningTask;
+    @NullableDecl 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.
@@ -441,7 +438,6 @@
    * @author Luke Sandberg
    * @since 11.0
    */
-  @Beta
   public abstract static class CustomScheduler extends Scheduler {
 
     /** A callable class that can reschedule itself using a {@link CustomScheduler}. */
@@ -568,7 +564,6 @@
      * @author Luke Sandberg
      * @since 11.0
      */
-    @Beta
     protected static final class Schedule {
 
       private final long delay;
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 362a530..733bf3b 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractService.java
@@ -47,7 +47,6 @@
  * @author Luke Sandberg
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractService implements Service {
   private static final ListenerCallQueue.Event<Listener> STARTING_EVENT =
@@ -216,7 +215,7 @@
    *
    * <p>If {@link #stopAsync} is called on a {@link State#STARTING} service, this method is not
    * invoked immediately. Instead, it will be deferred until after the service is {@link
-   * State#RUNNING}. Services that need to cancel startup work can override {#link #doCancelStart}.
+   * State#RUNNING}. Services that need to cancel startup work can override {@link #doCancelStart}.
    */
   @ForOverride
   protected abstract void doStop();
@@ -235,6 +234,7 @@
    *
    * @since 27.0
    */
+  @Beta
   @ForOverride
   protected void doCancelStart() {}
 
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 c7827d1..244f9fd 100644
--- a/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
@@ -16,8 +16,11 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.util.concurrent.AggregateFuture.ReleaseResourcesReason.ALL_INPUT_FUTURES_PROCESSED;
+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.logging.Level.SEVERE;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableCollection;
@@ -26,266 +29,303 @@
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
- * A future made up of a collection of sub-futures.
+ * A future whose value is derived from a collection of input futures.
  *
  * @param <InputT> the type of the individual inputs
  * @param <OutputT> the type of the output (i.e. this) future
  */
 @GwtCompatible
-abstract class AggregateFuture<InputT, OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
+abstract class AggregateFuture<InputT, OutputT> extends AggregateFutureState<OutputT> {
   private static final Logger logger = Logger.getLogger(AggregateFuture.class.getName());
 
+  /**
+   * The input futures. After {@link #init}, this field is read only by {@link #afterDone()} (to
+   * propagate cancellation) and {@link #toString()}. To access the futures' <i>values</i>, {@code
+   * AggregateFuture} attaches listeners that hold references to one or more inputs. And in the case
+   * of {@link CombinedFuture}, the user-supplied callback usually has its own references to inputs.
+   */
   /*
    * 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 RunningState runningState;
+  @NullableDecl private ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
+
+  private final boolean allMustSucceed;
+  private final boolean collectsValues;
+
+  AggregateFuture(
+      ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures,
+      boolean allMustSucceed,
+      boolean collectsValues) {
+    super(futures.size());
+    this.futures = checkNotNull(futures);
+    this.allMustSucceed = allMustSucceed;
+    this.collectsValues = collectsValues;
+  }
 
   @Override
   protected final void afterDone() {
     super.afterDone();
-    RunningState localRunningState = runningState;
-    if (localRunningState != null) {
-      // Let go of the memory held by the running state
-      this.runningState = null;
-      ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures =
-          localRunningState.futures;
+
+    ImmutableCollection<? extends Future<?>> localFutures = futures;
+    releaseResources(OUTPUT_FUTURE_DONE); // nulls out `futures`
+
+    if (isCancelled() & localFutures != null) {
       boolean wasInterrupted = wasInterrupted();
-
-      if (wasInterrupted) {
-        localRunningState.interruptTask();
-      }
-
-      if (isCancelled() & futures != null) {
-        for (ListenableFuture<?> future : futures) {
-          future.cancel(wasInterrupted);
-        }
+      for (Future<?> future : localFutures) {
+        future.cancel(wasInterrupted);
       }
     }
+    /*
+     * We don't call clearSeenExceptions() until processCompleted(). Prior to that, it may be needed
+     * again if some outstanding input fails.
+     */
   }
 
   @Override
-  protected String pendingToString() {
-    RunningState localRunningState = runningState;
-    if (localRunningState == null) {
-      return null;
-    }
-    ImmutableCollection<? extends ListenableFuture<? extends InputT>> localFutures =
-        localRunningState.futures;
+  protected final String pendingToString() {
+    ImmutableCollection<? extends Future<?>> localFutures = futures;
     if (localFutures != null) {
-      return "futures=[" + localFutures + "]";
+      return "futures=" + localFutures;
     }
-    return null;
+    return super.pendingToString();
   }
 
-  /** Must be called at the end of each sub-class's constructor. */
-  final void init(RunningState runningState) {
-    this.runningState = runningState;
-    runningState.init();
-  }
-
-  abstract class RunningState extends AggregateFutureState implements Runnable {
-    private ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
-    private final boolean allMustSucceed;
-    private final boolean collectsValues;
-
-    RunningState(
-        ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures,
-        boolean allMustSucceed,
-        boolean collectsValues) {
-      super(futures.size());
-      this.futures = checkNotNull(futures);
-      this.allMustSucceed = allMustSucceed;
-      this.collectsValues = collectsValues;
-    }
-
-    /* Used in the !allMustSucceed case so we don't have to instantiate a listener. */
-    @Override
-    public final void run() {
-      decrementCountAndMaybeComplete();
-    }
-
-    /**
-     * The "real" initialization; we can't put this in the constructor because, in the case where
-     * futures are already complete, we would not initialize the subclass before calling {@link
-     * #handleOneInputDone}. As this is called after the subclass is constructed, we're guaranteed
-     * to have properly initialized the subclass.
-     */
-    private void init() {
-      // Corner case: List is empty.
-      if (futures.isEmpty()) {
-        handleAllCompleted();
-        return;
-      }
-
-      // NOTE: If we ever want to use a custom executor here, have a look at CombinedFuture as we'll
-      // need to handle RejectedExecutionException
-
-      if (allMustSucceed) {
-        // We need fail fast, so we have to keep track of which future failed so we can propagate
-        // the exception immediately
-
-        // Register a listener on each Future in the list to update the state of this future.
-        // Note that if all the futures on the list are done prior to completing this loop, the last
-        // call to addListener() will callback to setOneValue(), transitively call our cleanup
-        // listener, and set this.futures to null.
-        // This is not actually a problem, since the foreach only needs this.futures to be non-null
-        // at the beginning of the loop.
-        int i = 0;
-        for (final ListenableFuture<? extends InputT> listenable : futures) {
-          final int index = i++;
-          listenable.addListener(
-              new Runnable() {
-                @Override
-                public void run() {
-                  try {
-                    handleOneInputDone(index, listenable);
-                  } finally {
-                    decrementCountAndMaybeComplete();
-                  }
-                }
-              },
-              directExecutor());
-        }
-      } else {
-        // We'll only call the callback when all futures complete, regardless of whether some failed
-        // Hold off on calling setOneValue until all complete, so we can share the same listener
-        for (ListenableFuture<? extends InputT> listenable : futures) {
-          listenable.addListener(this, directExecutor());
-        }
-      }
-    }
-
-    /**
-     * Fails this future with the given Throwable if {@link #allMustSucceed} is true. Also, logs the
-     * throwable if it is an {@link Error} or if {@link #allMustSucceed} is {@code true}, the
-     * throwable did not cause this future to fail, and it is the first time we've seen that
-     * particular Throwable.
-     */
-    private void handleException(Throwable throwable) {
-      checkNotNull(throwable);
-
-      boolean completedWithFailure = false;
-      boolean firstTimeSeeingThisException = true;
-      if (allMustSucceed) {
-        // As soon as the first one fails, throw the exception up.
-        // The result of all other inputs is then ignored.
-        completedWithFailure = setException(throwable);
-        if (completedWithFailure) {
-          releaseResourcesAfterFailure();
-        } else {
-          // Go up the causal chain to see if we've already seen this cause; if we have, even if
-          // it's wrapped by a different exception, don't log it.
-          firstTimeSeeingThisException = addCausalChain(getOrInitSeenExceptions(), throwable);
-        }
-      }
-
-      // | and & used because it's faster than the branch required for || and &&
-      if (throwable instanceof Error
-          | (allMustSucceed & !completedWithFailure & firstTimeSeeingThisException)) {
-        String message =
-            (throwable instanceof Error)
-                ? "Input Future failed with Error"
-                : "Got more than one input Future failure. Logging failures after the first";
-        logger.log(Level.SEVERE, message, throwable);
-      }
-    }
-
-    @Override
-    final void addInitialException(Set<Throwable> seen) {
-      if (!isCancelled()) {
-        // TODO(cpovirk): Think about whether we could/should use Verify to check this.
-        boolean unused = addCausalChain(seen, tryInternalFastPathGetFailure());
-      }
-    }
-
-    /** Handles the input at the given index completing. */
-    private void handleOneInputDone(int index, Future<? extends InputT> future) {
-      // The only cases in which this Future should already be done are (a) if it was cancelled or
-      // (b) if an input failed and we propagated that immediately because of allMustSucceed.
-      checkState(
-          allMustSucceed || !isDone() || isCancelled(),
-          "Future was done before all dependencies completed");
-
-      try {
-        checkState(future.isDone(), "Tried to set value from future which is not done");
-        if (allMustSucceed) {
-          if (future.isCancelled()) {
-            // clear running state prior to cancelling children, this sets our own state but lets
-            // the input futures keep running as some of them may be used elsewhere.
-            runningState = null;
-            cancel(false);
-          } else {
-            // We always get the result so that we can have fail-fast, even if we don't collect
-            InputT result = getDone(future);
-            if (collectsValues) {
-              collectOneValue(allMustSucceed, index, result);
-            }
-          }
-        } else if (collectsValues && !future.isCancelled()) {
-          collectOneValue(allMustSucceed, index, getDone(future));
-        }
-      } catch (ExecutionException e) {
-        handleException(e.getCause());
-      } catch (Throwable t) {
-        handleException(t);
-      }
-    }
-
-    private void decrementCountAndMaybeComplete() {
-      int newRemaining = decrementRemainingAndGet();
-      checkState(newRemaining >= 0, "Less than 0 remaining futures");
-      if (newRemaining == 0) {
-        processCompleted();
-      }
-    }
-
-    private void processCompleted() {
-      // Collect the values if (a) our output requires collecting them and (b) we haven't been
-      // collecting them as we go. (We've collected them as we go only if we needed to fail fast)
-      if (collectsValues & !allMustSucceed) {
-        int i = 0;
-        for (ListenableFuture<? extends InputT> listenable : futures) {
-          handleOneInputDone(i++, listenable);
-        }
-      }
+  /**
+   * Must be called at the end of each subclass's constructor. This method performs the "real"
+   * initialization; we can't put this in the constructor because, in the case where futures are
+   * already complete, we would not initialize the subclass before calling {@link
+   * #collectValueFromNonCancelledFuture}. As this is called after the subclass is constructed,
+   * we're guaranteed to have properly initialized the subclass.
+   */
+  final void init() {
+    // Corner case: List is empty.
+    if (futures.isEmpty()) {
       handleAllCompleted();
+      return;
     }
 
-    /**
-     * Listeners implicitly keep a reference to {@link RunningState} as they're inner classes, so we
-     * free resources here as well for the allMustSucceed=true case (i.e. when a future fails, we
-     * immediately release resources we no longer need); additionally, the future will release its
-     * reference to {@link RunningState}, which should free all associated memory when all the
-     * futures complete and the listeners are released.
-     *
-     * <p>TODO(user): Write tests for memory retention
-     */
-    @ForOverride
-    @OverridingMethodsMustInvokeSuper
-    void releaseResourcesAfterFailure() {
-      this.futures = null;
+    // NOTE: If we ever want to use a custom executor here, have a look at CombinedFuture as we'll
+    // need to handle RejectedExecutionException
+
+    if (allMustSucceed) {
+      // We need fail fast, so we have to keep track of which future failed so we can propagate
+      // the exception immediately
+
+      // Register a listener on each Future in the list to update the state of this future.
+      // Note that if all the futures on the list are done prior to completing this loop, the last
+      // call to addListener() will callback to setOneValue(), transitively call our cleanup
+      // listener, and set this.futures to null.
+      // This is not actually a problem, since the foreach only needs this.futures to be non-null
+      // at the beginning of the loop.
+      int i = 0;
+      for (final ListenableFuture<? extends InputT> future : futures) {
+        final int index = i++;
+        future.addListener(
+            new Runnable() {
+              @Override
+              public void run() {
+                try {
+                  if (future.isCancelled()) {
+                    // Clear futures prior to cancelling children. This sets our own state but lets
+                    // the input futures keep running, as some of them may be used elsewhere.
+                    futures = null;
+                    cancel(false);
+                  } else {
+                    collectValueFromNonCancelledFuture(index, future);
+                  }
+                } finally {
+                  /*
+                   * "null" means: There is no need to access `futures` again during
+                   * `processCompleted` because we're reading each value during a call to
+                   * handleOneInputDone.
+                   */
+                  decrementCountAndMaybeComplete(null);
+                }
+              }
+            },
+            directExecutor());
+      }
+    } else {
+      /*
+       * We'll call the user callback or collect the values only when all inputs complete,
+       * regardless of whether some failed. This lets us avoid calling expensive methods like
+       * Future.get() when we don't need to (specifically, for whenAllComplete().call*()), and it
+       * lets all futures share the same listener.
+       *
+       * We store `localFutures` inside the listener because `this.futures` might be nulled out by
+       * the time the listener runs for the final future -- at which point we need to check all
+       * inputs for exceptions *if* we're collecting values. If we're not, then the listener doesn't
+       * need access to the futures again, so we can just pass `null`.
+       *
+       * TODO(b/112550045): Allocating a single, cheaper listener is (I think) only an optimization.
+       * If we make some other optimizations, this one will no longer be necessary. The optimization
+       * could actually hurt in some cases, as it forces us to keep all inputs in memory until the
+       * final input completes.
+       */
+      final ImmutableCollection<? extends Future<? extends InputT>> localFutures =
+          collectsValues ? futures : null;
+      Runnable listener =
+          new Runnable() {
+            @Override
+            public void run() {
+              decrementCountAndMaybeComplete(localFutures);
+            }
+          };
+      for (ListenableFuture<? extends InputT> future : futures) {
+        future.addListener(listener, directExecutor());
+      }
     }
-
-    /**
-     * Called only if {@code collectsValues} is true.
-     *
-     * <p>If {@code allMustSucceed} is true, called as each future completes; otherwise, called for
-     * each future when all futures complete.
-     */
-    abstract void collectOneValue(
-        boolean allMustSucceed, int index, @NullableDecl InputT returnValue);
-
-    abstract void handleAllCompleted();
-
-    void interruptTask() {}
   }
 
+  /**
+   * Fails this future with the given Throwable if {@link #allMustSucceed} is true. Also, logs the
+   * throwable if it is an {@link Error} or if {@link #allMustSucceed} is {@code true}, the
+   * throwable did not cause this future to fail, and it is the first time we've seen that
+   * particular Throwable.
+   */
+  private void handleException(Throwable throwable) {
+    checkNotNull(throwable);
+
+    if (allMustSucceed) {
+      // As soon as the first one fails, make that failure the result of the output future.
+      // The results of all other inputs are then ignored (except for logging any failures).
+      boolean completedWithFailure = setException(throwable);
+      if (!completedWithFailure) {
+        // Go up the causal chain to see if we've already seen this cause; if we have, even if
+        // it's wrapped by a different exception, don't log it.
+        boolean firstTimeSeeingThisException = addCausalChain(getOrInitSeenExceptions(), throwable);
+        if (firstTimeSeeingThisException) {
+          log(throwable);
+          return;
+        }
+      }
+    }
+
+    /*
+     * TODO(cpovirk): Should whenAllComplete().call*() log errors, too? Currently, it doesn't call
+     * handleException() at all.
+     */
+    if (throwable instanceof Error) {
+      /*
+       * TODO(cpovirk): Do we really want to log this if we called setException(throwable) and it
+       * returned true? This was intentional (CL 46470009), but it seems odd compared to how we
+       * normally handle Error.
+       *
+       * Similarly, do we really want to log the same Error more than once?
+       */
+      log(throwable);
+    }
+  }
+
+  private static void log(Throwable throwable) {
+    String message =
+        (throwable instanceof Error)
+            ? "Input Future failed with Error"
+            : "Got more than one input Future failure. Logging failures after the first";
+    logger.log(SEVERE, message, throwable);
+  }
+
+  @Override
+  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());
+    }
+  }
+
+  /**
+   * Collects the result (success or failure) of one input future. The input must not have been
+   * cancelled. For details on when this is called, see {@link #collectOneValue}.
+   */
+  private void collectValueFromNonCancelledFuture(int index, Future<? extends InputT> future) {
+    try {
+      // We get the result, even if collectOneValue is a no-op, so that we can fail fast.
+      collectOneValue(index, getDone(future));
+    } catch (ExecutionException e) {
+      handleException(e.getCause());
+    } catch (Throwable t) {
+      handleException(t);
+    }
+  }
+
+  private void decrementCountAndMaybeComplete(
+      @NullableDecl
+          ImmutableCollection<? extends Future<? extends InputT>>
+              futuresIfNeedToCollectAtCompletion) {
+    int newRemaining = decrementRemainingAndGet();
+    checkState(newRemaining >= 0, "Less than 0 remaining futures");
+    if (newRemaining == 0) {
+      processCompleted(futuresIfNeedToCollectAtCompletion);
+    }
+  }
+
+  private void processCompleted(
+      @NullableDecl
+          ImmutableCollection<? extends Future<? extends InputT>>
+              futuresIfNeedToCollectAtCompletion) {
+    if (futuresIfNeedToCollectAtCompletion != null) {
+      int i = 0;
+      for (Future<? extends InputT> future : futuresIfNeedToCollectAtCompletion) {
+        if (!future.isCancelled()) {
+          collectValueFromNonCancelledFuture(i, future);
+        }
+        i++;
+      }
+    }
+    clearSeenExceptions();
+    handleAllCompleted();
+    /*
+     * Null out fields, including some used in handleAllCompleted() above (like
+     * `CollectionFuture.values`). This might be a no-op: If this future completed during
+     * handleAllCompleted(), they will already have been nulled out. But in the case of
+     * whenAll*().call*(), this future may be pending until the callback runs -- or even longer in
+     * the case of callAsync(), which waits for the callback's returned future to complete.
+     */
+    releaseResources(ALL_INPUT_FUTURES_PROCESSED);
+  }
+
+  /**
+   * Clears fields that are no longer needed after this future has completed -- or at least all its
+   * inputs have completed (more precisely, after {@link #handleAllCompleted()} has been called).
+   * Often called multiple times (that is, both when the inputs complete and when the output
+   * completes).
+   *
+   * <p>This is similar to our proposed {@code afterCommit} method but not quite the same. See the
+   * description of CL 265462958.
+   */
+  // TODO(user): Write more tests for memory retention.
+  @ForOverride
+  @OverridingMethodsMustInvokeSuper
+  void releaseResources(ReleaseResourcesReason reason) {
+    checkNotNull(reason);
+    /*
+     * All elements of `futures` are completed, or this future has already completed and read
+     * `futures` into a local variable (in preparation for propagating cancellation to them). In
+     * either case, no one needs to read `futures` for cancellation purposes later. (And
+     * cancellation purposes are the main reason to access `futures`, as discussed in its docs.)
+     */
+    this.futures = null;
+  }
+
+  enum ReleaseResourcesReason {
+    OUTPUT_FUTURE_DONE,
+    ALL_INPUT_FUTURES_PROCESSED,
+  }
+
+  /**
+   * 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 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) {
     for (; t != null; t = t.getCause()) {
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 040d813..f8398d8 100644
--- a/android/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
+++ b/android/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
@@ -37,9 +37,9 @@
  */
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
-abstract class AggregateFutureState {
+abstract class AggregateFutureState<OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
   // Lazily initialized the first time we see an exception; not released until all the input futures
-  // & this future completes. Released when the future releases the reference to the running state
+  // have completed and we have processed them all.
   private volatile Set<Throwable> seenExceptions = null;
 
   private volatile int remaining;
@@ -89,12 +89,27 @@
      * Thread2: calls setException(), which returns false, CASes seenExceptions to its exception,
      * and wrongly believes that its exception is new (leading it to logging it when it shouldn't)
      *
-     * Our solution is for threads to CAS seenExceptions from null to a Set population with _the
+     * Our solution is for threads to CAS seenExceptions from null to a Set populated with _the
      * initial exception_, no matter which thread does the work. This ensures that seenExceptions
      * always contains not just the current thread's exception but also the initial thread's.
      */
     Set<Throwable> seenExceptionsLocal = seenExceptions;
     if (seenExceptionsLocal == null) {
+      // TODO(cpovirk): Should we use a simpler (presumably cheaper) data structure?
+      /*
+       * Using weak references here could let us release exceptions earlier, but:
+       *
+       * 1. On Android, querying a WeakReference blocks if the GC is doing an otherwise-concurrent
+       * pass.
+       *
+       * 2. We would probably choose to compare exceptions using == instead of equals() (for
+       * consistency with how weak references are cleared). That's a behavior change -- arguably the
+       * removal of a feature.
+       *
+       * Fortunately, exceptions rarely contain references to expensive resources.
+       */
+
+      //
       seenExceptionsLocal = newConcurrentHashSet();
       /*
        * Other handleException() callers may see this as soon as we publish it. We need to populate
@@ -122,6 +137,10 @@
     return ATOMIC_HELPER.decrementAndGetRemainingCount(this);
   }
 
+  final void clearSeenExceptions() {
+    seenExceptions = null;
+  }
+
   private abstract static class AtomicHelper {
     /** Atomic compare-and-set of the {@link AggregateFutureState#seenExceptions} field. */
     abstract void compareAndSetSeenExceptions(
@@ -169,8 +188,7 @@
     @Override
     int decrementAndGetRemainingCount(AggregateFutureState state) {
       synchronized (state) {
-        state.remaining--;
-        return state.remaining;
+        return --state.remaining;
       }
     }
   }
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 cfd0ec7..563381b 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
@@ -27,7 +27,7 @@
  * cannot be used as a replacement for a {@link Double}. However, this class does extend {@code
  * Number} to allow uniform access by tools and utilities that deal with numerically-based classes.
  *
- * <p><a name="bitEquals"></a>This class compares primitive {@code double} values in methods such as
+ * <p><a id="bitEquals"></a>This class compares primitive {@code double} values in methods such as
  * {@link #compareAndSet} by comparing their bitwise representation using {@link
  * Double#doubleToRawLongBits}, which differs from both the primitive double {@code ==} operator and
  * from {@link Double#equals}, as if implemented by:
@@ -42,10 +42,8 @@
  *
  * <p>It is possible to write a more scalable updater, at the cost of giving up strict atomicity.
  * See for example <a
- * href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/DoubleAdder.html">
- * DoubleAdder</a> and <a
- * href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/DoubleMaxUpdater.html">
- * DoubleMaxUpdater</a>.
+ * href="http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java.base/java/util/concurrent/atomic/DoubleAdder.html">
+ * DoubleAdder</a>.
  *
  * @author Doug Lea
  * @author Martin Buchholz
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 c583957..5c4baa1 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
@@ -26,7 +26,7 @@
  * java.util.concurrent.atomic} package specification for description of the properties of atomic
  * variables.
  *
- * <p><a name="bitEquals"></a>This class compares primitive {@code double} values in methods such as
+ * <p><a id="bitEquals"></a>This class compares primitive {@code double} values in methods such as
  * {@link #compareAndSet} by comparing their bitwise representation using {@link
  * Double#doubleToRawLongBits}, which differs from both the primitive double {@code ==} operator and
  * from {@link Double#equals}, as if implemented by:
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 b857139..7fc58f4 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.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A map containing {@code long} values that can be atomically updated. While writes to a
@@ -325,7 +325,7 @@
     return sum;
   }
 
-  @MonotonicNonNullDecl private transient Map<K, Long> asMap;
+  @NullableDecl 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/Callables.java b/android/guava/src/com/google/common/util/concurrent/Callables.java
index 18f1a26..c4caf36 100644
--- a/android/guava/src/com/google/common/util/concurrent/Callables.java
+++ b/android/guava/src/com/google/common/util/concurrent/Callables.java
@@ -129,9 +129,10 @@
   /** Tries to set name of the given {@link Thread}, returns true if successful. */
   @GwtIncompatible // threads
   private static boolean trySetName(final String threadName, Thread currentThread) {
-    // In AppEngine, this will always fail. Should we test for that explicitly using
-    // MoreExecutors.isAppEngine? More generally, is there a way to see if we have the modifyThread
-    // permission without catching an exception?
+    /*
+     * setName should usually succeed, but the security manager can prohibit it. Is there a way to
+     * see if we have the modifyThread permission without catching an exception?
+     */
     try {
       currentThread.setName(threadName);
       return true;
diff --git a/android/guava/src/com/google/common/util/concurrent/CheckedFuture.java b/android/guava/src/com/google/common/util/concurrent/CheckedFuture.java
deleted file mode 100644
index b39a670..0000000
--- a/android/guava/src/com/google/common/util/concurrent/CheckedFuture.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.util.concurrent;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.GwtCompatible;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A {@code CheckedFuture} is a {@link ListenableFuture} that includes versions of the {@code get}
- * methods that can throw a checked exception. This makes it easier to create a future that executes
- * logic which can throw an exception.
- *
- * <p><b>Warning:</b> We recommend against using {@code CheckedFuture} in new projects. {@code
- * CheckedFuture} is difficult to build libraries atop. {@code CheckedFuture} ports of methods like
- * {@link Futures#transformAsync} have historically had bugs, and some of these bugs are necessary,
- * unavoidable consequences of the {@code CheckedFuture} API. Additionally, {@code CheckedFuture}
- * encourages users to take exceptions from one thread and rethrow them in another, producing
- * confusing stack traces.
- *
- * <p>A common implementation is {@link Futures#immediateCheckedFuture}.
- *
- * <p>Implementations of this interface must adapt the exceptions thrown by {@code Future#get()}:
- * {@link CancellationException}, {@link ExecutionException} and {@link InterruptedException} into
- * the type specified by the {@code X} type parameter.
- *
- * <p>This interface also extends the ListenableFuture interface to allow listeners to be added.
- * This allows the future to be used as a normal {@link Future} or as an asynchronous callback
- * mechanism as needed. This allows multiple callbacks to be registered for a particular task, and
- * the future will guarantee execution of all listeners when the task completes.
- *
- * <p>For a simpler alternative to CheckedFuture, consider accessing Future values with {@link
- * Futures#getChecked(Future, Class) Futures.getChecked()}.
- *
- * @author Sven Mawson
- * @since 1.0
- * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
- *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
- *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
- *     Additionally, it has a surprising policy about which exceptions to map and which to leave
- *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
- *     use, possibly specializing them to the particular exception type they use. We recommend that
- *     most people use {@code ListenableFuture} and perform any exception wrapping themselves. This
- *     class is scheduled for removal from Guava in January 2019.
- */
-// TODO(b/72241575): Remove by 2019-01
-@Beta
-@CanIgnoreReturnValue
-@Deprecated
-@GwtCompatible
-public interface CheckedFuture<V, X extends Exception> extends ListenableFuture<V> {
-
-  /**
-   * Exception checking version of {@link Future#get()} that will translate {@link
-   * InterruptedException}, {@link CancellationException} and {@link ExecutionException} into
-   * application-specific exceptions.
-   *
-   * @return the result of executing the future.
-   * @throws X on interruption, cancellation or execution exceptions.
-   */
-  V checkedGet() throws X;
-
-  /**
-   * Exception checking version of {@link Future#get(long, TimeUnit)} that will translate {@link
-   * InterruptedException}, {@link CancellationException} and {@link ExecutionException} into
-   * application-specific exceptions. On timeout this method throws a normal {@link
-   * TimeoutException}.
-   *
-   * @return the result of executing the future.
-   * @throws TimeoutException if retrieving the result timed out.
-   * @throws X on interruption, cancellation or execution exceptions.
-   */
-  V checkedGet(long timeout, TimeUnit unit) throws TimeoutException, X;
-}
diff --git a/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java b/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
new file mode 100644
index 0000000..2e5b5c5
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
@@ -0,0 +1,2218 @@
+/*
+ * Copyright (C) 2017 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 com.google.common.base.Functions.constant;
+import static com.google.common.base.MoreObjects.toStringHelper;
+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.Lists.asList;
+import static com.google.common.util.concurrent.ClosingFuture.State.CLOSED;
+import static com.google.common.util.concurrent.ClosingFuture.State.CLOSING;
+import static com.google.common.util.concurrent.ClosingFuture.State.OPEN;
+import static com.google.common.util.concurrent.ClosingFuture.State.SUBSUMED;
+import static com.google.common.util.concurrent.ClosingFuture.State.WILL_CLOSE;
+import static com.google.common.util.concurrent.ClosingFuture.State.WILL_CREATE_VALUE_AND_CLOSER;
+import static com.google.common.util.concurrent.Futures.getDone;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static com.google.common.util.concurrent.Futures.nonCancellationPropagating;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.logging.Level.FINER;
+import static java.util.logging.Level.SEVERE;
+import static java.util.logging.Level.WARNING;
+
+import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.AsyncCombiningCallable;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.CombiningCallable;
+import com.google.common.util.concurrent.Futures.FutureCombiner;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
+import com.google.j2objc.annotations.RetainedWith;
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Logger;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+/**
+ * A step in a pipeline of an asynchronous computation. When the last step in the computation is
+ * complete, some objects captured during the computation are closed.
+ *
+ * <p>A pipeline of {@code ClosingFuture}s is a tree of steps. Each step represents either an
+ * asynchronously-computed intermediate value, or else an exception that indicates the failure or
+ * cancellation of the operation so far. The only way to extract the value or exception from a step
+ * is by declaring that step to be the last step of the pipeline. Nevertheless, we refer to the
+ * "value" of a successful step or the "result" (value or exception) of any step.
+ *
+ * <ol>
+ *   <li>A pipeline starts at its leaf step (or steps), which is created from either a callable
+ *       block or a {@link ListenableFuture}.
+ *   <li>Each other step is derived from one or more input steps. At each step, zero or more objects
+ *       can be captured for later closing.
+ *   <li>There is one last step (the root of the tree), from which you can extract the final result
+ *       of the computation. After that result is available (or the computation fails), all objects
+ *       captured by any of the steps in the pipeline are closed.
+ * </ol>
+ *
+ * <h3>Starting a pipeline</h3>
+ *
+ * Start a {@code ClosingFuture} pipeline {@linkplain #submit(ClosingCallable, Executor) from a
+ * callable block} that may capture objects for later closing. To start a pipeline from a {@link
+ * ListenableFuture} that doesn't create resources that should be closed later, you can use {@link
+ * #from(ListenableFuture)} instead.
+ *
+ * <h3>Derived steps</h3>
+ *
+ * A {@code ClosingFuture} step can be derived from one or more input {@code ClosingFuture} steps in
+ * ways similar to {@link FluentFuture}s:
+ *
+ * <ul>
+ *   <li>by transforming the value from a successful input step,
+ *   <li>by catching the exception from a failed input step, or
+ *   <li>by combining the results of several input steps.
+ * </ul>
+ *
+ * Each derivation can capture the next value or any intermediate objects for later closing.
+ *
+ * <p>A step can be the input to at most one derived step. Once you transform its value, catch its
+ * exception, or combine it with others, you cannot do anything else with it, including declare it
+ * to be the last step of the pipeline.
+ *
+ * <h4>Transforming</h4>
+ *
+ * To derive the next step by asynchronously applying a function to an input step's value, call
+ * {@link #transform(ClosingFunction, Executor)} or {@link #transformAsync(AsyncClosingFunction,
+ * Executor)} on the input step.
+ *
+ * <h4>Catching</h4>
+ *
+ * To derive the next step from a failed input step, call {@link #catching(Class, ClosingFunction,
+ * Executor)} or {@link #catchingAsync(Class, AsyncClosingFunction, Executor)} on the input step.
+ *
+ * <h4>Combining</h4>
+ *
+ * To derive a {@code ClosingFuture} from two or more input steps, pass the input steps to {@link
+ * #whenAllComplete(Iterable)} or {@link #whenAllSucceed(Iterable)} or its overloads.
+ *
+ * <h3>Cancelling</h3>
+ *
+ * Any step in a pipeline can be {@linkplain #cancel(boolean) cancelled}, even after another step
+ * has been derived, with the same semantics as cancelling a {@link Future}. In addition, a
+ * successfully cancelled step will immediately start closing all objects captured for later closing
+ * by it and by its input steps.
+ *
+ * <h3>Ending a pipeline</h3>
+ *
+ * Each {@code ClosingFuture} pipeline must be ended. To end a pipeline, decide whether you want to
+ * close the captured objects automatically or manually.
+ *
+ * <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.
+ *
+ * <pre>{@code
+ * FluentFuture<UserName> userName =
+ *     ClosingFuture.submit(
+ *             closer -> closer.eventuallyClose(database.newTransaction(), closingExecutor),
+ *             executor)
+ *         .transformAsync((closer, transaction) -> transaction.queryClosingFuture("..."), executor)
+ *         .transform((closer, result) -> result.get("userName"), directExecutor())
+ *         .catching(DBException.class, e -> "no user", directExecutor())
+ *         .finishToFuture();
+ * }</pre>
+ *
+ * In this example, when the {@code userName} {@link Future} is done, the transaction and the query
+ * result cursor will both be closed, even if the operation is cancelled or fails.
+ *
+ * <h4>Manually closing</h4>
+ *
+ * If you want to close the captured objects manually, after you've used the final result, call
+ * {@link #finishToValueAndCloser(ValueAndCloserConsumer, Executor)} to get an object that holds the
+ * final result. You then call {@link ValueAndCloser#closeAsync()} to close the captured objects.
+ *
+ * <pre>{@code
+ *     ClosingFuture.submit(
+ *             closer -> closer.eventuallyClose(database.newTransaction(), closingExecutor),
+ *             executor)
+ *     .transformAsync((closer, transaction) -> transaction.queryClosingFuture("..."), executor)
+ *     .transform((closer, result) -> result.get("userName"), directExecutor())
+ *     .catching(DBException.class, e -> "no user", directExecutor())
+ *     .finishToValueAndCloser(
+ *         valueAndCloser -> this.userNameValueAndCloser = valueAndCloser, executor);
+ *
+ * // later
+ * try { // get() will throw if the operation failed or was cancelled.
+ *   UserName userName = userNameValueAndCloser.get();
+ *   // do something with userName
+ * } finally {
+ *   userNameValueAndCloser.closeAsync();
+ * }
+ * }</pre>
+ *
+ * In this example, when {@code userNameValueAndCloser.closeAsync()} is called, the transaction and
+ * the query result cursor will both be closed, even if the operation is cancelled or fails.
+ *
+ * <p>Note that if you don't call {@code closeAsync()}, the captured objects will not be closed. The
+ * automatic-closing approach described above is safer.
+ *
+ * @param <V> the type of the value of this step
+ * @since 30.0
+ */
+// TODO(dpb): Consider reusing one CloseableList for the entire pipeline, modulo combinations.
+@Beta // @Beta for one release.
+@DoNotMock("Use ClosingFuture.from(Futures.immediate*Future)")
+// TODO(dpb): GWT compatibility.
+public final class ClosingFuture<V> {
+
+  private static final Logger logger = Logger.getLogger(ClosingFuture.class.getName());
+
+  /**
+   * An object that can capture objects to be closed later, when a {@link ClosingFuture} pipeline is
+   * done.
+   */
+  public static final class DeferredCloser {
+    @RetainedWith private final CloseableList list;
+
+    DeferredCloser(CloseableList list) {
+      this.list = list;
+    }
+
+    /**
+     * Captures an object to be closed when a {@link ClosingFuture} pipeline is done.
+     *
+     * <p>For users of the {@code -jre} flavor of Guava, the object can be any {@code
+     * AutoCloseable}. For users of the {@code -android} flavor, the object must be a {@code
+     * Closeable}. (For more about the flavors, see <a
+     * href="https://github.com/google/guava#adding-guava-to-your-build">Adding Guava to your
+     * build</a>.)
+     *
+     * <p>Be careful when targeting an older SDK than you are building against (most commonly when
+     * building for Android): Ensure that any object you pass implements the interface not just in
+     * your current SDK version but also at the oldest version you support. For example, <a
+     * href="https://developer.android.com/sdk/api_diff/16/">API Level 16</a> is the first version
+     * in which {@code Cursor} is {@code Closeable}. To support older versions, pass a wrapper
+     * {@code Closeable} with a method reference like {@code cursor::close}.
+     *
+     * <p>Note that this method is still binary-compatible between flavors because the erasure of
+     * its parameter type is {@code Object}, not {@code AutoCloseable} or {@code Closeable}.
+     *
+     * @param closeable the object to be closed (see notes above)
+     * @param closingExecutor the object will be closed on this executor
+     * @return the first argument
+     */
+    @CanIgnoreReturnValue
+    @NullableDecl
+    // 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) {
+      checkNotNull(closingExecutor);
+      if (closeable != null) {
+        list.add(closeable, closingExecutor);
+      }
+      return closeable;
+    }
+  }
+
+  /**
+   * An operation that computes a result.
+   *
+   * @param <V> the type of the result
+   */
+  public interface ClosingCallable<V extends 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.
+     */
+    @NullableDecl
+    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> {
+
+    /**
+     * Applies this function to an input, 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.
+     */
+    @NullableDecl
+    U apply(DeferredCloser closer, @NullableDecl T input) throws Exception;
+  }
+
+  /**
+   * A function from an input to a {@link ClosingFuture} of a result.
+   *
+   * @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> {
+    /**
+     * Applies this function to an input, 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<U> apply(DeferredCloser closer, @NullableDecl T input) throws Exception;
+  }
+
+  /**
+   * An object that holds the final result of an asynchronous {@link ClosingFuture} operation and
+   * allows the user to close all the closeable objects that were captured during it for later
+   * closing.
+   *
+   * <p>The asynchronous operation will have completed before this object is created.
+   *
+   * @param <V> the type of the value of a successful operation
+   * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
+   */
+  public static final class ValueAndCloser<V> {
+
+    private final ClosingFuture<? extends V> closingFuture;
+
+    ValueAndCloser(ClosingFuture<? extends V> closingFuture) {
+      this.closingFuture = checkNotNull(closingFuture);
+    }
+
+    /**
+     * Returns the final value of the associated {@link ClosingFuture}, or throws an exception as
+     * {@link Future#get()} would.
+     *
+     * <p>Because the asynchronous operation has already completed, this method is synchronous and
+     * returns immediately.
+     *
+     * @throws CancellationException if the computation was cancelled
+     * @throws ExecutionException if the computation threw an exception
+     */
+    @NullableDecl
+    public V get() throws ExecutionException {
+      return getDone(closingFuture.future);
+    }
+
+    /**
+     * Starts closing all closeable objects captured during the {@link ClosingFuture}'s asynchronous
+     * operation on the {@link Executor}s specified by calls to {@link
+     * DeferredCloser#eventuallyClose(Closeable, Executor)}.
+     *
+     * <p>If any such calls specified {@link MoreExecutors#directExecutor()}, those objects will be
+     * closed synchronously.
+     *
+     * <p>Idempotent: objects will be closed at most once.
+     */
+    public void closeAsync() {
+      closingFuture.close();
+    }
+  }
+
+  /**
+   * Represents an operation that accepts a {@link ValueAndCloser} for the last step in a {@link
+   * ClosingFuture} pipeline.
+   *
+   * @param <V> the type of the final value of a successful pipeline
+   * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
+   */
+  public interface ValueAndCloserConsumer<V> {
+
+    /** Accepts a {@link ValueAndCloser} for the last step in a {@link ClosingFuture} pipeline. */
+    void accept(ValueAndCloser<V> valueAndCloser);
+  }
+
+  /**
+   * 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
+   */
+  public static <V> 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 with a {@link ListenableFuture}.
+   *
+   * <p>{@code future}'s value will not be closed when the pipeline is done even if {@code V}
+   * 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) {
+    return new ClosingFuture<V>(future);
+  }
+
+  /**
+   * Starts a {@link ClosingFuture} pipeline with a {@link ListenableFuture}.
+   *
+   * <p>If {@code future} succeeds, its value will be closed (using {@code closingExecutor)} when
+   * the pipeline is done, even if the pipeline is canceled or fails.
+   *
+   * <p>Cancelling the pipeline will not cancel {@code future}, so that the pipeline can access its
+   * value in order to close it.
+   *
+   * @param future the future to create the {@code ClosingFuture} from. For discussion of the
+   *     future's result type {@code C}, see {@link DeferredCloser#eventuallyClose(Closeable,
+   *     Executor)}.
+   * @param closingExecutor the future's result will be closed on this executor
+   * @deprecated Creating {@link Future}s of closeable types is dangerous in general because the
+   *     underlying value may never be closed if the {@link Future} is canceled after its operation
+   *     begins. Consider replacing code that creates {@link ListenableFuture}s of closeable types,
+   *     including those that pass them to this method, with {@link #submit(ClosingCallable,
+   *     Executor)} in order to ensure that resources do not leak. Or, to start a pipeline with a
+   *     {@link ListenableFuture} that doesn't create values that should be closed, use {@link
+   *     ClosingFuture#from}.
+   */
+  @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) {
+    checkNotNull(closingExecutor);
+    final ClosingFuture<C> closingFuture = new ClosingFuture<>(nonCancellationPropagating(future));
+    Futures.addCallback(
+        future,
+        new FutureCallback<Closeable>() {
+          @Override
+          public void onSuccess(@NullableDecl Closeable result) {
+            closingFuture.closeables.closer.eventuallyClose(result, closingExecutor);
+          }
+
+          @Override
+          public void onFailure(Throwable t) {}
+        },
+        directExecutor());
+    return closingFuture;
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline.
+   *
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
+   *     the {@code futures}, or if any has already been {@linkplain #finishToFuture() finished}
+   */
+  public static Combiner whenAllComplete(Iterable<? extends ClosingFuture<?>> futures) {
+    return new Combiner(false, futures);
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline.
+   *
+   * @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 Combiner whenAllComplete(
+      ClosingFuture<?> future1, ClosingFuture<?>... moreFutures) {
+    return whenAllComplete(asList(future1, moreFutures));
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline, assuming they
+   * all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
+   *     the {@code futures}, or if any has already been {@linkplain #finishToFuture() finished}
+   */
+  public static Combiner whenAllSucceed(Iterable<? extends ClosingFuture<?>> futures) {
+    return new Combiner(true, futures);
+  }
+
+  /**
+   * Starts specifying how to combine two {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner2<>(future1, future2);
+  }
+
+  /**
+   * Starts specifying how to combine three {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner3<>(future1, future2, future3);
+  }
+
+  /**
+   * Starts specifying how to combine four {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner4<>(future1, future2, future3, future4);
+  }
+
+  /**
+   * Starts specifying how to combine five {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner5<>(future1, future2, future3, future4, future5);
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline, assuming they
+   * all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * @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 Combiner whenAllSucceed(
+      ClosingFuture<?> future1,
+      ClosingFuture<?> future2,
+      ClosingFuture<?> future3,
+      ClosingFuture<?> future4,
+      ClosingFuture<?> future5,
+      ClosingFuture<?> future6,
+      ClosingFuture<?>... moreFutures) {
+    return whenAllSucceed(
+        FluentIterable.of(future1, future2, future3, future4, future5, future6)
+            .append(moreFutures));
+  }
+
+  private final AtomicReference<State> state = new AtomicReference<>(OPEN);
+  private final CloseableList closeables = new CloseableList();
+  private final FluentFuture<V> future;
+
+  private ClosingFuture(ListenableFuture<V> future) {
+    this.future = FluentFuture.from(future);
+  }
+
+  private ClosingFuture(final ClosingCallable<V> callable, Executor executor) {
+    checkNotNull(callable);
+    TrustedListenableFutureTask<V> task =
+        TrustedListenableFutureTask.create(
+            new Callable<V>() {
+              @Override
+              public V call() throws Exception {
+                return callable.call(closeables.closer);
+              }
+
+              @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
+   * be thrown by calling {@code finishToFuture().get()} if this were the last step. Calling {@code
+   * cancel()} on the returned future has no effect on the {@code ClosingFuture} pipeline.
+   *
+   * <p>{@code statusFuture} differs from most methods on {@code ClosingFuture}: You can make calls
+   * to {@code statusFuture} <i>in addition to</i> the call you make to {@link #finishToFuture()} or
+   * a derivation method <i>on the same instance</i>. This is important because calling {@code
+   * statusFuture} alone does not provide a way to close the pipeline.
+   */
+  public ListenableFuture<?> statusFuture() {
+    return nonCancellationPropagating(future.transform(constant(null), directExecutor()));
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * to its value. The function can use a {@link DeferredCloser} to capture objects to be closed
+   * when the pipeline is done.
+   *
+   * <p>If this {@code ClosingFuture} fails, the function will not be called, and the derived {@code
+   * ClosingFuture} will be equivalent to this one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}.
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * ClosingFuture<List<Row>> rowsFuture =
+   *     queryFuture.transform((closer, result) -> result.getRows(), executor);
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param function transforms the value of this step to the value of the derived step
+   * @param executor executor to run the function in
+   * @return the derived step
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from this
+   *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
+   *     finished}
+   */
+  public <U> ClosingFuture<U> transform(
+      final ClosingFunction<? super V, U> function, Executor executor) {
+    checkNotNull(function);
+    AsyncFunction<V, U> applyFunction =
+        new AsyncFunction<V, U>() {
+          @Override
+          public ListenableFuture<U> apply(V input) throws Exception {
+            return closeables.applyClosingFunction(function, input);
+          }
+
+          @Override
+          public String toString() {
+            return function.toString();
+          }
+        };
+    // TODO(dpb): Switch to future.transformSync when that exists (passing a throwing function).
+    return derive(future.transformAsync(applyFunction, executor));
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * that returns a {@code ClosingFuture} to its value. The function can use a {@link
+   * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+   * captured by the returned {@link ClosingFuture}).
+   *
+   * <p>If this {@code ClosingFuture} succeeds, the derived one will be equivalent to the one
+   * returned by the function.
+   *
+   * <p>If this {@code ClosingFuture} fails, the function will not be called, and the derived {@code
+   * ClosingFuture} will be equivalent to this one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}. But if the exception is thrown after the function creates a {@code
+   * ClosingFuture}, then none of the closeable objects in that {@code ClosingFuture} will be
+   * closed.
+   *
+   * <p>Usage guidelines for this method:
+   *
+   * <ul>
+   *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+   *       {@code ClosingFuture}. If possible, prefer calling {@link #transform(ClosingFunction,
+   *       Executor)} instead, with a function that returns the next value directly.
+   *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor) closer.eventuallyClose()}
+   *       for every closeable object this step creates in order to capture it for later closing.
+   *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+   *       ClosingFuture} call {@link #from(ListenableFuture)}.
+   *   <li>In case this step doesn't create new closeables, you can adapt an API that returns a
+   *       {@link ListenableFuture} to return a {@code ClosingFuture} by wrapping it with a call to
+   *       {@link #withoutCloser(AsyncFunction)}
+   * </ul>
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * // Result.getRowsClosingFuture() returns a ClosingFuture.
+   * ClosingFuture<List<Row>> rowsFuture =
+   *     queryFuture.transformAsync((closer, result) -> result.getRowsClosingFuture(), executor);
+   *
+   * // Result.writeRowsToOutputStreamFuture() returns a ListenableFuture that resolves to the
+   * // number of written rows. openOutputFile() returns a FileOutputStream (which implements
+   * // Closeable).
+   * ClosingFuture<Integer> rowsFuture2 =
+   *     queryFuture.transformAsync(
+   *         (closer, result) -> {
+   *           FileOutputStream fos = closer.eventuallyClose(openOutputFile(), closingExecutor);
+   *           return ClosingFuture.from(result.writeRowsToOutputStreamFuture(fos));
+   *      },
+   *      executor);
+   *
+   * // Result.getRowsFuture() returns a ListenableFuture (no new closeables are created).
+   * ClosingFuture<List<Row>> rowsFuture3 =
+   *     queryFuture.transformAsync(withoutCloser(Result::getRowsFuture), executor);
+   *
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   * (Specifically, {@code directExecutor} functions should avoid heavyweight operations inside
+   * {@code AsyncClosingFunction.apply}. Any heavyweight operations should occur in other threads
+   * responsible for completing the returned {@code ClosingFuture}.)
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param function transforms the value of this step to a {@code ClosingFuture} with the value of
+   *     the derived step
+   * @param executor executor to run the function in
+   * @return the derived step
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from this
+   *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
+   *     finished}
+   */
+  public <U> ClosingFuture<U> transformAsync(
+      final AsyncClosingFunction<? super V, U> function, Executor executor) {
+    checkNotNull(function);
+    AsyncFunction<V, U> applyFunction =
+        new AsyncFunction<V, U>() {
+          @Override
+          public ListenableFuture<U> apply(V input) throws Exception {
+            return closeables.applyAsyncClosingFunction(function, input);
+          }
+
+          @Override
+          public String toString() {
+            return function.toString();
+          }
+        };
+    return derive(future.transformAsync(applyFunction, executor));
+  }
+
+  /**
+   * Returns an {@link AsyncClosingFunction} that applies an {@link AsyncFunction} to an input,
+   * ignoring the DeferredCloser and returning a {@code ClosingFuture} derived from the returned
+   * {@link ListenableFuture}.
+   *
+   * <p>Use this method to pass a transformation to {@link #transformAsync(AsyncClosingFunction,
+   * Executor)} or to {@link #catchingAsync(Class, AsyncClosingFunction, Executor)} as long as it
+   * meets these conditions:
+   *
+   * <ul>
+   *   <li>It does not need to capture any {@link Closeable} objects by calling {@link
+   *       DeferredCloser#eventuallyClose(Closeable, Executor)}.
+   *   <li>It returns a {@link ListenableFuture}.
+   * </ul>
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * // Result.getRowsFuture() returns a ListenableFuture.
+   * ClosingFuture<List<Row>> rowsFuture =
+   *     queryFuture.transformAsync(withoutCloser(Result::getRowsFuture), executor);
+   * }</pre>
+   *
+   * @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) {
+    checkNotNull(function);
+    return new AsyncClosingFunction<V, U>() {
+      @Override
+      public ClosingFuture<U> apply(DeferredCloser closer, V input) throws Exception {
+        return ClosingFuture.from(function.apply(input));
+      }
+    };
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * to its exception if it is an instance of a given exception type. The function can use a {@link
+   * DeferredCloser} to capture objects to be closed when the pipeline is done.
+   *
+   * <p>If this {@code ClosingFuture} succeeds or fails with a different exception type, the
+   * function will not be called, and the derived {@code ClosingFuture} will be equivalent to this
+   * one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}.
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * ClosingFuture<QueryResult> queryFuture =
+   *     queryFuture.catching(
+   *         QueryException.class, (closer, x) -> Query.emptyQueryResult(), executor);
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
+   *     type is matched against this step's exception. "This step's exception" means the cause of
+   *     the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself. To avoid hiding bugs and other unrecoverable errors, callers should
+   *     prefer more specific types, avoiding {@code Throwable.class} in particular.
+   * @param fallback the function to be called if this step fails with the expected exception type.
+   *     The function's argument is this step's exception. "This step's exception" means the cause
+   *     of the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself.
+   * @param executor the executor that runs {@code fallback} if the input fails
+   */
+  public <X extends Throwable> ClosingFuture<V> catching(
+      Class<X> exceptionType, ClosingFunction<? super X, ? extends V> fallback, Executor executor) {
+    return catchingMoreGeneric(exceptionType, fallback, executor);
+  }
+
+  // Avoids generic type capture inconsistency problems where |? extends V| is incompatible with V.
+  private <X extends Throwable, W extends V> ClosingFuture<V> catchingMoreGeneric(
+      Class<X> exceptionType, final ClosingFunction<? super X, W> fallback, Executor executor) {
+    checkNotNull(fallback);
+    AsyncFunction<X, W> applyFallback =
+        new AsyncFunction<X, W>() {
+          @Override
+          public ListenableFuture<W> apply(X exception) throws Exception {
+            return closeables.applyClosingFunction(fallback, exception);
+          }
+
+          @Override
+          public String toString() {
+            return fallback.toString();
+          }
+        };
+    // TODO(dpb): Switch to future.catchingSync when that exists (passing a throwing function).
+    return derive(future.catchingAsync(exceptionType, applyFallback, executor));
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * that returns a {@code ClosingFuture} to its exception if it is an instance of a given exception
+   * type. The function can use a {@link DeferredCloser} to capture objects to be closed when the
+   * pipeline is done (other than those captured by the returned {@link ClosingFuture}).
+   *
+   * <p>If this {@code ClosingFuture} fails with an exception of the given type, the derived {@code
+   * ClosingFuture} will be equivalent to the one returned by the function.
+   *
+   * <p>If this {@code ClosingFuture} succeeds or fails with a different exception type, the
+   * function will not be called, and the derived {@code ClosingFuture} will be equivalent to this
+   * one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}. But if the exception is thrown after the function creates a {@code
+   * ClosingFuture}, then none of the closeable objects in that {@code ClosingFuture} will be
+   * closed.
+   *
+   * <p>Usage guidelines for this method:
+   *
+   * <ul>
+   *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+   *       {@code ClosingFuture}. If possible, prefer calling {@link #catching(Class,
+   *       ClosingFunction, Executor)} instead, with a function that returns the next value
+   *       directly.
+   *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor) closer.eventuallyClose()}
+   *       for every closeable object this step creates in order to capture it for later closing.
+   *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+   *       ClosingFuture} call {@link #from(ListenableFuture)}.
+   *   <li>In case this step doesn't create new closeables, you can adapt an API that returns a
+   *       {@link ListenableFuture} to return a {@code ClosingFuture} by wrapping it with a call to
+   *       {@link #withoutCloser(AsyncFunction)}
+   * </ul>
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * // Fall back to a secondary input stream in case of IOException.
+   * ClosingFuture<InputStream> inputFuture =
+   *     firstInputFuture.catchingAsync(
+   *         IOException.class, (closer, x) -> secondaryInputStreamClosingFuture(), executor);
+   * }
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   * (Specifically, {@code directExecutor} functions should avoid heavyweight operations inside
+   * {@code AsyncClosingFunction.apply}. Any heavyweight operations should occur in other threads
+   * responsible for completing the returned {@code ClosingFuture}.)
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
+   *     type is matched against this step's exception. "This step's exception" means the cause of
+   *     the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself. To avoid hiding bugs and other unrecoverable errors, callers should
+   *     prefer more specific types, avoiding {@code Throwable.class} in particular.
+   * @param fallback the function to be called if this step fails with the expected exception type.
+   *     The function's argument is this step's exception. "This step's exception" means the cause
+   *     of the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself.
+   * @param executor the executor that runs {@code fallback} if the input fails
+   */
+  // TODO(dpb): Should this do something special if the function throws CancellationException or
+  // ExecutionException?
+  public <X extends Throwable> ClosingFuture<V> catchingAsync(
+      Class<X> exceptionType,
+      AsyncClosingFunction<? super X, ? extends V> fallback,
+      Executor executor) {
+    return catchingAsyncMoreGeneric(exceptionType, fallback, executor);
+  }
+
+  // Avoids generic type capture inconsistency problems where |? extends V| is incompatible with V.
+  private <X extends Throwable, W extends V> ClosingFuture<V> catchingAsyncMoreGeneric(
+      Class<X> exceptionType,
+      final AsyncClosingFunction<? super X, W> fallback,
+      Executor executor) {
+    checkNotNull(fallback);
+    AsyncFunction<X, W> asyncFunction =
+        new AsyncFunction<X, W>() {
+          @Override
+          public ListenableFuture<W> apply(X exception) throws Exception {
+            return closeables.applyAsyncClosingFunction(fallback, exception);
+          }
+
+          @Override
+          public String toString() {
+            return fallback.toString();
+          }
+        };
+    return derive(future.catchingAsync(exceptionType, asyncFunction, executor));
+  }
+
+  /**
+   * 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.
+   *
+   * <p>After calling this method, you may not call {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, this method, or any other
+   * derivation method on this {@code ClosingFuture}.
+   *
+   * @return a {@link Future} that represents the final value or exception of the pipeline
+   */
+  public FluentFuture<V> finishToFuture() {
+    if (compareAndUpdateState(OPEN, WILL_CLOSE)) {
+      logger.log(FINER, "will close {0}", this);
+      future.addListener(
+          new Runnable() {
+            @Override
+            public void run() {
+              checkAndUpdateState(WILL_CLOSE, CLOSING);
+              close();
+              checkAndUpdateState(CLOSING, CLOSED);
+            }
+          },
+          directExecutor());
+    } else {
+      switch (state.get()) {
+        case SUBSUMED:
+          throw new IllegalStateException(
+              "Cannot call finishToFuture() after deriving another step");
+
+        case WILL_CREATE_VALUE_AND_CLOSER:
+          throw new IllegalStateException(
+              "Cannot call finishToFuture() after calling finishToValueAndCloser()");
+
+        case WILL_CLOSE:
+        case CLOSING:
+        case CLOSED:
+          throw new IllegalStateException("Cannot call finishToFuture() twice");
+
+        case OPEN:
+          throw new AssertionError();
+      }
+    }
+    return future;
+  }
+
+  /**
+   * Marks this step as the last step in the {@code ClosingFuture} pipeline. When this step is done,
+   * {@code receiver} will be called with an object that contains the result of the operation. The
+   * receiver can store the {@link ValueAndCloser} outside the receiver for later synchronous use.
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, this method again, or
+   * any other derivation method on this {@code ClosingFuture}.
+   *
+   * @param consumer a callback whose method will be called (using {@code executor}) when this
+   *     operation is done
+   */
+  public void finishToValueAndCloser(
+      final ValueAndCloserConsumer<? super V> consumer, Executor executor) {
+    checkNotNull(consumer);
+    if (!compareAndUpdateState(OPEN, WILL_CREATE_VALUE_AND_CLOSER)) {
+      switch (state.get()) {
+        case SUBSUMED:
+          throw new IllegalStateException(
+              "Cannot call finishToValueAndCloser() after deriving another step");
+
+        case WILL_CLOSE:
+        case CLOSING:
+        case CLOSED:
+          throw new IllegalStateException(
+              "Cannot call finishToValueAndCloser() after calling finishToFuture()");
+
+        case WILL_CREATE_VALUE_AND_CLOSER:
+          throw new IllegalStateException("Cannot call finishToValueAndCloser() twice");
+
+        case OPEN:
+          break;
+      }
+      throw new AssertionError(state);
+    }
+    future.addListener(
+        new Runnable() {
+          @Override
+          public void run() {
+            provideValueAndCloser(consumer, ClosingFuture.this);
+          }
+        },
+        executor);
+  }
+
+  private static <C, V extends C> void provideValueAndCloser(
+      ValueAndCloserConsumer<C> consumer, ClosingFuture<V> closingFuture) {
+    consumer.accept(new ValueAndCloser<C>(closingFuture));
+  }
+
+  /**
+   * Attempts to cancel execution of this step. This attempt will fail if the step has already
+   * completed, has already been cancelled, or could not be cancelled for some other reason. If
+   * successful, and this step has not started when {@code cancel} is called, this step should never
+   * run.
+   *
+   * <p>If successful, causes the objects captured by this step (if already started) and its input
+   * step(s) for later closing to be closed on their respective {@link Executor}s. If any such calls
+   * specified {@link MoreExecutors#directExecutor()}, those objects will be closed synchronously.
+   *
+   * @param mayInterruptIfRunning {@code true} if the thread executing this task should be
+   *     interrupted; otherwise, in-progress tasks are allowed to complete, but the step will be
+   *     cancelled regardless
+   * @return {@code false} if the step could not be cancelled, typically because it has already
+   *     completed normally; {@code true} otherwise
+   */
+  @CanIgnoreReturnValue
+  public boolean cancel(boolean mayInterruptIfRunning) {
+    logger.log(FINER, "cancelling {0}", this);
+    boolean cancelled = future.cancel(mayInterruptIfRunning);
+    if (cancelled) {
+      close();
+    }
+    return cancelled;
+  }
+
+  private void close() {
+    logger.log(FINER, "closing {0}", this);
+    closeables.close();
+  }
+
+  private <U> ClosingFuture<U> derive(FluentFuture<U> future) {
+    ClosingFuture<U> derived = new ClosingFuture<>(future);
+    becomeSubsumedInto(derived.closeables);
+    return derived;
+  }
+
+  private void becomeSubsumedInto(CloseableList otherCloseables) {
+    checkAndUpdateState(OPEN, SUBSUMED);
+    otherCloseables.add(closeables, directExecutor());
+  }
+
+  /**
+   * An object that can return the value of the {@link ClosingFuture}s that are passed to {@link
+   * #whenAllComplete(Iterable)} or {@link #whenAllSucceed(Iterable)}.
+   *
+   * <p>Only for use by a {@link CombiningCallable} or {@link AsyncCombiningCallable} object.
+   */
+  public static final class Peeker {
+    private final ImmutableList<ClosingFuture<?>> futures;
+    private volatile boolean beingCalled;
+
+    private Peeker(ImmutableList<ClosingFuture<?>> futures) {
+      this.futures = checkNotNull(futures);
+    }
+
+    /**
+     * Returns the value of {@code closingFuture}.
+     *
+     * @throws ExecutionException if {@code closingFuture} is a failed step
+     * @throws CancellationException if the {@code closingFuture}'s future was cancelled
+     * @throws IllegalArgumentException if {@code closingFuture} is not one of the futures passed to
+     *     {@link #whenAllComplete(Iterable)} or {@link #whenAllComplete(Iterable)}
+     * @throws IllegalStateException if called outside of a call to {@link
+     *     CombiningCallable#call(DeferredCloser, Peeker)} or {@link
+     *     AsyncCombiningCallable#call(DeferredCloser, Peeker)}
+     */
+    @NullableDecl
+    public final <D extends 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 {
+      beingCalled = true;
+      CloseableList newCloseables = new CloseableList();
+      try {
+        return combiner.call(newCloseables.closer, this);
+      } finally {
+        closeables.add(newCloseables, directExecutor());
+        beingCalled = false;
+      }
+    }
+
+    private <V extends Object> FluentFuture<V> callAsync(
+        AsyncCombiningCallable<V> combiner, CloseableList closeables) throws Exception {
+      beingCalled = true;
+      CloseableList newCloseables = new CloseableList();
+      try {
+        ClosingFuture<V> closingFuture = combiner.call(newCloseables.closer, this);
+        closingFuture.becomeSubsumedInto(closeables);
+        return closingFuture.future;
+      } finally {
+        closeables.add(newCloseables, directExecutor());
+        beingCalled = false;
+      }
+    }
+  }
+
+  /**
+   * A builder of a {@link ClosingFuture} step that is derived from more than one input step.
+   *
+   * <p>See {@link #whenAllComplete(Iterable)} and {@link #whenAllSucceed(Iterable)} for how to
+   * instantiate this class.
+   *
+   * <p>Example:
+   *
+   * <pre>{@code
+   * final ClosingFuture<BufferedReader> file1ReaderFuture = ...;
+   * final ClosingFuture<BufferedReader> file2ReaderFuture = ...;
+   * ListenableFuture<Integer> numberOfDifferentLines =
+   *       ClosingFuture.whenAllSucceed(file1ReaderFuture, file2ReaderFuture)
+   *           .call(
+   *               (closer, peeker) -> {
+   *                 BufferedReader file1Reader = peeker.getDone(file1ReaderFuture);
+   *                 BufferedReader file2Reader = peeker.getDone(file2ReaderFuture);
+   *                 return countDifferentLines(file1Reader, file2Reader);
+   *               },
+   *               executor)
+   *           .closing(executor);
+   * }</pre>
+   */
+  // TODO(cpovirk): Use simple name instead of fully qualified after we stop building with JDK 8.
+  @com.google.errorprone.annotations.DoNotMock(
+      "Use ClosingFuture.whenAllSucceed() or .whenAllComplete() instead.")
+  public static class Combiner {
+
+    private final CloseableList closeables = new CloseableList();
+
+    /**
+     * An operation that returns a result and may throw an exception.
+     *
+     * @param <V> the type of the result
+     */
+    public interface CombiningCallable<V extends 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.
+       *
+       * @param peeker used to get the value of any of the input futures
+       */
+      @NullableDecl
+      V call(DeferredCloser closer, Peeker peeker) throws Exception;
+    }
+
+    /**
+     * An operation that returns a {@link ClosingFuture} result and may throw an exception.
+     *
+     * @param <V> the type of the result
+     */
+    public interface AsyncCombiningCallable<V extends Object> {
+      /**
+       * Computes a {@link ClosingFuture} 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.
+       *
+       * @param peeker used to get the value of any of the input futures
+       */
+      ClosingFuture<V> call(DeferredCloser closer, Peeker peeker) throws Exception;
+    }
+
+    private final boolean allMustSucceed;
+    protected final ImmutableList<ClosingFuture<?>> inputs;
+
+    private Combiner(boolean allMustSucceed, Iterable<? extends ClosingFuture<?>> inputs) {
+      this.allMustSucceed = allMustSucceed;
+      this.inputs = ImmutableList.copyOf(inputs);
+      for (ClosingFuture<?> input : inputs) {
+        input.becomeSubsumedInto(closeables);
+      }
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by a {@link #whenAllSucceed} method and any of the inputs
+     * fail, so will the returned step.
+     *
+     * <p>If the combiningCallable throws a {@code CancellationException}, the pipeline will be
+     * cancelled.
+     *
+     * <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(
+        final CombiningCallable<V> combiningCallable, Executor executor) {
+      Callable<V> callable =
+          new Callable<V>() {
+            @Override
+            public V call() throws Exception {
+              return new Peeker(inputs).call(combiningCallable, closeables);
+            }
+
+            @Override
+            public String toString() {
+              return combiningCallable.toString();
+            }
+          };
+      ClosingFuture<V> derived = new ClosingFuture<>(futureCombiner().call(callable, executor));
+      derived.closeables.add(closeables, directExecutor());
+      return derived;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by a {@link #whenAllSucceed} method and any of the inputs
+     * fail, so will the returned step.
+     *
+     * <p>If the combiningCallable throws a {@code CancellationException}, the pipeline will be
+     * cancelled.
+     *
+     * <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.
+     *
+     * <p>If the combiningCallable throws any other exception, it will be used as the failure of the
+     * derived step.
+     *
+     * <p>If an exception is thrown after the combiningCallable creates a {@code ClosingFuture},
+     * then none of the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <V> ClosingFuture<V> callAsync(
+        final AsyncCombiningCallable<V> combiningCallable, Executor executor) {
+      AsyncCallable<V> asyncCallable =
+          new AsyncCallable<V>() {
+            @Override
+            public ListenableFuture<V> call() throws Exception {
+              return new Peeker(inputs).callAsync(combiningCallable, closeables);
+            }
+
+            @Override
+            public String toString() {
+              return combiningCallable.toString();
+            }
+          };
+      ClosingFuture<V> derived =
+          new ClosingFuture<>(futureCombiner().callAsync(asyncCallable, executor));
+      derived.closeables.add(closeables, directExecutor());
+      return derived;
+    }
+
+    private FutureCombiner<Object> futureCombiner() {
+      return allMustSucceed
+          ? Futures.whenAllSucceed(inputFutures())
+          : Futures.whenAllComplete(inputFutures());
+    }
+
+    private static final Function<ClosingFuture<?>, FluentFuture<?>> INNER_FUTURE =
+        new Function<ClosingFuture<?>, FluentFuture<?>>() {
+          @Override
+          public FluentFuture<?> apply(ClosingFuture<?> future) {
+            return future.future;
+          }
+        };
+
+    private ImmutableList<FluentFuture<?>> inputFutures() {
+      return FluentIterable.from(inputs).transform(INNER_FUTURE).toList();
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine two {@link
+   * ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture)} to start this
+   * combination.
+   *
+   * @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 {
+
+    /**
+     * A function that returns a value when applied to the values of the two futures passed to
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @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> {
+
+      /**
+       * Applies this function to two inputs, 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.
+       */
+      @NullableDecl
+      U apply(DeferredCloser closer, @NullableDecl V1 value1, @NullableDecl V2 value2)
+          throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the two futures
+     * passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @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> {
+
+      /**
+       * Applies this function to two inputs, 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<U> apply(
+          DeferredCloser closer, @NullableDecl V1 value1, @NullableDecl V2 value2) throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+
+    private Combiner2(ClosingFuture<V1> future1, ClosingFuture<V2> future2) {
+      super(true, ImmutableList.of(future1, future2));
+      this.future1 = future1;
+      this.future2 = future2;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture)} and
+     * any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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(
+        final ClosingFunction2<V1, V2, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            @NullableDecl
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(closer, peeker.getDone(future1), peeker.getDone(future2));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture)} and
+     * any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction2<V1, V2, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(closer, peeker.getDone(future1), peeker.getDone(future2));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine three
+   * {@link ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+   * ClosingFuture)} to start this combination.
+   *
+   * @param <V1> the type returned by the first future
+   * @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>
+      extends Combiner {
+    /**
+     * A function that returns a value when applied to the values of the three futures passed to
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <U> the type returned by the function
+     */
+    public interface ClosingFunction3<
+        V1 extends Object, V2 extends Object, V3 extends Object, U extends Object> {
+      /**
+       * Applies this function to three inputs, 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.
+       */
+      @NullableDecl
+      U apply(
+          DeferredCloser closer,
+          @NullableDecl V1 value1,
+          @NullableDecl V2 value2,
+          @NullableDecl V3 v3)
+          throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the three
+     * futures passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <U> the type returned by the function
+     */
+    public interface AsyncClosingFunction3<
+        V1 extends Object, V2 extends Object, V3 extends Object, U extends Object> {
+      /**
+       * Applies this function to three inputs, 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<U> apply(
+          DeferredCloser closer,
+          @NullableDecl V1 value1,
+          @NullableDecl V2 value2,
+          @NullableDecl V3 value3)
+          throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+    private final ClosingFuture<V3> future3;
+
+    private Combiner3(
+        ClosingFuture<V1> future1, ClosingFuture<V2> future2, ClosingFuture<V3> future3) {
+      super(true, ImmutableList.of(future1, future2, future3));
+      this.future1 = future1;
+      this.future2 = future2;
+      this.future3 = future3;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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(
+        final ClosingFunction3<V1, V2, V3, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            @NullableDecl
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction3<V1, V2, V3, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine four
+   * {@link ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+   * ClosingFuture)} to start this combination.
+   *
+   * @param <V1> the type returned by the first future
+   * @param <V2> the type returned by the second future
+   * @param <V3> the type returned by the third future
+   * @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>
+      extends Combiner {
+    /**
+     * A function that returns a value when applied to the values of the four futures passed to
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @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> {
+      /**
+       * Applies this function to four inputs, 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.
+       */
+      @NullableDecl
+      U apply(
+          DeferredCloser closer,
+          @NullableDecl V1 value1,
+          @NullableDecl V2 value2,
+          @NullableDecl V3 value3,
+          @NullableDecl V4 value4)
+          throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the four
+     * futures passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+     * ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @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> {
+      /**
+       * Applies this function to four inputs, 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<U> apply(
+          DeferredCloser closer,
+          @NullableDecl V1 value1,
+          @NullableDecl V2 value2,
+          @NullableDecl V3 value3,
+          @NullableDecl V4 value4)
+          throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+    private final ClosingFuture<V3> future3;
+    private final ClosingFuture<V4> future4;
+
+    private Combiner4(
+        ClosingFuture<V1> future1,
+        ClosingFuture<V2> future2,
+        ClosingFuture<V3> future3,
+        ClosingFuture<V4> future4) {
+      super(true, ImmutableList.of(future1, future2, future3, future4));
+      this.future1 = future1;
+      this.future2 = future2;
+      this.future3 = future3;
+      this.future4 = future4;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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(
+        final ClosingFunction4<V1, V2, V3, V4, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            @NullableDecl
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction4<V1, V2, V3, V4, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine five
+   * {@link ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+   * ClosingFuture, ClosingFuture)} to start this combination.
+   *
+   * @param <V1> the type returned by the first future
+   * @param <V2> the type returned by the second future
+   * @param <V3> the type returned by the third future
+   * @param <V4> the type returned by the fourth future
+   * @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>
+      extends Combiner {
+    /**
+     * A function that returns a value when applied to the values of the five futures passed to
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture, ClosingFuture,
+     * ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @param <V5> the type returned by the fifth future
+     * @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> {
+      /**
+       * Applies this function to five inputs, 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.
+       */
+      @NullableDecl
+      U apply(
+          DeferredCloser closer,
+          @NullableDecl V1 value1,
+          @NullableDecl V2 value2,
+          @NullableDecl V3 value3,
+          @NullableDecl V4 value4,
+          @NullableDecl V5 value5)
+          throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the five
+     * futures passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @param <V5> the type returned by the fifth future
+     * @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> {
+      /**
+       * Applies this function to five inputs, 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<U> apply(
+          DeferredCloser closer,
+          @NullableDecl V1 value1,
+          @NullableDecl V2 value2,
+          @NullableDecl V3 value3,
+          @NullableDecl V4 value4,
+          @NullableDecl V5 value5)
+          throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+    private final ClosingFuture<V3> future3;
+    private final ClosingFuture<V4> future4;
+    private final ClosingFuture<V5> future5;
+
+    private Combiner5(
+        ClosingFuture<V1> future1,
+        ClosingFuture<V2> future2,
+        ClosingFuture<V3> future3,
+        ClosingFuture<V4> future4,
+        ClosingFuture<V5> future5) {
+      super(true, ImmutableList.of(future1, future2, future3, future4, future5));
+      this.future1 = future1;
+      this.future2 = future2;
+      this.future3 = future3;
+      this.future4 = future4;
+      this.future5 = future5;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the
+     * returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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(
+        final ClosingFunction5<V1, V2, V3, V4, V5, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            @NullableDecl
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4),
+                  peeker.getDone(future5));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the
+     * returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction5<V1, V2, V3, V4, V5, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4),
+                  peeker.getDone(future5));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  @Override
+  public String toString() {
+    // TODO(dpb): Better toString, in the style of Futures.transform etc.
+    return toStringHelper(this).add("state", state.get()).addValue(future).toString();
+  }
+
+  @Override
+  protected void finalize() {
+    if (state.get().equals(OPEN)) {
+      logger.log(SEVERE, "Uh oh! An open ClosingFuture has leaked and will close: {0}", this);
+      FluentFuture<V> unused = finishToFuture();
+    }
+  }
+
+  private static void closeQuietly(final Closeable closeable, Executor executor) {
+    if (closeable == null) {
+      return;
+    }
+    try {
+      executor.execute(
+          new Runnable() {
+            @Override
+            public void run() {
+              try {
+                closeable.close();
+              } catch (IOException | RuntimeException e) {
+                logger.log(WARNING, "thrown by close()", e);
+              }
+            }
+          });
+    } catch (RejectedExecutionException e) {
+      if (logger.isLoggable(WARNING)) {
+        logger.log(
+            WARNING, String.format("while submitting close to %s; will close inline", executor), e);
+      }
+      closeQuietly(closeable, directExecutor());
+    }
+  }
+
+  private void checkAndUpdateState(State oldState, State newState) {
+    checkState(
+        compareAndUpdateState(oldState, newState),
+        "Expected state to be %s, but it was %s",
+        oldState,
+        newState);
+  }
+
+  private boolean compareAndUpdateState(State oldState, State newState) {
+    return state.compareAndSet(oldState, newState);
+  }
+
+  // TODO(dpb): Should we use a pair of ArrayLists instead of an IdentityHashMap?
+  private static final class CloseableList extends IdentityHashMap<Closeable, Executor>
+      implements Closeable {
+    private final DeferredCloser closer = new DeferredCloser(this);
+    private volatile boolean closed;
+    private volatile CountDownLatch whenClosed;
+
+    <V, U> ListenableFuture<U> applyClosingFunction(
+        ClosingFunction<? super V, U> transformation, V input) throws Exception {
+      // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
+      CloseableList newCloseables = new CloseableList();
+      try {
+        return immediateFuture(transformation.apply(newCloseables.closer, input));
+      } finally {
+        add(newCloseables, directExecutor());
+      }
+    }
+
+    <V, U> FluentFuture<U> applyAsyncClosingFunction(
+        AsyncClosingFunction<V, U> transformation, V input) throws Exception {
+      // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
+      CloseableList newCloseables = new CloseableList();
+      try {
+        ClosingFuture<U> closingFuture = transformation.apply(newCloseables.closer, input);
+        closingFuture.becomeSubsumedInto(newCloseables);
+        return closingFuture.future;
+      } finally {
+        add(newCloseables, directExecutor());
+      }
+    }
+
+    @Override
+    public void close() {
+      if (closed) {
+        return;
+      }
+      synchronized (this) {
+        if (closed) {
+          return;
+        }
+        closed = true;
+      }
+      for (Map.Entry<Closeable, Executor> entry : entrySet()) {
+        closeQuietly(entry.getKey(), entry.getValue());
+      }
+      clear();
+      if (whenClosed != null) {
+        whenClosed.countDown();
+      }
+    }
+
+    void add(@NullableDecl Closeable closeable, Executor executor) {
+      checkNotNull(executor);
+      if (closeable == null) {
+        return;
+      }
+      synchronized (this) {
+        if (!closed) {
+          put(closeable, executor);
+          return;
+        }
+      }
+      closeQuietly(closeable, executor);
+    }
+
+    /**
+     * Returns a latch that reaches zero when this objects' deferred closeables have been closed.
+     */
+    CountDownLatch whenClosedCountDown() {
+      if (closed) {
+        return new CountDownLatch(0);
+      }
+      synchronized (this) {
+        if (closed) {
+          return new CountDownLatch(0);
+        }
+        checkState(whenClosed == null);
+        return whenClosed = new CountDownLatch(1);
+      }
+    }
+  }
+
+  /**
+   * Returns an object that can be used to wait until this objects' deferred closeables have all had
+   * {@link Runnable}s that close them submitted to each one's closing {@link Executor}.
+   */
+  @VisibleForTesting
+  CountDownLatch whenClosedCountDown() {
+    return closeables.whenClosedCountDown();
+  }
+
+  /** The state of a {@link CloseableList}. */
+  enum State {
+    /** The {@link CloseableList} has not been subsumed or closed. */
+    OPEN,
+
+    /**
+     * The {@link CloseableList} has been subsumed into another. It may not be closed or subsumed
+     * into any other.
+     */
+    SUBSUMED,
+
+    /**
+     * Some {@link ListenableFuture} has a callback attached that will close the {@link
+     * CloseableList}, but it has not yet run. The {@link CloseableList} may not be subsumed.
+     */
+    WILL_CLOSE,
+
+    /**
+     * The callback that closes the {@link CloseableList} is running, but it has not completed. The
+     * {@link CloseableList} may not be subsumed.
+     */
+    CLOSING,
+
+    /** The {@link CloseableList} has been closed. It may not be further subsumed. */
+    CLOSED,
+
+    /**
+     * {@link ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)} has been
+     * called. The step may not be further subsumed, nor may {@link #finishToFuture()} be called.
+     */
+    WILL_CREATE_VALUE_AND_CLOSER,
+  }
+}
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 97476d5..3ae5800 100644
--- a/android/guava/src/com/google/common/util/concurrent/CollectionFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/CollectionFuture.java
@@ -14,98 +14,95 @@
 
 package com.google.common.util.concurrent;
 
-import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.Lists.newArrayListWithCapacity;
 import static java.util.Collections.unmodifiableList;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.util.List;
+import java.util.concurrent.Future;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /** Aggregate future that collects (stores) results of each future. */
 @GwtCompatible(emulated = true)
 abstract class CollectionFuture<V, C> 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;
 
-  abstract class CollectionFutureRunningState extends RunningState {
-    private List<Optional<V>> values;
+  CollectionFuture(
+      ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
+      boolean allMustSucceed) {
+    super(futures, allMustSucceed, true);
 
-    CollectionFutureRunningState(
-        ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
-        boolean allMustSucceed) {
-      super(futures, allMustSucceed, true);
+    List<Present<V>> values =
+        futures.isEmpty()
+            ? ImmutableList.<Present<V>>of()
+            : Lists.<Present<V>>newArrayListWithCapacity(futures.size());
 
-      this.values =
-          futures.isEmpty()
-              ? ImmutableList.<Optional<V>>of()
-              : Lists.<Optional<V>>newArrayListWithCapacity(futures.size());
-
-      // Populate the results list with null initially.
-      for (int i = 0; i < futures.size(); ++i) {
-        values.add(null);
-      }
+    // Populate the results list with null initially.
+    for (int i = 0; i < futures.size(); ++i) {
+      values.add(null);
     }
 
-    @Override
-    final void collectOneValue(boolean allMustSucceed, int index, @NullableDecl V returnValue) {
-      List<Optional<V>> localValues = values;
-
-      if (localValues != null) {
-        localValues.set(index, Optional.fromNullable(returnValue));
-      } else {
-        // Some other future failed or has been cancelled, causing this one to also be cancelled or
-        // have an exception set. This should only happen if allMustSucceed is true or if the output
-        // itself has been cancelled.
-        checkState(
-            allMustSucceed || isCancelled(), "Future was done before all dependencies completed");
-      }
-    }
-
-    @Override
-    final void handleAllCompleted() {
-      List<Optional<V>> localValues = values;
-      if (localValues != null) {
-        set(combine(localValues));
-      } else {
-        checkState(isDone());
-      }
-    }
-
-    @Override
-    void releaseResourcesAfterFailure() {
-      super.releaseResourcesAfterFailure();
-      this.values = null;
-    }
-
-    abstract C combine(List<Optional<V>> values);
+    this.values = values;
   }
 
+  @Override
+  final void collectOneValue(int index, @NullableDecl V returnValue) {
+    List<Present<V>> localValues = values;
+    if (localValues != null) {
+      localValues.set(index, new Present<>(returnValue));
+    }
+  }
+
+  @Override
+  final void handleAllCompleted() {
+    List<Present<V>> localValues = values;
+    if (localValues != null) {
+      set(combine(localValues));
+    }
+  }
+
+  @Override
+  void releaseResources(ReleaseResourcesReason reason) {
+    super.releaseResources(reason);
+    this.values = null;
+  }
+
+  abstract C combine(List<Present<V>> values);
+
   /** Used for {@link Futures#allAsList} and {@link Futures#successfulAsList}. */
   static final class ListFuture<V> extends CollectionFuture<V, List<V>> {
     ListFuture(
         ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
         boolean allMustSucceed) {
-      init(new ListFutureRunningState(futures, allMustSucceed));
+      super(futures, allMustSucceed);
+      init();
     }
 
-    private final class ListFutureRunningState extends CollectionFutureRunningState {
-      ListFutureRunningState(
-          ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
-          boolean allMustSucceed) {
-        super(futures, allMustSucceed);
+    @Override
+    public List<V> combine(List<Present<V>> values) {
+      List<V> result = newArrayListWithCapacity(values.size());
+      for (Present<V> element : values) {
+        result.add(element != null ? element.value : null);
       }
+      return unmodifiableList(result);
+    }
+  }
 
-      @Override
-      public List<V> combine(List<Optional<V>> values) {
-        List<V> result = newArrayListWithCapacity(values.size());
-        for (Optional<V> element : values) {
-          result.add(element != null ? element.orNull() : null);
-        }
-        return unmodifiableList(result);
-      }
+  /** The result of a successful {@code Future}. */
+  private static final class Present<V> {
+    V value;
+
+    Present(V value) {
+      this.value = 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 da9d539..15a1c07 100644
--- a/android/guava/src/com/google/common/util/concurrent/CombinedFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/CombinedFuture.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.util.concurrent.AggregateFuture.ReleaseResourcesReason.OUTPUT_FUTURE_DONE;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableCollection;
@@ -30,16 +30,16 @@
 /** Aggregate future that computes its value by calling a callable. */
 @GwtCompatible
 final class CombinedFuture<V> extends AggregateFuture<Object, V> {
+  private CombinedFutureInterruptibleTask<?> task;
+
   CombinedFuture(
       ImmutableCollection<? extends ListenableFuture<?>> futures,
       boolean allMustSucceed,
       Executor listenerExecutor,
       AsyncCallable<V> callable) {
-    init(
-        new CombinedFutureRunningState(
-            futures,
-            allMustSucceed,
-            new AsyncCallableInterruptibleTask(callable, listenerExecutor)));
+    super(futures, allMustSucceed, false);
+    this.task = new AsyncCallableInterruptibleTask(callable, listenerExecutor);
+    init();
   }
 
   CombinedFuture(
@@ -47,56 +47,50 @@
       boolean allMustSucceed,
       Executor listenerExecutor,
       Callable<V> callable) {
-    init(
-        new CombinedFutureRunningState(
-            futures, allMustSucceed, new CallableInterruptibleTask(callable, listenerExecutor)));
+    super(futures, allMustSucceed, false);
+    this.task = new CallableInterruptibleTask(callable, listenerExecutor);
+    init();
   }
 
-  private final class CombinedFutureRunningState extends RunningState {
-    private CombinedFutureInterruptibleTask task;
+  @Override
+  void collectOneValue(int index, @NullableDecl Object returnValue) {}
 
-    CombinedFutureRunningState(
-        ImmutableCollection<? extends ListenableFuture<?>> futures,
-        boolean allMustSucceed,
-        CombinedFutureInterruptibleTask task) {
-      super(futures, allMustSucceed, false);
-      this.task = task;
+  @Override
+  void handleAllCompleted() {
+    CombinedFutureInterruptibleTask<?> localTask = task;
+    if (localTask != null) {
+      localTask.execute();
     }
+  }
 
-    @Override
-    void collectOneValue(boolean allMustSucceed, int index, @NullableDecl Object returnValue) {}
-
-    @Override
-    void handleAllCompleted() {
-      CombinedFutureInterruptibleTask localTask = task;
-      if (localTask != null) {
-        localTask.execute();
-      } else {
-        checkState(isDone());
-      }
-    }
-
-    @Override
-    void releaseResourcesAfterFailure() {
-      super.releaseResourcesAfterFailure();
+  @Override
+  void releaseResources(ReleaseResourcesReason reason) {
+    super.releaseResources(reason);
+    /*
+     * If the output future is done, then it won't need to interrupt the task later, so it can clear
+     * its reference to it.
+     *
+     * If the output future is *not* done, then the task field will be cleared after the task runs
+     * or after the output future is done, whichever comes first.
+     */
+    if (reason == OUTPUT_FUTURE_DONE) {
       this.task = null;
     }
+  }
 
-    @Override
-    void interruptTask() {
-      CombinedFutureInterruptibleTask localTask = task;
-      if (localTask != null) {
-        localTask.interruptTask();
-      }
+  @Override
+  protected void interruptTask() {
+    CombinedFutureInterruptibleTask<?> localTask = task;
+    if (localTask != null) {
+      localTask.interruptTask();
     }
   }
 
   @WeakOuter
   private abstract class CombinedFutureInterruptibleTask<T> extends InterruptibleTask<T> {
     private final Executor listenerExecutor;
-    boolean thrownByExecute = true;
 
-    public CombinedFutureInterruptibleTask(Executor listenerExecutor) {
+    CombinedFutureInterruptibleTask(Executor listenerExecutor) {
       this.listenerExecutor = checkNotNull(listenerExecutor);
     }
 
@@ -109,21 +103,32 @@
       try {
         listenerExecutor.execute(this);
       } catch (RejectedExecutionException e) {
-        if (thrownByExecute) {
-          setException(e);
-        }
+        CombinedFuture.this.setException(e);
       }
     }
 
     @Override
     final void afterRanInterruptibly(T result, Throwable error) {
+      /*
+       * The future no longer needs to interrupt this task, so it no longer needs a reference to it.
+       *
+       * TODO(cpovirk): It might be nice for our InterruptibleTask subclasses to null out their
+       *  `callable` fields automatically. That would make it less important for us to null out the
+       * reference to `task` here (though it's still nice to do so in case our reference to the
+       * executor keeps it alive). Ideally, nulling out `callable` would be the responsibility of
+       * InterruptibleTask itself so that its other subclasses also benefit. (Handling `callable` in
+       * InterruptibleTask itself might also eliminate some of the existing boilerplate for, e.g.,
+       * pendingToString().)
+       */
+      CombinedFuture.this.task = null;
+
       if (error != null) {
         if (error instanceof ExecutionException) {
-          setException(error.getCause());
+          CombinedFuture.this.setException(error.getCause());
         } else if (error instanceof CancellationException) {
           cancel(false);
         } else {
-          setException(error);
+          CombinedFuture.this.setException(error);
         }
       } else {
         setValue(result);
@@ -138,14 +143,13 @@
       extends CombinedFutureInterruptibleTask<ListenableFuture<V>> {
     private final AsyncCallable<V> callable;
 
-    public AsyncCallableInterruptibleTask(AsyncCallable<V> callable, Executor listenerExecutor) {
+    AsyncCallableInterruptibleTask(AsyncCallable<V> callable, Executor listenerExecutor) {
       super(listenerExecutor);
       this.callable = checkNotNull(callable);
     }
 
     @Override
     ListenableFuture<V> runInterruptibly() throws Exception {
-      thrownByExecute = false;
       ListenableFuture<V> result = callable.call();
       return checkNotNull(
           result,
@@ -156,7 +160,7 @@
 
     @Override
     void setValue(ListenableFuture<V> value) {
-      setFuture(value);
+      CombinedFuture.this.setFuture(value);
     }
 
     @Override
@@ -169,14 +173,13 @@
   private final class CallableInterruptibleTask extends CombinedFutureInterruptibleTask<V> {
     private final Callable<V> callable;
 
-    public CallableInterruptibleTask(Callable<V> callable, Executor listenerExecutor) {
+    CallableInterruptibleTask(Callable<V> callable, Executor listenerExecutor) {
       super(listenerExecutor);
       this.callable = checkNotNull(callable);
     }
 
     @Override
     V runInterruptibly() throws Exception {
-      thrownByExecute = false;
       return callable.call();
     }
 
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 88929b6..f589e08 100644
--- a/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
+++ b/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
@@ -15,11 +15,13 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.util.concurrent.ExecutionSequencer.RunningState.CANCELLED;
 import static com.google.common.util.concurrent.ExecutionSequencer.RunningState.NOT_RUN;
 import static com.google.common.util.concurrent.ExecutionSequencer.RunningState.STARTED;
 import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
 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 com.google.common.annotations.Beta;
@@ -28,13 +30,50 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
- * Serializes execution of a set of operations. This class guarantees that a submitted callable will
- * not be called before previously submitted callables (and any {@code Future}s returned from them)
- * have completed.
+ * Serializes execution of tasks, somewhat like an "asynchronous {@code synchronized} block." Each
+ * {@linkplain #submit enqueued} callable will not be submitted to its associated executor until the
+ * previous callable has returned -- and, if the previous callable was an {@link AsyncCallable}, not
+ * until the {@code Future} it returned is {@linkplain Future#isDone done} (successful, failed, or
+ * cancelled).
  *
- * <p>This class implements a superset of the behavior of {@link
- * MoreExecutors#newSequentialExecutor}. If your tasks all run on the same underlying executor and
- * don't need to wait for {@code Future}s returned from {@code AsyncCallable}s, use it instead.
+ * <p>This class has limited support for cancellation and other "early completion":
+ *
+ * <ul>
+ *   <li>While calls to {@code submit} and {@code submitAsync} return a {@code Future} that can be
+ *       cancelled, cancellation never propagates to a task that has started to run -- neither to
+ *       the callable itself nor to any {@code Future} returned by an {@code AsyncCallable}.
+ *       (However, cancellation can prevent an <i>unstarted</i> task from running.) Therefore, the
+ *       next task will wait for any running callable (or pending {@code Future} returned by an
+ *       {@code AsyncCallable}) to complete, without interrupting it (and without calling {@code
+ *       cancel} on the {@code Future}). So beware: <i>Even if you cancel every precededing {@code
+ *       Future} returned by this class, the next task may still have to wait.</i>.
+ *   <li>Once an {@code AsyncCallable} returns a {@code Future}, this class considers that task to
+ *       be "done" as soon as <i>that</i> {@code Future} completes in any way. Notably, a {@code
+ *       Future} is "completed" even if it is cancelled while its underlying work continues on a
+ *       thread, an RPC, etc. The {@code Future} is also "completed" if it fails "early" -- for
+ *       example, if the deadline expires on a {@code Future} returned from {@link
+ *       Futures#withTimeout} while the {@code Future} it wraps continues its underlying work. So
+ *       beware: <i>Your {@code AsyncCallable} should not complete its {@code Future} until it is
+ *       safe for the next task to start.</i>
+ * </ul>
+ *
+ * <p>An additional limitation: this class serializes execution of <i>tasks</i> but not any
+ * <i>listeners</i> of those tasks.
+ *
+ * <p>This class is similar to {@link MoreExecutors#newSequentialExecutor}. This class is different
+ * in a few ways:
+ *
+ * <ul>
+ *   <li>Each task may be associated with a different executor.
+ *   <li>Tasks may be of type {@code AsyncCallable}.
+ *   <li>Running tasks <i>cannot</i> be interrupted. (Note that {@code newSequentialExecutor} does
+ *       not return {@code Future} objects, so it doesn't support interruption directly, either.
+ *       However, utilities that <i>use</i> that executor have the ability to interrupt tasks
+ *       running on it. This class, by contrast, does not expose an {@code Executor} API.)
+ * </ul>
+ *
+ * <p>If you don't need the features of this class, you may prefer {@code newSequentialExecutor} for
+ * its simplicity and ability to accommodate interruption.
  *
  * @since 26.0
  */
@@ -48,15 +87,47 @@
     return new ExecutionSequencer();
   }
 
-  enum RunningState {
-    NOT_RUN,
-    CANCELLED,
-    STARTED,
-  }
-
   /** This reference acts as a pointer tracking the head of a linked list of ListenableFutures. */
-  private final AtomicReference<ListenableFuture<Object>> ref =
-      new AtomicReference<>(immediateFuture(null));
+  private final AtomicReference<ListenableFuture<Void>> ref =
+      new AtomicReference<>(immediateVoidFuture());
+
+  private ThreadConfinedTaskQueue latestTaskQueue = new ThreadConfinedTaskQueue();
+
+  /**
+   * This object is unsafely published, but avoids problematic races by relying exclusively on the
+   * identity equality of its Thread field so that the task field is only accessed by a single
+   * thread.
+   */
+  private static final class ThreadConfinedTaskQueue {
+    /**
+     * This field is only used for identity comparisons with the current thread. Field assignments
+     * are atomic, but do not provide happens-before ordering; however:
+     *
+     * <ul>
+     *   <li>If this field's value == currentThread, we know that it's up to date, because write
+     *       operations in a thread always happen-before subsequent read operations in the same
+     *       thread
+     *   <li>If this field's value == null because of unsafe publication, we know that it isn't the
+     *       object associated with our thread, because if it was the publication wouldn't have been
+     *       unsafe and we'd have seen our thread as the value. This state is also why a new
+     *       ThreadConfinedTaskQueue object must be created for each inline execution, because
+     *       observing a null thread does not mean the object is safe to reuse.
+     *   <li>If this field's value is some other thread object, we know that it's not our thread.
+     *   <li>If this field's value == null because it originally belonged to another thread and that
+     *       thread cleared it, we still know that it's not associated with our thread
+     *   <li>If this field's value == null because it was associated with our thread and was
+     *       cleared, we know that we're not executing inline any more
+     * </ul>
+     *
+     * 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;
+    /** Only used by the thread associated with this object */
+    Runnable nextTask;
+    /** Only used by the thread associated with this object */
+    Executor nextExecutor;
+  }
 
   /**
    * Enqueues a task to run when the previous task (if any) completes.
@@ -67,6 +138,7 @@
    */
   public <T> ListenableFuture<T> submit(final Callable<T> callable, Executor executor) {
     checkNotNull(callable);
+    checkNotNull(executor);
     return submitAsync(
         new AsyncCallable<T>() {
           @Override
@@ -92,12 +164,13 @@
   public <T> ListenableFuture<T> submitAsync(
       final AsyncCallable<T> callable, final Executor executor) {
     checkNotNull(callable);
-    final AtomicReference<RunningState> runningState = new AtomicReference<>(NOT_RUN);
+    checkNotNull(executor);
+    final TaskNonReentrantExecutor taskExecutor = new TaskNonReentrantExecutor(executor, this);
     final AsyncCallable<T> task =
         new AsyncCallable<T>() {
           @Override
           public ListenableFuture<T> call() throws Exception {
-            if (!runningState.compareAndSet(NOT_RUN, STARTED)) {
+            if (!taskExecutor.trySetStarted()) {
               return immediateCancelledFuture();
             }
             return callable.call();
@@ -119,20 +192,13 @@
      * have completed - namely after oldFuture is done, and taskFuture has either completed or been
      * cancelled before the callable started execution.
      */
-    final SettableFuture<Object> newFuture = SettableFuture.create();
+    final SettableFuture<Void> newFuture = SettableFuture.create();
 
-    final ListenableFuture<?> oldFuture = ref.getAndSet(newFuture);
+    final ListenableFuture<Void> oldFuture = ref.getAndSet(newFuture);
 
     // Invoke our task once the previous future completes.
-    final ListenableFuture<T> taskFuture =
-        Futures.submitAsync(
-            task,
-            new Executor() {
-              @Override
-              public void execute(Runnable runnable) {
-                oldFuture.addListener(runnable, executor);
-              }
-            });
+    final TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
+    oldFuture.addListener(taskFuture, taskExecutor);
 
     final ListenableFuture<T> outputFuture = Futures.nonCancellationPropagating(taskFuture);
 
@@ -144,15 +210,39 @@
         new Runnable() {
           @Override
           public void run() {
-            if (taskFuture.isDone()
-                // If this CAS succeeds, we know that the provided callable will never be invoked,
-                // so when oldFuture completes it is safe to allow the next submitted task to
-                // proceed.
-                || (outputFuture.isCancelled() && runningState.compareAndSet(NOT_RUN, CANCELLED))) {
+            if (taskFuture.isDone()) {
               // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of
               // a future that eventually came from immediateFuture(null), this doesn't leak
               // throwables or completion values.
               newFuture.setFuture(oldFuture);
+            } else if (outputFuture.isCancelled() && taskExecutor.trySetCancelled()) {
+              // If this CAS succeeds, we know that the provided callable will never be invoked,
+              // so when oldFuture completes it is safe to allow the next submitted task to
+              // proceed. Doing this immediately here lets the next task run without waiting for
+              // the cancelled task's executor to run the noop AsyncCallable.
+              //
+              // ---
+              //
+              // If the CAS fails, the provided callable already started running (or it is about
+              // to). Our contract promises:
+              //
+              // 1. not to execute a new callable until the old one has returned
+              //
+              // If we were to cancel taskFuture, that would let the next task start while the old
+              // one is still running.
+              //
+              // Now, maybe we could tweak our implementation to not start the next task until the
+              // callable actually completes. (We could detect completion in our wrapper
+              // `AsyncCallable task`.) However, our contract also promises:
+              //
+              // 2. not to cancel any Future the user returned from an AsyncCallable
+              //
+              // We promise this because, once we cancel that Future, we would no longer be able to
+              // tell when any underlying work it is doing is done. Thus, we might start a new task
+              // while that underlying work is still running.
+              //
+              // So that is why we cancel only in the case of CAS success.
+              taskFuture.cancel(false);
             }
           }
         };
@@ -164,4 +254,163 @@
 
     return outputFuture;
   }
+
+  enum RunningState {
+    NOT_RUN,
+    CANCELLED,
+    STARTED,
+  }
+
+  /**
+   * This class helps avoid a StackOverflowError when large numbers of tasks are submitted with
+   * {@link MoreExecutors#directExecutor}. Normally, when the first future completes, all the other
+   * tasks would be called recursively. Here, we detect that the delegate executor is executing
+   * inline, and maintain a queue to dispatch tasks iteratively. There is one instance of this class
+   * per call to submit() or submitAsync(), and each instance supports only one call to execute().
+   *
+   * <p>This class would certainly be simpler and easier to reason about if it were built with
+   * ThreadLocal; however, ThreadLocal is not well optimized for the case where the ThreadLocal is
+   * non-static, and is initialized/removed frequently - this causes churn in the Thread specific
+   * hashmaps. Using a static ThreadLocal to avoid that overhead would mean that different
+   * ExecutionSequencer objects interfere with each other, which would be undesirable, in addition
+   * to increasing the memory footprint of every thread that interacted with it. In order to release
+   * entries in thread-specific maps when the ThreadLocal object itself is no longer referenced,
+   * ThreadLocal is usually implemented with a WeakReference, which can have negative performance
+   * 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 {
+
+    /**
+     * Used to update and read the latestTaskQueue field. Set to null once the runnable has been run
+     * or queued.
+     */
+    ExecutionSequencer sequencer;
+
+    /**
+     * Executor the task was set to run on. Set to null when the task has been queued, run, or
+     * cancelled.
+     */
+    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;
+
+    /** Thread that called execute(). Set in execute, cleared when delegate.execute() returns. */
+    Thread submitting;
+
+    private TaskNonReentrantExecutor(Executor delegate, ExecutionSequencer sequencer) {
+      super(NOT_RUN);
+      this.delegate = delegate;
+      this.sequencer = sequencer;
+    }
+
+    @Override
+    public void execute(Runnable task) {
+      // If this operation was successfully cancelled already, calling the runnable will be a noop.
+      // This also avoids a race where if outputFuture is cancelled, it will call taskFuture.cancel,
+      // which will call newFuture.setFuture(oldFuture), to allow the next task in the queue to run
+      // without waiting for the user's executor to run our submitted Runnable. However, this can
+      // interact poorly with the reentrancy-avoiding behavior of this executor - when the operation
+      // before the cancelled future completes, it will synchronously complete both the newFuture
+      // from the cancelled operation and its own. This can cause one runnable to queue two tasks,
+      // breaking the invariant this method relies on to iteratively run the next task after the
+      // previous one completes.
+      if (get() == RunningState.CANCELLED) {
+        delegate = null;
+        sequencer = null;
+        return;
+      }
+      submitting = Thread.currentThread();
+      try {
+        ThreadConfinedTaskQueue submittingTaskQueue = 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
+          // can't know without submitting something to the executor) so queue to run iteratively.
+          // Task must be null, since each execution on this executor can only produce one more
+          // execution.
+          checkState(submittingTaskQueue.nextTask == null);
+          submittingTaskQueue.nextTask = task;
+          submittingTaskQueue.nextExecutor = delegate;
+          delegate = null;
+        } else {
+          Executor localDelegate = delegate;
+          delegate = null;
+          this.task = task;
+          localDelegate.execute(this);
+        }
+      } finally {
+        // Important to null this out here - if we did *not* execute inline, we might still
+        // run() on the same thread that called execute() - such as in a thread pool, and think
+        // that it was happening inline. As a side benefit, avoids holding on to the Thread object
+        // longer than necessary.
+        submitting = null;
+      }
+    }
+
+    @SuppressWarnings("ShortCircuitBoolean")
+    @Override
+    public void run() {
+      Thread currentThread = Thread.currentThread();
+      if (currentThread != submitting) {
+        Runnable localTask = task;
+        task = null;
+        localTask.run();
+        return;
+      }
+      // Executor called reentrantly! Make sure that further calls don't overflow stack. Further
+      // reentrant calls will see that their current thread is the same as the one set in
+      // latestTaskQueue, and queue rather than calling execute() directly.
+      ThreadConfinedTaskQueue executingTaskQueue = new ThreadConfinedTaskQueue();
+      executingTaskQueue.thread = currentThread;
+      // 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
+      // one execute() call to another instance from the same ExecutionSequencer, we know by
+      // induction that the task that launched this one must not have added any other runnables to
+      // that thread's queue, and thus we cannot be replacing a TaskAndThread object that would
+      // 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;
+      sequencer = null;
+      try {
+        Runnable localTask = task;
+        task = null;
+        localTask.run();
+        // Now check if our task attempted to reentrantly execute the next task.
+        Runnable queuedTask;
+        Executor queuedExecutor;
+        // Intentionally using non-short-circuit operator
+        while ((queuedTask = executingTaskQueue.nextTask) != null
+            & (queuedExecutor = executingTaskQueue.nextExecutor) != null) {
+          executingTaskQueue.nextTask = null;
+          executingTaskQueue.nextExecutor = null;
+          queuedExecutor.execute(queuedTask);
+        }
+      } finally {
+        // Null out the thread field, so that we don't leak a reference to Thread, and so that
+        // future `thread == currentThread()` calls from this thread don't incorrectly queue instead
+        // of executing. Don't null out the latestTaskQueue field, because the work done here
+        // may have scheduled more operations on another thread, and if those operations then
+        // trigger reentrant calls that thread will have updated the latestTaskQueue field, and
+        // we'd be interfering with their operation.
+        executingTaskQueue.thread = null;
+      }
+    }
+
+    private boolean trySetStarted() {
+      return compareAndSet(NOT_RUN, STARTED);
+    }
+
+    private boolean trySetCancelled() {
+      return compareAndSet(NOT_RUN, CANCELLED);
+    }
+  }
 }
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 c7d7955..070cb15 100644
--- a/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
@@ -14,11 +14,14 @@
 
 package com.google.common.util.concurrent;
 
+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.Function;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
@@ -45,7 +48,7 @@
  * debugging, and cancellation. Examples of frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <h4>{@link java.util.concurrent.CompletableFuture} / {@link java.util.concurrent.CompletionStage}
@@ -67,6 +70,7 @@
  * @since 23.0
  */
 @Beta
+@DoNotMock("Use FluentFuture.from(Futures.immediate*Future) or SettableFuture")
 @GwtCompatible(emulated = true)
 public abstract class FluentFuture<V> extends GwtFluentFutureCatchingSpecialization<V> {
 
@@ -127,6 +131,17 @@
   }
 
   /**
+   * Simply returns its argument.
+   *
+   * @deprecated no need to use this
+   * @since 28.0
+   */
+  @Deprecated
+  public static <V> FluentFuture<V> from(FluentFuture<V> future) {
+    return checkNotNull(future);
+  }
+
+  /**
    * Returns a {@code Future} whose result is taken from this {@code Future} or, if this {@code
    * Future} fails with the given {@code exceptionType}, from the result provided by the {@code
    * fallback}. {@link Function#apply} is not invoked until the primary input has failed, so if the
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingCheckedFuture.java b/android/guava/src/com/google/common/util/concurrent/ForwardingCheckedFuture.java
deleted file mode 100644
index 75d9ce8..0000000
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingCheckedFuture.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2011 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.Beta;
-import com.google.common.annotations.GwtIncompatible;
-import com.google.common.base.Preconditions;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A future which forwards all its method calls to another future. Subclasses should override one or
- * more methods to modify the behavior of the backing future as desired per the <a href=
- * "http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
- *
- * <p>Most subclasses can simply extend {@link SimpleForwardingCheckedFuture}.
- *
- * @param <V> The result type returned by this Future's {@code get} method
- * @param <X> The type of the Exception thrown by the Future's {@code checkedGet} method
- * @author Anthony Zana
- * @since 9.0
- * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
- *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
- *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
- *     Additionally, it has a surprising policy about which exceptions to map and which to leave
- *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
- *     use, possibly specializing them to the particular exception type they use. We recommend that
- *     most people use {@code ListenableFuture} and perform any exception wrapping themselves. This
- *     class is scheduled for removal from Guava in January 2019.
- */
-// TODO(b/72241575): Remove by 2019-01
-@Beta
-@Deprecated
-@GwtIncompatible
-public abstract class ForwardingCheckedFuture<V, X extends Exception>
-    extends ForwardingListenableFuture<V> implements CheckedFuture<V, X> {
-
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet() throws X {
-    return delegate().checkedGet();
-  }
-
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet(long timeout, TimeUnit unit) throws TimeoutException, X {
-    return delegate().checkedGet(timeout, unit);
-  }
-
-  @Override
-  protected abstract CheckedFuture<V, X> delegate();
-
-  // TODO(cpovirk): Use Standard Javadoc form for SimpleForwarding*
-  /**
-   * A simplified version of {@link ForwardingCheckedFuture} where subclasses can pass in an already
-   * constructed {@link CheckedFuture} as the delegate.
-   *
-   * @since 9.0
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This class is scheduled for removal from Guava in October 2018.
-   */
-  @Beta
-  @Deprecated
-  public abstract static class SimpleForwardingCheckedFuture<V, X extends Exception>
-      extends ForwardingCheckedFuture<V, X> {
-    private final CheckedFuture<V, X> delegate;
-
-    protected SimpleForwardingCheckedFuture(CheckedFuture<V, X> delegate) {
-      this.delegate = Preconditions.checkNotNull(delegate);
-    }
-
-    @Override
-    protected final CheckedFuture<V, X> delegate() {
-      return delegate;
-    }
-  }
-}
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 fce638f..984fd68 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
@@ -70,4 +70,9 @@
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate.get(timeout, unit);
   }
+
+  @Override
+  public String toString() {
+    return delegate.toString();
+  }
 }
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 f050098..d2ed5d9 100644
--- a/android/guava/src/com/google/common/util/concurrent/Futures.java
+++ b/android/guava/src/com/google/common/util/concurrent/Futures.java
@@ -28,10 +28,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.CollectionFuture.ListFuture;
 import com.google.common.util.concurrent.ImmediateFuture.ImmediateCancelledFuture;
-import com.google.common.util.concurrent.ImmediateFuture.ImmediateFailedCheckedFuture;
 import com.google.common.util.concurrent.ImmediateFuture.ImmediateFailedFuture;
-import com.google.common.util.concurrent.ImmediateFuture.ImmediateSuccessfulCheckedFuture;
-import com.google.common.util.concurrent.ImmediateFuture.ImmediateSuccessfulFuture;
+import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
+import com.google.common.util.concurrent.internal.InternalFutures;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Collection;
 import java.util.List;
@@ -40,6 +39,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -60,7 +60,7 @@
  * monitoring, debugging, and cancellation. Examples of frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <p>If you do chain your operations manually, you may want to use {@link FluentFuture}.
@@ -121,77 +121,29 @@
   private Futures() {}
 
   /**
-   * Creates a {@link CheckedFuture} out of a normal {@link ListenableFuture} and a {@link Function}
-   * that maps from {@link Exception} instances into the appropriate checked type.
-   *
-   * <p><b>Warning:</b> We recommend against using {@code CheckedFuture} in new projects. {@code
-   * CheckedFuture} is difficult to build libraries atop. {@code CheckedFuture} ports of methods
-   * like {@link Futures#transformAsync} have historically had bugs, and some of these bugs are
-   * necessary, unavoidable consequences of the {@code CheckedFuture} API. Additionally, {@code
-   * CheckedFuture} encourages users to take exceptions from one thread and rethrow them in another,
-   * producing confusing stack traces.
-   *
-   * <p>The given mapping function will be applied to an {@link InterruptedException}, a {@link
-   * CancellationException}, or an {@link ExecutionException}. See {@link Future#get()} for details
-   * on the exceptions thrown.
-   *
-   * @since 9.0 (source-compatible since 1.0)
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This method is scheduled for removal from Guava in January 2019.
-   */
-  // TODO(b/72241575): Remove by 2019-01
-  @Beta
-  @Deprecated
-  @GwtIncompatible // TODO
-  public static <V, X extends Exception> CheckedFuture<V, X> makeChecked(
-      ListenableFuture<V> future, Function<? super Exception, X> mapper) {
-    return new MappingCheckedFuture<>(checkNotNull(future), mapper);
-  }
-
-  /**
    * Creates a {@code ListenableFuture} which has its value set immediately upon construction. The
    * 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) {
     if (value == null) {
-      // This cast is safe because null is assignable to V for all V (i.e. it is covariant)
-      @SuppressWarnings({"unchecked", "rawtypes"})
-      ListenableFuture<V> typedNull = (ListenableFuture) ImmediateSuccessfulFuture.NULL;
+      // This cast is safe because null is assignable to V for all V (i.e. it is bivariant)
+      @SuppressWarnings("unchecked")
+      ListenableFuture<V> typedNull = (ListenableFuture<V>) ImmediateFuture.NULL;
       return typedNull;
     }
-    return new ImmediateSuccessfulFuture<V>(value);
+    return new ImmediateFuture<>(value);
   }
 
   /**
-   * Returns a {@code CheckedFuture} which has its value set immediately upon construction.
+   * Returns a successful {@code ListenableFuture<Void>}. This method is equivalent to {@code
+   * immediateFuture(null)} except that it is restricted to produce futures of type {@code Void}.
    *
-   * <p>The returned {@code Future} can't be cancelled, and its {@code isDone()} method always
-   * returns {@code true}. Calling {@code get()} or {@code checkedGet()} will immediately return the
-   * provided value.
-   *
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This method is scheduled for removal from Guava in January 2019.
+   * @since 29.0
    */
-  // TODO(b/72241893): Remove by 2019-01
-  @Beta
-  @Deprecated
-  @GwtIncompatible // TODO
-  public static <V, X extends Exception> CheckedFuture<V, X> immediateCheckedFuture(
-      @NullableDecl V value) {
-    return new ImmediateSuccessfulCheckedFuture<>(value);
+  @SuppressWarnings("unchecked")
+  public static ListenableFuture<Void> immediateVoidFuture() {
+    return (ListenableFuture<Void>) ImmediateFuture.NULL;
   }
 
   /**
@@ -217,30 +169,30 @@
   }
 
   /**
-   * Returns a {@code CheckedFuture} which has an exception set immediately upon construction.
+   * Executes {@code callable} on the specified {@code executor}, returning a {@code Future}.
    *
-   * <p>The returned {@code Future} can't be cancelled, and its {@code isDone()} method always
-   * returns {@code true}. Calling {@code get()} will immediately throw the provided {@code
-   * Exception} wrapped in an {@code ExecutionException}, and calling {@code checkedGet()} will
-   * throw the provided exception itself.
-   *
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This method is scheduled for removal from Guava in January 2019.
+   * @throws RejectedExecutionException if the task cannot be scheduled for execution
+   * @since 28.2
    */
-  // TODO(b/72241500): Remove by 2019-01
   @Beta
-  @Deprecated
-  @GwtIncompatible // TODO
-  public static <V, X extends Exception> CheckedFuture<V, X> immediateFailedCheckedFuture(
-      X exception) {
-    checkNotNull(exception);
-    return new ImmediateFailedCheckedFuture<>(exception);
+  public static <O> ListenableFuture<O> submit(Callable<O> callable, Executor executor) {
+    TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
+    executor.execute(task);
+    return task;
+  }
+
+  /**
+   * Executes {@code runnable} on the specified {@code executor}, returning a {@code Future} that
+   * will complete after execution.
+   *
+   * @throws RejectedExecutionException if the task cannot be scheduled for execution
+   * @since 28.2
+   */
+  @Beta
+  public static ListenableFuture<Void> submit(Runnable runnable, Executor executor) {
+    TrustedListenableFutureTask<Void> task = TrustedListenableFutureTask.create(runnable, null);
+    executor.execute(task);
+    return task;
   }
 
   /**
@@ -304,9 +256,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method.
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * @param input the primary input {@code Future}
    * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
@@ -371,11 +321,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method. (Specifically, {@code directExecutor} functions should avoid
-   * heavyweight operations inside {@code AsyncFunction.apply}. Any heavyweight operations should
-   * occur in other threads responsible for completing the returned {@code Future}.)
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * @param input the primary input {@code Future}
    * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
@@ -443,11 +389,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method. (Specifically, {@code directExecutor} functions should avoid
-   * heavyweight operations inside {@code AsyncFunction.apply}. Any heavyweight operations should
-   * occur in other threads responsible for completing the returned {@code Future}.)
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * <p>The returned {@code Future} attempts to keep its cancellation state in sync with that of the
    * input future and that of the future returned by the chain function. That is, if the returned
@@ -483,9 +425,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method.
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * <p>The returned {@code Future} attempts to keep its cancellation state in sync with that of the
    * input future. That is, if the returned {@code Future} is cancelled, it will attempt to cancel
@@ -578,6 +518,9 @@
    *
    * <p>The list of results is in the same order as the input list.
    *
+   * <p>This differs from {@link #successfulAsList(ListenableFuture[])} in that it will return a
+   * failed future if any of the items fails.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures, and if any of the
    * provided futures fails or is canceled, this one is, too.
    *
@@ -597,6 +540,9 @@
    *
    * <p>The list of results is in the same order as the input list.
    *
+   * <p>This differs from {@link #successfulAsList(Iterable)} in that it will return a failed future
+   * if any of the items fails.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures, and if any of the
    * provided futures fails or is canceled, this one is, too.
    *
@@ -614,6 +560,8 @@
    * Creates a {@link FutureCombiner} that processes the completed futures whether or not they're
    * successful.
    *
+   * <p>Any failures from the input futures will not be propagated to the returned future.
+   *
    * @since 20.0
    */
   @Beta
@@ -626,6 +574,8 @@
    * Creates a {@link FutureCombiner} that processes the completed futures whether or not they're
    * successful.
    *
+   * <p>Any failures from the input futures will not be propagated to the returned future.
+   *
    * @since 20.0
    */
   @Beta
@@ -818,6 +768,11 @@
    * {@code null} (which is indistinguishable from the future having a successful value of {@code
    * null}).
    *
+   * <p>The list of results is in the same order as the input list.
+   *
+   * <p>This differs from {@link #allAsList(ListenableFuture[])} in that it's tolerant of failed
+   * futures for any of the items, representing them as {@code null} in the result list.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures.
    *
    * @param futures futures to combine
@@ -838,6 +793,11 @@
    * {@code null} (which is indistinguishable from the future having a successful value of {@code
    * null}).
    *
+   * <p>The list of results is in the same order as the input list.
+   *
+   * <p>This differs from {@link #allAsList(Iterable)} in that it's tolerant of failed futures for
+   * any of the items, representing them as {@code null} in the result list.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures.
    *
    * @param futures futures to combine
@@ -1014,6 +974,11 @@
    * callbacks, but any callback added through this method is guaranteed to be called once the
    * computation is complete.
    *
+   * <p>Exceptions thrown by a {@code callback} will be propagated up to the executor. Any exception
+   * thrown during {@code Executor.execute} (e.g., a {@code RejectedExecutionException} or an
+   * exception thrown by {@linkplain MoreExecutors#directExecutor direct execution}) will be caught
+   * and logged.
+   *
    * <p>Example:
    *
    * <pre>{@code
@@ -1031,9 +996,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * callbacks passed to this method.
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * <p>For a more general interface to attach a completion listener to a {@code Future}, see {@link
    * ListenableFuture#addListener addListener}.
@@ -1063,6 +1026,14 @@
 
     @Override
     public void run() {
+      if (future instanceof InternalFutureFailureAccess) {
+        Throwable failure =
+            InternalFutures.tryInternalFastPathGetFailure((InternalFutureFailureAccess) future);
+        if (failure != null) {
+          callback.onFailure(failure);
+          return;
+        }
+      }
       final V value;
       try {
         value = getDone(future);
@@ -1289,25 +1260,4 @@
    * If you think you would use this method, let us know. You might also also look into the
    * Fork-Join framework: http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
    */
-
-  /**
-   * A checked future that uses a function to map from exceptions to the appropriate checked type.
-   */
-  @GwtIncompatible // TODO
-  private static class MappingCheckedFuture<V, X extends Exception>
-      extends AbstractCheckedFuture<V, X> {
-
-    final Function<? super Exception, X> mapper;
-
-    MappingCheckedFuture(ListenableFuture<V> delegate, Function<? super Exception, X> mapper) {
-      super(delegate);
-
-      this.mapper = checkNotNull(mapper);
-    }
-
-    @Override
-    protected X mapException(Exception e) {
-      return mapper.apply(e);
-    }
-  }
 }
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 bdf1743..a5e9d32 100644
--- a/android/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
+++ b/android/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
@@ -36,7 +36,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
-import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
 
 /** Static methods used to implement {@link Futures#getChecked(Future, Class)}. */
 @GwtIncompatible
diff --git a/android/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java b/android/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
new file mode 100644
index 0000000..b557ac6
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
@@ -0,0 +1,17 @@
+/*
+ * 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 71f5fa8..89b168b 100644
--- a/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.annotations.GwtIncompatible;
 import com.google.common.util.concurrent.AbstractFuture.TrustedFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -26,11 +25,20 @@
 import java.util.logging.Logger;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
-/** Implementations of {@code Futures.immediate*}. */
-@GwtCompatible(emulated = true)
-abstract class ImmediateFuture<V> implements ListenableFuture<V> {
+/** Implementation of {@link Futures#immediateFuture}. */
+@GwtCompatible
+// 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);
+
   private static final Logger log = Logger.getLogger(ImmediateFuture.class.getName());
 
+  @NullableDecl private final V value;
+
+  ImmediateFuture(@NullableDecl V value) {
+    this.value = value;
+  }
+
   @Override
   public void addListener(Runnable listener, Executor executor) {
     checkNotNull(listener, "Runnable was null.");
@@ -52,8 +60,11 @@
     return false;
   }
 
+  // TODO(lukes): Consider throwing InterruptedException when appropriate.
   @Override
-  public abstract V get() throws ExecutionException;
+  public V get() {
+    return value;
+  }
 
   @Override
   public V get(long timeout, TimeUnit unit) throws ExecutionException {
@@ -71,57 +82,10 @@
     return true;
   }
 
-  static class ImmediateSuccessfulFuture<V> extends ImmediateFuture<V> {
-    static final ImmediateSuccessfulFuture<Object> NULL = new ImmediateSuccessfulFuture<>(null);
-    @NullableDecl private final V value;
-
-    ImmediateSuccessfulFuture(@NullableDecl V value) {
-      this.value = value;
-    }
-
-    // TODO(lukes): Consider throwing InterruptedException when appropriate.
-    @Override
-    public V get() {
-      return value;
-    }
-
-    @Override
-    public String toString() {
-      // Behaviour analogous to AbstractFuture#toString().
-      return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
-    }
-  }
-
-  @GwtIncompatible // TODO
-  static class ImmediateSuccessfulCheckedFuture<V, X extends Exception> extends ImmediateFuture<V>
-      implements CheckedFuture<V, X> {
-    @NullableDecl private final V value;
-
-    ImmediateSuccessfulCheckedFuture(@NullableDecl V value) {
-      this.value = value;
-    }
-
-    @Override
-    public V get() {
-      return value;
-    }
-
-    @Override
-    public V checkedGet() {
-      return value;
-    }
-
-    @Override
-    public V checkedGet(long timeout, TimeUnit unit) {
-      checkNotNull(unit);
-      return value;
-    }
-
-    @Override
-    public String toString() {
-      // Behaviour analogous to AbstractFuture#toString().
-      return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
-    }
+  @Override
+  public String toString() {
+    // Behaviour analogous to AbstractFuture#toString().
+    return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
   }
 
   static final class ImmediateFailedFuture<V> extends TrustedFuture<V> {
@@ -135,36 +99,4 @@
       cancel(false);
     }
   }
-
-  @GwtIncompatible // TODO
-  static class ImmediateFailedCheckedFuture<V, X extends Exception> extends ImmediateFuture<V>
-      implements CheckedFuture<V, X> {
-    private final X thrown;
-
-    ImmediateFailedCheckedFuture(X thrown) {
-      this.thrown = thrown;
-    }
-
-    @Override
-    public V get() throws ExecutionException {
-      throw new ExecutionException(thrown);
-    }
-
-    @Override
-    public V checkedGet() throws X {
-      throw thrown;
-    }
-
-    @Override
-    public V checkedGet(long timeout, TimeUnit unit) throws X {
-      checkNotNull(unit);
-      throw thrown;
-    }
-
-    @Override
-    public String toString() {
-      // Behaviour analogous to AbstractFuture#toString().
-      return super.toString() + "[status=FAILURE, cause=[" + thrown + "]]";
-    }
-  }
 }
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 862ff2a..98e31ed 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -14,6 +14,7 @@
 
 package com.google.common.util.concurrent;
 
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
@@ -40,7 +41,7 @@
  * frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <p>The main purpose of {@link #addListener addListener} is to support this chaining. You will
@@ -98,6 +99,7 @@
  * @author Nishant Thakkar
  * @since 1.0
  */
+@DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
 public interface ListenableFuture<V> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
@@ -112,20 +114,10 @@
    * thrown by {@linkplain MoreExecutors#directExecutor direct execution}) will be caught and
    * logged.
    *
-   * <p>Note: For fast, lightweight listeners that would be safe to execute in any thread, consider
-   * {@link MoreExecutors#directExecutor}. Otherwise, avoid it. Heavyweight {@code directExecutor}
-   * listeners can cause problems, and these problems can be difficult to reproduce because they
-   * depend on timing. For example:
-   *
-   * <ul>
-   *   <li>The listener may be executed by the caller of {@code addListener}. That caller may be a
-   *       UI thread or other latency-sensitive thread. This can harm UI responsiveness.
-   *   <li>The listener may be executed by the thread that completes this {@code Future}. That
-   *       thread may be an internal system thread such as an RPC network thread. Blocking that
-   *       thread may stall progress of the whole system. It may even cause a deadlock.
-   *   <li>The listener may delay other listeners, even listeners that are not themselves {@code
-   *       directExecutor} listeners.
-   * </ul>
+   * <p>Note: If your listener is lightweight -- and will not cause stack overflow by completing
+   * more futures or adding more {@code directExecutor()} listeners inline -- consider {@link
+   * MoreExecutors#directExecutor}. Otherwise, avoid it: See the warnings on the docs for {@code
+   * directExecutor}.
    *
    * <p>This is the most general listener interface. For common operations performed using
    * listeners, see {@link Futures}. For a simplified but general listener interface, see {@link
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 db516c3..9f6f7e3 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
@@ -14,10 +14,17 @@
 
 package com.google.common.util.concurrent;
 
+import static java.lang.Math.min;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
@@ -80,6 +87,20 @@
     executionList.add(listener, exec);
   }
 
+  @CanIgnoreReturnValue
+  @Override
+  public V get(long timeout, TimeUnit unit)
+      throws TimeoutException, InterruptedException, ExecutionException {
+
+    long timeoutNanos = unit.toNanos(timeout);
+    if (timeoutNanos <= OverflowAvoidingLockSupport.MAX_NANOSECONDS_THRESHOLD) {
+      return super.get(timeout, unit);
+    }
+    // Waiting 68 years should be enough for any program.
+    return super.get(
+        min(timeoutNanos, OverflowAvoidingLockSupport.MAX_NANOSECONDS_THRESHOLD), NANOSECONDS);
+  }
+
   /** Internal implementation detail used to invoke the listeners. */
   @Override
   protected void done() {
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 e684d71..469eb67 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -31,6 +32,9 @@
  * @author Chris Povirk
  * @since 10.0
  */
+@DoNotMock(
+    "Use TestingExecutors.sameThreadScheduledExecutor, or wrap a real Executor from "
+        + "java.util.concurrent.Executors with MoreExecutors.listeningDecorator")
 @GwtIncompatible
 public interface ListeningExecutorService extends ExecutorService {
   /**
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 20b2a88..27ee85d 100644
--- a/android/guava/src/com/google/common/util/concurrent/Monitor.java
+++ b/android/guava/src/com/google/common/util/concurrent/Monitor.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.primitives.Longs;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
 import com.google.j2objc.annotations.Weak;
 import java.util.concurrent.TimeUnit;
@@ -920,9 +921,7 @@
    */
   private static long toSafeNanos(long time, TimeUnit unit) {
     long timeoutNanos = unit.toNanos(time);
-    return (timeoutNanos <= 0L)
-        ? 0L
-        : (timeoutNanos > (Long.MAX_VALUE / 4) * 3) ? (Long.MAX_VALUE / 4) * 3 : timeoutNanos;
+    return Longs.constrainToRange(timeoutNanos, 0L, (Long.MAX_VALUE / 4) * 3);
   }
 
   /**
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 86ea0ee..584e27a 100644
--- a/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
+++ b/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
@@ -47,13 +47,12 @@
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 /**
  * Factory and utility methods for {@link java.util.concurrent.Executor}, {@link ExecutorService},
- * and {@link ThreadFactory}.
+ * and {@link java.util.concurrent.ThreadFactory}.
  *
  * @author Eric Fellheimer
  * @author Kyle Littlefield
@@ -340,10 +339,11 @@
 
   /**
    * Creates an executor service that runs each task in the thread that invokes {@code
-   * execute/submit}, as in {@link CallerRunsPolicy} This applies both to individually submitted
-   * tasks and to collections of tasks submitted via {@code invokeAll} or {@code invokeAny}. In the
-   * latter case, tasks will run serially on the calling thread. Tasks are run to completion before
-   * a {@code Future} is returned to the caller (unless the executor has been shutdown).
+   * execute/submit}, as in {@code ThreadPoolExecutor.CallerRunsPolicy}. This applies both to
+   * individually submitted tasks and to collections of tasks submitted via {@code invokeAll} or
+   * {@code invokeAny}. In the latter case, tasks will run serially on the calling thread. Tasks are
+   * run to completion before a {@code Future} is returned to the caller (unless the executor has
+   * been shutdown).
    *
    * <p>Although all tasks are immediately executed in the thread that submitted the task, this
    * {@code ExecutorService} imposes a small locking overhead on each task submission in order to
@@ -370,7 +370,33 @@
 
   /**
    * Returns an {@link Executor} that runs each task in the thread that invokes {@link
-   * Executor#execute execute}, as in {@link CallerRunsPolicy}.
+   * Executor#execute execute}, as in {@code ThreadPoolExecutor.CallerRunsPolicy}.
+   *
+   * <p>This executor is appropriate for tasks that are lightweight and not deeply chained.
+   * Inappropriate {@code directExecutor} usage can cause problems, and these problems can be
+   * difficult to reproduce because they depend on timing. For example:
+   *
+   * <ul>
+   *   <li>A call like {@code future.transform(function, directExecutor())} may execute the function
+   *       immediately in the thread that is calling {@code transform}. (This specific case happens
+   *       if the future is already completed.) If {@code transform} call was made from a UI thread
+   *       or other latency-sensitive thread, a heavyweight function can harm responsiveness.
+   *   <li>If the task will be executed later, consider which thread will trigger the execution --
+   *       since that thread will execute the task inline. If the thread is a shared system thread
+   *       like an RPC network thread, a heavyweight task can stall progress of the whole system or
+   *       even deadlock it.
+   *   <li>If many tasks will be triggered by the same event, one heavyweight task may delay other
+   *       tasks -- even tasks that are not themselves {@code directExecutor} tasks.
+   *   <li>If many such tasks are chained together (such as with {@code
+   *       future.transform(...).transform(...).transform(...)....}), they may overflow the stack.
+   *       (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.)
+   * </ul>
+   *
+   * Additionally, beware of executing tasks with {@code directExecutor} while holding a lock. Since
+   * the task you submit to the executor (or any other arbitrary work the executor does) may do slow
+   * work or acquire other locks, you risk deadlocks.
    *
    * <p>This instance is equivalent to:
    *
@@ -739,15 +765,17 @@
   /**
    * Returns a default thread factory used to create new threads.
    *
-   * <p>On AppEngine, returns {@code ThreadManager.currentRequestThreadFactory()}. Otherwise,
-   * returns {@link Executors#defaultThreadFactory()}.
+   * <p>When running on AppEngine with access to <a
+   * href="https://cloud.google.com/appengine/docs/standard/java/javadoc/">AppEngine legacy
+   * APIs</a>, this method returns {@code ThreadManager.currentRequestThreadFactory()}. Otherwise,
+   * it returns {@link Executors#defaultThreadFactory()}.
    *
    * @since 14.0
    */
   @Beta
   @GwtIncompatible // concurrency
   public static ThreadFactory platformThreadFactory() {
-    if (!isAppEngine()) {
+    if (!isAppEngineWithApiClasses()) {
       return Executors.defaultThreadFactory();
     }
     try {
@@ -755,7 +783,16 @@
           Class.forName("com.google.appengine.api.ThreadManager")
               .getMethod("currentRequestThreadFactory")
               .invoke(null);
-    } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException e) {
+      /*
+       * Do not merge the 3 catch blocks below. javac would infer a type of
+       * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of Android
+       * don't *seem* to mind, but there might be edge cases of which we're unaware.)
+       */
+    } catch (IllegalAccessException e) {
+      throw new RuntimeException("Couldn't invoke ThreadManager.currentRequestThreadFactory", e);
+    } catch (ClassNotFoundException e) {
+      throw new RuntimeException("Couldn't invoke ThreadManager.currentRequestThreadFactory", e);
+    } catch (NoSuchMethodException e) {
       throw new RuntimeException("Couldn't invoke ThreadManager.currentRequestThreadFactory", e);
     } catch (InvocationTargetException e) {
       throw Throwables.propagate(e.getCause());
@@ -763,11 +800,16 @@
   }
 
   @GwtIncompatible // TODO
-  private static boolean isAppEngine() {
+  private static boolean isAppEngineWithApiClasses() {
     if (System.getProperty("com.google.appengine.runtime.environment") == null) {
       return false;
     }
     try {
+      Class.forName("com.google.appengine.api.utils.SystemProperty");
+    } catch (ClassNotFoundException e) {
+      return false;
+    }
+    try {
       // If the current environment is null, we're not inside AppEngine.
       return Class.forName("com.google.apphosting.api.ApiProxy")
               .getMethod("getCurrentEnvironment")
@@ -824,10 +866,6 @@
   static Executor renamingDecorator(final Executor executor, final Supplier<String> nameSupplier) {
     checkNotNull(executor);
     checkNotNull(nameSupplier);
-    if (isAppEngine()) {
-      // AppEngine doesn't support thread renaming, so don't even try
-      return executor;
-    }
     return new Executor() {
       @Override
       public void execute(Runnable command) {
@@ -853,10 +891,6 @@
       final ExecutorService service, final Supplier<String> nameSupplier) {
     checkNotNull(service);
     checkNotNull(nameSupplier);
-    if (isAppEngine()) {
-      // AppEngine doesn't support thread renaming, so don't even try.
-      return service;
-    }
     return new WrappingExecutorService(service) {
       @Override
       protected <T> Callable<T> wrapTask(Callable<T> callable) {
@@ -887,10 +921,6 @@
       final ScheduledExecutorService service, final Supplier<String> nameSupplier) {
     checkNotNull(service);
     checkNotNull(nameSupplier);
-    if (isAppEngine()) {
-      // AppEngine doesn't support thread renaming, so don't even try.
-      return service;
-    }
     return new WrappingScheduledExecutorService(service) {
       @Override
       protected <T> Callable<T> wrapTask(Callable<T> callable) {
@@ -969,26 +999,12 @@
       return delegate;
     }
     return new Executor() {
-      boolean thrownFromDelegate = true;
-
       @Override
-      public void execute(final Runnable command) {
+      public void execute(Runnable command) {
         try {
-          delegate.execute(
-              new Runnable() {
-                @Override
-                public void run() {
-                  thrownFromDelegate = false;
-                  command.run();
-                }
-              });
+          delegate.execute(command);
         } catch (RejectedExecutionException e) {
-          if (thrownFromDelegate) {
-            // wrap exception?
-            future.setException(e);
-          }
-          // otherwise it must have been thrown from a transitive call and the delegate runnable
-          // should have handled it.
+          future.setException(e);
         }
       }
     };
diff --git a/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java b/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
new file mode 100644
index 0000000..ae871e0
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
@@ -0,0 +1,37 @@
+/*
+ * 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.util.concurrent;
+
+import static java.lang.Math.min;
+
+import java.util.concurrent.locks.LockSupport;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+
+/**
+ * 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.
+ */
+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) {
+    // 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/RateLimiter.java b/android/guava/src/com/google/common/util/concurrent/RateLimiter.java
index c72a1ef..99824ee 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.MonotonicNonNullDecl;
+import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A rate limiter. Conceptually, a rate limiter distributes permits at a configurable rate. Each
@@ -92,7 +92,6 @@
 // would mean a maximum rate of "1MB/s", which might be small in some cases.
 @Beta
 @GwtIncompatible
-@SuppressWarnings("GoodTime") // lots of violations - also how should we model a rate?
 public abstract class RateLimiter {
   /**
    * Creates a {@code RateLimiter} with the specified stable throughput, given as "permits per
@@ -159,6 +158,7 @@
    * @throws IllegalArgumentException if {@code permitsPerSecond} is negative or zero or {@code
    *     warmupPeriod} is negative
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public static RateLimiter create(double permitsPerSecond, long warmupPeriod, TimeUnit unit) {
     checkArgument(warmupPeriod >= 0, "warmupPeriod must not be negative: %s", warmupPeriod);
     return create(
@@ -184,7 +184,7 @@
   private final SleepingStopwatch stopwatch;
 
   // Can't be initialized in the constructor because mocks don't call the constructor.
-  @MonotonicNonNullDecl private volatile Object mutexDoNotUseDirectly;
+  @NullableDecl private volatile Object mutexDoNotUseDirectly;
 
   private Object mutex() {
     Object mutex = mutexDoNotUseDirectly;
@@ -300,6 +300,7 @@
    * @return {@code true} if the permit was acquired, {@code false} otherwise
    * @throws IllegalArgumentException if the requested number of permits is negative or zero
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean tryAcquire(long timeout, TimeUnit unit) {
     return tryAcquire(1, timeout, unit);
   }
@@ -342,6 +343,7 @@
    * @return {@code true} if the permits were acquired, {@code false} otherwise
    * @throws IllegalArgumentException if the requested number of permits is negative or zero
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean tryAcquire(int permits, long timeout, TimeUnit unit) {
     long timeoutMicros = max(unit.toMicros(timeout), 0);
     checkPermits(permits);
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 3493339..5604175 100644
--- a/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
+++ b/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
@@ -19,11 +19,12 @@
 import static com.google.common.util.concurrent.SequentialExecutor.WorkerRunningState.QUEUED;
 import static com.google.common.util.concurrent.SequentialExecutor.WorkerRunningState.QUEUING;
 import static com.google.common.util.concurrent.SequentialExecutor.WorkerRunningState.RUNNING;
+import static java.lang.System.identityHashCode;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
-import com.google.j2objc.annotations.WeakOuter;
+import com.google.j2objc.annotations.RetainedWith;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.concurrent.Executor;
@@ -79,7 +80,7 @@
   @GuardedBy("queue")
   private long workerRunCount = 0;
 
-  private final QueueWorker worker = new QueueWorker();
+  @RetainedWith private final QueueWorker worker = new QueueWorker();
 
   /** Use {@link MoreExecutors#newSequentialExecutor} */
   SequentialExecutor(Executor executor) {
@@ -119,6 +120,11 @@
             public void run() {
               task.run();
             }
+
+            @Override
+            public String toString() {
+              return task.toString();
+            }
           };
       queue.add(submittedTask);
       workerRunningState = QUEUING;
@@ -163,8 +169,9 @@
   }
 
   /** Worker that runs tasks from {@link #queue} until it is empty. */
-  @WeakOuter
   private final class QueueWorker implements Runnable {
+    Runnable task;
+
     @Override
     public void run() {
       try {
@@ -196,7 +203,6 @@
       boolean hasSetRunning = false;
       try {
         while (true) {
-          Runnable task;
           synchronized (queue) {
             // Choose whether this thread will run or not after acquiring the lock on the first
             // iteration
@@ -227,6 +233,8 @@
             task.run();
           } catch (RuntimeException e) {
             log.log(Level.SEVERE, "Exception while executing runnable " + task, e);
+          } finally {
+            task = null;
           }
         }
       } finally {
@@ -238,5 +246,20 @@
         }
       }
     }
+
+    @SuppressWarnings("GuardedBy")
+    @Override
+    public String toString() {
+      Runnable currentlyRunning = task;
+      if (currentlyRunning != null) {
+        return "SequentialExecutorWorker{running=" + currentlyRunning + "}";
+      }
+      return "SequentialExecutorWorker{state=" + workerRunningState + "}";
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "SequentialExecutor@" + identityHashCode(this) + "{" + executor + "}";
   }
 }
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 40dbd56..2c6cdab 100644
--- a/android/guava/src/com/google/common/util/concurrent/Service.java
+++ b/android/guava/src/com/google/common/util/concurrent/Service.java
@@ -14,9 +14,9 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -51,7 +51,7 @@
  * @author Luke Sandberg
  * @since 9.0 (in 1.0 as {@code com.google.common.base.Service})
  */
-@Beta
+@DoNotMock("Create an AbstractIdleService")
 @GwtIncompatible
 public interface Service {
   /**
@@ -173,7 +173,6 @@
    *
    * @since 9.0 (in 1.0 as {@code com.google.common.base.Service.State})
    */
-  @Beta // should come out of Beta when Service does
   enum State {
     /** A service in this state is inactive. It does minimal work and consumes minimal resources. */
     NEW {
@@ -241,7 +240,6 @@
    * @author Luke Sandberg
    * @since 15.0 (present as an interface in 13.0)
    */
-  @Beta // should come out of Beta when Service does
   abstract class Listener {
     /**
      * Called when the service transitions from {@linkplain State#NEW NEW} to {@linkplain
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 ed819f4..e5c5e14 100644
--- a/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
+++ b/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
@@ -30,7 +30,6 @@
 import static com.google.common.util.concurrent.Service.State.TERMINATED;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Function;
 import com.google.common.base.MoreObjects;
@@ -39,7 +38,6 @@
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.google.common.collect.Lists;
@@ -119,9 +117,8 @@
  * @author Luke Sandberg
  * @since 14.0
  */
-@Beta
 @GwtIncompatible
-public final class ServiceManager {
+public final class ServiceManager implements ServiceManagerBridge {
   private static final Logger logger = Logger.getLogger(ServiceManager.class.getName());
   private static final ListenerCallQueue.Event<Listener> HEALTHY_EVENT =
       new ListenerCallQueue.Event<Listener>() {
@@ -157,7 +154,6 @@
    * @author Luke Sandberg
    * @since 15.0 (present as an interface in 14.0)
    */
-  @Beta // Should come out of Beta when ServiceManager does
   public abstract static class Listener {
     /**
      * Called when the service initially becomes healthy.
@@ -243,8 +239,9 @@
    * during {@code Executor.execute} (e.g., a {@code RejectedExecutionException}) will be caught and
    * logged.
    *
-   * <p>For fast, lightweight listeners that would be safe to execute in any thread, consider
-   * calling {@link #addListener(Listener)}.
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
+   * documentation.
    *
    * @param listener the listener to run when the manager changes state
    * @param executor the executor in which the listeners callback methods will be run.
@@ -254,26 +251,6 @@
   }
 
   /**
-   * Registers a {@link Listener} to be run when this {@link ServiceManager} changes state. The
-   * listener will not have previous state changes replayed, so it is suggested that listeners are
-   * added before any of the managed services are {@linkplain Service#startAsync started}.
-   *
-   * <p>{@code addListener} guarantees execution ordering across calls to a given listener but not
-   * across calls to multiple listeners. Specifically, a given listener will have its callbacks
-   * invoked in the same order as the underlying service enters those states. Additionally, at most
-   * one of the listener's callbacks will execute at once. However, multiple listeners' callbacks
-   * may execute concurrently, and listeners may execute in an order different from the one in which
-   * they were registered.
-   *
-   * <p>RuntimeExceptions thrown by a listener will be caught and logged.
-   *
-   * @param listener the listener to run when the manager changes state
-   */
-  public void addListener(Listener listener) {
-    state.addListener(listener, directExecutor());
-  }
-
-  /**
    * Initiates service {@linkplain Service#startAsync startup} on all the services being managed. It
    * is only valid to call this method if all of the services are {@linkplain State#NEW new}.
    *
@@ -387,8 +364,11 @@
    *
    * <p>N.B. This snapshot is guaranteed to be consistent, i.e. the set of states returned will
    * correspond to a point in time view of the services.
+   *
+   * @since 29.0 (present with return type {@code ImmutableMultimap} since 14.0)
    */
-  public ImmutableMultimap<State, Service> servicesByState() {
+  @Override
+  public ImmutableSetMultimap<State, Service> servicesByState() {
     return state.servicesByState();
   }
 
@@ -592,7 +572,7 @@
       }
     }
 
-    ImmutableMultimap<State, Service> servicesByState() {
+    ImmutableSetMultimap<State, Service> servicesByState() {
       ImmutableSetMultimap.Builder<State, Service> builder = ImmutableSetMultimap.builder();
       monitor.enter();
       try {
diff --git a/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java b/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
new file mode 100644
index 0000000..a9300a6
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
@@ -0,0 +1,31 @@
+/*
+ * 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.util.concurrent;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.util.concurrent.Service.State;
+
+/**
+ * Superinterface of {@link ServiceManager} to introduce a bridge method for {@code
+ * servicesByState()}, to ensure binary compatibility with older Guava versions that specified
+ * {@code servicesByState()} to return {@code ImmutableMultimap}.
+ */
+@GwtIncompatible
+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 3c8b90f..1c220e6 100644
--- a/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import org.checkerframework.checker.nullness.compatqual.NullableDecl;
@@ -54,7 +53,6 @@
     return super.setException(throwable);
   }
 
-  @Beta
   @CanIgnoreReturnValue
   @Override
   public boolean setFuture(ListenableFuture<? extends V> future) {
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 938040b..9d0b81b 100644
--- a/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
@@ -113,8 +113,7 @@
     return interfaceType.cast(object);
   }
 
-  private
-  <T> T callWithTimeout(
+  private <T> T callWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit, boolean amInterruptible)
       throws Exception {
     checkNotNull(callable);
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 1c0d9c7..b841517 100644
--- a/android/guava/src/com/google/common/util/concurrent/TimeLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/TimeLimiter.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -30,6 +31,7 @@
  * @since 1.0
  */
 @Beta
+@DoNotMock("Use FakeTimeLimiter")
 @GwtIncompatible
 @SuppressWarnings("GoodTime") // should have java.time.Duration overloads
 public interface TimeLimiter {
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 c67a254..a91bf67 100644
--- a/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
@@ -117,15 +117,21 @@
       } else {
         try {
           ScheduledFuture<?> timer = timeoutFuture.timer;
-          String message = "Timed out";
-          if (timer != null) {
-            long overDelayMs = Math.abs(timer.getDelay(TimeUnit.MILLISECONDS));
-            if (overDelayMs > 10) { // Not all timing drift is worth reporting
-              message += " (timeout delayed by " + overDelayMs + " ms after scheduled time)";
-            }
-          }
           timeoutFuture.timer = null; // Don't include already elapsed delay in delegate.toString()
-          timeoutFuture.setException(new TimeoutFutureException(message + ": " + delegate));
+          String message = "Timed out";
+          // This try-finally block ensures that we complete the timeout future, even if attempting
+          // to produce the message throws (probably StackOverflowError from delegate.toString())
+          try {
+            if (timer != null) {
+              long overDelayMs = Math.abs(timer.getDelay(TimeUnit.MILLISECONDS));
+              if (overDelayMs > 10) { // Not all timing drift is worth reporting
+                message += " (timeout delayed by " + overDelayMs + " ms after scheduled time)";
+              }
+            }
+            message += ": " + delegate;
+          } finally {
+            timeoutFuture.setException(new TimeoutFutureException(message));
+          }
         } finally {
           delegate.cancel(true);
         }
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 6e8abba..c0c2600 100644
--- a/android/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
+++ b/android/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
@@ -65,7 +65,6 @@
     @Override
     public void uncaughtException(Thread t, Throwable e) {
       try {
-        // cannot use FormattingLogger due to a dependency loop
         logger.log(
             SEVERE, String.format(Locale.ROOT, "Caught an exception in %s.  Shutting down.", t), e);
       } catch (Throwable errorInLogging) {
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 de14c1b..4f46780 100644
--- a/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
+++ b/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
@@ -14,8 +14,10 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.base.Verify.verify;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
+import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
@@ -24,11 +26,13 @@
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
 
 /**
  * Utilities for treating interruptible operations as uninterruptible. In all cases, if a thread is
@@ -366,6 +370,79 @@
     }
   }
 
+  /**
+   * Invokes {@code lock.}{@link Lock#tryLock(long, TimeUnit) tryLock(timeout, unit)}
+   * uninterruptibly.
+   *
+   * @since 30.0
+   */
+  @GwtIncompatible // concurrency
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
+  public static boolean tryLockUninterruptibly(Lock lock, long timeout, TimeUnit unit) {
+    boolean interrupted = false;
+    try {
+      long remainingNanos = unit.toNanos(timeout);
+      long end = System.nanoTime() + remainingNanos;
+
+      while (true) {
+        try {
+          return lock.tryLock(remainingNanos, NANOSECONDS);
+        } catch (InterruptedException e) {
+          interrupted = true;
+          remainingNanos = end - System.nanoTime();
+        }
+      }
+    } finally {
+      if (interrupted) {
+        Thread.currentThread().interrupt();
+      }
+    }
+  }
+
+  /**
+   * Invokes {@code executor.}{@link ExecutorService#awaitTermination(long, TimeUnit)
+   * awaitTermination(long, TimeUnit)} uninterruptibly with no timeout.
+   *
+   * @since 30.0
+   */
+  @Beta
+  @GwtIncompatible // concurrency
+  public static void awaitTerminationUninterruptibly(ExecutorService executor) {
+    // TODO(cpovirk): We could optimize this to avoid calling nanoTime() at all.
+    verify(awaitTerminationUninterruptibly(executor, Long.MAX_VALUE, NANOSECONDS));
+  }
+
+  /**
+   * Invokes {@code executor.}{@link ExecutorService#awaitTermination(long, TimeUnit)
+   * awaitTermination(long, TimeUnit)} uninterruptibly.
+   *
+   * @since 30.0
+   */
+  @Beta
+  @GwtIncompatible // concurrency
+  @SuppressWarnings("GoodTime")
+  public static boolean awaitTerminationUninterruptibly(
+      ExecutorService executor, long timeout, TimeUnit unit) {
+    boolean interrupted = false;
+    try {
+      long remainingNanos = unit.toNanos(timeout);
+      long end = System.nanoTime() + remainingNanos;
+
+      while (true) {
+        try {
+          return executor.awaitTermination(remainingNanos, NANOSECONDS);
+        } catch (InterruptedException e) {
+          interrupted = true;
+          remainingNanos = end - System.nanoTime();
+        }
+      }
+    } finally {
+      if (interrupted) {
+        Thread.currentThread().interrupt();
+      }
+    }
+  }
+
   // TODO(user): Add support for waitUninterruptibly.
 
   private Uninterruptibles() {}
diff --git a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
index 6cc6d68..475cabb 100755
--- a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
+++ b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
@@ -23,15 +23,14 @@
 import com.google.common.collect.ImmutableMap;
 
 /**
- * <b>Do not use this class directly. For access to public-suffix information,
- * use {@link com.google.common.net.InternetDomainName}.</b>
+ * <b>Do not use this class directly. For access to public-suffix information, use {@link
+ * com.google.common.net.InternetDomainName}.</b>
  *
- * A generated static class containing public members which provide domain
- * name patterns used in determining whether a given domain name is an
- * effective top-level domain (public suffix).
+ * <p>A generated static class containing public members which provide domain name patterns used in
+ * 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}.
+ * <p>Because this class is used in GWT, the data members are stored in a space-efficient manner.
+ * {@see TrieParser}.
  *
  * @since 16.0
  */
@@ -42,22 +41,23 @@
 
   /** 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?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?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??i&ma?nofelet?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??h&od?skihs??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??g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri????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?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?c&c,inimod??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?irga??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??opbf9bbgm--nx?s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&hrats?lc!.&snduolc,ysrab,?smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??779tbp--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,??0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc?tnamys??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!s?w??v!.&gro?lim?mo&c?n,?ten?ude?vog??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,?h&d3tbgm--nx?p?t??i!.&ased?bew?ca?enoz,hcs?lim?o&c!.topsgolb,?g??ro?sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.topsgolb,?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,l??uolc!.&drayknil,ropav,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,?artxe??sla??i!ffo??n&a&d?iler?nif?rus&e?ni!efil?srelevart????eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,brb-ni,decalpb,e&daregtmueart,mohsnd,nihcamyek,?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,??p&h21,iog:ol,,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,??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?rots?yov??dod?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???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,,??g&ro?s-raegelif,?myn,noitatsksid,o&bmoy,c?t&nigol,poh,??p&ion,j-raegelif,ohbew,?r&aegelif,ofsnd,?s&dym,ndd,ti??t&en?s&acdnuos,ohon,??u&a-raegelif,de??v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??o&cnal?htathgir?rhc??w??n!goloc?i&lno!.ysrab,?w??o!.knilemoh,hp?latipac?ts&der?e&gdirb?rif???z!.amil,??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?taeht?u&ces?sni?t&inruf?necca??za???s!.&a?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f?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!.&n&eyb,oyc,?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?617upk--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?5&7vtse--nx?mzt5--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?oc?ten???i&a?v??k!.&gro?lim?moc?ten?ude?vog???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&eman?gro?hcs?i!bom??lim?moc!.topsgolb,?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&ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,tneimip,z,?d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolcarfniarodef,?e&a,cin-yrev-si,grofpeh,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,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,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,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,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??lim?moc?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??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?moc?o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&dnala?iki,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!.&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!.&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?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??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?reve?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!ten!.oc,doof???s!.&myn,topsgolb,??t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??oc!.&e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?pi-on,topsgolb,vres-hn,ysrab,??shn?ten?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?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?mon,oc?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???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?oof???c?mt??e&d?hs?wyenoh??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,retsulc-gnitsoh,topsgolb,?b?o??o&a?btuf?l?o&c!.ed,?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&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!.topsgolb,c!bew??dretsma?e&rts?t??fma?rirhs?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!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,irfa,?g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?remacytirucesym,s,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,ottad,?g,ildts.ipa,uhnnylf,?c&amytirucesemoh,d-morf,esyrcs,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,?i-morf,m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&hr,panqym:-&ahpla,ved,?,smetsystuo,ved&j,pw,??wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,nneve.&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&ihcec,uzanoppanex,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,??omer-sndnyd,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats&-swennwot,mocpw,?ksndd,robsikrow,?o&fgp,lb&-sndnyd,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,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,row-&sndnyd,ta-sndnyd,?u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am-sndnyd,?luf-ytnuob:.a&hpla,teb,?,ru-&elpmis,taen,?ssukoreh,?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,eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,ollabtib,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&anis:piv,,esaberif,k1,lortnocduolc,roetem:.ue,,tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&divorpnwo,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,tn&ecysrab,iap-a-si,uh-a-si,?vres&-s&ndnyd,pvtsaf,?inim,nmad,?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&ila&nyd,snd,?nymsd,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&itilitu3,lahw-eht-sevas,mag-otni-si,tyskciuq,?i&ht2tniop,paelgoog,?k&-morf,aerf-ten,colbpohsym,?m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?r&ac-otni-si,etsohmaerd,?s&e&l-rof-slles,rtca-na-si,?ibodym,?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,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,inuemoh,obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,lerottad,wetag-llawerif,?dnacsekil,filten,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m?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&eb&merun?nr&ats?eun???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!raw??ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?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?po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?gro?lim?mo&c?n,?ten?ude???i!.&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?i&hsaf?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&ia&il?m??nhojcs?pe?scire??t&ron?sob???p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op??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,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?gro?ipym,lim?m&o&c!.topsgolb,?n??rif?udon,?ofni?piv-og,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,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?ia?n!am?ib???hwsohw?i!.&8302,aminifed,b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&noitacilppa,ropav,?rd,??e&civedniser,egipa,sufxob,t&isnoehtnap,newtu,??gnigatsniser.secived,k&orgn,ramytefasresworb,?m&oc?udon,?nyded,ppa&-arusah,cs,enalpkcab,?r&eniatnoceruza,ial.sppa,?s&codehtdaer,pparevelc,tacdnas,?t&enotorp,i&belet,detfihs,kecaps,?raedon.egats,sudgniht.&cersid.tsuc,dorp.tsuc,gnitset.tsuc,ved.tsuc,??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,?ofni?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??hgi&erf?l&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!.&gro?moc?ten???t!.&gro?lim?moc?sulpnpv,ten?ude?vog??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?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!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??topsgolb,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???leh?m!ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&arusah,nur:.a,,tibelet,??ra&a?hs??u&ekam?llag?org!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?pom?t&at?s!ivom?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?mi?sb??c&ba?er?js?sp?te??d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?ni??g&el!.&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,??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??et?i&b?dar?ecam?r??rp?t&a?erpoir???p&m!e?t??ooc?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??u&anam?j?m???t&am?e&n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?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?of????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???it&norf?rac??k&col?o&p?rb???l&aed?ffeahcs?syrhc??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,cidessa?drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?rianiretev?sserp??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?opsgolb,r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?m&oc?yn,?t&en?opsgolb,?ude?vog???h!.&eman?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&cs?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?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?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?korbdal?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??gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&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??ud??o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&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!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!.&21k?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,?pion,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???xt!.&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?gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?ph21,ro?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!i??nnocu?rid!.lenaptsaf,txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?g&aip?rat??id?k&circ?ram??n!.&6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,nab-eht-ni,?e&cnarusnihtlaehezitavirp,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?nozdop,rehurht,s,tis-repparcs,zamkcar,?f&aeletis,ehc-a-si,?g&nitsohnnylf,olbevres,?k&eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??mac&asac,ih,?n&a&f&agp,lhn,?ibed,?dcduabkcalb,i,pv-ni,?o&c-morf,jodsnd,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,hbew,?paduolc,tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc,?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&ceffeym,e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,sixetnod,?u&h,nyd,r,?x&inuemoh,spym,unilemoh,?y&awetag-llawerif,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?gro?lim?mo&c?n,?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??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?rpatsiv??opud?uocsid??o&b?cs?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??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!.&duolcp,etiseerf,flah,sseccaduolc,??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??civ?dlq?sat?t&ca?n??wsn???vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e?iab??e!.&dcym,enozgniebllew,noitatsksid,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!.&eni&esrem,m,?mon,tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca?eniram,g&bc,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m??moc,natsegad,onijym,pp,ri&b,midalv,?s&ar,itym,?t&en,ni?opsgolb,set??ude?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!.&gro?moc?ten?ude???ykuyr??v&b?c!.topsgolb,?ed?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?mon,o&c?g??ro?snduolc,ualeb???r!.&ca?lim?moc?oc?t&en?ni??ude?v&og?uog???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!t??c!.&hta,ofni,vog???e&d&an?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??lp?p!ila??rot?ssin?wdaorb??b!.&fo?lim?m&oc!.topsgolb,?yn,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.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!.&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?i&bom?maf!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?ledif?n&ifx?ummoc!.bdnevar,??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&oc?yn,?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.&duolc,motsuc,??oc,topsgolb,??d!.&gro?lop?moc?ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,??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??λε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур?тйас?фр?юе?յահ?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?يطسلف??ه&ارمه?يدوعسلا??وكمارا?ي&بظوبا?ليابوم??ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ンョシッァフ?业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?宝珠?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?行工?表手?販通?车汽众大?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
+      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??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур?тйас?фр?юе?յահ?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
 
   /**
-   * If a hostname is not a key in the EXCLUDE map, and if removing its
-   * leftmost component results in a name which is a key in this map, it is a
-   * public suffix.
+   * If a hostname is not a key in the EXCLUDE map, and if removing its leftmost component results
+   * in a name which is a key in this map, it is a public suffix.
    */
   public static final ImmutableMap<String, PublicSuffixType> UNDER =
-      TrieParser.parseTrie("ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?scitats,??e&b.lrusnart,d.ecapsrebu,noz.notirt,t&atse.etupmoc,is.hsmroftalp,?y??gp?h&k?s.mroftalp,trae.sppad:.zzb,,?jf?k&c?f?rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&mme0,s&tnemelepiuq,wanozama.&1-etupmoc,ble,etupmoc,??tneyoj.snc,??nc.moc.swanozama.&ble,etupmoc,?o&c.pato,i.&solots,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n??r&b.mon?e??sw.rosivda,t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.cimonotpyrc,?u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??zyx.tibelet,?");
+      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,??");
 
   /**
-   * The elements in this map would pass the UNDER test, but are known not to
-   * be public suffixes and are thus excluded from consideration. Since it
-   * refers to elements in UNDER of the same type, the type is actually not
-   * important here. The map is simply used for consistency reasons.
+   * The elements in this map would pass the UNDER test, but are known not to be public suffixes and
+   * are thus excluded from consideration. Since it refers to elements in UNDER of the same type,
+   * the type is actually not important here. The map is simply used for consistency reasons.
    */
   public static final ImmutableMap<String, PublicSuffixType> EXCLUDED =
-      TrieParser.parseTrie("kc.www?pj.&a&mahokoy.ytic?yogan.ytic??ebok.ytic?i&adnes.ytic?kasawak.ytic??oroppas.ytic?uhsuykatik.ytic???");
+      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???");
 }
diff --git a/android/pom.xml b/android/pom.xml
index a383a8a..748d104 100644
--- a/android/pom.xml
+++ b/android/pom.xml
@@ -4,23 +4,21 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.sonatype.oss</groupId>
-    <artifactId>oss-parent</artifactId>
-    <version>9</version>
-  </parent>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-parent</artifactId>
-  <version>27.1-android</version>
+  <version>30.0-android</version>
   <packaging>pom</packaging>
   <name>Guava Maven Parent</name>
+  <description>Parent for guava artifacts</description>
   <url>https://github.com/google/guava</url>
   <properties>
     <!-- Override this with -Dtest.include="**/SomeTest.java" on the CLI -->
     <test.include>%regex[.*.class]</test.include>
-    <truth.version>0.42</truth.version>
-    <animal.sniffer.version>1.17</animal.sniffer.version>
-    <maven-javadoc-plugin.version>3.0.1</maven-javadoc-plugin.version>
+    <truth.version>1.0</truth.version>
+    <animal.sniffer.version>1.18</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>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <issueManagement>
     <system>GitHub Issues</system>
@@ -29,14 +27,11 @@
   <inceptionYear>2010</inceptionYear>
   <licenses>
     <license>
-      <name>The Apache Software License, Version 2.0</name>
+      <name>Apache License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
       <distribution>repo</distribution>
     </license>
   </licenses>
-  <prerequisites>
-    <maven>3.0.3</maven>
-  </prerequisites>
   <scm>
     <connection>scm:git:https://github.com/google/guava.git</connection>
     <developerConnection>scm:git:git@github.com:google/guava.git</developerConnection>
@@ -75,6 +70,7 @@
         <directory>src</directory>
         <excludes>
           <exclude>**/*.java</exclude>
+          <exclude>**/*.sw*</exclude>
         </excludes>
       </resource>
     </resources>
@@ -88,6 +84,28 @@
     </testResources>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>enforce-versions</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireMavenVersion>
+                  <version>3.0.5</version>
+                </requireMavenVersion>
+                <requireJavaVersion>
+                  <version>1.8.0</version>
+                </requireJavaVersion>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <artifactId>maven-javadoc-plugin</artifactId>
         <version>${maven-javadoc-plugin.version}</version>
       </plugin>
@@ -96,7 +114,7 @@
       <plugins>
         <plugin>
           <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.8.0</version>
+          <version>3.8.1</version>
           <configuration>
             <source>1.7</source>
             <target>1.7</target>
@@ -104,16 +122,11 @@
         </plugin>
         <plugin>
           <artifactId>maven-jar-plugin</artifactId>
-          <version>3.0.2</version>
-          <configuration>
-            <excludes>
-              <exclude>**/ForceGuavaCompilation*</exclude>
-            </excludes>
-          </configuration>
+          <version>3.2.0</version>
         </plugin>
         <plugin>
           <artifactId>maven-source-plugin</artifactId>
-          <version>2.1.2</version>
+          <version>${maven-source-plugin.version}</version>
           <executions>
             <execution>
               <id>attach-sources</id>
@@ -121,17 +134,13 @@
               <goals><goal>jar</goal></goals>
             </execution>
           </executions>
-          <configuration>
-            <excludes>
-              <exclude>**/ForceGuavaCompilation*</exclude>
-            </excludes>
-          </configuration>
         </plugin>
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>animal-sniffer-maven-plugin</artifactId>
           <version>${animal.sniffer.version}</version>
           <configuration>
+            <annotations>com.google.common.util.concurrent.IgnoreJRERequirement</annotations>
             <signature>
               <groupId>org.codehaus.mojo.signature</groupId>
               <artifactId>java16-sun</artifactId>
@@ -179,7 +188,7 @@
         </plugin>
         <plugin>
           <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.10</version>
+          <version>3.1.1</version>
         </plugin>
         <plugin>
           <artifactId>maven-antrun-plugin</artifactId>
@@ -208,10 +217,25 @@
             <argLine>-Xmx1536M -Duser.language=hi -Duser.country=IN</argLine>
           </configuration>
         </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-enforcer-plugin</artifactId>
+          <version>3.0.0-M2</version>
+        </plugin>
       </plugins>
     </pluginManagement>
   </build>
   <distributionManagement>
+    <snapshotRepository>
+      <id>sonatype-nexus-snapshots</id>
+      <name>Sonatype Nexus Snapshots</name>
+      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+    </snapshotRepository>
+    <repository>
+      <id>sonatype-nexus-staging</id>
+      <name>Nexus Release Repository</name>
+      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+    </repository>
     <site>
       <id>guava-site</id>
       <name>Guava Documentation Site</name>
@@ -228,22 +252,22 @@
       <dependency>
         <groupId>org.checkerframework</groupId>
         <artifactId>checker-compat-qual</artifactId>
-        <version>2.5.2</version>
+        <version>2.5.5</version>
       </dependency>
       <dependency>
         <groupId>com.google.errorprone</groupId>
         <artifactId>error_prone_annotations</artifactId>
-        <version>2.2.0</version>
+        <version>2.3.4</version>
       </dependency>
       <dependency>
         <groupId>com.google.j2objc</groupId>
         <artifactId>j2objc-annotations</artifactId>
-        <version>1.1</version>
+        <version>1.3</version>
       </dependency>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.12</version>
+        <version>4.13</version>
         <scope>test</scope>
       </dependency>
       <dependency>
@@ -292,4 +316,53 @@
       </dependency>
     </dependencies>
   </dependencyManagement>
+  <profiles>
+    <profile>
+        <id>sonatype-oss-release</id>
+        <build>
+          <plugins>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-source-plugin</artifactId>
+              <version>${maven-source-plugin.version}</version>
+              <executions>
+                <execution>
+                  <id>attach-sources</id>
+                  <goals>
+                    <goal>jar-no-fork</goal>
+                  </goals>
+                </execution>
+              </executions>
+            </plugin>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-javadoc-plugin</artifactId>
+              <version>${maven-javadoc-plugin.version}</version>
+                <executions>
+                  <execution>
+                    <id>attach-javadocs</id>
+                    <goals>
+                      <goal>jar</goal>
+                    </goals>
+                </execution>
+              </executions>
+            </plugin>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-gpg-plugin</artifactId>
+              <version>1.6</version>
+              <executions>
+                <execution>
+                  <id>sign-artifacts</id>
+                  <phase>verify</phase>
+                  <goals>
+                    <goal>sign</goal>
+                  </goals>
+                </execution>
+              </executions>
+            </plugin>
+          </plugins>
+      </build>
+    </profile>
+  </profiles>
 </project>
diff --git a/cycle_whitelist.txt b/cycle_whitelist.txt
index e9c70c3..96c9e1b 100644
--- a/cycle_whitelist.txt
+++ b/cycle_whitelist.txt
@@ -13,14 +13,15 @@
 NAMESPACE org.junit
 
 # ***** REAL CYCLES *****
-# Inverses (currently not solvable by weakening a reference)
-FIELD com.google.common.base.Converter.reverse
+# Cycle exists until future completes
+FIELD com.google.common.util.concurrent.AbstractFuture.Listener.executor com.google.common.util.concurrent.ExecutionSequencer.TaskNonReentrantExecutor
 
 # ***** FALSE POSITIVES *****
 
 # The Runnable type is so generic that it produces too many false positives.
 TYPE java.lang.Runnable
 
+FIELD com.google.common.base.Converter.reverse
 FIELD com.google.common.collect.AbstractBiMap.EntrySet.iterator.$.entry com.google.common.collect.AbstractBiMap.EntrySet.iterator.$.next.$
 FIELD com.google.common.collect.AbstractMapBasedMultimap.map
 FIELD com.google.common.collect.AbstractMultimap.asMap com.google.common.collect.AbstractMapBasedMultimap.NavigableAsMap
@@ -34,10 +35,13 @@
 FIELD com.google.common.collect.ImmutableSet.asList
 FIELD com.google.common.collect.Maps.FilteredMapValues.unfiltered
 FIELD com.google.common.collect.Sets.SubSet.inputSet
+FIELD com.google.common.collect.SingletonImmutableBiMap.inverse
 FIELD com.google.common.collect.TreeTraverser.PostOrderNode.childIterator
 FIELD com.google.common.collect.TreeTraverser.PreOrderIterator.stack
 FIELD com.google.common.util.concurrent.AbstractFuture.Listener.executor com.google.common.util.concurrent.MoreExecutors.rejectionPropagatingExecutor.$
 FIELD com.google.common.util.concurrent.AbstractService.listeners
+# NonReentrantExecutor is not exposed to this field
+FIELD com.google.common.util.concurrent.ExecutionSequencer.ThreadConfinedTaskQueue.nextExecutor com.google.common.util.concurrent.ExecutionSequencer.TaskNonReentrantExecutor
 # Real cycle, but the runningState field is null'ed on completion of the future.
 FIELD com.google.common.util.concurrent.AggregateFuture.runningState
 FIELD java.util.AbstractMap.keySet com.google.common.collect.AbstractMapBasedMultimap.NavigableKeySet
diff --git a/futures/failureaccess/pom.xml b/futures/failureaccess/pom.xml
index 6cce782..1e10465 100644
--- a/futures/failureaccess/pom.xml
+++ b/futures/failureaccess/pom.xml
@@ -15,7 +15,7 @@
     Contains
     com.google.common.util.concurrent.internal.InternalFutureFailureAccess and
     InternalFutures. Most users will never need to use this artifact. Its
-    classes is conceptually a part of Guava, but they're in this separate
+    classes are conceptually a part of Guava, but they're in this separate
     artifact so that Android libraries can use them without pulling in all of
     Guava (just as they can use ListenableFuture by depending on the
     listenablefuture artifact).
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 862ff2a..98e31ed 100644
--- a/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -14,6 +14,7 @@
 
 package com.google.common.util.concurrent;
 
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
@@ -40,7 +41,7 @@
  * frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <p>The main purpose of {@link #addListener addListener} is to support this chaining. You will
@@ -98,6 +99,7 @@
  * @author Nishant Thakkar
  * @since 1.0
  */
+@DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
 public interface ListenableFuture<V> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
@@ -112,20 +114,10 @@
    * thrown by {@linkplain MoreExecutors#directExecutor direct execution}) will be caught and
    * logged.
    *
-   * <p>Note: For fast, lightweight listeners that would be safe to execute in any thread, consider
-   * {@link MoreExecutors#directExecutor}. Otherwise, avoid it. Heavyweight {@code directExecutor}
-   * listeners can cause problems, and these problems can be difficult to reproduce because they
-   * depend on timing. For example:
-   *
-   * <ul>
-   *   <li>The listener may be executed by the caller of {@code addListener}. That caller may be a
-   *       UI thread or other latency-sensitive thread. This can harm UI responsiveness.
-   *   <li>The listener may be executed by the thread that completes this {@code Future}. That
-   *       thread may be an internal system thread such as an RPC network thread. Blocking that
-   *       thread may stall progress of the whole system. It may even cause a deadlock.
-   *   <li>The listener may delay other listeners, even listeners that are not themselves {@code
-   *       directExecutor} listeners.
-   * </ul>
+   * <p>Note: If your listener is lightweight -- and will not cause stack overflow by completing
+   * more futures or adding more {@code directExecutor()} listeners inline -- consider {@link
+   * MoreExecutors#directExecutor}. Otherwise, avoid it: See the warnings on the docs for {@code
+   * directExecutor}.
    *
    * <p>This is the most general listener interface. For common operations performed using
    * listeners, see {@link Futures}. For a simplified but general listener interface, see {@link
diff --git a/guava-bom/pom.xml b/guava-bom/pom.xml
index e4516dc..1df9577 100644
--- a/guava-bom/pom.xml
+++ b/guava-bom/pom.xml
@@ -8,7 +8,7 @@
 
   <groupId>com.google.guava</groupId>
   <artifactId>guava-bom</artifactId>
-  <version>27.1-jre</version>
+  <version>30.0-jre</version>
   <packaging>pom</packaging>
   
   <parent>
@@ -29,7 +29,7 @@
 
   <licenses>
     <license>
-      <name>The Apache Software License, Version 2.0</name>
+      <name>Apache License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
       <distribution>repo</distribution>
     </license>
diff --git a/guava-gwt/pom.xml b/guava-gwt/pom.xml
index b96ed97..44db390 100644
--- a/guava-gwt/pom.xml
+++ b/guava-gwt/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>27.1-jre</version>
+    <version>30.0-jre</version>
   </parent>
   <artifactId>guava-gwt</artifactId>
   <name>Guava GWT compatible libs</name>
@@ -17,8 +17,6 @@
     This project includes GWT-friendly sources.
   </description>
   <properties>
-    <!-- We skip GWT tests by default. To run, pass -Dgwt.test.include=**/GwtTestSuite.java -->
-    <gwt.test.include>**/DoesNotMatchAnyTests.java</gwt.test.include>
     <gwt.version>2.8.2</gwt.version>
     <gwt.plugin.version>2.8.2</gwt.plugin.version>
     <gwt.logLevel>WARN</gwt.logLevel>
@@ -55,6 +53,11 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
+      <groupId>com.google.elemental2</groupId>
+      <artifactId>elemental2-promise</artifactId>
+      <version>1.0.0-RC1</version>
+    </dependency>
+    <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava-testlib</artifactId>
       <version>${project.version}</version>
@@ -84,7 +87,7 @@
       <groupId>com.google.gwt</groupId>
       <artifactId>gwt-user</artifactId>
       <version>${gwt.version}</version>
-      <scope>provided</scope>
+      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.truth</groupId>
@@ -109,15 +112,48 @@
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <!-- Yes, we want to exclude ForceGuavaCompilation 4 times: -->
+            <!-- (And we might as well exclude DummyJavadocClass 3 times (though it would be harmless to include).) -->
+            <!-- 1. Don't compile it (since that requires a *non-test* dep on gwt-user. -->
+            <exclude>**/ForceGuavaCompilation*</exclude>
+            <exclude>**/DummyJavadocClass*</exclude>
+          </excludes>
+        </configuration>
       </plugin>
       <plugin>
         <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <!-- 2. Don't include the source in the jar (since that would let users depend on it from GWT client code, which is compiled from source). -->
+            <exclude>**/ForceGuavaCompilation*</exclude>
+            <exclude>**/DummyJavadocClass*</exclude>
+          </excludes>
+        </configuration>
       </plugin>
       <plugin>
         <artifactId>maven-source-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <!-- 3. Don't include it in the source jar (since it's really more of a "test" than it is production code). -->
+            <exclude>**/ForceGuavaCompilation*</exclude>
+            <exclude>**/DummyJavadocClass*</exclude>
+          </excludes>
+        </configuration>
       </plugin>
       <plugin>
         <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <sourceFileExcludes>
+            <!-- 4. Don't build Javadoc for it (since that, too, would require a *non-test* dep on gwt-user. -->
+            <sourceFileExclude>**/ForceGuavaCompilation*</sourceFileExclude>
+          </sourceFileExcludes>
+          <!-- The above exclusion doesn't actually matter unless I prevent Javadoc from autodiscovering the source in the sourcepath, which defaults to the source directory :\ Boo for -sourcepath. -->
+          <sourcepath>doesnotexist</sourcepath>
+          <!-- Note that we do need to build Javadoc for *some* class. Otherwise, we get an empty Javadoc jar, which the Sonatype repository manager rejects. To avoid that, we've introduced a dummy class. But we made it package-private so that no one can depend on it. That in turn forced us to configure Javadoc to show package-private APIs. -->
+          <show>package</show>
+        </configuration>
       </plugin>
       <!-- Disable "normal" testing, which doesn't work for GWT tests. -->
       <plugin>
@@ -337,7 +373,7 @@
             </goals>
             <configuration>
               <module>com.google.common.GuavaTests</module>
-              <includes>${gwt.test.include}</includes>
+              <includes>**/GwtTestSuite.java</includes>
               <logLevel>${gwt.logLevel}</logLevel>
               <mode>htmlunit</mode>
               <htmlunit>FF38</htmlunit>
diff --git a/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.java b/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.java
index db6ce09..2e17c9a 100644
--- a/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.java
+++ b/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.java
@@ -80,5 +80,16 @@
     throw new UnsupportedOperationException();
   }
 
+  /*
+   * We will eventually disable GWT-RPC on the server side, but we'll leave it nominally enabled on
+   * the client side. There's little practical difference: If it's disabled on the server, it won't
+   * work. It's just a matter of how quickly it fails. I'm not sure if failing on the client would
+   * be better or not, but it's harder: GWT's System.getProperty reads from a different property
+   * list than Java's, so anyone who needs to reenable GWT-RPC in an emergency would have to figure
+   * out how to set both properties. It's easier to have to set only one, and it might as well be
+   * the Java property, since Guava already reads another Java property.
+   */
+  static void checkGwtRpcEnabled() {}
+
   private Platform() {}
 }
diff --git a/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.native.js b/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.native.js
new file mode 100644
index 0000000..cc9482e
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/base/super/com/google/common/base/Platform.native.js
@@ -0,0 +1,26 @@
+/**
+ * @param {?string} str
+ * @return {boolean} Whether the given string is null or is the empty string.
+ * @public
+ */
+Platform.stringIsNullOrEmpty = function(str) {
+  return !str;
+};
+
+
+/**
+ * @param {?string} str
+ * @return {string} Original str, if it is non-null. Otherwise empty string.
+ */
+Platform.nullToEmpty = function(str) {
+  return str || "";
+};
+
+
+/**
+ * @param {?string} str
+ * @return {string} Original str, if it is non-empty. Otherwise null;
+ */
+Platform.emptyToNull = function(str) {
+  return str || null;
+};
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 af5911a..dba29ff 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
@@ -231,6 +231,7 @@
     return expireWrite || expireAccess;
   }
 
+  @SuppressWarnings("GoodTime")
   private long currentTimeNanos() {
     return ticker.read();
   }
@@ -377,8 +378,7 @@
     }
 
     @Override
-    @Nullable
-    public V getIfPresent(Object key) {
+    public @Nullable V getIfPresent(Object key) {
       return localCache.getIfPresent(key);
     }
 
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 3b45258..8236f00 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
@@ -18,7 +18,6 @@
 
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 
-import com.google.common.annotations.Beta;
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -32,7 +31,6 @@
  */
 public abstract class ImmutableBiMap<K, V> extends ForwardingImmutableMap<K, V>
     implements BiMap<K, V> {
-  @Beta
   public static <T, K, V> Collector<T, ?, ImmutableBiMap<K, V>> toImmutableBiMap(
       Function<? super T, ? extends K> keyFunction,
       Function<? super T, ? extends V> valueFunction) {
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableCollection.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableCollection.java
index c5bdbfd..ccab6d8 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableCollection.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableCollection.java
@@ -90,8 +90,7 @@
   }
 
   /** If this collection is backed by an array of its elements in insertion order, returns it. */
-  @Nullable
-  Object[] internalArray() {
+  Object @Nullable [] internalArray() {
     return null;
   }
 
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableList.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableList.java
index c2e69b4..7f7b72b 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableList.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableList.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.ObjectArrays.checkElementsNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -45,7 +44,6 @@
 
   ImmutableList() {}
 
-  @Beta
   public static <E> Collector<E, ?, ImmutableList<E>> toImmutableList() {
     return CollectCollectors.toImmutableList();
   }
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 1f9fe94..550b7d1 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
@@ -21,7 +21,6 @@
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.Iterables.getOnlyElement;
 
-import com.google.common.annotations.Beta;
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
@@ -73,14 +72,12 @@
 
   ImmutableMap() {}
 
-  @Beta
   public static <T, 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);
   }
 
-  @Beta
   public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
       Function<? super T, ? extends K> keyFunction,
       Function<? super T, ? extends 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 349c954..6d4b800 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,7 +18,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -41,7 +40,6 @@
 public abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E> {
   ImmutableSet() {}
 
-  @Beta
   public static <E> Collector<E, ?, ImmutableSet<E>> toImmutableSet() {
     return CollectCollectors.toImmutableSet();
   }
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 b902b32..d255c35 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
@@ -22,7 +22,6 @@
 import static java.util.Collections.singletonMap;
 import static java.util.Collections.unmodifiableSortedMap;
 
-import com.google.common.annotations.Beta;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.Map;
@@ -67,7 +66,6 @@
     this.sortedDelegate = delegate;
   }
 
-  @Beta
   public static <T, K, V> Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
       Comparator<? super K> comparator,
       Function<? super T, ? extends K> keyFunction,
@@ -75,7 +73,6 @@
     return CollectCollectors.toImmutableSortedMap(comparator, keyFunction, valueFunction);
   }
 
-  @Beta
   public static <T, K, V> Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
       Comparator<? super K> comparator,
       Function<? super T, ? extends K> keyFunction,
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedSet.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedSet.java
index 8eeaf4f..ce09f61 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedSet.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedSet.java
@@ -19,7 +19,6 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -68,7 +67,6 @@
     }
   }
 
-  @Beta
   public static <E> Collector<E, ?, ImmutableSortedSet<E>> toImmutableSortedSet(
       Comparator<? super E> comparator) {
     return CollectCollectors.toImmutableSortedSet(comparator);
@@ -321,7 +319,17 @@
     return null;
   }
 
-  ImmutableSortedSet<E> headSet(E toElement, boolean inclusive) {
+  public E ceiling(E e) {
+    ImmutableSortedSet<E> set = tailSet(e, true);
+    return !set.isEmpty() ? set.first() : null;
+  }
+
+  public E floor(E e) {
+    ImmutableSortedSet<E> set = headSet(e, true);
+    return !set.isEmpty() ? set.last() : null;
+  }
+
+  public ImmutableSortedSet<E> headSet(E toElement, boolean inclusive) {
     checkNotNull(toElement);
     if (inclusive) {
       E tmp = higher(toElement);
@@ -362,7 +370,7 @@
     }
   }
 
-  ImmutableSortedSet<E> tailSet(E fromElement, boolean inclusive) {
+  public ImmutableSortedSet<E> tailSet(E fromElement, boolean inclusive) {
     checkNotNull(fromElement);
     if (!inclusive) {
       E tmp = higher(fromElement);
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/MapMaker.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/MapMaker.java
index fa1afc5..b2fd7ae 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/MapMaker.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/MapMaker.java
@@ -16,108 +16,18 @@
 
 package com.google.common.collect;
 
-import com.google.common.base.Function;
-import java.util.LinkedHashMap;
+import static com.google.common.base.Preconditions.checkArgument;
+
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 /**
- * MapMaker emulation. Since Javascript is single-threaded and have no references, this reduces to
- * the creation of expiring and computing maps.
+ * MapMaker emulation.
  *
  * @author Charles Fry
  */
 public final class MapMaker {
-
-  // TODO(fry,kak): ConcurrentHashMap never throws a CME when mutating the map during iteration, but
-  // this implementation (based on a LHM) does. This will all be replaced soon anyways, so leaving
-  // it as is for now.
-  private static class ComputingMap<K, V> extends LinkedHashMap<K, V>
-      implements ConcurrentMap<K, V> {
-    private final Function<? super K, ? extends V> computer;
-
-    ComputingMap(int initialCapacity) {
-      this(null, initialCapacity);
-    }
-
-    ComputingMap(Function<? super K, ? extends V> computer, int initialCapacity) {
-      super(initialCapacity, /* ignored loadFactor */ 0.75f, true);
-      this.computer = computer;
-    }
-
-    @Override
-    public V putIfAbsent(K key, V value) {
-      if (!containsKey(key)) {
-        return put(key, value);
-      } else {
-        return get(key);
-      }
-    }
-
-    @Override
-    public boolean remove(Object key, Object value) {
-      if (containsKey(key) && get(key).equals(value)) {
-        remove(key);
-        return true;
-      }
-      return false;
-    }
-
-    @Override
-    public boolean replace(K key, V oldValue, V newValue) {
-      if (containsKey(key) && get(key).equals(oldValue)) {
-        put(key, newValue);
-        return true;
-      }
-      return false;
-    }
-
-    @Override
-    public V replace(K key, V value) {
-      return containsKey(key) ? put(key, value) : null;
-    }
-
-    @Override
-    public V get(Object k) {
-      // from CustomConcurrentHashMap
-      V result = super.get(k);
-      if (result == null && computer != null) {
-        /*
-         * This cast isn't safe, but we can rely on the fact that K is almost always passed to
-         * Map.get(), and tools like IDEs and Findbugs can catch situations where this isn't the
-         * case.
-         *
-         * The alternative is to add an overloaded method, but the chances of a user calling get()
-         * instead of the new API and the risks inherent in adding a new API outweigh this little
-         * hole.
-         */
-        @SuppressWarnings("unchecked")
-        K key = (K) k;
-        result = compute(key);
-      }
-      return result;
-    }
-
-    private V compute(K key) {
-      // from MapMaker
-      V value;
-      try {
-        value = computer.apply(key);
-      } catch (Throwable t) {
-        throw new ComputationException(t);
-      }
-
-      if (value == null) {
-        String message = computer + " returned null for key " + key + ".";
-        throw new NullPointerException(message);
-      }
-      put(key, value);
-      return value;
-    }
-  }
-
   private int initialCapacity = 16;
-  private boolean useCustomMap;
 
   public MapMaker() {}
 
@@ -130,21 +40,14 @@
   }
 
   public MapMaker concurrencyLevel(int concurrencyLevel) {
-    if (concurrencyLevel < 1) {
-      throw new IllegalArgumentException("GWT only supports a concurrency level of 1");
-    }
+    checkArgument(
+        concurrencyLevel >= 1, "concurrency level (%s) must be at least 1", concurrencyLevel);
     // GWT technically only supports concurrencyLevel == 1, but we silently
     // ignore other positive values.
     return this;
   }
 
   public <K, V> ConcurrentMap<K, V> makeMap() {
-    return useCustomMap
-        ? new ComputingMap<K, V>(null, initialCapacity)
-        : new ConcurrentHashMap<K, V>(initialCapacity);
-  }
-
-  public <K, V> ConcurrentMap<K, V> makeComputingMap(Function<? super K, ? extends V> computer) {
-    return new ComputingMap<K, V>(computer, initialCapacity);
+    return new ConcurrentHashMap<K, V>(initialCapacity);
   }
 }
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 9497262..bb9fc16 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
@@ -99,5 +99,16 @@
     return exponent / 2;
   }
 
+  /*
+   * We will eventually disable GWT-RPC on the server side, but we'll leave it nominally enabled on
+   * the client side. There's little practical difference: If it's disabled on the server, it won't
+   * work. It's just a matter of how quickly it fails. I'm not sure if failing on the client would
+   * be better or not, but it's harder: GWT's System.getProperty reads from a different property
+   * list than Java's, so anyone who needs to reenable GWT-RPC in an emergency would have to figure
+   * out how to set both properties. It's easier to have to set only one, and it might as well be
+   * the Java property, since Guava already reads another Java property.
+   */
+  static void checkGwtRpcEnabled() {}
+
   private Platform() {}
 }
diff --git a/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/DoublesMethodsForWeb.java b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/DoublesMethodsForWeb.java
new file mode 100644
index 0000000..2fdd4c1
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/DoublesMethodsForWeb.java
@@ -0,0 +1,28 @@
+/*
+ * 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.primitives;
+
+import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsPackage;
+
+/** Web specializations for {@link Doubles} methods. */
+abstract class DoublesMethodsForWeb {
+
+  @JsMethod(name = "Math.min", namespace = JsPackage.GLOBAL)
+  public static native double min(double... array);
+
+  @JsMethod(name = "Math.max", namespace = JsPackage.GLOBAL)
+  public static native double max(double... array);
+}
diff --git a/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/FloatsMethodsForWeb.java b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/FloatsMethodsForWeb.java
new file mode 100644
index 0000000..61d57cc
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/FloatsMethodsForWeb.java
@@ -0,0 +1,28 @@
+/*
+ * 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.primitives;
+
+import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsPackage;
+
+/** Web specializations for {@link Floats} methods. */
+abstract class FloatsMethodsForWeb {
+
+  @JsMethod(name = "Math.min", namespace = JsPackage.GLOBAL)
+  public static native float min(float... array);
+
+  @JsMethod(name = "Math.max", namespace = JsPackage.GLOBAL)
+  public static native float max(float... array);
+}
diff --git a/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/IntsMethodsForWeb.java b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/IntsMethodsForWeb.java
new file mode 100644
index 0000000..540b217
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/IntsMethodsForWeb.java
@@ -0,0 +1,28 @@
+/*
+ * 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.primitives;
+
+import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsPackage;
+
+/** Web specializations for {@link Ints} methods. */
+abstract class IntsMethodsForWeb {
+
+  @JsMethod(name = "Math.min", namespace = JsPackage.GLOBAL)
+  public static native int min(int... array);
+
+  @JsMethod(name = "Math.max", namespace = JsPackage.GLOBAL)
+  public static native int max(int... array);
+}
diff --git a/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/Platform.java b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/Platform.java
new file mode 100644
index 0000000..7596ea2
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/Platform.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 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.primitives;
+
+final class Platform {
+  /*
+   * We will eventually disable GWT-RPC on the server side, but we'll leave it nominally enabled on
+   * the client side. There's little practical difference: If it's disabled on the server, it won't
+   * work. It's just a matter of how quickly it fails. I'm not sure if failing on the client would
+   * be better or not, but it's harder: GWT's System.getProperty reads from a different property
+   * list than Java's, so anyone who needs to reenable GWT-RPC in an emergency would have to figure
+   * out how to set both properties. It's easier to have to set only one, and it might as well be
+   * the Java property, since Guava already reads another Java property.
+   */
+  static void checkGwtRpcEnabled() {}
+
+  private Platform() {}
+}
diff --git a/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/ShortsMethodsForWeb.java b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/ShortsMethodsForWeb.java
new file mode 100644
index 0000000..8036e6c
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/primitives/super/com/google/common/primitives/ShortsMethodsForWeb.java
@@ -0,0 +1,28 @@
+/*
+ * 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.primitives;
+
+import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsPackage;
+
+/** Web specializations for {@link Shorts} methods. */
+abstract class ShortsMethodsForWeb {
+
+  @JsMethod(name = "Math.min", namespace = JsPackage.GLOBAL)
+  public static native short min(short... array);
+
+  @JsMethod(name = "Math.max", namespace = JsPackage.GLOBAL)
+  public static native short max(short... array);
+}
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 96691b8..900d5f7 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
@@ -219,7 +219,10 @@
 
   @Override
   protected final Throwable tryInternalFastPathGetFailure() {
-    return state == State.FAILURE ? throwable : null;
+    if (this instanceof Trusted) {
+      return state == State.FAILURE ? throwable : null;
+    }
+    return null;
   }
 
   final Throwable trustedGetException() {
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AggregateFutureState.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AggregateFutureState.java
index 91c603b..0058c34 100644
--- a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AggregateFutureState.java
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AggregateFutureState.java
@@ -21,7 +21,7 @@
 import java.util.Set;
 
 /** Emulation of AggregateFutureState. */
-abstract class AggregateFutureState {
+abstract class AggregateFutureState<OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
   // Lazily initialized the first time we see an exception; not released until all the input futures
   // & this future completes. Released when the future releases the reference to the running state
   private Set<Throwable> seenExceptions = null;
@@ -44,4 +44,8 @@
   final int decrementRemainingAndGet() {
     return --remaining;
   }
+
+  final void clearSeenExceptions() {
+    seenExceptions = null;
+  }
 }
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/ListenableFuture.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/ListenableFuture.java
new file mode 100644
index 0000000..f5e92eb
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/ListenableFuture.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2007 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 elemental2.promise.IThenable;
+import elemental2.promise.Promise;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+import jsinterop.annotations.JsMethod;
+import jsinterop.annotations.JsOptional;
+
+/**
+ * Java super source for ListenableFuture, implementing a structural thenable via a default method.
+ * For restrictions, please refer to the documentation of the then() method.
+ *
+ * <p>This class is not (explicitly) implementing IThenable<V> because "then" is overloaded there
+ * and the single parameter version would need to be marked native, which does not seem to be
+ * feasible in interfaces (see "subclassing a class with overloaded methods" in jsinterop
+ * documentation).
+ */
+public interface ListenableFuture<V> extends Future<V>, Thenable<V> {
+  void addListener(Runnable listener, Executor executor);
+
+  /** Note that this method is not expected to be overridden. */
+  @JsMethod
+  @Override
+  default <R> IThenable<R> then(
+      @JsOptional ThenOnFulfilledCallbackFn<? super V, ? extends R> onFulfilled,
+      @JsOptional ThenOnRejectedCallbackFn<? extends R> onRejected) {
+    return new Promise<V>(
+            (resolve, reject) -> {
+              Futures.addCallback(
+                  this,
+                  new FutureCallback<V>() {
+                    @Override
+                    public void onSuccess(V value) {
+                      resolve.onInvoke(value);
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable) {
+                      reject.onInvoke(throwable.getBackingJsObject());
+                    }
+                  },
+                  MoreExecutors.directExecutor());
+            })
+        .then(
+            (IThenable.ThenOnFulfilledCallbackFn) onFulfilled,
+            (IThenable.ThenOnRejectedCallbackFn) onRejected);
+  }
+
+  // TODO(b/141673833): If this would work, it would allow us to implement IThenable properly:
+  // default <R> Promise<R> then(IThenable.ThenOnFulfilledCallbackFn<? super V, ? extends R>
+  // onFulfilled) {
+  //   return then(onFulfilled, null);
+  // }
+}
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/Thenable.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/Thenable.java
new file mode 100644
index 0000000..db468ef
--- /dev/null
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/Thenable.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 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 elemental2.promise.IThenable;
+import jsinterop.annotations.JsFunction;
+import jsinterop.annotations.JsOptional;
+import jsinterop.annotations.JsPackage;
+import jsinterop.annotations.JsType;
+
+/**
+ * Subset of the elemental2 IThenable interface without the single-parameter overload, which allows
+ * us to implement it using a default implementation in J2cl ListenableFuture.
+ */
+@JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "IThenable")
+interface Thenable<T> {
+  <V> IThenable<V> then(
+      @JsOptional ThenOnFulfilledCallbackFn<? super T, ? extends V> onFulfilled,
+      @JsOptional ThenOnRejectedCallbackFn<? extends V> onRejected);
+
+  @JsFunction
+  interface ThenOnFulfilledCallbackFn<T, V> {
+    V onInvoke(T p0);
+  }
+
+  @JsFunction
+  interface ThenOnRejectedCallbackFn<V> {
+    V onInvoke(Object p0);
+  }
+}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableAsList_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/DummyJavadocClass.java
similarity index 66%
rename from guava-gwt/src/com/google/common/collect/ImmutableAsList_CustomFieldSerializer.java
rename to guava-gwt/src/com/google/common/DummyJavadocClass.java
index d02eb6d..cd86273 100644
--- a/guava-gwt/src/com/google/common/collect/ImmutableAsList_CustomFieldSerializer.java
+++ b/guava-gwt/src/com/google/common/DummyJavadocClass.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 The Guava Authors
+ * Copyright (C) 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.
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.common.collect;
+package com.google.common;
 
 /**
- * Even though {@link ImmutableAsList} cannot be instantiated, we still need a custom field
- * serializer. TODO(cpovirk): why?
+ * A dummy class so that the Maven Javadoc plugin will produce a jar. If it doesn't produce a jar,
+ * then the Sonatype repository manager issues an error.
  *
- * @author Hayward Chan
+ * @author Chris Povirk
  */
-public final class ImmutableAsList_CustomFieldSerializer {}
+class DummyJavadocClass {}
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 f5ec06f..e284348 100644
--- a/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
+++ b/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
@@ -14,6 +14,7 @@
   <super-source path="super"/>
    
   <inherits name="com.google.gwt.user.User"/>
+      
   <inherits name="com.google.gwt.core.Core"/>
    
 </module>
diff --git a/guava-gwt/src/com/google/common/base/Absent_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/base/Absent_CustomFieldSerializer.java
deleted file mode 100644
index 4db1123..0000000
--- a/guava-gwt/src/com/google/common/base/Absent_CustomFieldSerializer.java
+++ /dev/null
@@ -1,41 +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.base;
-
-import com.google.common.annotations.GwtCompatible;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * Custom GWT serializer for {@link Absent}.
- *
- * <p>GWT can serialize an absent {@code Optional} on its own, but the resulting object is a
- * different instance than the singleton {@code Absent.INSTANCE}, which breaks equality. We
- * implement a custom serializer to maintain the singleton property.
- *
- * @author Chris Povirk
- */
-@GwtCompatible
-public class Absent_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, Absent<?> instance) {}
-
-  public static Absent<?> instantiate(SerializationStreamReader reader) {
-    return Absent.INSTANCE;
-  }
-
-  public static void serialize(SerializationStreamWriter writer, Absent<?> instance) {}
-}
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 cddd48e..5ed0fb2 100644
--- a/guava-gwt/src/com/google/common/base/Base.gwt.xml
+++ b/guava-gwt/src/com/google/common/base/Base.gwt.xml
@@ -14,8 +14,11 @@
   <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"/>
    
 </module>
diff --git a/guava-gwt/src/com/google/common/base/GwtSerializationDependencies.java b/guava-gwt/src/com/google/common/base/GwtSerializationDependencies.java
deleted file mode 100644
index 69cf0d2..0000000
--- a/guava-gwt/src/com/google/common/base/GwtSerializationDependencies.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.base;
-
-import com.google.common.annotations.GwtCompatible;
-import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
-
-/**
- * Contains dummy collection implementations to convince GWT that part of serializing a collection
- * is serializing its elements.
- *
- * <p>See {@linkplain com.google.common.collect.GwtSerializationDependencies the
- * com.google.common.collect version} for more details.
- *
- * @author Chris Povirk
- */
-@GwtCompatible
-final class GwtSerializationDependencies {
-  private GwtSerializationDependencies() {}
-
-  static final class OptionalDependencies<T> extends Optional<T> {
-    @Nullable T value;
-
-    OptionalDependencies() {
-      super();
-    }
-
-    @Override
-    public boolean isPresent() {
-      throw new AssertionError();
-    }
-
-    @Override
-    public T get() {
-      throw new AssertionError();
-    }
-
-    @Override
-    public T or(T defaultValue) {
-      throw new AssertionError();
-    }
-
-    @Override
-    public Optional<T> or(Optional<? extends T> secondChoice) {
-      throw new AssertionError();
-    }
-
-    @Override
-    public T or(Supplier<? extends T> supplier) {
-      throw new AssertionError();
-    }
-
-    @Override
-    public T orNull() {
-      throw new AssertionError();
-    }
-
-    @Override
-    public Set<T> asSet() {
-      throw new AssertionError();
-    }
-
-    @Override
-    public <V> Optional<V> transform(Function<? super T, V> function) {
-      throw new AssertionError();
-    }
-
-    @Override
-    public boolean equals(@Nullable Object object) {
-      throw new AssertionError();
-    }
-
-    @Override
-    public int hashCode() {
-      throw new AssertionError();
-    }
-
-    @Override
-    public String toString() {
-      throw new AssertionError();
-    }
-  }
-}
diff --git a/guava-gwt/src/com/google/common/base/PairwiseEquivalence_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/base/PairwiseEquivalence_CustomFieldSerializer.java
deleted file mode 100644
index 0a34f93..0000000
--- a/guava-gwt/src/com/google/common/base/PairwiseEquivalence_CustomFieldSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2011 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * GWT serialization logic for {@link PairwiseEquivalence}.
- *
- * @author Kedar Kanitkar
- */
-public class PairwiseEquivalence_CustomFieldSerializer {
-
-  private PairwiseEquivalence_CustomFieldSerializer() {}
-
-  public static void deserialize(
-      SerializationStreamReader reader, PairwiseEquivalence<?> instance) {}
-
-  public static PairwiseEquivalence<?> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return create((Equivalence<?>) reader.readObject());
-  }
-
-  private static <T> PairwiseEquivalence<T> create(Equivalence<T> elementEquivalence) {
-    return new PairwiseEquivalence<T>(elementEquivalence);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, PairwiseEquivalence<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.elementEquivalence);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/base/Present_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/base/Present_CustomFieldSerializer.java
deleted file mode 100644
index 710086d..0000000
--- a/guava-gwt/src/com/google/common/base/Present_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +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.base;
-
-import com.google.common.annotations.GwtCompatible;
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * Custom GWT serializer for {@link Present}.
- *
- * @author Chris Povirk
- */
-@GwtCompatible
-public class Present_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, Present<?> instance) {}
-
-  public static Present<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return (Present<Object>) Optional.of(reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, Present<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.get());
-  }
-}
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 225f923..615b95f 100644
--- a/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
+++ b/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
@@ -14,10 +14,17 @@
   <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.util.concurrent.Concurrent"/>
-  <inherits name="com.google.gwt.core.Core"/>
    
+  <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"/>
+    
 </module>
diff --git a/guava-gwt/src/com/google/common/collect/AllEqualOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/AllEqualOrdering_CustomFieldSerializer.java
deleted file mode 100644
index ab46c9e..0000000
--- a/guava-gwt/src/com/google/common/collect/AllEqualOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link AllEqualOrdering}.
- *
- * @author Chris Povirk
- */
-public class AllEqualOrdering_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, AllEqualOrdering instance) {}
-
-  public static AllEqualOrdering instantiate(SerializationStreamReader reader) {
-    return AllEqualOrdering.INSTANCE;
-  }
-
-  public static void serialize(SerializationStreamWriter writer, AllEqualOrdering instance) {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/ArrayListMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ArrayListMultimap_CustomFieldSerializer.java
deleted file mode 100644
index a58ca25..0000000
--- a/guava-gwt/src/com/google/common/collect/ArrayListMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ArrayListMultimap}.
- *
- * @author Chris Povirk
- */
-public class ArrayListMultimap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader in, ArrayListMultimap<?, ?> out) {}
-
-  public static ArrayListMultimap<Object, Object> instantiate(SerializationStreamReader in)
-      throws SerializationException {
-    return (ArrayListMultimap<Object, Object>)
-        Multimap_CustomFieldSerializerBase.populate(in, ArrayListMultimap.create());
-  }
-
-  public static void serialize(SerializationStreamWriter out, ArrayListMultimap<?, ?> multimap)
-      throws SerializationException {
-    Multimap_CustomFieldSerializerBase.serialize(out, multimap);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ByFunctionOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ByFunctionOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 812bb5a..0000000
--- a/guava-gwt/src/com/google/common/collect/ByFunctionOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 com.google.common.base.Function;
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ByFunctionOrdering}.
- *
- * @author Chris Povirk
- */
-public class ByFunctionOrdering_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, ByFunctionOrdering<?, ?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static ByFunctionOrdering<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new ByFunctionOrdering<>(
-        (Function<Object, Object>) reader.readObject(), (Ordering<Object>) reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ByFunctionOrdering<?, ?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.function);
-    writer.writeObject(instance.ordering);
-  }
-}
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 72b65ba..765ac84 100644
--- a/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
+++ b/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
@@ -14,11 +14,17 @@
   <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"/>
    
 </module>
diff --git a/guava-gwt/src/com/google/common/collect/ComparatorOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ComparatorOrdering_CustomFieldSerializer.java
deleted file mode 100644
index f6cea19..0000000
--- a/guava-gwt/src/com/google/common/collect/ComparatorOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Comparator;
-
-/**
- * This class implements the GWT serialization of {@link ComparatorOrdering}.
- *
- * @author Chris Povirk
- */
-public class ComparatorOrdering_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, ComparatorOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static ComparatorOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new ComparatorOrdering<>((Comparator<Object>) reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ComparatorOrdering<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.comparator);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/CompoundOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/CompoundOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 527c265..0000000
--- a/guava-gwt/src/com/google/common/collect/CompoundOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * This class implements the GWT serialization of {@link CompoundOrdering}.
- *
- * @author Chris Povirk
- */
-public class CompoundOrdering_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, CompoundOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static CompoundOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    int n = reader.readInt();
-    List<Comparator<Object>> comparators = new ArrayList<>();
-    for (int i = 0; i < n; i++) {
-      comparators.add((Comparator<Object>) reader.readObject());
-    }
-    return new CompoundOrdering<>(comparators);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, CompoundOrdering<?> instance)
-      throws SerializationException {
-    writer.writeInt(instance.comparators.length);
-    for (Comparator<?> comparator : instance.comparators) {
-      writer.writeObject(comparator);
-    }
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/DenseImmutableTable_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/DenseImmutableTable_CustomFieldSerializer.java
deleted file mode 100644
index c02db5b..0000000
--- a/guava-gwt/src/com/google/common/collect/DenseImmutableTable_CustomFieldSerializer.java
+++ /dev/null
@@ -1,41 +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.collect;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link DenseImmutableTable}.
- *
- * @author Chris Povirk
- */
-public class DenseImmutableTable_CustomFieldSerializer {
-  public static void deserialize(
-      SerializationStreamReader reader, DenseImmutableTable<?, ?, ?> instance) {}
-
-  public static DenseImmutableTable<Object, Object, Object> instantiate(
-      SerializationStreamReader reader) throws SerializationException {
-    return (DenseImmutableTable<Object, Object, Object>)
-        ImmutableTable_CustomFieldSerializerBase.instantiate(reader);
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, DenseImmutableTable<Object, Object, Object> table)
-      throws SerializationException {
-    ImmutableTable_CustomFieldSerializerBase.serialize(writer, table);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/EmptyImmutableListMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/EmptyImmutableListMultimap_CustomFieldSerializer.java
deleted file mode 100644
index 443709e..0000000
--- a/guava-gwt/src/com/google/common/collect/EmptyImmutableListMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link EmptyImmutableListMultimap}.
- *
- * @author Chris Povirk
- */
-public class EmptyImmutableListMultimap_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, EmptyImmutableListMultimap instance) {}
-
-  public static EmptyImmutableListMultimap instantiate(SerializationStreamReader reader) {
-    return EmptyImmutableListMultimap.INSTANCE;
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, EmptyImmutableListMultimap instance) {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/EmptyImmutableSetMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/EmptyImmutableSetMultimap_CustomFieldSerializer.java
deleted file mode 100644
index ac095df..0000000
--- a/guava-gwt/src/com/google/common/collect/EmptyImmutableSetMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link EmptyImmutableSetMultimap}.
- *
- * @author Chris Povirk
- */
-public class EmptyImmutableSetMultimap_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, EmptyImmutableSetMultimap instance) {}
-
-  public static EmptyImmutableSetMultimap instantiate(SerializationStreamReader reader) {
-    return EmptyImmutableSetMultimap.INSTANCE;
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, EmptyImmutableSetMultimap instance) {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/ExplicitOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ExplicitOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 8b02cdf..0000000
--- a/guava-gwt/src/com/google/common/collect/ExplicitOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ExplicitOrdering}.
- *
- * @author Chris Povirk
- */
-public class ExplicitOrdering_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ExplicitOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static ExplicitOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new ExplicitOrdering<>((ImmutableMap<Object, Integer>) reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ExplicitOrdering<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.rankMap);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ForwardingImmutableList_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ForwardingImmutableList_CustomFieldSerializer.java
deleted file mode 100644
index dc63281..0000000
--- a/guava-gwt/src/com/google/common/collect/ForwardingImmutableList_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ForwardingImmutableList} cannot be instantiated, we still need a custom field
- * serializer. TODO(cpovirk): why?
- *
- * @author Hayward Chan
- */
-public final class ForwardingImmutableList_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/ForwardingImmutableSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ForwardingImmutableSet_CustomFieldSerializer.java
deleted file mode 100644
index aec6088..0000000
--- a/guava-gwt/src/com/google/common/collect/ForwardingImmutableSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ForwardingImmutableSet} cannot be instantiated, we still need a custom field
- * serializer. TODO(cpovirk): why?
- *
- * @author Hayward Chan
- */
-public final class ForwardingImmutableSet_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/GwtSerializationDependencies.java b/guava-gwt/src/com/google/common/collect/GwtSerializationDependencies.java
deleted file mode 100644
index 0abf5ee..0000000
--- a/guava-gwt/src/com/google/common/collect/GwtSerializationDependencies.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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 com.google.common.annotations.GwtCompatible;
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.TreeMap;
-
-/**
- * Contains dummy collection implementations to convince GWT that part of serializing a collection
- * is serializing its elements.
- *
- * <p>Because of our use of final fields in our collections, GWT's normal heuristic for determining
- * which classes might be serialized fails. That heuristic is, roughly speaking, to look at each
- * parameter and return type of each RPC interface and to assume that implementations of those types
- * might be serialized. Those types have their own dependencies -- their fields -- which are
- * analyzed recursively and analogously.
- *
- * <p>For classes with final fields, GWT assumes that the class itself might be serialized but
- * doesn't assume the same about its final fields. To work around this, we provide dummy
- * implementations of our collections with their dependencies as non-final fields. Even though these
- * implementations are never instantiated, they are visible to GWT when it performs its
- * serialization analysis, and it assumes that their fields may be serialized.
- *
- * <p>Currently we provide dummy implementations of all the immutable collection classes necessary
- * to support declarations like {@code ImmutableMultiset<String>} in RPC interfaces. Support for
- * {@code ImmutableMultiset} in the interface is support for {@code Multiset}, so there is nothing
- * further to be done to support the new collection interfaces. It is not support, however, for an
- * RPC interface in terms of {@code HashMultiset}. It is still possible to send a {@code
- * HashMultiset} over GWT RPC; it is only the declaration of an interface in terms of {@code
- * HashMultiset} that we haven't tried to support. (We may wish to revisit this decision in the
- * future.)
- *
- * @author Chris Povirk
- */
-@GwtCompatible
-// None of these classes are instantiated, let alone serialized:
-@SuppressWarnings("serial")
-final class GwtSerializationDependencies {
-  private GwtSerializationDependencies() {}
-
-  static final class ImmutableListMultimapDependencies<K, V> extends ImmutableListMultimap<K, V> {
-    K key;
-    V value;
-
-    ImmutableListMultimapDependencies() {
-      super(null, 0);
-    }
-  }
-
-  // ImmutableMap is covered by ImmutableSortedMap/ImmutableBiMap.
-
-  // ImmutableMultimap is covered by ImmutableSetMultimap/ImmutableListMultimap.
-
-  static final class ImmutableSetMultimapDependencies<K, V> extends ImmutableSetMultimap<K, V> {
-    K key;
-    V value;
-
-    ImmutableSetMultimapDependencies() {
-      super(null, 0, null);
-    }
-  }
-
-  /*
-   * We support an interface declared in terms of LinkedListMultimap because it
-   * supports entry ordering not supported by other implementations.
-   */
-  static final class LinkedListMultimapDependencies<K, V> extends LinkedListMultimap<K, V> {
-    K key;
-    V value;
-
-    LinkedListMultimapDependencies() {}
-  }
-
-  static final class HashBasedTableDependencies<R, C, V> extends HashBasedTable<R, C, V> {
-    HashMap<R, HashMap<C, V>> data;
-
-    HashBasedTableDependencies() {
-      super(null, null);
-    }
-  }
-
-  static final class TreeBasedTableDependencies<R, C, V> extends TreeBasedTable<R, C, V> {
-    TreeMap<R, TreeMap<C, V>> data;
-
-    TreeBasedTableDependencies() {
-      super(null, null);
-    }
-  }
-
-  /*
-   * We don't normally need "implements Serializable," but we do here. That's
-   * because ImmutableTable itself is not Serializable as of this writing. We
-   * need for GWT to believe that this dummy class is serializable, or else it
-   * won't generate serialization code for R, C, and V.
-   */
-  static final class ImmutableTableDependencies<R, C, V> extends SingletonImmutableTable<R, C, V>
-      implements Serializable {
-    R rowKey;
-    C columnKey;
-    V value;
-
-    ImmutableTableDependencies() {
-      super(null, null, null);
-    }
-  }
-
-  static final class TreeMultimapDependencies<K, V> extends TreeMultimap<K, V> {
-    Comparator<? super K> keyComparator;
-    Comparator<? super V> valueComparator;
-    K key;
-    V value;
-
-    TreeMultimapDependencies() {
-      super(null, null);
-    }
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/HashBasedTable_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/HashBasedTable_CustomFieldSerializer.java
deleted file mode 100644
index 4ce2b43..0000000
--- a/guava-gwt/src/com/google/common/collect/HashBasedTable_CustomFieldSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link HashBasedTable}.
- *
- * @author Hayward Chan
- */
-public class HashBasedTable_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, HashBasedTable<?, ?, ?> table) {}
-
-  public static HashBasedTable<Object, Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return Table_CustomFieldSerializerBase.populate(reader, HashBasedTable.create());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, HashBasedTable<?, ?, ?> table)
-      throws SerializationException {
-    Table_CustomFieldSerializerBase.serialize(writer, table);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/HashMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/HashMultimap_CustomFieldSerializer.java
deleted file mode 100644
index cb37d1e..0000000
--- a/guava-gwt/src/com/google/common/collect/HashMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link HashMultimap}.
- *
- * @author Jord Sonneveld
- */
-public class HashMultimap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader in, HashMultimap<?, ?> out) {}
-
-  public static HashMultimap<Object, Object> instantiate(SerializationStreamReader in)
-      throws SerializationException {
-    return (HashMultimap<Object, Object>)
-        Multimap_CustomFieldSerializerBase.populate(in, HashMultimap.create());
-  }
-
-  public static void serialize(SerializationStreamWriter out, HashMultimap<?, ?> multimap)
-      throws SerializationException {
-    Multimap_CustomFieldSerializerBase.serialize(out, multimap);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/HashMultiset_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/HashMultiset_CustomFieldSerializer.java
deleted file mode 100644
index 1244e1e..0000000
--- a/guava-gwt/src/com/google/common/collect/HashMultiset_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link HashMultiset}.
- *
- * @author Chris Povirk
- */
-public class HashMultiset_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, HashMultiset<?> instance) {}
-
-  public static HashMultiset<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return (HashMultiset<Object>)
-        Multiset_CustomFieldSerializerBase.populate(reader, HashMultiset.create());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, HashMultiset<?> instance)
-      throws SerializationException {
-    Multiset_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableBiMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableBiMap_CustomFieldSerializer.java
deleted file mode 100644
index d952317..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableBiMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ImmutableBiMap} cannot be instantiated, we still need a custom field
- * serializer to unify the type signature of {@code ImmutableBiMap[]} on server and client side.
- *
- * @author Hayward Chan
- */
-public final class ImmutableBiMap_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableEntry_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableEntry_CustomFieldSerializer.java
deleted file mode 100644
index 402c946..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableEntry_CustomFieldSerializer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ImmutableEntry}.
- *
- * @author Kyle Butt
- */
-public class ImmutableEntry_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableEntry<?, ?> instance) {}
-
-  public static ImmutableEntry<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Object key = reader.readObject();
-    Object value = reader.readObject();
-    return new ImmutableEntry<>(key, value);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableEntry<?, ?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.getKey());
-    writer.writeObject(instance.getValue());
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableEnumMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableEnumMap_CustomFieldSerializer.java
deleted file mode 100644
index 4e9b9aa..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableEnumMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,51 +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.collect;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-import java.util.Map;
-
-/**
- * This class implements the GWT serialization of {@link ImmutableEnumMap}.
- *
- * @author Louis Wasserman
- */
-public class ImmutableEnumMap_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, ImmutableEnumMap<?, ?> instance) {}
-
-  public static <K extends Enum<K>, V> ImmutableEnumMap<?, ?> instantiate(
-      SerializationStreamReader reader) throws SerializationException {
-    Map<K, V> deserialized = Maps.newHashMap();
-    Map_CustomFieldSerializerBase.deserialize(reader, deserialized);
-    /*
-     * It is safe to cast to ImmutableEnumSet because in order for it to be
-     * serialized as an ImmutableEnumSet, it must be non-empty to start
-     * with.
-     */
-    return (ImmutableEnumMap<?, ?>) Maps.immutableEnumMap(deserialized);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableEnumMap<?, ?> instance)
-      throws SerializationException {
-    Map_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableEnumSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableEnumSet_CustomFieldSerializer.java
deleted file mode 100644
index 72a414a..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableEnumSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase;
-import java.util.List;
-
-/**
- * This class implements the GWT serialization of {@link ImmutableEnumSet}.
- *
- * @author Hayward Chan
- */
-public class ImmutableEnumSet_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableEnumSet<?> instance) {}
-
-  public static <E extends Enum<E>> ImmutableEnumSet<?> instantiate(
-      SerializationStreamReader reader) throws SerializationException {
-    List<E> deserialized = Lists.newArrayList();
-    Collection_CustomFieldSerializerBase.deserialize(reader, deserialized);
-    /*
-     * It is safe to cast to ImmutableEnumSet because in order for it to be
-     * serialized as an ImmutableEnumSet, it must be non-empty to start
-     * with.
-     */
-    return (ImmutableEnumSet<?>) Sets.immutableEnumSet(deserialized);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableEnumSet<?> instance)
-      throws SerializationException {
-    Collection_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableListMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableListMultimap_CustomFieldSerializer.java
deleted file mode 100644
index 68a6176..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableListMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ImmutableListMultimap}.
- *
- * @author Chris Povirk
- */
-public class ImmutableListMultimap_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, ImmutableListMultimap<?, ?> instance) {}
-
-  public static ImmutableListMultimap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return (ImmutableListMultimap<Object, Object>)
-        Multimap_CustomFieldSerializerBase.instantiate(reader, ImmutableListMultimap.builder());
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, ImmutableListMultimap<?, ?> instance)
-      throws SerializationException {
-    Multimap_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableList_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableList_CustomFieldSerializer.java
deleted file mode 100644
index 7ccbe3b..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableList_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ImmutableList} cannot be instantiated, we still need a custom field serializer
- * to unify the type signature of {@code ImmutableList[]} on server and client side.
- *
- * @author Hayward Chan
- */
-public final class ImmutableList_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableMultiset_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableMultiset_CustomFieldSerializer.java
deleted file mode 100644
index 16086c3..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableMultiset_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ImmutableMultiset} cannot be instantiated, we still need a custom field
- * serializer to unify the type signature of {@code ImmutableMultiset[]} on server and client side.
- *
- * @author Chris Povirk
- */
-public class ImmutableMultiset_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableSetMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableSetMultimap_CustomFieldSerializer.java
deleted file mode 100644
index 3e978d5..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableSetMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Comparator;
-
-/**
- * This class implements the GWT serialization of {@link ImmutableSetMultimap}.
- *
- * @author Chris Povirk
- */
-public class ImmutableSetMultimap_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, ImmutableSetMultimap<?, ?> instance) {}
-
-  // Serialization type safety is at the caller's mercy.
-  @SuppressWarnings("unchecked")
-  public static ImmutableSetMultimap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Comparator<Object> valueComparator = (Comparator<Object>) reader.readObject();
-    ImmutableSetMultimap.Builder<Object, Object> builder = ImmutableSetMultimap.builder();
-    if (valueComparator != null) {
-      builder.orderValuesBy(valueComparator);
-    }
-    return (ImmutableSetMultimap<Object, Object>)
-        Multimap_CustomFieldSerializerBase.instantiate(reader, builder);
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, ImmutableSetMultimap<?, ?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.valueComparator());
-    Multimap_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableSet_CustomFieldSerializer.java
deleted file mode 100644
index d4c4144..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ImmutableSet} cannot be instantiated, we still need a custom field serializer
- * to unify the type signature of {@code ImmutableSet[]} on server and client side.
- *
- * @author Hayward Chan
- */
-public final class ImmutableSet_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableSortedMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableSortedMap_CustomFieldSerializer.java
deleted file mode 100644
index 215ffa6..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableSortedMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * Even though {@link ImmutableSortedMap} cannot be instantiated, we still need a custom field
- * serializer. TODO(cpovirk): why? Does it help if ensure that the GWT and non-GWT classes have the
- * same fields? Is that worth the trouble?
- *
- * @author Chris Povirk
- */
-public final class ImmutableSortedMap_CustomFieldSerializer {
-  public static void deserialize(
-      SerializationStreamReader reader, ImmutableSortedMap<?, ?> instance) {}
-
-  public static ImmutableSortedMap<?, ?> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return ImmutableSortedMap_CustomFieldSerializerBase.instantiate(reader);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableSortedMap<?, ?> instance)
-      throws SerializationException {
-    ImmutableSortedMap_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableSortedMap_CustomFieldSerializerBase.java b/guava-gwt/src/com/google/common/collect/ImmutableSortedMap_CustomFieldSerializerBase.java
deleted file mode 100644
index 06b434e..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableSortedMap_CustomFieldSerializerBase.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-import java.util.Comparator;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-/**
- * This class contains static utility methods for writing {@code ImmutableSortedMap} GWT field
- * serializers.
- *
- * @author Chris Povirk
- */
-final class ImmutableSortedMap_CustomFieldSerializerBase {
-  static ImmutableSortedMap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    /*
-     * Nothing we can do, but we're already assuming the serialized form is
-     * correctly typed, anyway.
-     */
-    @SuppressWarnings("unchecked")
-    Comparator<Object> comparator = (Comparator<Object>) reader.readObject();
-
-    SortedMap<Object, Object> entries = new TreeMap<>(comparator);
-    Map_CustomFieldSerializerBase.deserialize(reader, entries);
-
-    return ImmutableSortedMap.orderedBy(comparator).putAll(entries).build();
-  }
-
-  static void serialize(SerializationStreamWriter writer, ImmutableSortedMap<?, ?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.comparator());
-
-    Map_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-
-  private ImmutableSortedMap_CustomFieldSerializerBase() {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableSortedSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ImmutableSortedSet_CustomFieldSerializer.java
deleted file mode 100644
index 8924e9e..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableSortedSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-
-/**
- * Even though {@link ImmutableSortedSet} cannot be instantiated, we still need a custom field
- * serializer to unify the type signature of {@code ImmutableSortedSet[]} on server and client side.
- *
- * @author Hayward Chan
- */
-public final class ImmutableSortedSet_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/ImmutableTable_CustomFieldSerializerBase.java b/guava-gwt/src/com/google/common/collect/ImmutableTable_CustomFieldSerializerBase.java
deleted file mode 100644
index da2fabd..0000000
--- a/guava-gwt/src/com/google/common/collect/ImmutableTable_CustomFieldSerializerBase.java
+++ /dev/null
@@ -1,54 +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.collect;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-
-/**
- * This class contains static utility methods for writing {@link ImmutableTable} GWT field
- * serializers. Serializers should delegate to {@link #serialize} and {@link #instantiate}.
- *
- * @author Chris Povirk
- */
-final class ImmutableTable_CustomFieldSerializerBase {
-  public static ImmutableTable<Object, Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    ImmutableTable.Builder<Object, Object, Object> builder = ImmutableTable.builder();
-    int rowCount = reader.readInt();
-    for (int i = 0; i < rowCount; i++) {
-      Object rowKey = reader.readObject();
-      int colCount = reader.readInt();
-      for (int j = 0; j < colCount; j++) {
-        builder.put(rowKey, reader.readObject(), reader.readObject());
-      }
-    }
-    return builder.build();
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, ImmutableTable<Object, Object, Object> table)
-      throws SerializationException {
-    writer.writeInt(table.rowKeySet().size());
-    for (Object rowKey : table.rowKeySet()) {
-      writer.writeObject(rowKey);
-      Map_CustomFieldSerializerBase.serialize(writer, table.row(rowKey));
-    }
-  }
-
-  private ImmutableTable_CustomFieldSerializerBase() {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/IndexedImmutableSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/IndexedImmutableSet_CustomFieldSerializer.java
deleted file mode 100644
index b526995..0000000
--- a/guava-gwt/src/com/google/common/collect/IndexedImmutableSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2018 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;
-
-/**
- * Dummy serializer. Otherwise, GWT, in processing JdkBackedImmutableSet -- even though that class
- * has a custom field serializer -- would generate its own version of this class, implemented in
- * terms of calls to ImmutableSet_CustomFieldSerializer, which is itself a dummy that we've
- * provided. That produces GWT compilation errors, albeit ones that are non-fatal (even with -strict
- * on, oddly).
- */
-public final class IndexedImmutableSet_CustomFieldSerializer {}
diff --git a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableBiMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/JdkBackedImmutableBiMap_CustomFieldSerializer.java
deleted file mode 100644
index f635de5..0000000
--- a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableBiMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2018 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * This class implements the GWT serialization of {@link JdkBackedImmutableBiMap}.
- *
- * @author Louis Wasserman
- */
-public class JdkBackedImmutableBiMap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableBiMap<?, ?> instance) {}
-
-  public static ImmutableBiMap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Map<Object, Object> entries = new LinkedHashMap<>();
-    Map_CustomFieldSerializerBase.deserialize(reader, entries);
-    return ImmutableBiMap.copyOf(entries);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableBiMap<?, ?> instance)
-      throws SerializationException {
-    Map_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/JdkBackedImmutableMap_CustomFieldSerializer.java
deleted file mode 100644
index 4859931..0000000
--- a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2018 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * This class implements the GWT serialization of {@link JdkBackedImmutableMap}.
- *
- * @author Louis Wasserman
- */
-public class JdkBackedImmutableMap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableMap<?, ?> instance) {}
-
-  public static ImmutableMap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Map<Object, Object> entries = new LinkedHashMap<>();
-    Map_CustomFieldSerializerBase.deserialize(reader, entries);
-    return ImmutableMap.copyOf(entries);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableMap<?, ?> instance)
-      throws SerializationException {
-    Map_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableMultiset_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/JdkBackedImmutableMultiset_CustomFieldSerializer.java
deleted file mode 100644
index 8899446..0000000
--- a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableMultiset_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2018 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link JdkBackedImmutableMultiset}.
- *
- * @author Louis Wasserman
- */
-public class JdkBackedImmutableMultiset_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableMultiset<?> instance) {}
-
-  public static ImmutableMultiset<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return ImmutableMultiset.copyOf(
-        Multiset_CustomFieldSerializerBase.populate(reader, LinkedHashMultiset.create()));
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableMultiset<?> instance)
-      throws SerializationException {
-    Multiset_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/JdkBackedImmutableSet_CustomFieldSerializer.java
deleted file mode 100644
index a7c9564..0000000
--- a/guava-gwt/src/com/google/common/collect/JdkBackedImmutableSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2018 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase;
-import java.util.List;
-
-/**
- * This class implements the GWT serialization of {@link JdkBackedImmutableSet}.
- *
- * @author Louis Wasserman
- */
-public class JdkBackedImmutableSet_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableSet<?> instance) {}
-
-  public static ImmutableSet<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    List<Object> elements = Lists.newArrayList();
-    Collection_CustomFieldSerializerBase.deserialize(reader, elements);
-    return ImmutableSet.copyOf(elements);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableSet<?> instance)
-      throws SerializationException {
-    Collection_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/LexicographicalOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/LexicographicalOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 941194d..0000000
--- a/guava-gwt/src/com/google/common/collect/LexicographicalOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link LexicographicalOrdering}.
- *
- * @author Chris Povirk
- */
-public class LexicographicalOrdering_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, LexicographicalOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static LexicographicalOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new LexicographicalOrdering<>((Ordering<Object>) reader.readObject());
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, LexicographicalOrdering<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.elementOrder);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/LinkedHashMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/LinkedHashMultimap_CustomFieldSerializer.java
deleted file mode 100644
index ba21f4a..0000000
--- a/guava-gwt/src/com/google/common/collect/LinkedHashMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * This class implements the GWT serialization of {@link LinkedHashMultimap}.
- *
- * @author Chris Povirk
- */
-public class LinkedHashMultimap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader in, LinkedHashMultimap<?, ?> out) {}
-
-  public static LinkedHashMultimap<Object, Object> instantiate(SerializationStreamReader stream)
-      throws SerializationException {
-    LinkedHashMultimap<Object, Object> multimap = LinkedHashMultimap.create();
-
-    int distinctKeys = stream.readInt();
-    Map<Object, Collection<Object>> map = new LinkedHashMap<>();
-    for (int i = 0; i < distinctKeys; i++) {
-      Object key = stream.readObject();
-      map.put(key, multimap.createCollection(key));
-    }
-    int entries = stream.readInt();
-    for (int i = 0; i < entries; i++) {
-      Object key = stream.readObject();
-      Object value = stream.readObject();
-      map.get(key).add(value);
-    }
-    multimap.setMap(map);
-
-    return multimap;
-  }
-
-  public static void serialize(SerializationStreamWriter stream, LinkedHashMultimap<?, ?> multimap)
-      throws SerializationException {
-    stream.writeInt(multimap.keySet().size());
-    for (Object key : multimap.keySet()) {
-      stream.writeObject(key);
-    }
-    stream.writeInt(multimap.size());
-    for (Entry<?, ?> entry : multimap.entries()) {
-      stream.writeObject(entry.getKey());
-      stream.writeObject(entry.getValue());
-    }
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/LinkedHashMultiset_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/LinkedHashMultiset_CustomFieldSerializer.java
deleted file mode 100644
index 934bc69..0000000
--- a/guava-gwt/src/com/google/common/collect/LinkedHashMultiset_CustomFieldSerializer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link LinkedHashMultiset}.
- *
- * @author Chris Povirk
- */
-public class LinkedHashMultiset_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, LinkedHashMultiset<?> instance) {}
-
-  public static LinkedHashMultiset<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return (LinkedHashMultiset<Object>)
-        Multiset_CustomFieldSerializerBase.populate(reader, LinkedHashMultiset.create());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, LinkedHashMultiset<?> instance)
-      throws SerializationException {
-    Multiset_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/LinkedListMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/LinkedListMultimap_CustomFieldSerializer.java
deleted file mode 100644
index 8441529..0000000
--- a/guava-gwt/src/com/google/common/collect/LinkedListMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Map.Entry;
-
-/**
- * This class implements the GWT serialization of {@link LinkedListMultimap}.
- *
- * @author Chris Povirk
- */
-public class LinkedListMultimap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader in, LinkedListMultimap<?, ?> out) {}
-
-  public static LinkedListMultimap<Object, Object> instantiate(SerializationStreamReader in)
-      throws SerializationException {
-    LinkedListMultimap<Object, Object> multimap = LinkedListMultimap.create();
-    int size = in.readInt();
-    for (int i = 0; i < size; i++) {
-      Object key = in.readObject();
-      Object value = in.readObject();
-      multimap.put(key, value);
-    }
-    return multimap;
-  }
-
-  public static void serialize(SerializationStreamWriter out, LinkedListMultimap<?, ?> multimap)
-      throws SerializationException {
-    out.writeInt(multimap.size());
-    for (Entry<?, ?> entry : multimap.entries()) {
-      out.writeObject(entry.getKey());
-      out.writeObject(entry.getValue());
-    }
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/Multimap_CustomFieldSerializerBase.java b/guava-gwt/src/com/google/common/collect/Multimap_CustomFieldSerializerBase.java
deleted file mode 100644
index 31a0483..0000000
--- a/guava-gwt/src/com/google/common/collect/Multimap_CustomFieldSerializerBase.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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 com.google.errorprone.annotations.CanIgnoreReturnValue;
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Collection;
-import java.util.Map.Entry;
-
-/**
- * This class contains static utility methods for writing {@code Multimap} GWT field serializers.
- * Serializers should delegate to {@link #serialize(SerializationStreamWriter, Multimap)} and to
- * either {@link #instantiate(SerializationStreamReader, ImmutableMultimap.Builder)} or {@link
- * #populate(SerializationStreamReader, Multimap)}.
- *
- * @author Chris Povirk
- */
-public final class Multimap_CustomFieldSerializerBase {
-
-  static ImmutableMultimap<Object, Object> instantiate(
-      SerializationStreamReader reader, ImmutableMultimap.Builder<Object, Object> builder)
-      throws SerializationException {
-    int keyCount = reader.readInt();
-    for (int i = 0; i < keyCount; ++i) {
-      Object key = reader.readObject();
-      int valueCount = reader.readInt();
-      for (int j = 0; j < valueCount; ++j) {
-        Object value = reader.readObject();
-        builder.put(key, value);
-      }
-    }
-    return builder.build();
-  }
-
-  @CanIgnoreReturnValue
-  public static Multimap<Object, Object> populate(
-      SerializationStreamReader reader, Multimap<Object, Object> multimap)
-      throws SerializationException {
-    int keyCount = reader.readInt();
-    for (int i = 0; i < keyCount; ++i) {
-      Object key = reader.readObject();
-      int valueCount = reader.readInt();
-      for (int j = 0; j < valueCount; ++j) {
-        Object value = reader.readObject();
-        multimap.put(key, value);
-      }
-    }
-    return multimap;
-  }
-
-  public static void serialize(SerializationStreamWriter writer, Multimap<?, ?> instance)
-      throws SerializationException {
-    writer.writeInt(instance.asMap().size());
-    for (Entry<?, ? extends Collection<?>> entry : instance.asMap().entrySet()) {
-      writer.writeObject(entry.getKey());
-      writer.writeInt(entry.getValue().size());
-      for (Object value : entry.getValue()) {
-        writer.writeObject(value);
-      }
-    }
-  }
-
-  private Multimap_CustomFieldSerializerBase() {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/Multiset_CustomFieldSerializerBase.java b/guava-gwt/src/com/google/common/collect/Multiset_CustomFieldSerializerBase.java
deleted file mode 100644
index d03ed67..0000000
--- a/guava-gwt/src/com/google/common/collect/Multiset_CustomFieldSerializerBase.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class contains static utility methods for writing {@code Multiset} GWT field serializers.
- * Serializers should delegate to {@link #serialize(SerializationStreamWriter, Multiset)} and {@link
- * #populate(SerializationStreamReader, Multiset)}.
- *
- * @author Chris Povirk
- */
-final class Multiset_CustomFieldSerializerBase {
-
-  static Multiset<Object> populate(SerializationStreamReader reader, Multiset<Object> multiset)
-      throws SerializationException {
-    int distinctElements = reader.readInt();
-    for (int i = 0; i < distinctElements; i++) {
-      Object element = reader.readObject();
-      int count = reader.readInt();
-      multiset.add(element, count);
-    }
-    return multiset;
-  }
-
-  static void serialize(SerializationStreamWriter writer, Multiset<?> instance)
-      throws SerializationException {
-    int entryCount = instance.entrySet().size();
-    writer.writeInt(entryCount);
-    for (Multiset.Entry<?> entry : instance.entrySet()) {
-      writer.writeObject(entry.getElement());
-      writer.writeInt(entry.getCount());
-    }
-  }
-
-  private Multiset_CustomFieldSerializerBase() {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/NaturalOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/NaturalOrdering_CustomFieldSerializer.java
deleted file mode 100644
index e75655c..0000000
--- a/guava-gwt/src/com/google/common/collect/NaturalOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link NaturalOrdering}.
- *
- * @author Chris Povirk
- */
-public class NaturalOrdering_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, NaturalOrdering instance) {}
-
-  public static NaturalOrdering instantiate(SerializationStreamReader reader) {
-    return NaturalOrdering.INSTANCE;
-  }
-
-  public static void serialize(SerializationStreamWriter writer, NaturalOrdering instance) {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/NullsFirstOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/NullsFirstOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 47dac6f..0000000
--- a/guava-gwt/src/com/google/common/collect/NullsFirstOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link NullsFirstOrdering}.
- *
- * @author Chris Povirk
- */
-public class NullsFirstOrdering_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, NullsFirstOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static NullsFirstOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new NullsFirstOrdering<>((Ordering<Object>) reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, NullsFirstOrdering<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.ordering);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/NullsLastOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/NullsLastOrdering_CustomFieldSerializer.java
deleted file mode 100644
index a850494..0000000
--- a/guava-gwt/src/com/google/common/collect/NullsLastOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link NullsLastOrdering}.
- *
- * @author Chris Povirk
- */
-public class NullsLastOrdering_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, NullsLastOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static NullsLastOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new NullsLastOrdering<>((Ordering<Object>) reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, NullsLastOrdering<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.ordering);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/Range_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/Range_CustomFieldSerializer.java
deleted file mode 100644
index 18c945e..0000000
--- a/guava-gwt/src/com/google/common/collect/Range_CustomFieldSerializer.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2016 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link Range}.
- *
- * @author Dean de Bree
- */
-public class Range_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, Range<?> instance) {}
-
-  public static Range<?> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-
-    Cut lowerBound;
-    boolean hasLowerBound = reader.readBoolean();
-    if (hasLowerBound) {
-      boolean lowerIsClosed = reader.readBoolean();
-      Comparable lower = (Comparable) reader.readObject();
-
-      lowerBound = lowerIsClosed ? Cut.belowValue(lower) : Cut.aboveValue(lower);
-    } else {
-      lowerBound = Cut.belowAll();
-    }
-
-    Cut upperBound;
-    boolean hasUpperBound = reader.readBoolean();
-    if (hasUpperBound) {
-      boolean upperIsClosed = reader.readBoolean();
-      Comparable upper = (Comparable) reader.readObject();
-
-      upperBound = upperIsClosed ? Cut.aboveValue(upper) : Cut.belowValue(upper);
-    } else {
-      upperBound = Cut.aboveAll();
-    }
-
-    return Range.create(lowerBound, upperBound);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, Range<?> instance)
-      throws SerializationException {
-
-    if (instance.hasLowerBound()) {
-      writer.writeBoolean(true);
-      writer.writeBoolean(instance.lowerBoundType() == BoundType.CLOSED);
-      writer.writeObject(instance.lowerEndpoint());
-    } else {
-      writer.writeBoolean(false);
-    }
-
-    if (instance.hasUpperBound()) {
-      writer.writeBoolean(true);
-      writer.writeBoolean(instance.upperBoundType() == BoundType.CLOSED);
-      writer.writeObject(instance.upperEndpoint());
-    } else {
-      writer.writeBoolean(false);
-    }
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableAsList_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableAsList_CustomFieldSerializer.java
deleted file mode 100644
index f203602..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableAsList_CustomFieldSerializer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase;
-import java.util.ArrayList;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableAsList}.
- *
- * @author Hayward Chan
- */
-@GwtCompatible(emulated = true)
-public class RegularImmutableAsList_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, RegularImmutableAsList<?> instance) {}
-
-  public static RegularImmutableAsList<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    ArrayList<Object> elements = new ArrayList<>();
-    Collection_CustomFieldSerializerBase.deserialize(reader, elements);
-    ImmutableList<Object> delegate = ImmutableList.copyOf(elements);
-    return new RegularImmutableAsList<>(delegate, delegate);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, RegularImmutableAsList<?> instance)
-      throws SerializationException {
-    Collection_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableBiMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableBiMap_CustomFieldSerializer.java
deleted file mode 100644
index a8ec71f..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableBiMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableBiMap}.
- *
- * @author Chris Povirk
- */
-public class RegularImmutableBiMap_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, ImmutableBiMap<?, ?> instance) {}
-
-  public static ImmutableBiMap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Map<Object, Object> entries = new LinkedHashMap<>();
-    Map_CustomFieldSerializerBase.deserialize(reader, entries);
-    return ImmutableBiMap.copyOf(entries);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableBiMap<?, ?> instance)
-      throws SerializationException {
-    Map_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableList_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableList_CustomFieldSerializer.java
deleted file mode 100644
index 02b8d20..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableList_CustomFieldSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableList}.
- *
- * @author Hayward Chan
- */
-public class RegularImmutableList_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, RegularImmutableList<?> instance) {}
-
-  public static RegularImmutableList<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    List<Object> elements = new ArrayList<>();
-    Collection_CustomFieldSerializerBase.deserialize(reader, elements);
-    /*
-     * For this custom field serializer to be invoked, the list must have been
-     * RegularImmutableList before it's serialized.  Since RegularImmutableList
-     * always have one or more elements, ImmutableList.copyOf always return
-     * a RegularImmutableList back.
-     */
-    return (RegularImmutableList<Object>) ImmutableList.copyOf(elements);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, RegularImmutableList<?> instance)
-      throws SerializationException {
-    Collection_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableMap_CustomFieldSerializer.java
deleted file mode 100644
index 283caf4..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Map_CustomFieldSerializerBase;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableMap}.
- *
- * @author Hayward Chan
- */
-public class RegularImmutableMap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableMap<?, ?> instance) {}
-
-  public static ImmutableMap<Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Map<Object, Object> entries = new LinkedHashMap<>();
-    Map_CustomFieldSerializerBase.deserialize(reader, entries);
-    return ImmutableMap.copyOf(entries);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableMap<?, ?> instance)
-      throws SerializationException {
-    Map_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableMultiset_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableMultiset_CustomFieldSerializer.java
deleted file mode 100644
index 96390db..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableMultiset_CustomFieldSerializer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2011 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableMultiset}.
- *
- * @author Louis Wasserman
- */
-public class RegularImmutableMultiset_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, ImmutableMultiset<?> instance) {}
-
-  public static ImmutableMultiset<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return ImmutableMultiset.copyOf(
-        Multiset_CustomFieldSerializerBase.populate(reader, LinkedHashMultiset.create()));
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableMultiset<?> instance)
-      throws SerializationException {
-    Multiset_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableSet_CustomFieldSerializer.java
deleted file mode 100644
index be88c42..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase;
-import java.util.List;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableSet}.
- *
- * @author Hayward Chan
- */
-public class RegularImmutableSet_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ImmutableSet<?> instance) {}
-
-  public static ImmutableSet<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    List<Object> elements = Lists.newArrayList();
-    Collection_CustomFieldSerializerBase.deserialize(reader, elements);
-    return ImmutableSet.copyOf(elements);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ImmutableSet<?> instance)
-      throws SerializationException {
-    Collection_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/RegularImmutableSortedSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/RegularImmutableSortedSet_CustomFieldSerializer.java
deleted file mode 100644
index facf312..0000000
--- a/guava-gwt/src/com/google/common/collect/RegularImmutableSortedSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * This class implements the GWT serialization of {@link RegularImmutableSortedSet}.
- *
- * @author Chris Povirk
- */
-public class RegularImmutableSortedSet_CustomFieldSerializer {
-  public static void deserialize(
-      SerializationStreamReader reader, RegularImmutableSortedSet<?> instance) {}
-
-  public static RegularImmutableSortedSet<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    /*
-     * Nothing we can do, but we're already assuming the serialized form is
-     * correctly typed, anyway.
-     */
-    @SuppressWarnings("unchecked")
-    Comparator<Object> comparator = (Comparator<Object>) reader.readObject();
-
-    List<Object> elements = new ArrayList<>();
-    Collection_CustomFieldSerializerBase.deserialize(reader, elements);
-    /*
-     * For this custom field serializer to be invoked, the set must have been
-     * RegularImmutableSortedSet before it's serialized. Since
-     * RegularImmutableSortedSet always have one or more elements,
-     * ImmutableSortedSet.copyOf always return a RegularImmutableSortedSet back.
-     */
-    return (RegularImmutableSortedSet<Object>) ImmutableSortedSet.copyOf(comparator, elements);
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, RegularImmutableSortedSet<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.comparator());
-
-    Collection_CustomFieldSerializerBase.serialize(writer, instance);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/ReverseNaturalOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ReverseNaturalOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 0ad9464..0000000
--- a/guava-gwt/src/com/google/common/collect/ReverseNaturalOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ReverseNaturalOrdering}.
- *
- * @author Chris Povirk
- */
-public class ReverseNaturalOrdering_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, ReverseNaturalOrdering instance) {}
-
-  public static ReverseNaturalOrdering instantiate(SerializationStreamReader reader) {
-    return ReverseNaturalOrdering.INSTANCE;
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ReverseNaturalOrdering instance) {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/ReverseOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/ReverseOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 7b3ecd7..0000000
--- a/guava-gwt/src/com/google/common/collect/ReverseOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link ReverseOrdering}.
- *
- * @author Chris Povirk
- */
-public class ReverseOrdering_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader reader, ReverseOrdering<?> instance) {}
-
-  @SuppressWarnings("unchecked") // deserialization is unsafe
-  public static ReverseOrdering<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return new ReverseOrdering<>((Ordering<Object>) reader.readObject());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, ReverseOrdering<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.forwardOrder);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/SingletonImmutableBiMap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/SingletonImmutableBiMap_CustomFieldSerializer.java
deleted file mode 100644
index 89fe8ff..0000000
--- a/guava-gwt/src/com/google/common/collect/SingletonImmutableBiMap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link SingletonImmutableBiMap}.
- *
- * @author Chris Povirk
- */
-public class SingletonImmutableBiMap_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, SingletonImmutableBiMap<?, ?> instance) {}
-
-  public static SingletonImmutableBiMap<Object, Object> instantiate(
-      SerializationStreamReader reader) throws SerializationException {
-    Object key = checkNotNull(reader.readObject());
-    Object value = checkNotNull(reader.readObject());
-    return new SingletonImmutableBiMap<>(key, value);
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, SingletonImmutableBiMap<?, ?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.singleKey);
-    writer.writeObject(instance.singleValue);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/SingletonImmutableList_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/SingletonImmutableList_CustomFieldSerializer.java
deleted file mode 100644
index b2a549d..0000000
--- a/guava-gwt/src/com/google/common/collect/SingletonImmutableList_CustomFieldSerializer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link SingletonImmutableList}.
- *
- * @author Chris Povirk
- */
-public class SingletonImmutableList_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, SingletonImmutableList<?> instance) {}
-
-  public static SingletonImmutableList<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Object element = reader.readObject();
-    return new SingletonImmutableList<>(element);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, SingletonImmutableList<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.element);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/SingletonImmutableSet_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/SingletonImmutableSet_CustomFieldSerializer.java
deleted file mode 100644
index 711a51c..0000000
--- a/guava-gwt/src/com/google/common/collect/SingletonImmutableSet_CustomFieldSerializer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link SingletonImmutableSet}.
- *
- * @author Hayward Chan
- */
-public class SingletonImmutableSet_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, SingletonImmutableSet<?> instance) {}
-
-  public static SingletonImmutableSet<Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    Object element = reader.readObject();
-    return new SingletonImmutableSet<>(element);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, SingletonImmutableSet<?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.element);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/SingletonImmutableTable_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/SingletonImmutableTable_CustomFieldSerializer.java
deleted file mode 100644
index 13413d8..0000000
--- a/guava-gwt/src/com/google/common/collect/SingletonImmutableTable_CustomFieldSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link SingletonImmutableTable}.
- *
- * @author Chris Povirk
- */
-public class SingletonImmutableTable_CustomFieldSerializer {
-  public static void deserialize(
-      SerializationStreamReader reader, SingletonImmutableTable<?, ?, ?> instance) {}
-
-  public static SingletonImmutableTable<Object, Object, Object> instantiate(
-      SerializationStreamReader reader) throws SerializationException {
-    Object rowKey = reader.readObject();
-    Object columnKey = reader.readObject();
-    Object value = reader.readObject();
-    return new SingletonImmutableTable<>(rowKey, columnKey, value);
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, SingletonImmutableTable<?, ?, ?> instance)
-      throws SerializationException {
-    writer.writeObject(instance.singleRowKey);
-    writer.writeObject(instance.singleColumnKey);
-    writer.writeObject(instance.singleValue);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/SparseImmutableTable_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/SparseImmutableTable_CustomFieldSerializer.java
deleted file mode 100644
index 571ddd1..0000000
--- a/guava-gwt/src/com/google/common/collect/SparseImmutableTable_CustomFieldSerializer.java
+++ /dev/null
@@ -1,41 +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.collect;
-
-import com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link SparseImmutableTable}.
- *
- * @author Chris Povirk
- */
-public class SparseImmutableTable_CustomFieldSerializer {
-  public static void deserialize(
-      SerializationStreamReader reader, SparseImmutableTable<?, ?, ?> instance) {}
-
-  public static SparseImmutableTable<Object, Object, Object> instantiate(
-      SerializationStreamReader reader) throws SerializationException {
-    return (SparseImmutableTable<Object, Object, Object>)
-        ImmutableTable_CustomFieldSerializerBase.instantiate(reader);
-  }
-
-  public static void serialize(
-      SerializationStreamWriter writer, SparseImmutableTable<Object, Object, Object> table)
-      throws SerializationException {
-    ImmutableTable_CustomFieldSerializerBase.serialize(writer, table);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/Table_CustomFieldSerializerBase.java b/guava-gwt/src/com/google/common/collect/Table_CustomFieldSerializerBase.java
deleted file mode 100644
index cd857d1..0000000
--- a/guava-gwt/src/com/google/common/collect/Table_CustomFieldSerializerBase.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * This class contains static utility methods for writing {@link Table} GWT field serializers.
- * Serializers should delegate to {@link #serialize} and {@link #populate}.
- *
- * <p>For {@link ImmutableTable}, see {@link ImmutableTable_CustomFieldSerializerBase}.
- *
- * @author Chris Povirk
- */
-final class Table_CustomFieldSerializerBase {
-  static <T extends StandardTable<Object, Object, Object>> T populate(
-      SerializationStreamReader reader, T table) throws SerializationException {
-    Map<?, ?> hashMap = (Map<?, ?>) reader.readObject();
-    for (Entry<?, ?> row : hashMap.entrySet()) {
-      table.row(row.getKey()).putAll((Map<?, ?>) row.getValue());
-    }
-    return table;
-  }
-
-  static void serialize(SerializationStreamWriter writer, StandardTable<?, ?, ?> table)
-      throws SerializationException {
-    /*
-     * The backing map of a {Hash,Tree}BasedTable is a {Hash,Tree}Map of {Hash,Tree}Maps. Therefore,
-     * the backing map is serializable (assuming that the row, column and values, along with any
-     * comparators, are all serializable).
-     */
-    writer.writeObject(table.backingMap);
-  }
-
-  private Table_CustomFieldSerializerBase() {}
-}
diff --git a/guava-gwt/src/com/google/common/collect/TreeBasedTable_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/TreeBasedTable_CustomFieldSerializer.java
deleted file mode 100644
index 7258b2a..0000000
--- a/guava-gwt/src/com/google/common/collect/TreeBasedTable_CustomFieldSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Comparator;
-
-/**
- * This class implements the GWT serialization of {@link TreeBasedTable}.
- *
- * @author Hayward Chan
- */
-public class TreeBasedTable_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, TreeBasedTable<?, ?, ?> table) {}
-
-  public static TreeBasedTable<Object, Object, Object> instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    @SuppressWarnings("unchecked") // The comparator isn't used statically.
-    Comparator<Object> rowComparator = (Comparator<Object>) reader.readObject();
-    @SuppressWarnings("unchecked") // The comparator isn't used statically.
-    Comparator<Object> columnComparator = (Comparator<Object>) reader.readObject();
-
-    TreeBasedTable<Object, Object, Object> table =
-        TreeBasedTable.create(rowComparator, columnComparator);
-    return Table_CustomFieldSerializerBase.populate(reader, table);
-  }
-
-  public static void serialize(SerializationStreamWriter writer, TreeBasedTable<?, ?, ?> table)
-      throws SerializationException {
-    writer.writeObject(table.rowComparator());
-    writer.writeObject(table.columnComparator());
-    Table_CustomFieldSerializerBase.serialize(writer, table);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/TreeMultimap_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/TreeMultimap_CustomFieldSerializer.java
deleted file mode 100644
index 1cb961c..0000000
--- a/guava-gwt/src/com/google/common/collect/TreeMultimap_CustomFieldSerializer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-import java.util.Comparator;
-
-/**
- * This class implements the GWT serialization of {@link TreeMultimap}.
- *
- * @author Nikhil Singhal
- */
-public class TreeMultimap_CustomFieldSerializer {
-
-  public static void deserialize(SerializationStreamReader in, TreeMultimap<?, ?> out) {}
-
-  @SuppressWarnings("unchecked")
-  public static TreeMultimap<Object, Object> instantiate(SerializationStreamReader in)
-      throws SerializationException {
-    Comparator<Object> keyComparator = (Comparator<Object>) in.readObject();
-    Comparator<Object> valueComparator = (Comparator<Object>) in.readObject();
-
-    return (TreeMultimap<Object, Object>)
-        Multimap_CustomFieldSerializerBase.populate(
-            in, TreeMultimap.create(keyComparator, valueComparator));
-  }
-
-  public static void serialize(SerializationStreamWriter out, TreeMultimap<?, ?> multimap)
-      throws SerializationException {
-    out.writeObject(multimap.keyComparator());
-    out.writeObject(multimap.valueComparator());
-    Multimap_CustomFieldSerializerBase.serialize(out, multimap);
-  }
-}
diff --git a/guava-gwt/src/com/google/common/collect/UsingToStringOrdering_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/collect/UsingToStringOrdering_CustomFieldSerializer.java
deleted file mode 100644
index 54a9e15..0000000
--- a/guava-gwt/src/com/google/common/collect/UsingToStringOrdering_CustomFieldSerializer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@link UsingToStringOrdering}.
- *
- * @author Chris Povirk
- */
-public class UsingToStringOrdering_CustomFieldSerializer {
-
-  public static void deserialize(
-      SerializationStreamReader reader, UsingToStringOrdering instance) {}
-
-  public static UsingToStringOrdering instantiate(SerializationStreamReader reader) {
-    return UsingToStringOrdering.INSTANCE;
-  }
-
-  public static void serialize(SerializationStreamWriter writer, UsingToStringOrdering instance) {}
-}
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 1284122..d04c253 100644
--- a/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
+++ b/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
@@ -14,8 +14,11 @@
   <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"/>
    
+  <inherits name="com.google.common.base.Base"/>
+     
+  <inherits name="com.google.gwt.core.Core"/>
+    
 </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 8ab917e..143da9b 100644
--- a/guava-gwt/src/com/google/common/html/Html.gwt.xml
+++ b/guava-gwt/src/com/google/common/html/Html.gwt.xml
@@ -14,8 +14,11 @@
   <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"/>
    
 </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 cc1193a..7790655 100644
--- a/guava-gwt/src/com/google/common/io/Io.gwt.xml
+++ b/guava-gwt/src/com/google/common/io/Io.gwt.xml
@@ -14,10 +14,15 @@
   <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"/>
    
+  <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"/>
+    
 </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 11314f7..f5f9879 100644
--- a/guava-gwt/src/com/google/common/math/Math.gwt.xml
+++ b/guava-gwt/src/com/google/common/math/Math.gwt.xml
@@ -14,9 +14,13 @@
   <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"/>
    
+  <inherits name="com.google.common.base.Base"/>
+   
+  <inherits name="com.google.common.primitives.Primitives"/>
+     
+  <inherits name="com.google.gwt.core.Core"/>
+    
 </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 8e09522..19a6cb6 100644
--- a/guava-gwt/src/com/google/common/net/Net.gwt.xml
+++ b/guava-gwt/src/com/google/common/net/Net.gwt.xml
@@ -14,13 +14,21 @@
   <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"/>
    
+  <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"/>
+    
 </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 4200ce4..505f45c 100644
--- a/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
+++ b/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
@@ -14,9 +14,13 @@
   <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"/>
    
 </module>
diff --git a/guava-gwt/src/com/google/common/primitives/UnsignedLong_CustomFieldSerializer.java b/guava-gwt/src/com/google/common/primitives/UnsignedLong_CustomFieldSerializer.java
deleted file mode 100644
index 0640320..0000000
--- a/guava-gwt/src/com/google/common/primitives/UnsignedLong_CustomFieldSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2011 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 com.google.gwt.user.client.rpc.SerializationException;
-import com.google.gwt.user.client.rpc.SerializationStreamReader;
-import com.google.gwt.user.client.rpc.SerializationStreamWriter;
-
-/**
- * This class implements the GWT serialization of {@code UnsignedLong}.
- *
- * @author Louis Wasserman
- */
-public class UnsignedLong_CustomFieldSerializer {
-  public static void deserialize(SerializationStreamReader reader, UnsignedLong instance) {}
-
-  public static UnsignedLong instantiate(SerializationStreamReader reader)
-      throws SerializationException {
-    return UnsignedLong.fromLongBits(reader.readLong());
-  }
-
-  public static void serialize(SerializationStreamWriter writer, UnsignedLong instance)
-      throws SerializationException {
-    writer.writeLong(instance.longValue());
-  }
-}
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 398ee57..e80620d 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
@@ -14,9 +14,15 @@
   <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"/>
    
 </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 7e6cebe..d00c0ed 100644
--- a/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
+++ b/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
@@ -14,9 +14,13 @@
   <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"/>
    
 </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 4944618..d5dd290 100644
--- a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
+++ b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
@@ -20,5 +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" />
+<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" />
 </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 b4f1c4f..ffbcaf1 100644
--- a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
+++ b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
@@ -20,5 +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" />
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.gwt.core.Core" />
 </module>
diff --git a/guava-gwt/test/com/google/common/base/AbstractIteratorTest_gwt.java b/guava-gwt/test/com/google/common/base/AbstractIteratorTest_gwt.java
deleted file mode 100644
index 7405a26..0000000
--- a/guava-gwt/test/com/google/common/base/AbstractIteratorTest_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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;
-public class AbstractIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCantRemove() throws Exception {
-  com.google.common.base.AbstractIteratorTest testCase = new com.google.common.base.AbstractIteratorTest();
-  testCase.testCantRemove();
-}
-
-public void testDefaultBehaviorOfNextAndHasNext() throws Exception {
-  com.google.common.base.AbstractIteratorTest testCase = new com.google.common.base.AbstractIteratorTest();
-  testCase.testDefaultBehaviorOfNextAndHasNext();
-}
-
-public void testException() throws Exception {
-  com.google.common.base.AbstractIteratorTest testCase = new com.google.common.base.AbstractIteratorTest();
-  testCase.testException();
-}
-
-public void testExceptionAfterEndOfData() throws Exception {
-  com.google.common.base.AbstractIteratorTest testCase = new com.google.common.base.AbstractIteratorTest();
-  testCase.testExceptionAfterEndOfData();
-}
-
-public void testReentrantHasNext() throws Exception {
-  com.google.common.base.AbstractIteratorTest testCase = new com.google.common.base.AbstractIteratorTest();
-  testCase.testReentrantHasNext();
-}
-
-public void testSneakyThrow() throws Exception {
-  com.google.common.base.AbstractIteratorTest testCase = new com.google.common.base.AbstractIteratorTest();
-  testCase.testSneakyThrow();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/AsciiTest_gwt.java b/guava-gwt/test/com/google/common/base/AsciiTest_gwt.java
deleted file mode 100644
index e33c6c7..0000000
--- a/guava-gwt/test/com/google/common/base/AsciiTest_gwt.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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;
-public class AsciiTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCharsIgnored() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testCharsIgnored();
-}
-
-public void testCharsLower() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testCharsLower();
-}
-
-public void testCharsUpper() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testCharsUpper();
-}
-
-public void testEqualsIgnoreCase() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testEqualsIgnoreCase();
-}
-
-public void testToLowerCase() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testToLowerCase();
-}
-
-public void testToUpperCase() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testToUpperCase();
-}
-
-public void testTruncate() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testTruncate();
-}
-
-public void testTruncateIllegalArguments() throws Exception {
-  com.google.common.base.AsciiTest testCase = new com.google.common.base.AsciiTest();
-  testCase.testTruncateIllegalArguments();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/CaseFormatTest_gwt.java b/guava-gwt/test/com/google/common/base/CaseFormatTest_gwt.java
deleted file mode 100644
index f48ed5d..0000000
--- a/guava-gwt/test/com/google/common/base/CaseFormatTest_gwt.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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;
-public class CaseFormatTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testConverterToBackward() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testConverterToBackward();
-}
-
-public void testConverterToForward() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testConverterToForward();
-}
-
-public void testConverter_nullConversions() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testConverter_nullConversions();
-}
-
-public void testConverter_serialization() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testConverter_serialization();
-}
-
-public void testConverter_toString() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testConverter_toString();
-}
-
-public void testIdentity() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testIdentity();
-}
-
-public void testLowerCamelToLowerCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerCamelToLowerCamel();
-}
-
-public void testLowerCamelToLowerHyphen() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerCamelToLowerHyphen();
-}
-
-public void testLowerCamelToLowerUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerCamelToLowerUnderscore();
-}
-
-public void testLowerCamelToUpperCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerCamelToUpperCamel();
-}
-
-public void testLowerCamelToUpperUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerCamelToUpperUnderscore();
-}
-
-public void testLowerHyphenToLowerCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerHyphenToLowerCamel();
-}
-
-public void testLowerHyphenToLowerHyphen() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerHyphenToLowerHyphen();
-}
-
-public void testLowerHyphenToLowerUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerHyphenToLowerUnderscore();
-}
-
-public void testLowerHyphenToUpperCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerHyphenToUpperCamel();
-}
-
-public void testLowerHyphenToUpperUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerHyphenToUpperUnderscore();
-}
-
-public void testLowerUnderscoreToLowerCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerUnderscoreToLowerCamel();
-}
-
-public void testLowerUnderscoreToLowerHyphen() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerUnderscoreToLowerHyphen();
-}
-
-public void testLowerUnderscoreToLowerUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerUnderscoreToLowerUnderscore();
-}
-
-public void testLowerUnderscoreToUpperCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerUnderscoreToUpperCamel();
-}
-
-public void testLowerUnderscoreToUpperUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testLowerUnderscoreToUpperUnderscore();
-}
-
-public void testUpperCamelToLowerCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperCamelToLowerCamel();
-}
-
-public void testUpperCamelToLowerHyphen() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperCamelToLowerHyphen();
-}
-
-public void testUpperCamelToLowerUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperCamelToLowerUnderscore();
-}
-
-public void testUpperCamelToUpperCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperCamelToUpperCamel();
-}
-
-public void testUpperCamelToUpperUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperCamelToUpperUnderscore();
-}
-
-public void testUpperUnderscoreToLowerCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperUnderscoreToLowerCamel();
-}
-
-public void testUpperUnderscoreToLowerHyphen() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperUnderscoreToLowerHyphen();
-}
-
-public void testUpperUnderscoreToLowerUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperUnderscoreToLowerUnderscore();
-}
-
-public void testUpperUnderscoreToUpperCamel() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperUnderscoreToUpperCamel();
-}
-
-public void testUpperUnderscoreToUpperUnderscore() throws Exception {
-  com.google.common.base.CaseFormatTest testCase = new com.google.common.base.CaseFormatTest();
-  testCase.testUpperUnderscoreToUpperUnderscore();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/CharMatcherTest_gwt.java b/guava-gwt/test/com/google/common/base/CharMatcherTest_gwt.java
deleted file mode 100644
index 95b8d03..0000000
--- a/guava-gwt/test/com/google/common/base/CharMatcherTest_gwt.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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;
-public class CharMatcherTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testAllMatches() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testAllMatches();
-}
-
-public void testAnyAndNone_logicalOps() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testAnyAndNone_logicalOps();
-}
-
-public void testCollapse() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testCollapse();
-}
-
-public void testCollapse_any() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testCollapse_any();
-}
-
-public void testEmpty() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testEmpty();
-}
-
-public void testGeneral() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testGeneral();
-}
-
-public void testNoMatches() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testNoMatches();
-}
-
-public void testPrecomputedOptimizations() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testPrecomputedOptimizations();
-}
-
-public void testReplaceFrom() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testReplaceFrom();
-}
-
-public void testToString() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testToString();
-}
-
-public void testTrimAndCollapse() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testTrimAndCollapse();
-}
-
-public void testTrimFrom() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testTrimFrom();
-}
-
-public void testTrimLeadingFrom() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testTrimLeadingFrom();
-}
-
-public void testTrimTrailingFrom() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testTrimTrailingFrom();
-}
-
-public void testWhitespaceBreakingWhitespaceSubset() throws Exception {
-  com.google.common.base.CharMatcherTest testCase = new com.google.common.base.CharMatcherTest();
-  testCase.testWhitespaceBreakingWhitespaceSubset();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/CharsetsTest_gwt.java b/guava-gwt/test/com/google/common/base/CharsetsTest_gwt.java
deleted file mode 100644
index 5cc3767..0000000
--- a/guava-gwt/test/com/google/common/base/CharsetsTest_gwt.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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;
-public class CharsetsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testUtf8() throws Exception {
-  com.google.common.base.CharsetsTest testCase = new com.google.common.base.CharsetsTest();
-  testCase.testUtf8();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/ConverterTest_gwt.java b/guava-gwt/test/com/google/common/base/ConverterTest_gwt.java
deleted file mode 100644
index ae47a8e..0000000
--- a/guava-gwt/test/com/google/common/base/ConverterTest_gwt.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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;
-public class ConverterTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testAndThen() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testAndThen();
-}
-
-public void testApply() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testApply();
-}
-
-public void testConvertAllIsView() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testConvertAllIsView();
-}
-
-public void testConverter() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testConverter();
-}
-
-public void testFrom() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testFrom();
-}
-
-public void testIdentityConverter() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testIdentityConverter();
-}
-
-public void testNullIsNotPassedThrough() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testNullIsNotPassedThrough();
-}
-
-public void testNullIsPassedThrough() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testNullIsPassedThrough();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testReverse();
-}
-
-public void testReverseReverse() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testReverseReverse();
-}
-
-public void testSerialization_andThen() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testSerialization_andThen();
-}
-
-public void testSerialization_from() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testSerialization_from();
-}
-
-public void testSerialization_identity() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testSerialization_identity();
-}
-
-public void testSerialization_reverse() throws Exception {
-  com.google.common.base.ConverterTest testCase = new com.google.common.base.ConverterTest();
-  testCase.testSerialization_reverse();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/EnumsTest_gwt.java b/guava-gwt/test/com/google/common/base/EnumsTest_gwt.java
deleted file mode 100644
index 40d81a5..0000000
--- a/guava-gwt/test/com/google/common/base/EnumsTest_gwt.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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;
-public class EnumsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testGetIfPresent() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testGetIfPresent();
-}
-
-public void testGetIfPresent_caseSensitive() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testGetIfPresent_caseSensitive();
-}
-
-public void testGetIfPresent_whenNoMatchingConstant() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testGetIfPresent_whenNoMatchingConstant();
-}
-
-public void testStringConverter_convert() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testStringConverter_convert();
-}
-
-public void testStringConverter_convertError() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testStringConverter_convertError();
-}
-
-public void testStringConverter_nullConversions() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testStringConverter_nullConversions();
-}
-
-public void testStringConverter_reverse() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testStringConverter_reverse();
-}
-
-public void testStringConverter_serialization() throws Exception {
-  com.google.common.base.EnumsTest testCase = new com.google.common.base.EnumsTest();
-  testCase.testStringConverter_serialization();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/EquivalenceTest_gwt.java b/guava-gwt/test/com/google/common/base/EquivalenceTest_gwt.java
deleted file mode 100644
index a7dde83..0000000
--- a/guava-gwt/test/com/google/common/base/EquivalenceTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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;
-public class EquivalenceTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testEquals() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testEquals();
-}
-
-public void testEqualsEquivalent() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testEqualsEquivalent();
-}
-
-public void testEquivalentTo() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testEquivalentTo();
-}
-
-public void testIdentityEquivalent() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testIdentityEquivalent();
-}
-
-public void testOnResultOf() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testOnResultOf();
-}
-
-public void testOnResultOf_equals() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testOnResultOf_equals();
-}
-
-public void testPairwiseEquivalent() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testPairwiseEquivalent();
-}
-
-public void testPairwiseEquivalent_equals() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testPairwiseEquivalent_equals();
-}
-
-public void testWrap() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testWrap();
-}
-
-public void testWrap_get() throws Exception {
-  com.google.common.base.EquivalenceTest testCase = new com.google.common.base.EquivalenceTest();
-  testCase.testWrap_get();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/FunctionsTest_gwt.java b/guava-gwt/test/com/google/common/base/FunctionsTest_gwt.java
deleted file mode 100644
index 50355d7..0000000
--- a/guava-gwt/test/com/google/common/base/FunctionsTest_gwt.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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;
-public class FunctionsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testComposeOfFunctionsIsAssociative() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testComposeOfFunctionsIsAssociative();
-}
-
-public void testComposeOfPredicateAndFunctionIsAssociative() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testComposeOfPredicateAndFunctionIsAssociative();
-}
-
-public void testComposition() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testComposition();
-}
-
-public void testCompositionWildcard() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testCompositionWildcard();
-}
-
-public void testConstant() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testConstant();
-}
-
-public void testForMapWildCardWithDefault() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testForMapWildCardWithDefault();
-}
-
-public void testForMapWithDefault() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testForMapWithDefault();
-}
-
-public void testForMapWithDefault_null() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testForMapWithDefault_null();
-}
-
-public void testForMapWithoutDefault() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testForMapWithoutDefault();
-}
-
-public void testForPredicate() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testForPredicate();
-}
-
-public void testForSupplier() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testForSupplier();
-}
-
-public void testIdentity_notSame() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testIdentity_notSame();
-}
-
-public void testIdentity_same() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testIdentity_same();
-}
-
-public void testToStringFunction_apply() throws Exception {
-  com.google.common.base.FunctionsTest testCase = new com.google.common.base.FunctionsTest();
-  testCase.testToStringFunction_apply();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/JoinerTest_gwt.java b/guava-gwt/test/com/google/common/base/JoinerTest_gwt.java
deleted file mode 100644
index 2f02a10..0000000
--- a/guava-gwt/test/com/google/common/base/JoinerTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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;
-public class JoinerTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testEntries() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.testEntries();
-}
-
-public void testMap() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.testMap();
-}
-
-public void testNoSpecialNullBehavior() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.testNoSpecialNullBehavior();
-}
-
-public void testOnCharOverride() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.testOnCharOverride();
-}
-
-public void testSkipNulls() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.testSkipNulls();
-}
-
-public void testUseForNull() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.testUseForNull();
-}
-
-public void test_skipNulls_onMap() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.test_skipNulls_onMap();
-}
-
-public void test_skipNulls_useForNull() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.test_skipNulls_useForNull();
-}
-
-public void test_useForNull_skipNulls() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.test_useForNull_skipNulls();
-}
-
-public void test_useForNull_twice() throws Exception {
-  com.google.common.base.JoinerTest testCase = new com.google.common.base.JoinerTest();
-  testCase.test_useForNull_twice();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/ObjectsTest_gwt.java b/guava-gwt/test/com/google/common/base/ObjectsTest_gwt.java
deleted file mode 100644
index 80afce2..0000000
--- a/guava-gwt/test/com/google/common/base/ObjectsTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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;
-public class ObjectsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testEqual() throws Exception {
-  com.google.common.base.ObjectsTest testCase = new com.google.common.base.ObjectsTest();
-  testCase.testEqual();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.base.ObjectsTest testCase = new com.google.common.base.ObjectsTest();
-  testCase.testHashCode();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/OptionalTest_gwt.java b/guava-gwt/test/com/google/common/base/OptionalTest_gwt.java
deleted file mode 100644
index 8fb6dec..0000000
--- a/guava-gwt/test/com/google/common/base/OptionalTest_gwt.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * 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;
-public class OptionalTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testAbsent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testAbsent();
-}
-
-public void testAsSet_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testAsSet_absent();
-}
-
-public void testAsSet_absentIsImmutable() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testAsSet_absentIsImmutable();
-}
-
-public void testAsSet_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testAsSet_present();
-}
-
-public void testAsSet_presentIsImmutable() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testAsSet_presentIsImmutable();
-}
-
-public void testEqualsAndHashCode() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testEqualsAndHashCode();
-}
-
-public void testFromJavaUtil() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testFromJavaUtil();
-}
-
-public void testFromNullable() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testFromNullable();
-}
-
-public void testFromNullable_null() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testFromNullable_null();
-}
-
-public void testGet_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testGet_absent();
-}
-
-public void testGet_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testGet_present();
-}
-
-public void testIsPresent_no() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testIsPresent_no();
-}
-
-public void testIsPresent_yes() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testIsPresent_yes();
-}
-
-public void testOf() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOf();
-}
-
-public void testOf_null() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOf_null();
-}
-
-public void testOrNull_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOrNull_absent();
-}
-
-public void testOrNull_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOrNull_present();
-}
-
-public void testOr_Optional_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_Optional_absent();
-}
-
-public void testOr_Optional_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_Optional_present();
-}
-
-public void testOr_T_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_T_absent();
-}
-
-public void testOr_T_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_T_present();
-}
-
-public void testOr_nullSupplier_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_nullSupplier_absent();
-}
-
-public void testOr_nullSupplier_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_nullSupplier_present();
-}
-
-public void testOr_supplier_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_supplier_absent();
-}
-
-public void testOr_supplier_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testOr_supplier_present();
-}
-
-public void testPresentInstances_allAbsent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testPresentInstances_allAbsent();
-}
-
-public void testPresentInstances_allPresent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testPresentInstances_allPresent();
-}
-
-public void testPresentInstances_callingIteratorTwice() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testPresentInstances_callingIteratorTwice();
-}
-
-public void testPresentInstances_somePresent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testPresentInstances_somePresent();
-}
-
-public void testPresentInstances_wildcards() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testPresentInstances_wildcards();
-}
-
-public void testSampleCodeError1() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testSampleCodeError1();
-}
-
-public void testSampleCodeError2() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testSampleCodeError2();
-}
-
-public void testSampleCodeFine1() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testSampleCodeFine1();
-}
-
-public void testSampleCodeFine2() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testSampleCodeFine2();
-}
-
-public void testToJavaUtil_instance() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testToJavaUtil_instance();
-}
-
-public void testToJavaUtil_static() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testToJavaUtil_static();
-}
-
-public void testToString_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testToString_absent();
-}
-
-public void testToString_present() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testToString_present();
-}
-
-public void testTransform_absent() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testTransform_absent();
-}
-
-public void testTransform_absent_functionReturnsNull() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testTransform_absent_functionReturnsNull();
-}
-
-public void testTransform_presentIdentity() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testTransform_presentIdentity();
-}
-
-public void testTransform_presentToString() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testTransform_presentToString();
-}
-
-public void testTransform_present_functionReturnsNull() throws Exception {
-  com.google.common.base.OptionalTest testCase = new com.google.common.base.OptionalTest();
-  testCase.testTransform_present_functionReturnsNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/PreconditionsTest_gwt.java b/guava-gwt/test/com/google/common/base/PreconditionsTest_gwt.java
deleted file mode 100644
index b29c412..0000000
--- a/guava-gwt/test/com/google/common/base/PreconditionsTest_gwt.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * 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;
-public class PreconditionsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCheckArgument_complexMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_complexMessage_failure();
-}
-
-public void testCheckArgument_complexMessage_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_complexMessage_success();
-}
-
-public void testCheckArgument_notEnoughArgs_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_notEnoughArgs_failure();
-}
-
-public void testCheckArgument_nullArgs_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_nullArgs_failure();
-}
-
-public void testCheckArgument_nullMessageWithArgs_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_nullMessageWithArgs_failure();
-}
-
-public void testCheckArgument_nullMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_nullMessage_failure();
-}
-
-public void testCheckArgument_simpleMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_simpleMessage_failure();
-}
-
-public void testCheckArgument_simpleMessage_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_simpleMessage_success();
-}
-
-public void testCheckArgument_simple_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_simple_failure();
-}
-
-public void testCheckArgument_simple_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_simple_success();
-}
-
-public void testCheckArgument_singleNullArg_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_singleNullArg_failure();
-}
-
-public void testCheckArgument_singleNullArray_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_singleNullArray_failure();
-}
-
-public void testCheckArgument_tooManyArgs_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckArgument_tooManyArgs_failure();
-}
-
-public void testCheckElementIndex_badSize() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckElementIndex_badSize();
-}
-
-public void testCheckElementIndex_negative() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckElementIndex_negative();
-}
-
-public void testCheckElementIndex_ok() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckElementIndex_ok();
-}
-
-public void testCheckElementIndex_tooHigh() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckElementIndex_tooHigh();
-}
-
-public void testCheckElementIndex_withDesc_negative() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckElementIndex_withDesc_negative();
-}
-
-public void testCheckElementIndex_withDesc_tooHigh() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckElementIndex_withDesc_tooHigh();
-}
-
-public void testCheckNotNull_complexMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckNotNull_complexMessage_failure();
-}
-
-public void testCheckNotNull_complexMessage_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckNotNull_complexMessage_success();
-}
-
-public void testCheckNotNull_simpleMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckNotNull_simpleMessage_failure();
-}
-
-public void testCheckNotNull_simpleMessage_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckNotNull_simpleMessage_success();
-}
-
-public void testCheckNotNull_simple_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckNotNull_simple_failure();
-}
-
-public void testCheckNotNull_simple_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckNotNull_simple_success();
-}
-
-public void testCheckPositionIndex_badSize() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_badSize();
-}
-
-public void testCheckPositionIndex_negative() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_negative();
-}
-
-public void testCheckPositionIndex_ok() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_ok();
-}
-
-public void testCheckPositionIndex_startNegative() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_startNegative();
-}
-
-public void testCheckPositionIndex_tooHigh() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_tooHigh();
-}
-
-public void testCheckPositionIndex_withDesc_negative() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_withDesc_negative();
-}
-
-public void testCheckPositionIndex_withDesc_tooHigh() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndex_withDesc_tooHigh();
-}
-
-public void testCheckPositionIndexes_badSize() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndexes_badSize();
-}
-
-public void testCheckPositionIndexes_endTooHigh() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndexes_endTooHigh();
-}
-
-public void testCheckPositionIndexes_ok() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndexes_ok();
-}
-
-public void testCheckPositionIndexes_reversed() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckPositionIndexes_reversed();
-}
-
-public void testCheckState_complexMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_complexMessage_failure();
-}
-
-public void testCheckState_complexMessage_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_complexMessage_success();
-}
-
-public void testCheckState_nullMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_nullMessage_failure();
-}
-
-public void testCheckState_simpleMessage_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_simpleMessage_failure();
-}
-
-public void testCheckState_simpleMessage_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_simpleMessage_success();
-}
-
-public void testCheckState_simple_failure() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_simple_failure();
-}
-
-public void testCheckState_simple_success() throws Exception {
-  com.google.common.base.PreconditionsTest testCase = new com.google.common.base.PreconditionsTest();
-  testCase.testCheckState_simple_success();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/PredicatesTest_gwt.java b/guava-gwt/test/com/google/common/base/PredicatesTest_gwt.java
deleted file mode 100644
index f474114..0000000
--- a/guava-gwt/test/com/google/common/base/PredicatesTest_gwt.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * 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;
-public class PredicatesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testAlwaysFalse_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAlwaysFalse_apply();
-}
-
-public void testAlwaysFalse_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAlwaysFalse_equality();
-}
-
-public void testAlwaysTrue_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAlwaysTrue_apply();
-}
-
-public void testAlwaysTrue_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAlwaysTrue_equality();
-}
-
-public void testAnd_applyBinary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_applyBinary();
-}
-
-public void testAnd_applyIterable() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_applyIterable();
-}
-
-public void testAnd_applyNoArgs() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_applyNoArgs();
-}
-
-public void testAnd_applyOneArg() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_applyOneArg();
-}
-
-public void testAnd_applyTernary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_applyTernary();
-}
-
-public void testAnd_arrayDefensivelyCopied() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_arrayDefensivelyCopied();
-}
-
-public void testAnd_equalityBinary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_equalityBinary();
-}
-
-public void testAnd_equalityIterable() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_equalityIterable();
-}
-
-public void testAnd_equalityNoArgs() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_equalityNoArgs();
-}
-
-public void testAnd_equalityOneArg() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_equalityOneArg();
-}
-
-public void testAnd_equalityTernary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_equalityTernary();
-}
-
-public void testAnd_iterableDefensivelyCopied() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_iterableDefensivelyCopied();
-}
-
-public void testAnd_listDefensivelyCopied() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testAnd_listDefensivelyCopied();
-}
-
-public void testCompose() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testCompose();
-}
-
-public void testHashCodeForBooleanOperations() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testHashCodeForBooleanOperations();
-}
-
-public void testIn_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIn_apply();
-}
-
-public void testIn_compilesWithExplicitSupertype() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIn_compilesWithExplicitSupertype();
-}
-
-public void testIn_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIn_equality();
-}
-
-public void testIn_handlesClassCastException() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIn_handlesClassCastException();
-}
-
-public void testIn_handlesNullPointerException() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIn_handlesNullPointerException();
-}
-
-public void testIsEqualToNull_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIsEqualToNull_apply();
-}
-
-public void testIsEqualToNull_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIsEqualToNull_equality();
-}
-
-public void testIsEqualTo_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIsEqualTo_apply();
-}
-
-public void testIsEqualTo_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIsEqualTo_equality();
-}
-
-public void testIsNull_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIsNull_apply();
-}
-
-public void testIsNull_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testIsNull_equality();
-}
-
-public void testNotNull_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testNotNull_apply();
-}
-
-public void testNotNull_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testNotNull_equality();
-}
-
-public void testNot_apply() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testNot_apply();
-}
-
-public void testNot_equality() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testNot_equality();
-}
-
-public void testNot_equalityForNotOfKnownValues() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testNot_equalityForNotOfKnownValues();
-}
-
-public void testOr_applyBinary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_applyBinary();
-}
-
-public void testOr_applyIterable() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_applyIterable();
-}
-
-public void testOr_applyNoArgs() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_applyNoArgs();
-}
-
-public void testOr_applyOneArg() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_applyOneArg();
-}
-
-public void testOr_applyTernary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_applyTernary();
-}
-
-public void testOr_arrayDefensivelyCopied() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_arrayDefensivelyCopied();
-}
-
-public void testOr_equalityBinary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_equalityBinary();
-}
-
-public void testOr_equalityIterable() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_equalityIterable();
-}
-
-public void testOr_equalityNoArgs() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_equalityNoArgs();
-}
-
-public void testOr_equalityOneArg() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_equalityOneArg();
-}
-
-public void testOr_equalityTernary() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_equalityTernary();
-}
-
-public void testOr_iterableDefensivelyCopied() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_iterableDefensivelyCopied();
-}
-
-public void testOr_listDefensivelyCopied() throws Exception {
-  com.google.common.base.PredicatesTest testCase = new com.google.common.base.PredicatesTest();
-  testCase.testOr_listDefensivelyCopied();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/SplitterTest_gwt.java b/guava-gwt/test/com/google/common/base/SplitterTest_gwt.java
deleted file mode 100644
index d384b7d..0000000
--- a/guava-gwt/test/com/google/common/base/SplitterTest_gwt.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * 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;
-public class SplitterTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCharacterSimpleSplit() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSimpleSplit();
-}
-
-public void testCharacterSimpleSplitToList() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSimpleSplitToList();
-}
-
-public void testCharacterSimpleSplitWithNoDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSimpleSplitWithNoDelimiter();
-}
-
-public void testCharacterSplitEmptyToken() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitEmptyToken();
-}
-
-public void testCharacterSplitEmptyTokenOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitEmptyTokenOmitEmptyStrings();
-}
-
-public void testCharacterSplitOnEmptyString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitOnEmptyString();
-}
-
-public void testCharacterSplitOnEmptyStringOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitOnEmptyStringOmitEmptyStrings();
-}
-
-public void testCharacterSplitOnOnlyDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitOnOnlyDelimiter();
-}
-
-public void testCharacterSplitOnOnlyDelimitersOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitOnOnlyDelimitersOmitEmptyStrings();
-}
-
-public void testCharacterSplitWithDoubleDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithDoubleDelimiter();
-}
-
-public void testCharacterSplitWithDoubleDelimiterAndSpace() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithDoubleDelimiterAndSpace();
-}
-
-public void testCharacterSplitWithDoubleDelimiterOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithDoubleDelimiterOmitEmptyStrings();
-}
-
-public void testCharacterSplitWithLeadingDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithLeadingDelimiter();
-}
-
-public void testCharacterSplitWithMatcherDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithMatcherDelimiter();
-}
-
-public void testCharacterSplitWithMultipleLetters() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithMultipleLetters();
-}
-
-public void testCharacterSplitWithTrailingDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithTrailingDelimiter();
-}
-
-public void testCharacterSplitWithTrim() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testCharacterSplitWithTrim();
-}
-
-public void testFixedLengthSimpleSplit() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSimpleSplit();
-}
-
-public void testFixedLengthSplitEmptyString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitEmptyString();
-}
-
-public void testFixedLengthSplitEmptyStringWithOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitEmptyStringWithOmitEmptyStrings();
-}
-
-public void testFixedLengthSplitEqualChunkLength() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitEqualChunkLength();
-}
-
-public void testFixedLengthSplitIntoChars() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitIntoChars();
-}
-
-public void testFixedLengthSplitNegativeChunkLen() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitNegativeChunkLen();
-}
-
-public void testFixedLengthSplitOnlyOneChunk() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitOnlyOneChunk();
-}
-
-public void testFixedLengthSplitSmallerString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitSmallerString();
-}
-
-public void testFixedLengthSplitZeroChunkLen() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testFixedLengthSplitZeroChunkLen();
-}
-
-public void testInvalidZeroLimit() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testInvalidZeroLimit();
-}
-
-public void testLimit1Separator() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimit1Separator();
-}
-
-public void testLimitExtraSeparators() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparators();
-}
-
-public void testLimitExtraSeparatorsOmitEmpty() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsOmitEmpty();
-}
-
-public void testLimitExtraSeparatorsOmitEmpty3() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsOmitEmpty3();
-}
-
-public void testLimitExtraSeparatorsTrim() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsTrim();
-}
-
-public void testLimitExtraSeparatorsTrim1() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsTrim1();
-}
-
-public void testLimitExtraSeparatorsTrim1Empty() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsTrim1Empty();
-}
-
-public void testLimitExtraSeparatorsTrim1EmptyOmit() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsTrim1EmptyOmit();
-}
-
-public void testLimitExtraSeparatorsTrim1NoOmit() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsTrim1NoOmit();
-}
-
-public void testLimitExtraSeparatorsTrim3() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitExtraSeparatorsTrim3();
-}
-
-public void testLimitFixedLength() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitFixedLength();
-}
-
-public void testLimitLarge() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitLarge();
-}
-
-public void testLimitOne() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitOne();
-}
-
-public void testLimitSeparator() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testLimitSeparator();
-}
-
-public void testMapSplitter_CharacterSeparator() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_CharacterSeparator();
-}
-
-public void testMapSplitter_duplicateKeys() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_duplicateKeys();
-}
-
-public void testMapSplitter_emptySeparator() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_emptySeparator();
-}
-
-public void testMapSplitter_malformedEntry() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_malformedEntry();
-}
-
-public void testMapSplitter_multiCharacterSeparator() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_multiCharacterSeparator();
-}
-
-public void testMapSplitter_notTrimmed() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_notTrimmed();
-}
-
-public void testMapSplitter_orderedResults() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_orderedResults();
-}
-
-public void testMapSplitter_trimmedBoth() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_trimmedBoth();
-}
-
-public void testMapSplitter_trimmedEntries() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_trimmedEntries();
-}
-
-public void testMapSplitter_trimmedKeyValue() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_trimmedKeyValue();
-}
-
-public void testMapSplitter_varyingTrimLevels() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testMapSplitter_varyingTrimLevels();
-}
-
-public void testSplitNullString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testSplitNullString();
-}
-
-public void testSplitterIterableIsLazy_char() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testSplitterIterableIsLazy_char();
-}
-
-public void testSplitterIterableIsLazy_string() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testSplitterIterableIsLazy_string();
-}
-
-public void testSplitterIterableIsUnmodifiable_char() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testSplitterIterableIsUnmodifiable_char();
-}
-
-public void testSplitterIterableIsUnmodifiable_string() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testSplitterIterableIsUnmodifiable_string();
-}
-
-public void testStringSimpleSplit() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSimpleSplit();
-}
-
-public void testStringSimpleSplitWithNoDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSimpleSplitWithNoDelimiter();
-}
-
-public void testStringSplitEmptyToken() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitEmptyToken();
-}
-
-public void testStringSplitEmptyTokenOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitEmptyTokenOmitEmptyStrings();
-}
-
-public void testStringSplitOnEmptyString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitOnEmptyString();
-}
-
-public void testStringSplitOnEmptyStringOmitEmptyString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitOnEmptyStringOmitEmptyString();
-}
-
-public void testStringSplitOnOnlyDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitOnOnlyDelimiter();
-}
-
-public void testStringSplitOnOnlyDelimitersOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitOnOnlyDelimitersOmitEmptyStrings();
-}
-
-public void testStringSplitWithDelimiterSubstringInValue() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithDelimiterSubstringInValue();
-}
-
-public void testStringSplitWithDoubleDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithDoubleDelimiter();
-}
-
-public void testStringSplitWithDoubleDelimiterAndSpace() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithDoubleDelimiterAndSpace();
-}
-
-public void testStringSplitWithDoubleDelimiterOmitEmptyStrings() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithDoubleDelimiterOmitEmptyStrings();
-}
-
-public void testStringSplitWithEmptyString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithEmptyString();
-}
-
-public void testStringSplitWithLeadingDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithLeadingDelimiter();
-}
-
-public void testStringSplitWithLongDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithLongDelimiter();
-}
-
-public void testStringSplitWithLongLeadingDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithLongLeadingDelimiter();
-}
-
-public void testStringSplitWithLongTrailingDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithLongTrailingDelimiter();
-}
-
-public void testStringSplitWithMultipleLetters() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithMultipleLetters();
-}
-
-public void testStringSplitWithTrailingDelimiter() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithTrailingDelimiter();
-}
-
-public void testStringSplitWithTrim() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testStringSplitWithTrim();
-}
-
-public void testToString() throws Exception {
-  com.google.common.base.SplitterTest testCase = new com.google.common.base.SplitterTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/StopwatchTest_gwt.java b/guava-gwt/test/com/google/common/base/StopwatchTest_gwt.java
deleted file mode 100644
index f2284ce..0000000
--- a/guava-gwt/test/com/google/common/base/StopwatchTest_gwt.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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;
-public class StopwatchTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCreateStarted() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testCreateStarted();
-}
-
-public void testCreateUnstarted() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testCreateUnstarted();
-}
-
-public void testElapsed_micros() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testElapsed_micros();
-}
-
-public void testElapsed_millis() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testElapsed_millis();
-}
-
-public void testElapsed_multipleSegments() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testElapsed_multipleSegments();
-}
-
-public void testElapsed_notRunning() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testElapsed_notRunning();
-}
-
-public void testElapsed_whileRunning() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testElapsed_whileRunning();
-}
-
-public void testInitialState() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testInitialState();
-}
-
-public void testReset_new() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testReset_new();
-}
-
-public void testReset_whileRunning() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testReset_whileRunning();
-}
-
-public void testStart() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testStart();
-}
-
-public void testStart_whileRunning() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testStart_whileRunning();
-}
-
-public void testStop() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testStop();
-}
-
-public void testStop_alreadyStopped() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testStop_alreadyStopped();
-}
-
-public void testStop_new() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testStop_new();
-}
-
-public void testToString() throws Exception {
-  com.google.common.base.StopwatchTest testCase = new com.google.common.base.StopwatchTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/StringsTest_gwt.java b/guava-gwt/test/com/google/common/base/StringsTest_gwt.java
deleted file mode 100644
index d7b9073..0000000
--- a/guava-gwt/test/com/google/common/base/StringsTest_gwt.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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;
-public class StringsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCommonPrefix() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testCommonPrefix();
-}
-
-public void testCommonSuffix() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testCommonSuffix();
-}
-
-public void testEmptyToNull() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testEmptyToNull();
-}
-
-public void testIsNullOrEmpty() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testIsNullOrEmpty();
-}
-
-public void testLenientFormat() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testLenientFormat();
-}
-
-public void testLenientFormat_badArgumentToString_gwtFriendly() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testLenientFormat_badArgumentToString_gwtFriendly();
-}
-
-public void testNullToEmpty() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testNullToEmpty();
-}
-
-public void testPadEnd_negativeMinLength() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadEnd_negativeMinLength();
-}
-
-public void testPadEnd_noPadding() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadEnd_noPadding();
-}
-
-public void testPadEnd_null() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadEnd_null();
-}
-
-public void testPadEnd_somePadding() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadEnd_somePadding();
-}
-
-public void testPadStart_negativeMinLength() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadStart_negativeMinLength();
-}
-
-public void testPadStart_noPadding() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadStart_noPadding();
-}
-
-public void testPadStart_null() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadStart_null();
-}
-
-public void testPadStart_somePadding() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testPadStart_somePadding();
-}
-
-public void testRepeat() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testRepeat();
-}
-
-public void testRepeat_null() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testRepeat_null();
-}
-
-public void testValidSurrogatePairAt() throws Exception {
-  com.google.common.base.StringsTest testCase = new com.google.common.base.StringsTest();
-  testCase.testValidSurrogatePairAt();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/SuppliersTest_gwt.java b/guava-gwt/test/com/google/common/base/SuppliersTest_gwt.java
deleted file mode 100644
index 9c86e48..0000000
--- a/guava-gwt/test/com/google/common/base/SuppliersTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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;
-public class SuppliersTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testCompose() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testCompose();
-}
-
-public void testComposeWithLists() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testComposeWithLists();
-}
-
-public void testCompose_equals() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testCompose_equals();
-}
-
-public void testMemoize() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testMemoize();
-}
-
-public void testMemoizeExceptionThrown() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testMemoizeExceptionThrown();
-}
-
-public void testMemoize_redudantly() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testMemoize_redudantly();
-}
-
-public void testOfInstanceSuppliesNull() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testOfInstanceSuppliesNull();
-}
-
-public void testOfInstanceSuppliesSameInstance() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testOfInstanceSuppliesSameInstance();
-}
-
-public void testOfInstance_equals() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testOfInstance_equals();
-}
-
-public void testSupplierFunction() throws Exception {
-  com.google.common.base.SuppliersTest testCase = new com.google.common.base.SuppliersTest();
-  testCase.testSupplierFunction();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/base/TestModuleEntryPoint.java
deleted file mode 100644
index cda7e39..0000000
--- a/guava-gwt/test/com/google/common/base/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/base/ThrowablesTest_gwt.java b/guava-gwt/test/com/google/common/base/ThrowablesTest_gwt.java
deleted file mode 100644
index e7597bf..0000000
--- a/guava-gwt/test/com/google/common/base/ThrowablesTest_gwt.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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;
-public class ThrowablesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testGetCasualChainLoop() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetCasualChainLoop();
-}
-
-public void testGetCasualChainNull() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetCasualChainNull();
-}
-
-public void testGetCausalChain() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetCausalChain();
-}
-
-public void testGetRootCause_DoubleWrapped() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetRootCause_DoubleWrapped();
-}
-
-public void testGetRootCause_Loop() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetRootCause_Loop();
-}
-
-public void testGetRootCause_NoCause() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetRootCause_NoCause();
-}
-
-public void testGetRootCause_SingleWrapped() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testGetRootCause_SingleWrapped();
-}
-
-public void testThrowIfUnchecked_Checked() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testThrowIfUnchecked_Checked();
-}
-
-public void testThrowIfUnchecked_Error() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testThrowIfUnchecked_Error();
-}
-
-public void testThrowIfUnchecked_Unchecked() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testThrowIfUnchecked_Unchecked();
-}
-
-public void testThrowIfUnchecked_null() throws Exception {
-  com.google.common.base.ThrowablesTest testCase = new com.google.common.base.ThrowablesTest();
-  testCase.testThrowIfUnchecked_null();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/ToStringHelperTest_gwt.java b/guava-gwt/test/com/google/common/base/ToStringHelperTest_gwt.java
deleted file mode 100644
index e0890c3..0000000
--- a/guava-gwt/test/com/google/common/base/ToStringHelperTest_gwt.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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;
-public class ToStringHelperTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testConstructorLenient_anonymousClass() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testConstructorLenient_anonymousClass();
-}
-
-public void testConstructorLenient_classObject() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testConstructorLenient_classObject();
-}
-
-public void testConstructorLenient_innerClass() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testConstructorLenient_innerClass();
-}
-
-public void testConstructorLenient_instance() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testConstructorLenient_instance();
-}
-
-public void testConstructor_stringObject() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testConstructor_stringObject();
-}
-
-public void testToStringHelperLenient_localInnerClass() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringHelperLenient_localInnerClass();
-}
-
-public void testToStringHelperLenient_localInnerNestedClass() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringHelperLenient_localInnerNestedClass();
-}
-
-public void testToStringHelperLenient_moreThanNineAnonymousClasses() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringHelperLenient_moreThanNineAnonymousClasses();
-}
-
-public void testToStringLenient_addValue() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_addValue();
-}
-
-public void testToStringLenient_addValueWithNullValue() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_addValueWithNullValue();
-}
-
-public void testToStringLenient_addWithNullValue() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_addWithNullValue();
-}
-
-public void testToStringLenient_complexFields() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_complexFields();
-}
-
-public void testToStringLenient_nullInteger() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_nullInteger();
-}
-
-public void testToStringLenient_oneField() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_oneField();
-}
-
-public void testToStringLenient_oneIntegerField() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToStringLenient_oneIntegerField();
-}
-
-public void testToString_addWithNullName() throws Exception {
-  com.google.common.base.ToStringHelperTest testCase = new com.google.common.base.ToStringHelperTest();
-  testCase.testToString_addWithNullName();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/Utf8Test_gwt.java b/guava-gwt/test/com/google/common/base/Utf8Test_gwt.java
deleted file mode 100644
index f844ec5..0000000
--- a/guava-gwt/test/com/google/common/base/Utf8Test_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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;
-public class Utf8Test_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testEncodedLength_invalidStrings() throws Exception {
-  com.google.common.base.Utf8Test testCase = new com.google.common.base.Utf8Test();
-  testCase.testEncodedLength_invalidStrings();
-}
-
-public void testEncodedLength_validStrings() throws Exception {
-  com.google.common.base.Utf8Test testCase = new com.google.common.base.Utf8Test();
-  testCase.testEncodedLength_validStrings();
-}
-
-public void testEncodedLength_validStrings2() throws Exception {
-  com.google.common.base.Utf8Test testCase = new com.google.common.base.Utf8Test();
-  testCase.testEncodedLength_validStrings2();
-}
-
-public void testIsWellFormed_4BytesSamples() throws Exception {
-  com.google.common.base.Utf8Test testCase = new com.google.common.base.Utf8Test();
-  testCase.testIsWellFormed_4BytesSamples();
-}
-
-public void testShardsHaveExpectedRoundTrippables() throws Exception {
-  com.google.common.base.Utf8Test testCase = new com.google.common.base.Utf8Test();
-  testCase.testShardsHaveExpectedRoundTrippables();
-}
-
-public void testSomeSequences() throws Exception {
-  com.google.common.base.Utf8Test testCase = new com.google.common.base.Utf8Test();
-  testCase.testSomeSequences();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/VerifyTest_gwt.java b/guava-gwt/test/com/google/common/base/VerifyTest_gwt.java
deleted file mode 100644
index eb7ea0c..0000000
--- a/guava-gwt/test/com/google/common/base/VerifyTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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;
-public class VerifyTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.base.testModule";
-}
-public void testVerifyNotNull_complexMessage_success() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerifyNotNull_complexMessage_success();
-}
-
-public void testVerifyNotNull_simpleMessage_failure() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerifyNotNull_simpleMessage_failure();
-}
-
-public void testVerifyNotNull_simple_failure() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerifyNotNull_simple_failure();
-}
-
-public void testVerifyNotNull_simple_success() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerifyNotNull_simple_success();
-}
-
-public void testVerify_complexMessage_failure() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerify_complexMessage_failure();
-}
-
-public void testVerify_complexMessage_success() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerify_complexMessage_success();
-}
-
-public void testVerify_simpleMessage_failure() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerify_simpleMessage_failure();
-}
-
-public void testVerify_simpleMessage_success() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerify_simpleMessage_success();
-}
-
-public void testVerify_simple_failure() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerify_simple_failure();
-}
-
-public void testVerify_simple_success() throws Exception {
-  com.google.common.base.VerifyTest testCase = new com.google.common.base.VerifyTest();
-  testCase.testVerify_simple_success();
-}
-}
diff --git a/guava-gwt/test/com/google/common/base/testModule.gwt.xml b/guava-gwt/test/com/google/common/base/testModule.gwt.xml
index 326194d..c87f3db 100644
--- a/guava-gwt/test/com/google/common/base/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/base/testModule.gwt.xml
@@ -1,17 +1,24 @@
 <?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"/>
    
-  <source path=""/>
-    
   <super-source path="super"/>
    
 </module>
diff --git a/guava-gwt/test/com/google/common/cache/CacheBuilderGwtTest_gwt.java b/guava-gwt/test/com/google/common/cache/CacheBuilderGwtTest_gwt.java
deleted file mode 100644
index ac8854b..0000000
--- a/guava-gwt/test/com/google/common/cache/CacheBuilderGwtTest_gwt.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.cache;
-public class CacheBuilderGwtTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.cache.testModule";
-}
-public void testAsMapEntrySet() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMapEntrySet();
-}
-
-public void testAsMapKeySet() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMapKeySet();
-}
-
-public void testAsMapKeySet_contains() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMapKeySet_contains();
-}
-
-public void testAsMapValues_contains() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMapValues_contains();
-}
-
-public void testAsMapValues_iteratorRemove() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMapValues_iteratorRemove();
-}
-
-public void testAsMap_containsKey() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMap_containsKey();
-}
-
-public void testAsMap_containsValue() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testAsMap_containsValue();
-}
-
-public void testExpireAfterAccess() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testExpireAfterAccess();
-}
-
-public void testExpireAfterWrite() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testExpireAfterWrite();
-}
-
-public void testExpireAfterWriteAndAccess() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testExpireAfterWriteAndAccess();
-}
-
-public void testInvalidate() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testInvalidate();
-}
-
-public void testInvalidateAll() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testInvalidateAll();
-}
-
-public void testLoader() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testLoader();
-}
-
-public void testLoadingCache() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testLoadingCache();
-}
-
-public void testMapMethods() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testMapMethods();
-}
-
-public void testPutAll() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testPutAll();
-}
-
-public void testRemovalListener() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testRemovalListener();
-}
-
-public void testSizeConstraint() throws Exception {
-  com.google.common.cache.CacheBuilderGwtTest testCase = new com.google.common.cache.CacheBuilderGwtTest();
-  testCase.setUp();
-  testCase.testSizeConstraint();
-}
-}
diff --git a/guava-gwt/test/com/google/common/cache/CacheBuilderTest_gwt.java b/guava-gwt/test/com/google/common/cache/CacheBuilderTest_gwt.java
deleted file mode 100644
index 7aa24af..0000000
--- a/guava-gwt/test/com/google/common/cache/CacheBuilderTest_gwt.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.cache;
-public class CacheBuilderTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.cache.testModule";
-}
-public void testConcurrencyLevel_large() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testConcurrencyLevel_large();
-}
-
-public void testConcurrencyLevel_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testConcurrencyLevel_setTwice();
-}
-
-public void testConcurrencyLevel_zero() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testConcurrencyLevel_zero();
-}
-
-public void testInitialCapacity_large() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testInitialCapacity_large();
-}
-
-public void testInitialCapacity_negative() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testInitialCapacity_negative();
-}
-
-public void testInitialCapacity_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testInitialCapacity_setTwice();
-}
-
-public void testMaximumSize_negative() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testMaximumSize_negative();
-}
-
-public void testMaximumSize_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testMaximumSize_setTwice();
-}
-
-public void testNewBuilder() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testNewBuilder();
-}
-
-public void testRemovalListener_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testRemovalListener_setTwice();
-}
-
-public void testTicker_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTicker_setTwice();
-}
-
-public void testTimeToIdleAndToLive() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToIdleAndToLive();
-}
-
-public void testTimeToIdle_negative() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToIdle_negative();
-}
-
-public void testTimeToIdle_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToIdle_setTwice();
-}
-
-public void testTimeToIdle_small() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToIdle_small();
-}
-
-public void testTimeToLive_negative() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToLive_negative();
-}
-
-public void testTimeToLive_setTwice() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToLive_setTwice();
-}
-
-public void testTimeToLive_small() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testTimeToLive_small();
-}
-
-public void testValuesIsNotASet() throws Exception {
-  com.google.common.cache.CacheBuilderTest testCase = new com.google.common.cache.CacheBuilderTest();
-  testCase.testValuesIsNotASet();
-}
-}
diff --git a/guava-gwt/test/com/google/common/cache/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/cache/TestModuleEntryPoint.java
deleted file mode 100644
index baf8478..0000000
--- a/guava-gwt/test/com/google/common/cache/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/cache/testModule.gwt.xml b/guava-gwt/test/com/google/common/cache/testModule.gwt.xml
index 4a2a4e7..dae8396 100644
--- a/guava-gwt/test/com/google/common/cache/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/cache/testModule.gwt.xml
@@ -1,19 +1,28 @@
 <?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"/>
    
-  <source path=""/>
-    
   <super-source path="super"/>
    
 </module>
diff --git a/guava-gwt/test/com/google/common/collect/AbstractIteratorTest_gwt.java b/guava-gwt/test/com/google/common/collect/AbstractIteratorTest_gwt.java
deleted file mode 100644
index 0c7d06a..0000000
--- a/guava-gwt/test/com/google/common/collect/AbstractIteratorTest_gwt.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.collect;
-public class AbstractIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCantRemove() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testCantRemove();
-}
-
-public void testDefaultBehaviorOfNextAndHasNext() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testDefaultBehaviorOfNextAndHasNext();
-}
-
-public void testDefaultBehaviorOfPeek() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testDefaultBehaviorOfPeek();
-}
-
-public void testDefaultBehaviorOfPeekForEmptyIteration() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testDefaultBehaviorOfPeekForEmptyIteration();
-}
-
-public void testException() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testException();
-}
-
-public void testExceptionAfterEndOfData() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testExceptionAfterEndOfData();
-}
-
-public void testReentrantHasNext() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testReentrantHasNext();
-}
-
-public void testSneakyThrow() throws Exception {
-  com.google.common.collect.AbstractIteratorTest testCase = new com.google.common.collect.AbstractIteratorTest();
-  testCase.testSneakyThrow();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/AbstractMapEntryTest_gwt.java b/guava-gwt/test/com/google/common/collect/AbstractMapEntryTest_gwt.java
deleted file mode 100644
index aa93b55..0000000
--- a/guava-gwt/test/com/google/common/collect/AbstractMapEntryTest_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.collect;
-public class AbstractMapEntryTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testEquals() throws Exception {
-  com.google.common.collect.AbstractMapEntryTest testCase = new com.google.common.collect.AbstractMapEntryTest();
-  testCase.testEquals();
-}
-
-public void testEqualsNull() throws Exception {
-  com.google.common.collect.AbstractMapEntryTest testCase = new com.google.common.collect.AbstractMapEntryTest();
-  testCase.testEqualsNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.AbstractMapEntryTest testCase = new com.google.common.collect.AbstractMapEntryTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeNull() throws Exception {
-  com.google.common.collect.AbstractMapEntryTest testCase = new com.google.common.collect.AbstractMapEntryTest();
-  testCase.testHashCodeNull();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.AbstractMapEntryTest testCase = new com.google.common.collect.AbstractMapEntryTest();
-  testCase.testToString();
-}
-
-public void testToStringNull() throws Exception {
-  com.google.common.collect.AbstractMapEntryTest testCase = new com.google.common.collect.AbstractMapEntryTest();
-  testCase.testToStringNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/AbstractSequentialIteratorTest_gwt.java b/guava-gwt/test/com/google/common/collect/AbstractSequentialIteratorTest_gwt.java
deleted file mode 100644
index d4cbc18..0000000
--- a/guava-gwt/test/com/google/common/collect/AbstractSequentialIteratorTest_gwt.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.collect;
-public class AbstractSequentialIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBroken() throws Exception {
-  com.google.common.collect.AbstractSequentialIteratorTest testCase = new com.google.common.collect.AbstractSequentialIteratorTest();
-  testCase.testBroken();
-}
-
-public void testDoubler() throws Exception {
-  com.google.common.collect.AbstractSequentialIteratorTest testCase = new com.google.common.collect.AbstractSequentialIteratorTest();
-  testCase.testDoubler();
-}
-
-public void testEmpty() throws Exception {
-  com.google.common.collect.AbstractSequentialIteratorTest testCase = new com.google.common.collect.AbstractSequentialIteratorTest();
-  testCase.testEmpty();
-}
-
-public void testSampleCode() throws Exception {
-  com.google.common.collect.AbstractSequentialIteratorTest testCase = new com.google.common.collect.AbstractSequentialIteratorTest();
-  testCase.testSampleCode();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ArrayListMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ArrayListMultimapTest_gwt.java
deleted file mode 100644
index 5c5450f..0000000
--- a/guava-gwt/test/com/google/common/collect/ArrayListMultimapTest_gwt.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.collect;
-public class ArrayListMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromArrayListMultimap() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testCreateFromArrayListMultimap();
-}
-
-public void testCreateFromHashMultimap() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testCreateFromHashMultimap();
-}
-
-public void testCreateFromIllegalSizes() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testCreateFromIllegalSizes();
-}
-
-public void testCreateFromMultimap() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testCreateFromMultimap();
-}
-
-public void testCreateFromSizes() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testCreateFromSizes();
-}
-
-public void testGetRandomAccess() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testGetRandomAccess();
-}
-
-public void testRemoveAllRandomAccess() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testRemoveAllRandomAccess();
-}
-
-public void testReplaceValuesRandomAccess() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testReplaceValuesRandomAccess();
-}
-
-public void testSublistConcurrentModificationException() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testSublistConcurrentModificationException();
-}
-
-public void testTrimToSize() throws Exception {
-  com.google.common.collect.ArrayListMultimapTest testCase = new com.google.common.collect.ArrayListMultimapTest();
-  testCase.testTrimToSize();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ArrayTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/ArrayTableTest_gwt.java
deleted file mode 100644
index a8d93fe..0000000
--- a/guava-gwt/test/com/google/common/collect/ArrayTableTest_gwt.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * 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.collect;
-public class ArrayTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAt() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testAt();
-}
-
-public void testCellReflectsChanges() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCellReflectsChanges();
-}
-
-public void testCellSetToString_ordered() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCellSetToString_ordered();
-}
-
-public void testClear() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnKeyList() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumnKeyList();
-}
-
-public void testColumnKeySetToString_ordered() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySetToString_ordered();
-}
-
-public void testColumnMissing() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumnMissing();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnPutIllegal() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumnPutIllegal();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testCreateCopyArrayTable() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateCopyArrayTable();
-}
-
-public void testCreateCopyEmptyArrayTable() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateCopyEmptyArrayTable();
-}
-
-public void testCreateCopyEmptyTable() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateCopyEmptyTable();
-}
-
-public void testCreateCopyHashBasedTable() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateCopyHashBasedTable();
-}
-
-public void testCreateDuplicateColumns() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateDuplicateColumns();
-}
-
-public void testCreateDuplicateRows() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateDuplicateRows();
-}
-
-public void testCreateEmptyColumns() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateEmptyColumns();
-}
-
-public void testCreateEmptyRows() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateEmptyRows();
-}
-
-public void testCreateEmptyRowsXColumns() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testCreateEmptyRowsXColumns();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testErase() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testErase();
-}
-
-public void testEraseAll() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testEraseAll();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testGetMissingKeys() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testGetMissingKeys();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testPut();
-}
-
-public void testPutAllTable() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testPutAllTable();
-}
-
-public void testPutIllegal() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testPutIllegal();
-}
-
-public void testPutNull() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testPutNull();
-}
-
-public void testPutNullReplace() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testPutNullReplace();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowClearAndPut() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRowClearAndPut();
-}
-
-public void testRowKeyList() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRowKeyList();
-}
-
-public void testRowKeySetToString_ordered() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetToString_ordered();
-}
-
-public void testRowMissing() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRowMissing();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testRowPutIllegal() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testRowPutIllegal();
-}
-
-public void testSerialization() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testSerialization();
-}
-
-public void testSet() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testSet();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-
-public void testToString_ordered() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testToString_ordered();
-}
-
-public void testValuesToString_ordered() throws Exception {
-  com.google.common.collect.ArrayTableTest testCase = new com.google.common.collect.ArrayTableTest();
-  testCase.setUp();
-  testCase.testValuesToString_ordered();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/CollectSpliteratorsTest_gwt.java b/guava-gwt/test/com/google/common/collect/CollectSpliteratorsTest_gwt.java
deleted file mode 100644
index 388ac18..0000000
--- a/guava-gwt/test/com/google/common/collect/CollectSpliteratorsTest_gwt.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.collect;
-public class CollectSpliteratorsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testFlatMap() throws Exception {
-  com.google.common.collect.CollectSpliteratorsTest testCase = new com.google.common.collect.CollectSpliteratorsTest();
-  testCase.testFlatMap();
-}
-
-public void testMap() throws Exception {
-  com.google.common.collect.CollectSpliteratorsTest testCase = new com.google.common.collect.CollectSpliteratorsTest();
-  testCase.testMap();
-}
-
-public void testMultisetsSpliterator() throws Exception {
-  com.google.common.collect.CollectSpliteratorsTest testCase = new com.google.common.collect.CollectSpliteratorsTest();
-  testCase.testMultisetsSpliterator();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/Collections2Test_gwt.java b/guava-gwt/test/com/google/common/collect/Collections2Test_gwt.java
deleted file mode 100644
index ed2c7ab..0000000
--- a/guava-gwt/test/com/google/common/collect/Collections2Test_gwt.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.collect;
-public class Collections2Test_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testOrderedPermutationSetContains() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetContains();
-}
-
-public void testOrderedPermutationSetEmpty() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetEmpty();
-}
-
-public void testOrderedPermutationSetOneElement() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetOneElement();
-}
-
-public void testOrderedPermutationSetRepeatedElements() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetRepeatedElements();
-}
-
-public void testOrderedPermutationSetRepeatedElementsSize() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetRepeatedElementsSize();
-}
-
-public void testOrderedPermutationSetSizeOverflow() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetSizeOverflow();
-}
-
-public void testOrderedPermutationSetThreeElements() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testOrderedPermutationSetThreeElements();
-}
-
-public void testPermutationSetContains() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetContains();
-}
-
-public void testPermutationSetEmpty() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetEmpty();
-}
-
-public void testPermutationSetFourElements() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetFourElements();
-}
-
-public void testPermutationSetOneElement() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetOneElement();
-}
-
-public void testPermutationSetSize() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetSize();
-}
-
-public void testPermutationSetSizeOverflow() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetSizeOverflow();
-}
-
-public void testPermutationSetThreeElements() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetThreeElements();
-}
-
-public void testPermutationSetThreeElementsOutOfOrder() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetThreeElementsOutOfOrder();
-}
-
-public void testPermutationSetThreeRepeatedElements() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetThreeRepeatedElements();
-}
-
-public void testPermutationSetTwoElements() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testPermutationSetTwoElements();
-}
-
-public void testToStringImplWithNullEntries() throws Exception {
-  com.google.common.collect.Collections2Test testCase = new com.google.common.collect.Collections2Test();
-  testCase.testToStringImplWithNullEntries();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ComparatorsTest_gwt.java b/guava-gwt/test/com/google/common/collect/ComparatorsTest_gwt.java
deleted file mode 100644
index d2e0e12..0000000
--- a/guava-gwt/test/com/google/common/collect/ComparatorsTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.collect;
-public class ComparatorsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testEmptiesFirst() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testEmptiesFirst();
-}
-
-public void testEmptiesLast() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testEmptiesLast();
-}
-
-public void testGreatestCollector() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testGreatestCollector();
-}
-
-public void testIsInOrder() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testIsInOrder();
-}
-
-public void testIsInStrictOrder() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testIsInStrictOrder();
-}
-
-public void testLeastCollector() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testLeastCollector();
-}
-
-public void testLexicographical() throws Exception {
-  com.google.common.collect.ComparatorsTest testCase = new com.google.common.collect.ComparatorsTest();
-  testCase.testLexicographical();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ComparisonChainTest_gwt.java b/guava-gwt/test/com/google/common/collect/ComparisonChainTest_gwt.java
deleted file mode 100644
index 795d238..0000000
--- a/guava-gwt/test/com/google/common/collect/ComparisonChainTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.collect;
-public class ComparisonChainTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCompareBooleans() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testCompareBooleans();
-}
-
-public void testCompareFalseFirst() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testCompareFalseFirst();
-}
-
-public void testCompareTrueFirst() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testCompareTrueFirst();
-}
-
-public void testDegenerate() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testDegenerate();
-}
-
-public void testManyEqual() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testManyEqual();
-}
-
-public void testOneEqual() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testOneEqual();
-}
-
-public void testOneEqualUsingComparator() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testOneEqualUsingComparator();
-}
-
-public void testShortCircuitGreater() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testShortCircuitGreater();
-}
-
-public void testShortCircuitLess() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testShortCircuitLess();
-}
-
-public void testShortCircuitSecondStep() throws Exception {
-  com.google.common.collect.ComparisonChainTest testCase = new com.google.common.collect.ComparisonChainTest();
-  testCase.testShortCircuitSecondStep();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ContiguousSetTest_gwt.java b/guava-gwt/test/com/google/common/collect/ContiguousSetTest_gwt.java
deleted file mode 100644
index 37fe757..0000000
--- a/guava-gwt/test/com/google/common/collect/ContiguousSetTest_gwt.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * 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.collect;
-public class ContiguousSetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsList() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testAsList();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testContains();
-}
-
-public void testContainsAll() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testContainsAll();
-}
-
-public void testCreate_empty() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testCreate_empty();
-}
-
-public void testCreate_noMax() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testCreate_noMax();
-}
-
-public void testCreate_noMin() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testCreate_noMin();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testEquals();
-}
-
-public void testFirst() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testFirst();
-}
-
-public void testHeadSet() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testHeadSet();
-}
-
-public void testHeadSet_tooSmall() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testHeadSet_tooSmall();
-}
-
-public void testIntersection() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testIntersection();
-}
-
-public void testIntersection_empty() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testIntersection_empty();
-}
-
-public void testInvalidIntRange() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testInvalidIntRange();
-}
-
-public void testInvalidLongRange() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testInvalidLongRange();
-}
-
-public void testLast() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testLast();
-}
-
-public void testRange() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testRange();
-}
-
-public void testRange_unboundedRange() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testRange_unboundedRange();
-}
-
-public void testSubSet() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testSubSet();
-}
-
-public void testSubSet_outOfOrder() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testSubSet_outOfOrder();
-}
-
-public void testSubSet_tooLarge() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testSubSet_tooLarge();
-}
-
-public void testSubSet_tooSmall() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testSubSet_tooSmall();
-}
-
-public void testTailSet() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testTailSet();
-}
-
-public void testTailSet_tooLarge() throws Exception {
-  com.google.common.collect.ContiguousSetTest testCase = new com.google.common.collect.ContiguousSetTest();
-  testCase.testTailSet_tooLarge();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/CountTest_gwt.java b/guava-gwt/test/com/google/common/collect/CountTest_gwt.java
deleted file mode 100644
index 523432f..0000000
--- a/guava-gwt/test/com/google/common/collect/CountTest_gwt.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.collect;
-public class CountTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAddAndGet() throws Exception {
-  com.google.common.collect.CountTest testCase = new com.google.common.collect.CountTest();
-  testCase.testAddAndGet();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.CountTest testCase = new com.google.common.collect.CountTest();
-  testCase.testGet();
-}
-
-public void testGetAndAdd() throws Exception {
-  com.google.common.collect.CountTest testCase = new com.google.common.collect.CountTest();
-  testCase.testGetAndAdd();
-}
-
-public void testGetAndSet() throws Exception {
-  com.google.common.collect.CountTest testCase = new com.google.common.collect.CountTest();
-  testCase.testGetAndSet();
-}
-
-public void testSet() throws Exception {
-  com.google.common.collect.CountTest testCase = new com.google.common.collect.CountTest();
-  testCase.testSet();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/EmptyImmutableTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/EmptyImmutableTableTest_gwt.java
deleted file mode 100644
index 5548b82..0000000
--- a/guava-gwt/test/com/google/common/collect/EmptyImmutableTableTest_gwt.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.collect;
-public class EmptyImmutableTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCellSet() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testCellSet();
-}
-
-public void testClear() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testColumn();
-}
-
-public void testColumnKeySet() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testColumnKeySet();
-}
-
-public void testColumnMap() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testColumnMap();
-}
-
-public void testConsistentHashCode() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testConsistentHashCode();
-}
-
-public void testConsistentToString() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testConsistentToString();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testContainsValue();
-}
-
-public void testEqualsObject() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testEqualsObject();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testPut();
-}
-
-public void testPutAll() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testPutAll();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testRow();
-}
-
-public void testRowKeySet() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testRowKeySet();
-}
-
-public void testRowMap() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testRowMap();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testSize();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testToString();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.EmptyImmutableTableTest testCase = new com.google.common.collect.EmptyImmutableTableTest();
-  testCase.testValues();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/EnumBiMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/EnumBiMapTest_gwt.java
deleted file mode 100644
index 8d0966e..0000000
--- a/guava-gwt/test/com/google/common/collect/EnumBiMapTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.collect;
-public class EnumBiMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromMap() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testCreateFromMap();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEnumBiMapConstructor() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testEnumBiMapConstructor();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testEquals();
-}
-
-public void testIterationOrder() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testIterationOrder();
-}
-
-public void testKeySetIteratorRemove() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testKeySetIteratorRemove();
-}
-
-public void testKeyType() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testKeyType();
-}
-
-public void testValueType() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testValueType();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.EnumBiMapTest testCase = new com.google.common.collect.EnumBiMapTest();
-  testCase.testValuesIteratorRemove();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/EnumHashBiMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/EnumHashBiMapTest_gwt.java
deleted file mode 100644
index cd73e05..0000000
--- a/guava-gwt/test/com/google/common/collect/EnumHashBiMapTest_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.collect;
-public class EnumHashBiMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.EnumHashBiMapTest testCase = new com.google.common.collect.EnumHashBiMapTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromMap() throws Exception {
-  com.google.common.collect.EnumHashBiMapTest testCase = new com.google.common.collect.EnumHashBiMapTest();
-  testCase.testCreateFromMap();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.EnumHashBiMapTest testCase = new com.google.common.collect.EnumHashBiMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEnumBiMapConstructor() throws Exception {
-  com.google.common.collect.EnumHashBiMapTest testCase = new com.google.common.collect.EnumHashBiMapTest();
-  testCase.testEnumBiMapConstructor();
-}
-
-public void testEnumHashBiMapConstructor() throws Exception {
-  com.google.common.collect.EnumHashBiMapTest testCase = new com.google.common.collect.EnumHashBiMapTest();
-  testCase.testEnumHashBiMapConstructor();
-}
-
-public void testKeyType() throws Exception {
-  com.google.common.collect.EnumHashBiMapTest testCase = new com.google.common.collect.EnumHashBiMapTest();
-  testCase.testKeyType();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/EnumMultisetTest_gwt.java b/guava-gwt/test/com/google/common/collect/EnumMultisetTest_gwt.java
deleted file mode 100644
index ff55467..0000000
--- a/guava-gwt/test/com/google/common/collect/EnumMultisetTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.collect;
-public class EnumMultisetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClassCreate() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testClassCreate();
-}
-
-public void testCollectionCreate() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testCollectionCreate();
-}
-
-public void testCreateEmptyWithClass() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testCreateEmptyWithClass();
-}
-
-public void testCreateEmptyWithoutClassFails() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testCreateEmptyWithoutClassFails();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testEntrySet();
-}
-
-public void testIllegalCreate() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testIllegalCreate();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.EnumMultisetTest testCase = new com.google.common.collect.EnumMultisetTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/EvictingQueueTest_gwt.java b/guava-gwt/test/com/google/common/collect/EvictingQueueTest_gwt.java
deleted file mode 100644
index ea559ab..0000000
--- a/guava-gwt/test/com/google/common/collect/EvictingQueueTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.collect;
-public class EvictingQueueTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAddAll() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testAddAll();
-}
-
-public void testAddAll_largeList() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testAddAll_largeList();
-}
-
-public void testCreateWithNegativeSize() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testCreateWithNegativeSize();
-}
-
-public void testCreateWithZeroSize() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testCreateWithZeroSize();
-}
-
-public void testEvictingAfterOne() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testEvictingAfterOne();
-}
-
-public void testEvictingAfterThree() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testEvictingAfterThree();
-}
-
-public void testRemainingCapacity_maxSize0() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testRemainingCapacity_maxSize0();
-}
-
-public void testRemainingCapacity_maxSize1() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testRemainingCapacity_maxSize1();
-}
-
-public void testRemainingCapacity_maxSize3() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testRemainingCapacity_maxSize3();
-}
-
-public void testSerialization() throws Exception {
-  com.google.common.collect.EvictingQueueTest testCase = new com.google.common.collect.EvictingQueueTest();
-  testCase.testSerialization();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ForMapMultimapAsMapImplementsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ForMapMultimapAsMapImplementsMapTest_gwt.java
deleted file mode 100644
index 2cb9ff7..0000000
--- a/guava-gwt/test/com/google/common/collect/ForMapMultimapAsMapImplementsMapTest_gwt.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * 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.collect;
-public class ForMapMultimapAsMapImplementsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ForMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ForwardingSortedMapImplementsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ForwardingSortedMapImplementsMapTest_gwt.java
deleted file mode 100644
index 30c8272..0000000
--- a/guava-gwt/test/com/google/common/collect/ForwardingSortedMapImplementsMapTest_gwt.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * 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.collect;
-public class ForwardingSortedMapImplementsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ForwardingSortedMapImplementsMapTest testCase = new com.google.common.collect.ForwardingSortedMapImplementsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/GeneralRangeTest_gwt.java b/guava-gwt/test/com/google/common/collect/GeneralRangeTest_gwt.java
deleted file mode 100644
index bfa6e70..0000000
--- a/guava-gwt/test/com/google/common/collect/GeneralRangeTest_gwt.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.collect;
-public class GeneralRangeTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreateEmptyRangeClosedOpenSucceeds() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testCreateEmptyRangeClosedOpenSucceeds();
-}
-
-public void testCreateEmptyRangeFails() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testCreateEmptyRangeFails();
-}
-
-public void testCreateEmptyRangeOpenClosedSucceeds() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testCreateEmptyRangeOpenClosedSucceeds();
-}
-
-public void testCreateEmptyRangeOpenOpenFails() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testCreateEmptyRangeOpenOpenFails();
-}
-
-public void testCreateSingletonRangeSucceeds() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testCreateSingletonRangeSucceeds();
-}
-
-public void testDoublyBoundedAgainstRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testDoublyBoundedAgainstRange();
-}
-
-public void testFromRangeAll() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testFromRangeAll();
-}
-
-public void testFromRangeOneEnd() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testFromRangeOneEnd();
-}
-
-public void testFromRangeTwoEnds() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testFromRangeTwoEnds();
-}
-
-public void testIntersectAgainstBiggerRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testIntersectAgainstBiggerRange();
-}
-
-public void testIntersectAgainstMatchingEndpointsRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testIntersectAgainstMatchingEndpointsRange();
-}
-
-public void testIntersectAgainstSmallerRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testIntersectAgainstSmallerRange();
-}
-
-public void testIntersectNonOverlappingRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testIntersectNonOverlappingRange();
-}
-
-public void testIntersectOverlappingRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testIntersectOverlappingRange();
-}
-
-public void testLowerRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testLowerRange();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testReverse();
-}
-
-public void testSingletonRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testSingletonRange();
-}
-
-public void testUpperRange() throws Exception {
-  com.google.common.collect.GeneralRangeTest testCase = new com.google.common.collect.GeneralRangeTest();
-  testCase.testUpperRange();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/HashBasedTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/HashBasedTableTest_gwt.java
deleted file mode 100644
index 84d5b9e..0000000
--- a/guava-gwt/test/com/google/common/collect/HashBasedTableTest_gwt.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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.collect;
-public class HashBasedTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testCreateCopy() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testCreateCopy();
-}
-
-public void testCreateWithInvalidSizes() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testCreateWithInvalidSizes();
-}
-
-public void testCreateWithValidSizes() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testCreateWithValidSizes();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testIterationOrder() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testIterationOrder();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testPut();
-}
-
-public void testPutAllTable() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testPutAllTable();
-}
-
-public void testPutNull() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testPutNull();
-}
-
-public void testPutNullReplace() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testPutNullReplace();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowClearAndPut() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testRowClearAndPut();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.HashBasedTableTest testCase = new com.google.common.collect.HashBasedTableTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/HashBiMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/HashBiMapTest_gwt.java
deleted file mode 100644
index 4b1dae5..0000000
--- a/guava-gwt/test/com/google/common/collect/HashBiMapTest_gwt.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.collect;
-public class HashBiMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBashIt() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testBashIt();
-}
-
-public void testBiMapEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testBiMapEntrySetIteratorRemove();
-}
-
-public void testInsertionOrder() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInsertionOrder();
-}
-
-public void testInsertionOrderAfterForcePut() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInsertionOrderAfterForcePut();
-}
-
-public void testInsertionOrderAfterInverseForcePut() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInsertionOrderAfterInverseForcePut();
-}
-
-public void testInsertionOrderAfterRemoveFirst() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInsertionOrderAfterRemoveFirst();
-}
-
-public void testInsertionOrderAfterRemoveLast() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInsertionOrderAfterRemoveLast();
-}
-
-public void testInsertionOrderAfterRemoveMiddle() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInsertionOrderAfterRemoveMiddle();
-}
-
-public void testInverseEntrySetValueNewKey() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInverseEntrySetValueNewKey();
-}
-
-public void testInverseInsertionOrderAfterInverse() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInverseInsertionOrderAfterInverse();
-}
-
-public void testInverseInsertionOrderAfterInverseForcePut() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInverseInsertionOrderAfterInverseForcePut();
-}
-
-public void testInverseInsertionOrderAfterInverseForcePutPresentKey() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testInverseInsertionOrderAfterInverseForcePutPresentKey();
-}
-
-public void testMapConstructor() throws Exception {
-  com.google.common.collect.HashBiMapTest testCase = new com.google.common.collect.HashBiMapTest();
-  testCase.testMapConstructor();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/HashMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/HashMultimapTest_gwt.java
deleted file mode 100644
index b981fec..0000000
--- a/guava-gwt/test/com/google/common/collect/HashMultimapTest_gwt.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.collect;
-public class HashMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.HashMultimapTest testCase = new com.google.common.collect.HashMultimapTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromIllegalSizes() throws Exception {
-  com.google.common.collect.HashMultimapTest testCase = new com.google.common.collect.HashMultimapTest();
-  testCase.testCreateFromIllegalSizes();
-}
-
-public void testCreateFromMultimap() throws Exception {
-  com.google.common.collect.HashMultimapTest testCase = new com.google.common.collect.HashMultimapTest();
-  testCase.testCreateFromMultimap();
-}
-
-public void testCreateFromSizes() throws Exception {
-  com.google.common.collect.HashMultimapTest testCase = new com.google.common.collect.HashMultimapTest();
-  testCase.testCreateFromSizes();
-}
-
-public void testEmptyMultimapsEqual() throws Exception {
-  com.google.common.collect.HashMultimapTest testCase = new com.google.common.collect.HashMultimapTest();
-  testCase.testEmptyMultimapsEqual();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/HashMultisetTest_gwt.java b/guava-gwt/test/com/google/common/collect/HashMultisetTest_gwt.java
deleted file mode 100644
index 4c4ac4a..0000000
--- a/guava-gwt/test/com/google/common/collect/HashMultisetTest_gwt.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.collect;
-public class HashMultisetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.HashMultisetTest testCase = new com.google.common.collect.HashMultisetTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromIterable() throws Exception {
-  com.google.common.collect.HashMultisetTest testCase = new com.google.common.collect.HashMultisetTest();
-  testCase.testCreateFromIterable();
-}
-
-public void testCreateWithSize() throws Exception {
-  com.google.common.collect.HashMultisetTest testCase = new com.google.common.collect.HashMultisetTest();
-  testCase.testCreateWithSize();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/HashingTest_gwt.java b/guava-gwt/test/com/google/common/collect/HashingTest_gwt.java
deleted file mode 100644
index 8747495..0000000
--- a/guava-gwt/test/com/google/common/collect/HashingTest_gwt.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.collect;
-public class HashingTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testSmear() throws Exception {
-  com.google.common.collect.HashingTest testCase = new com.google.common.collect.HashingTest();
-  testCase.testSmear();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableBiMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableBiMapTest_gwt.java
deleted file mode 100644
index 668ce9d..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableBiMapTest_gwt.java
+++ /dev/null
@@ -1,740 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableBiMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testDoubleInverse__BiMapSpecificTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests testCase = new com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests();
-  testCase.testDoubleInverse();
-}
-
-public void testForcePut__BiMapSpecificTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests testCase = new com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests();
-  testCase.testForcePut();
-}
-
-public void testKeySet__BiMapSpecificTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests testCase = new com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests();
-  testCase.testKeySet();
-}
-
-public void testValues__BiMapSpecificTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests testCase = new com.google.common.collect.ImmutableBiMapTest.BiMapSpecificTests();
-  testCase.testValues();
-}
-
-public void testBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilder();
-}
-
-public void testBuilderPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderPutAll();
-}
-
-public void testBuilderPutAllWithEmptyMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderPutAllWithEmptyMap();
-}
-
-public void testBuilderPutNullKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderPutNullKey();
-}
-
-public void testBuilderPutNullKeyViaPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderPutNullKeyViaPutAll();
-}
-
-public void testBuilderPutNullValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderPutNullValue();
-}
-
-public void testBuilderPutNullValueViaPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderPutNullValueViaPutAll();
-}
-
-public void testBuilderReuse__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilderReuse();
-}
-
-public void testBuilder_orderEntriesByValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValue();
-}
-
-public void testBuilder_orderEntriesByValueAfterExactSizeBuild__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValueAfterExactSizeBuild();
-}
-
-public void testBuilder_orderEntriesByValue_usedTwiceFails__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValue_usedTwiceFails();
-}
-
-public void testBuilder_withImmutableEntry__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testBuilder_withImmutableEntry();
-}
-
-public void testCopyOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testCopyOf();
-}
-
-public void testCopyOfEmptyMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testCopyOfEmptyMap();
-}
-
-public void testCopyOfSingletonMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testCopyOfSingletonMap();
-}
-
-public void testDuplicateValues__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testDuplicateValues();
-}
-
-public void testEmpty__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testEmpty();
-}
-
-public void testEmptyBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testEmptyBuilder();
-}
-
-public void testFromHashMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testFromHashMap();
-}
-
-public void testFromImmutableMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testFromImmutableMap();
-}
-
-public void testOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testOf();
-}
-
-public void testOfNullKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testOfNullKey();
-}
-
-public void testOfNullValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testOfNullValue();
-}
-
-public void testOfWithDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testOfWithDuplicateKey();
-}
-
-public void testPuttingTheSameKeyTwiceThrowsOnBuild__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testPuttingTheSameKeyTwiceThrowsOnBuild();
-}
-
-public void testSingletonBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testSingletonBuilder();
-}
-
-public void testToImmutableBiMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testToImmutableBiMap();
-}
-
-public void testToImmutableBiMap_exceptionOnDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.CreationTests testCase = new com.google.common.collect.ImmutableBiMapTest.CreationTests();
-  testCase.testToImmutableBiMap_exceptionOnDuplicateKey();
-}
-
-public void testClear__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testSize();
-}
-
-public void testValues__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__InverseMapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.InverseMapTests testCase = new com.google.common.collect.ImmutableBiMapTest.InverseMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testSize();
-}
-
-public void testValues__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableBiMapTest.MapTests testCase = new com.google.common.collect.ImmutableBiMapTest.MapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableEnumMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableEnumMapTest_gwt.java
deleted file mode 100644
index 4bde4e8..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableEnumMapTest_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableEnumMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testEmptyImmutableEnumMap() throws Exception {
-  com.google.common.collect.ImmutableEnumMapTest testCase = new com.google.common.collect.ImmutableEnumMapTest();
-  testCase.testEmptyImmutableEnumMap();
-}
-
-public void testImmutableEnumMapOrdering() throws Exception {
-  com.google.common.collect.ImmutableEnumMapTest testCase = new com.google.common.collect.ImmutableEnumMapTest();
-  testCase.testImmutableEnumMapOrdering();
-}
-
-public void testIteratesOnce() throws Exception {
-  com.google.common.collect.ImmutableEnumMapTest testCase = new com.google.common.collect.ImmutableEnumMapTest();
-  testCase.testIteratesOnce();
-}
-
-public void testToImmutableEnumMap() throws Exception {
-  com.google.common.collect.ImmutableEnumMapTest testCase = new com.google.common.collect.ImmutableEnumMapTest();
-  testCase.testToImmutableEnumMap();
-}
-
-public void testToImmutableMapMerging() throws Exception {
-  com.google.common.collect.ImmutableEnumMapTest testCase = new com.google.common.collect.ImmutableEnumMapTest();
-  testCase.testToImmutableMapMerging();
-}
-
-public void testToImmutableMap_exceptionOnDuplicateKey() throws Exception {
-  com.google.common.collect.ImmutableEnumMapTest testCase = new com.google.common.collect.ImmutableEnumMapTest();
-  testCase.testToImmutableMap_exceptionOnDuplicateKey();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableListMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableListMultimapTest_gwt.java
deleted file mode 100644
index c2d43cc..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableListMultimapTest_gwt.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableListMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBuilderOrderKeysAndValuesBy() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderOrderKeysAndValuesBy();
-}
-
-public void testBuilderOrderKeysBy() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderOrderKeysBy();
-}
-
-public void testBuilderOrderKeysByDuplicates() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderOrderKeysByDuplicates();
-}
-
-public void testBuilderOrderValuesBy() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderOrderValuesBy();
-}
-
-public void testBuilderPutAllIterable() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutAllIterable();
-}
-
-public void testBuilderPutAllMultimap() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutAllMultimap();
-}
-
-public void testBuilderPutAllMultimapWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutAllMultimapWithDuplicates();
-}
-
-public void testBuilderPutAllVarargs() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutAllVarargs();
-}
-
-public void testBuilderPutAllWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutAllWithDuplicates();
-}
-
-public void testBuilderPutNullKey() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutNullKey();
-}
-
-public void testBuilderPutNullValue() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutNullValue();
-}
-
-public void testBuilderPutWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilderPutWithDuplicates();
-}
-
-public void testBuilder_withImmutableEntry() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilder_withImmutableEntry();
-}
-
-public void testBuilder_withImmutableEntryAndNullContents() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilder_withImmutableEntryAndNullContents();
-}
-
-public void testBuilder_withMutableEntry() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testBuilder_withMutableEntry();
-}
-
-public void testCopyOf() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testCopyOf();
-}
-
-public void testCopyOfEmpty() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testCopyOfEmpty();
-}
-
-public void testCopyOfImmutableListMultimap() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testCopyOfImmutableListMultimap();
-}
-
-public void testCopyOfNullKey() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testCopyOfNullKey();
-}
-
-public void testCopyOfNullValue() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testCopyOfNullValue();
-}
-
-public void testCopyOfWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testCopyOfWithDuplicates();
-}
-
-public void testEmptyMultimapReads() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testEmptyMultimapReads();
-}
-
-public void testEmptyMultimapWrites() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testEmptyMultimapWrites();
-}
-
-public void testFlatteningToImmutableListMultimap() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testFlatteningToImmutableListMultimap();
-}
-
-public void testInverse() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testInverse();
-}
-
-public void testInverseMinimizesWork() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testInverseMinimizesWork();
-}
-
-public void testMultimapEquals() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testMultimapEquals();
-}
-
-public void testMultimapReads() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testMultimapReads();
-}
-
-public void testMultimapWrites() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testMultimapWrites();
-}
-
-public void testOf() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testOf();
-}
-
-public void testToImmutableListMultimap() throws Exception {
-  com.google.common.collect.ImmutableListMultimapTest testCase = new com.google.common.collect.ImmutableListMultimapTest();
-  testCase.testToImmutableListMultimap();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableListTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableListTest_gwt.java
deleted file mode 100644
index e7eeb3b..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableListTest_gwt.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableListTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsList__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testAsList();
-}
-
-public void testBuilderAdd__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testBuilderAdd();
-}
-
-public void testBuilderAddAllHandlesNullsCorrectly__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testBuilderAddAllHandlesNullsCorrectly();
-}
-
-public void testBuilderAddAll_iterable__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testBuilderAddAll_iterable();
-}
-
-public void testBuilderAddAll_iterator__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testBuilderAddAll_iterator();
-}
-
-public void testBuilderAddHandlesNullsCorrectly__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testBuilderAddHandlesNullsCorrectly();
-}
-
-public void testBuilderAdd_varargs__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testBuilderAdd_varargs();
-}
-
-public void testComplexBuilder__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testComplexBuilder();
-}
-
-public void testEquals_immutableList__BasicTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.BasicTests testCase = new com.google.common.collect.ImmutableListTest.BasicTests();
-  testCase.testEquals_immutableList();
-}
-
-public void testBuilderAddArrayHandlesNulls__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testBuilderAddArrayHandlesNulls();
-}
-
-public void testBuilderAddCollectionHandlesNulls__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testBuilderAddCollectionHandlesNulls();
-}
-
-public void testCopyOf_arrayContainingOnlyNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_arrayContainingOnlyNull();
-}
-
-public void testCopyOf_arrayOfOneElement__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_arrayOfOneElement();
-}
-
-public void testCopyOf_collectionContainingNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_collectionContainingNull();
-}
-
-public void testCopyOf_collection_empty__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_general__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_collection_general();
-}
-
-public void testCopyOf_collection_oneElement__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_collection_oneElement();
-}
-
-public void testCopyOf_concurrentlyMutating__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_concurrentlyMutating();
-}
-
-public void testCopyOf_emptyArray__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_emptyArray();
-}
-
-public void testCopyOf_iteratorContainingNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_iteratorContainingNull();
-}
-
-public void testCopyOf_iteratorNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_iteratorNull();
-}
-
-public void testCopyOf_iterator_empty__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_iterator_empty();
-}
-
-public void testCopyOf_iterator_general__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_iterator_general();
-}
-
-public void testCopyOf_iterator_oneElement__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_iterator_oneElement();
-}
-
-public void testCopyOf_nullArray__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_nullArray();
-}
-
-public void testCopyOf_plainIterable__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_plainIterable();
-}
-
-public void testCopyOf_plainIterable_iteratesOnce__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_plainIterable_iteratesOnce();
-}
-
-public void testCopyOf_shortcut_empty__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_shortcut_empty();
-}
-
-public void testCopyOf_shortcut_immutableList__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_shortcut_immutableList();
-}
-
-public void testCopyOf_shortcut_singleton__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCopyOf_shortcut_singleton();
-}
-
-public void testCreation_arrayOfArray__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_arrayOfArray();
-}
-
-public void testCreation_eightElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_eightElements();
-}
-
-public void testCreation_elevenElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_elevenElements();
-}
-
-public void testCreation_fiveElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_fiveElements();
-}
-
-public void testCreation_fourElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_fourElements();
-}
-
-public void testCreation_fourteenElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_fourteenElements();
-}
-
-public void testCreation_generic__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_generic();
-}
-
-public void testCreation_nineElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_nineElements();
-}
-
-public void testCreation_noArgs__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_noArgs();
-}
-
-public void testCreation_oneElement__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_oneElement();
-}
-
-public void testCreation_sevenElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_sevenElements();
-}
-
-public void testCreation_singletonNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_singletonNull();
-}
-
-public void testCreation_sixElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_sixElements();
-}
-
-public void testCreation_tenElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_tenElements();
-}
-
-public void testCreation_thirteenElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_thirteenElements();
-}
-
-public void testCreation_threeElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_threeElements();
-}
-
-public void testCreation_twelveElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_twelveElements();
-}
-
-public void testCreation_twoElements__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_twoElements();
-}
-
-public void testCreation_withNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testCreation_withNull();
-}
-
-public void testSortedCopyOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf();
-}
-
-public void testSortedCopyOf_containsNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_containsNull();
-}
-
-public void testSortedCopyOf_empty__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_empty();
-}
-
-public void testSortedCopyOf_natural__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_natural();
-}
-
-public void testSortedCopyOf_natural_containsNull__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_natural_containsNull();
-}
-
-public void testSortedCopyOf_natural_empty__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_natural_empty();
-}
-
-public void testSortedCopyOf_natural_singleton__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_natural_singleton();
-}
-
-public void testSortedCopyOf_singleton__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testSortedCopyOf_singleton();
-}
-
-public void testToImmutableList__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableListTest.CreationTests testCase = new com.google.common.collect.ImmutableListTest.CreationTests();
-  testCase.testToImmutableList();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableMapTest_gwt.java
deleted file mode 100644
index 2b53584..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableMapTest_gwt.java
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsMultimap() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testAsMultimap();
-}
-
-public void testAsMultimapCaches() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testAsMultimapCaches();
-}
-
-public void testAsMultimapWhenEmpty() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testAsMultimapWhenEmpty();
-}
-
-public void testBuilderPutAllEntryList() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testBuilderPutAllEntryList();
-}
-
-public void testBuilderPutAllEntryListJdkBacked() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testBuilderPutAllEntryListJdkBacked();
-}
-
-public void testCopyOfEnumMap() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testCopyOfEnumMap();
-}
-
-public void testCopyOfMutableEntryList() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testCopyOfMutableEntryList();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testEquals();
-}
-
-public void testMutableValues() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testMutableValues();
-}
-
-public void testNullGet() throws Exception {
-  com.google.common.collect.ImmutableMapTest testCase = new com.google.common.collect.ImmutableMapTest();
-  testCase.testNullGet();
-}
-
-public void testBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder();
-}
-
-public void testBuilderPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutAll();
-}
-
-public void testBuilderPutAllWithEmptyMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutAllWithEmptyMap();
-}
-
-public void testBuilderPutImmutableEntryWithNullKeyFailsAtomically__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutImmutableEntryWithNullKeyFailsAtomically();
-}
-
-public void testBuilderPutMutableEntryWithNullKeyFailsAtomically__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutMutableEntryWithNullKeyFailsAtomically();
-}
-
-public void testBuilderPutNullKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutNullKey();
-}
-
-public void testBuilderPutNullKeyFailsAtomically__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutNullKeyFailsAtomically();
-}
-
-public void testBuilderPutNullKeyViaPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutNullKeyViaPutAll();
-}
-
-public void testBuilderPutNullValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutNullValue();
-}
-
-public void testBuilderPutNullValueViaPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderPutNullValueViaPutAll();
-}
-
-public void testBuilderReuse__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilderReuse();
-}
-
-public void testBuilder_orderEntriesByValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValue();
-}
-
-public void testBuilder_orderEntriesByValueAfterExactSizeBuild__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValueAfterExactSizeBuild();
-}
-
-public void testBuilder_orderEntriesByValue_usedTwiceFails__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValue_usedTwiceFails();
-}
-
-public void testBuilder_withImmutableEntry__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder_withImmutableEntry();
-}
-
-public void testBuilder_withImmutableEntryAndNullContents__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder_withImmutableEntryAndNullContents();
-}
-
-public void testBuilder_withMutableEntry__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testBuilder_withMutableEntry();
-}
-
-public void testCopyOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testCopyOf();
-}
-
-public void testCopyOfEmptyMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testCopyOfEmptyMap();
-}
-
-public void testCopyOfSingletonMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testCopyOfSingletonMap();
-}
-
-public void testEmptyBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testEmptyBuilder();
-}
-
-public void testOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testOf();
-}
-
-public void testOfNullKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testOfNullKey();
-}
-
-public void testOfNullValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testOfNullValue();
-}
-
-public void testOfWithDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testOfWithDuplicateKey();
-}
-
-public void testPuttingTheSameKeyTwiceThrowsOnBuild__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testPuttingTheSameKeyTwiceThrowsOnBuild();
-}
-
-public void testSingletonBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testSingletonBuilder();
-}
-
-public void testToImmutableMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testToImmutableMap();
-}
-
-public void testToImmutableMapMerging__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testToImmutableMapMerging();
-}
-
-public void testToImmutableMap_exceptionOnDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.CreationTests testCase = new com.google.common.collect.ImmutableMapTest.CreationTests();
-  testCase.testToImmutableMap_exceptionOnDuplicateKey();
-}
-
-public void testClear__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testClear();
-}
-
-public void testContainsKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testGetNull();
-}
-
-public void testHashCode__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testSize();
-}
-
-public void testValues__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValues();
-}
-
-public void testValuesClear__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__MapTestsWithBadHashes() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes testCase = new com.google.common.collect.ImmutableMapTest.MapTestsWithBadHashes();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testSize();
-}
-
-public void testValues__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableMapTest.SingletonMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testSize();
-}
-
-public void testValues__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableMapTest.MapTests testCase = new com.google.common.collect.ImmutableMapTest.MapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableMultimapAsMapImplementsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableMultimapAsMapImplementsMapTest_gwt.java
deleted file mode 100644
index cbb4cf3..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableMultimapAsMapImplementsMapTest_gwt.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableMultimapAsMapImplementsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableMultimapTest_gwt.java
deleted file mode 100644
index 4aaed73..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableMultimapTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBuilder_withImmutableEntry() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testBuilder_withImmutableEntry();
-}
-
-public void testBuilder_withImmutableEntryAndNullContents() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testBuilder_withImmutableEntryAndNullContents();
-}
-
-public void testBuilder_withMutableEntry() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testBuilder_withMutableEntry();
-}
-
-public void testCopyOf() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testCopyOf();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testEquals();
-}
-
-public void testUnhashableMixedValues() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testUnhashableMixedValues();
-}
-
-public void testUnhashableSingletonValue() throws Exception {
-  com.google.common.collect.ImmutableMultimapTest testCase = new com.google.common.collect.ImmutableMultimapTest();
-  testCase.testUnhashableSingletonValue();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableMultisetTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableMultisetTest_gwt.java
deleted file mode 100644
index e985619..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableMultisetTest_gwt.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableMultisetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsList() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testAsList();
-}
-
-public void testBuilderAdd() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAdd();
-}
-
-public void testBuilderAddAll() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddAll();
-}
-
-public void testBuilderAddAllHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddAllHandlesNullsCorrectly();
-}
-
-public void testBuilderAddAllHashMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddAllHashMultiset();
-}
-
-public void testBuilderAddAllImmutableMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddAllImmutableMultiset();
-}
-
-public void testBuilderAddAllIterator() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddAllIterator();
-}
-
-public void testBuilderAddAllTreeMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddAllTreeMultiset();
-}
-
-public void testBuilderAddCopies() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddCopies();
-}
-
-public void testBuilderAddCopiesHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddCopiesHandlesNullsCorrectly();
-}
-
-public void testBuilderAddCopiesIllegal() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddCopiesIllegal();
-}
-
-public void testBuilderAddHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderAddHandlesNullsCorrectly();
-}
-
-public void testBuilderSetCount() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderSetCount();
-}
-
-public void testBuilderSetCountHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderSetCountHandlesNullsCorrectly();
-}
-
-public void testBuilderSetCountIllegal() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testBuilderSetCountIllegal();
-}
-
-public void testCopyOf_collectionContainingNull() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_collectionContainingNull();
-}
-
-public void testCopyOf_collection_empty() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_general() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_collection_general();
-}
-
-public void testCopyOf_collection_oneElement() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_collection_oneElement();
-}
-
-public void testCopyOf_hashMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_hashMultiset();
-}
-
-public void testCopyOf_iteratorContainingNull() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_iteratorContainingNull();
-}
-
-public void testCopyOf_iterator_empty() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_iterator_empty();
-}
-
-public void testCopyOf_iterator_general() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_iterator_general();
-}
-
-public void testCopyOf_iterator_oneElement() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_iterator_oneElement();
-}
-
-public void testCopyOf_multisetContainingNull() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_multisetContainingNull();
-}
-
-public void testCopyOf_multiset_empty() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_multiset_empty();
-}
-
-public void testCopyOf_multiset_general() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_multiset_general();
-}
-
-public void testCopyOf_multiset_oneElement() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_multiset_oneElement();
-}
-
-public void testCopyOf_plainIterable() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_plainIterable();
-}
-
-public void testCopyOf_shortcut_empty() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_shortcut_empty();
-}
-
-public void testCopyOf_shortcut_immutableMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_shortcut_immutableMultiset();
-}
-
-public void testCopyOf_shortcut_singleton() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_shortcut_singleton();
-}
-
-public void testCopyOf_treeMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCopyOf_treeMultiset();
-}
-
-public void testCreation_arrayContainingOnlyNull() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_arrayContainingOnlyNull();
-}
-
-public void testCreation_arrayOfArray() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_arrayOfArray();
-}
-
-public void testCreation_arrayOfOneElement() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_arrayOfOneElement();
-}
-
-public void testCreation_emptyArray() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_emptyArray();
-}
-
-public void testCreation_fiveElements() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_fiveElements();
-}
-
-public void testCreation_fourElements() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_fourElements();
-}
-
-public void testCreation_noArgs() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_noArgs();
-}
-
-public void testCreation_oneElement() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_oneElement();
-}
-
-public void testCreation_sevenElements() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_sevenElements();
-}
-
-public void testCreation_sixElements() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_sixElements();
-}
-
-public void testCreation_threeElements() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_threeElements();
-}
-
-public void testCreation_twoElements() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testCreation_twoElements();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testEquals();
-}
-
-public void testEquals_immutableMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testEquals_immutableMultiset();
-}
-
-public void testIterationOrder() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testIterationOrder();
-}
-
-public void testIterationOrderThroughBuilderRemovals() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testIterationOrderThroughBuilderRemovals();
-}
-
-public void testMultisetWrites() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testMultisetWrites();
-}
-
-public void testToImmutableMultiset() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testToImmutableMultiset();
-}
-
-public void testToImmutableMultisetCountFunction() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testToImmutableMultisetCountFunction();
-}
-
-public void testToImmutableMultiset_duplicates() throws Exception {
-  com.google.common.collect.ImmutableMultisetTest testCase = new com.google.common.collect.ImmutableMultisetTest();
-  testCase.testToImmutableMultiset_duplicates();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableSetMultimapAsMapImplementsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableSetMultimapAsMapImplementsMapTest_gwt.java
deleted file mode 100644
index 948439c..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableSetMultimapAsMapImplementsMapTest_gwt.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableSetMultimapAsMapImplementsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.ImmutableSetMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableSetMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableSetMultimapTest_gwt.java
deleted file mode 100644
index 635075a..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableSetMultimapTest_gwt.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableSetMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBuilderOrderKeysAndValuesBy() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderOrderKeysAndValuesBy();
-}
-
-public void testBuilderOrderKeysBy() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderOrderKeysBy();
-}
-
-public void testBuilderOrderKeysByDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderOrderKeysByDuplicates();
-}
-
-public void testBuilderOrderValuesBy() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderOrderValuesBy();
-}
-
-public void testBuilderPutAllIterable() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutAllIterable();
-}
-
-public void testBuilderPutAllMultimap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutAllMultimap();
-}
-
-public void testBuilderPutAllMultimapWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutAllMultimapWithDuplicates();
-}
-
-public void testBuilderPutAllVarargs() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutAllVarargs();
-}
-
-public void testBuilderPutAllWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutAllWithDuplicates();
-}
-
-public void testBuilderPutNullKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutNullKey();
-}
-
-public void testBuilderPutNullValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutNullValue();
-}
-
-public void testBuilderPutWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilderPutWithDuplicates();
-}
-
-public void testBuilder_withImmutableEntry() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilder_withImmutableEntry();
-}
-
-public void testBuilder_withImmutableEntryAndNullContents() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilder_withImmutableEntryAndNullContents();
-}
-
-public void testBuilder_withMutableEntry() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testBuilder_withMutableEntry();
-}
-
-public void testCopyOf() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testCopyOf();
-}
-
-public void testCopyOfEmpty() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testCopyOfEmpty();
-}
-
-public void testCopyOfImmutableSetMultimap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testCopyOfImmutableSetMultimap();
-}
-
-public void testCopyOfNullKey() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testCopyOfNullKey();
-}
-
-public void testCopyOfNullValue() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testCopyOfNullValue();
-}
-
-public void testCopyOfWithDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testCopyOfWithDuplicates();
-}
-
-public void testEmptyMultimapReads() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testEmptyMultimapReads();
-}
-
-public void testEmptyMultimapWrites() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testEmptyMultimapWrites();
-}
-
-public void testFlatteningToImmutableSetMultimap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testFlatteningToImmutableSetMultimap();
-}
-
-public void testInverse() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testInverse();
-}
-
-public void testInverseMinimizesWork() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testInverseMinimizesWork();
-}
-
-public void testMultimapEquals() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testMultimapEquals();
-}
-
-public void testMultimapReads() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testMultimapReads();
-}
-
-public void testMultimapWrites() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testMultimapWrites();
-}
-
-public void testOf() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testOf();
-}
-
-public void testToImmutableSetMultimap() throws Exception {
-  com.google.common.collect.ImmutableSetMultimapTest testCase = new com.google.common.collect.ImmutableSetMultimapTest();
-  testCase.testToImmutableSetMultimap();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableSetTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableSetTest_gwt.java
deleted file mode 100644
index cb7180c..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableSetTest_gwt.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableSetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBuilderAddAll() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testBuilderAddAll();
-}
-
-public void testBuilderAddAllHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testBuilderAddAllHandlesNullsCorrectly();
-}
-
-public void testBuilderAddHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testBuilderAddHandlesNullsCorrectly();
-}
-
-public void testBuilderWithDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testBuilderWithDuplicateElements();
-}
-
-public void testBuilderWithNonDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testBuilderWithNonDuplicateElements();
-}
-
-public void testComplexBuilder() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testComplexBuilder();
-}
-
-public void testContainsAll_sameType() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testContainsAll_sameType();
-}
-
-public void testCopyOf_arrayContainingOnlyNull() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_arrayContainingOnlyNull();
-}
-
-public void testCopyOf_arrayOfOneElement() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_arrayOfOneElement();
-}
-
-public void testCopyOf_collectionContainingNull() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_collectionContainingNull();
-}
-
-public void testCopyOf_collection_empty() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_enumSet() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_collection_enumSet();
-}
-
-public void testCopyOf_collection_general() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_collection_general();
-}
-
-public void testCopyOf_collection_oneElement() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_collection_oneElement();
-}
-
-public void testCopyOf_collection_oneElementRepeated() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_collection_oneElementRepeated();
-}
-
-public void testCopyOf_copiesImmutableSortedSet() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_copiesImmutableSortedSet();
-}
-
-public void testCopyOf_emptyArray() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_emptyArray();
-}
-
-public void testCopyOf_iteratorContainingNull() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_iteratorContainingNull();
-}
-
-public void testCopyOf_iterator_empty() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_iterator_empty();
-}
-
-public void testCopyOf_iterator_general() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_iterator_general();
-}
-
-public void testCopyOf_iterator_oneElement() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_iterator_oneElement();
-}
-
-public void testCopyOf_iterator_oneElementRepeated() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_iterator_oneElementRepeated();
-}
-
-public void testCopyOf_nullArray() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_nullArray();
-}
-
-public void testCopyOf_plainIterable() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_plainIterable();
-}
-
-public void testCopyOf_plainIterable_iteratesOnce() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_plainIterable_iteratesOnce();
-}
-
-public void testCopyOf_shortcut_empty() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_shortcut_empty();
-}
-
-public void testCopyOf_shortcut_sameType() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_shortcut_sameType();
-}
-
-public void testCopyOf_shortcut_singleton() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCopyOf_shortcut_singleton();
-}
-
-public void testCreation_allDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_allDuplicates();
-}
-
-public void testCreation_arrayOfArray() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_arrayOfArray();
-}
-
-public void testCreation_eightElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_eightElements();
-}
-
-public void testCreation_fiveElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_fiveElements();
-}
-
-public void testCreation_fourElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_fourElements();
-}
-
-public void testCreation_manyDuplicates() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_manyDuplicates();
-}
-
-public void testCreation_noArgs() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_noArgs();
-}
-
-public void testCreation_oneDuplicate() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_oneDuplicate();
-}
-
-public void testCreation_oneElement() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_oneElement();
-}
-
-public void testCreation_sevenElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_sevenElements();
-}
-
-public void testCreation_sixElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_sixElements();
-}
-
-public void testCreation_threeElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_threeElements();
-}
-
-public void testCreation_twoElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testCreation_twoElements();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testEquals();
-}
-
-public void testEquals_sameType() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testEquals_sameType();
-}
-
-public void testReuseBuilderWithDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testReuseBuilderWithDuplicateElements();
-}
-
-public void testReuseBuilderWithNonDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testReuseBuilderWithNonDuplicateElements();
-}
-
-public void testToImmutableSet() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testToImmutableSet();
-}
-
-public void testToImmutableSet_duplicates() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testToImmutableSet_duplicates();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.ImmutableSetTest testCase = new com.google.common.collect.ImmutableSetTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableSortedMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableSortedMapTest_gwt.java
deleted file mode 100644
index 8244100..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableSortedMapTest_gwt.java
+++ /dev/null
@@ -1,2320 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableSortedMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBuilderGenerics_SelfComparable() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testBuilderGenerics_SelfComparable();
-}
-
-public void testBuilderGenerics_SuperComparable() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testBuilderGenerics_SuperComparable();
-}
-
-public void testHeadMapExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testHeadMapExclusive();
-}
-
-public void testHeadMapInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testHeadMapInclusive();
-}
-
-public void testMutableValues() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testMutableValues();
-}
-
-public void testNullGet() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testNullGet();
-}
-
-public void testNullValuesInCopyOfEntries() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testNullValuesInCopyOfEntries();
-}
-
-public void testNullValuesInCopyOfMap() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testNullValuesInCopyOfMap();
-}
-
-public void testSubMapExclusiveExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testSubMapExclusiveExclusive();
-}
-
-public void testSubMapExclusiveInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testSubMapExclusiveInclusive();
-}
-
-public void testSubMapInclusiveExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testSubMapInclusiveExclusive();
-}
-
-public void testSubMapInclusiveInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testSubMapInclusiveInclusive();
-}
-
-public void testTailMapExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testTailMapExclusive();
-}
-
-public void testTailMapInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest testCase = new com.google.common.collect.ImmutableSortedMapTest();
-  testCase.testTailMapInclusive();
-}
-
-public void testBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilder();
-}
-
-public void testBuilderComparator__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderComparator();
-}
-
-public void testBuilderPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderPutAll();
-}
-
-public void testBuilderPutAllWithEmptyMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderPutAllWithEmptyMap();
-}
-
-public void testBuilderPutNullKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderPutNullKey();
-}
-
-public void testBuilderPutNullKeyViaPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderPutNullKeyViaPutAll();
-}
-
-public void testBuilderPutNullValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderPutNullValue();
-}
-
-public void testBuilderPutNullValueViaPutAll__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderPutNullValueViaPutAll();
-}
-
-public void testBuilderReuse__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderReuse();
-}
-
-public void testBuilderReverseOrder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilderReverseOrder();
-}
-
-public void testBuilder_orderEntriesByValueFails__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilder_orderEntriesByValueFails();
-}
-
-public void testBuilder_withImmutableEntry__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilder_withImmutableEntry();
-}
-
-public void testBuilder_withImmutableEntryAndNullContents__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilder_withImmutableEntryAndNullContents();
-}
-
-public void testBuilder_withMutableEntry__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testBuilder_withMutableEntry();
-}
-
-public void testCopyOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOf();
-}
-
-public void testCopyOfDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfDuplicateKey();
-}
-
-public void testCopyOfEmptyMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfEmptyMap();
-}
-
-public void testCopyOfExplicitComparator__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfExplicitComparator();
-}
-
-public void testCopyOfImmutableSortedSetDifferentComparator__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfImmutableSortedSetDifferentComparator();
-}
-
-public void testCopyOfSingletonMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfSingletonMap();
-}
-
-public void testCopyOfSortedExplicit__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfSortedExplicit();
-}
-
-public void testCopyOfSortedNatural__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testCopyOfSortedNatural();
-}
-
-public void testEmptyBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testEmptyBuilder();
-}
-
-public void testImmutableMapCopyOfImmutableSortedMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testImmutableMapCopyOfImmutableSortedMap();
-}
-
-public void testOf__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testOf();
-}
-
-public void testOfNullKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testOfNullKey();
-}
-
-public void testOfNullValue__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testOfNullValue();
-}
-
-public void testOfWithDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testOfWithDuplicateKey();
-}
-
-public void testPuttingTheSameKeyTwiceThrowsOnBuild__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testPuttingTheSameKeyTwiceThrowsOnBuild();
-}
-
-public void testSingletonBuilder__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testSingletonBuilder();
-}
-
-public void testToImmutableSortedMap__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testToImmutableSortedMap();
-}
-
-public void testToImmutableSortedMapMerging__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testToImmutableSortedMapMerging();
-}
-
-public void testToImmutableSortedMap_exceptionOnDuplicateKey__CreationTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.CreationTests testCase = new com.google.common.collect.ImmutableSortedMapTest.CreationTests();
-  testCase.testToImmutableSortedMap_exceptionOnDuplicateKey();
-}
-
-public void testClear__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__SubMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SubMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SubMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TailExclusiveMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailExclusiveMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TailMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.TailMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.TailMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__HeadMapInclusiveTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapInclusiveTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__HeadMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.HeadMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.HeadMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__SingletonMapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.SingletonMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__MapTests() throws Exception {
-  com.google.common.collect.ImmutableSortedMapTest.MapTests testCase = new com.google.common.collect.ImmutableSortedMapTest.MapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableSortedSetTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableSortedSetTest_gwt.java
deleted file mode 100644
index 923b95b..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableSortedSetTest_gwt.java
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableSortedSetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsList() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testAsList();
-}
-
-public void testAsListInconsistentComprator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testAsListInconsistentComprator();
-}
-
-public void testBuilderAddAll() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderAddAll();
-}
-
-public void testBuilderAddAllHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderAddAllHandlesNullsCorrectly();
-}
-
-public void testBuilderAddHandlesNullsCorrectly() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderAddHandlesNullsCorrectly();
-}
-
-public void testBuilderGenerics_SelfComparable() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderGenerics_SelfComparable();
-}
-
-public void testBuilderGenerics_SuperComparable() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderGenerics_SuperComparable();
-}
-
-public void testBuilderMethod() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderMethod();
-}
-
-public void testBuilderWithDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderWithDuplicateElements();
-}
-
-public void testBuilderWithNonDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testBuilderWithNonDuplicateElements();
-}
-
-public void testComplexBuilder() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testComplexBuilder();
-}
-
-public void testContainsAll_differentComparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testContainsAll_differentComparator();
-}
-
-public void testContainsAll_notSortedSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testContainsAll_notSortedSet();
-}
-
-public void testContainsAll_sameComparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testContainsAll_sameComparator();
-}
-
-public void testContainsAll_sameComparator_StringVsInt() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testContainsAll_sameComparator_StringVsInt();
-}
-
-public void testContainsAll_sameType() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testContainsAll_sameType();
-}
-
-public void testCopyOfExplicit_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfExplicit_comparator();
-}
-
-public void testCopyOfExplicit_iterator_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfExplicit_iterator_comparator();
-}
-
-public void testCopyOfExplicit_iterator_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfExplicit_iterator_ordering();
-}
-
-public void testCopyOfExplicit_iterator_ordering_dupes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfExplicit_iterator_ordering_dupes();
-}
-
-public void testCopyOfExplicit_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfExplicit_ordering();
-}
-
-public void testCopyOfExplicit_ordering_dupes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfExplicit_ordering_dupes();
-}
-
-public void testCopyOfSorted_explicit_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfSorted_explicit_ordering();
-}
-
-public void testCopyOfSorted_natural_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfSorted_natural_comparator();
-}
-
-public void testCopyOfSorted_natural_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOfSorted_natural_ordering();
-}
-
-public void testCopyOf_arrayContainingOnlyNull() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_arrayContainingOnlyNull();
-}
-
-public void testCopyOf_arrayOfOneElement() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_arrayOfOneElement();
-}
-
-public void testCopyOf_collectionContainingNull() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_collectionContainingNull();
-}
-
-public void testCopyOf_collection_empty() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_enumSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_collection_enumSet();
-}
-
-public void testCopyOf_collection_general() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_collection_general();
-}
-
-public void testCopyOf_collection_oneElement() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_collection_oneElement();
-}
-
-public void testCopyOf_collection_oneElementRepeated() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_collection_oneElementRepeated();
-}
-
-public void testCopyOf_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_comparator();
-}
-
-public void testCopyOf_emptyArray() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_emptyArray();
-}
-
-public void testCopyOf_headSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_headSet();
-}
-
-public void testCopyOf_iteratorContainingNull() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iteratorContainingNull();
-}
-
-public void testCopyOf_iterator_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_comparator();
-}
-
-public void testCopyOf_iterator_empty() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_empty();
-}
-
-public void testCopyOf_iterator_general() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_general();
-}
-
-public void testCopyOf_iterator_oneElement() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_oneElement();
-}
-
-public void testCopyOf_iterator_oneElementRepeated() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_oneElementRepeated();
-}
-
-public void testCopyOf_iterator_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_ordering();
-}
-
-public void testCopyOf_iterator_ordering_dupes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_iterator_ordering_dupes();
-}
-
-public void testCopyOf_nullArray() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_nullArray();
-}
-
-public void testCopyOf_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_ordering();
-}
-
-public void testCopyOf_ordering_dupes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_ordering_dupes();
-}
-
-public void testCopyOf_plainIterable() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_plainIterable();
-}
-
-public void testCopyOf_plainIterable_iteratesOnce() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_plainIterable_iteratesOnce();
-}
-
-public void testCopyOf_shortcut_empty() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_shortcut_empty();
-}
-
-public void testCopyOf_shortcut_sameType() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_shortcut_sameType();
-}
-
-public void testCopyOf_shortcut_singleton() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_shortcut_singleton();
-}
-
-public void testCopyOf_sortedSetIterable() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_sortedSetIterable();
-}
-
-public void testCopyOf_sortedSet_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_sortedSet_comparator();
-}
-
-public void testCopyOf_sortedSet_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_sortedSet_ordering();
-}
-
-public void testCopyOf_subSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_subSet();
-}
-
-public void testCopyOf_tailSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCopyOf_tailSet();
-}
-
-public void testCreation_eightElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_eightElements();
-}
-
-public void testCreation_fiveElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_fiveElements();
-}
-
-public void testCreation_fourElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_fourElements();
-}
-
-public void testCreation_noArgs() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_noArgs();
-}
-
-public void testCreation_oneElement() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_oneElement();
-}
-
-public void testCreation_sevenElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_sevenElements();
-}
-
-public void testCreation_sixElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_sixElements();
-}
-
-public void testCreation_threeElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_threeElements();
-}
-
-public void testCreation_twoElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testCreation_twoElements();
-}
-
-public void testEmpty_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEmpty_comparator();
-}
-
-public void testEmpty_first() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEmpty_first();
-}
-
-public void testEmpty_headSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEmpty_headSet();
-}
-
-public void testEmpty_last() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEmpty_last();
-}
-
-public void testEmpty_subSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEmpty_subSet();
-}
-
-public void testEmpty_tailSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEmpty_tailSet();
-}
-
-public void testEquals_bothDefaultOrdering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEquals_bothDefaultOrdering();
-}
-
-public void testEquals_bothDefaultOrdering_StringVsInt() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEquals_bothDefaultOrdering_StringVsInt();
-}
-
-public void testEquals_bothExplicitOrdering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEquals_bothExplicitOrdering();
-}
-
-public void testEquals_bothExplicitOrdering_StringVsInt() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEquals_bothExplicitOrdering_StringVsInt();
-}
-
-public void testEquals_sameType() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testEquals_sameType();
-}
-
-public void testExplicit_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_comparator();
-}
-
-public void testExplicit_contains() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_contains();
-}
-
-public void testExplicit_containsMismatchedTypes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_containsMismatchedTypes();
-}
-
-public void testExplicit_first() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_first();
-}
-
-public void testExplicit_headSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_headSet();
-}
-
-public void testExplicit_last() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_last();
-}
-
-public void testExplicit_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_ordering();
-}
-
-public void testExplicit_ordering_dupes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_ordering_dupes();
-}
-
-public void testExplicit_subSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_subSet();
-}
-
-public void testExplicit_tailSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testExplicit_tailSet();
-}
-
-public void testHeadSetExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testHeadSetExclusive();
-}
-
-public void testHeadSetInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testHeadSetInclusive();
-}
-
-public void testLegacyComparable_builder_natural() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testLegacyComparable_builder_natural();
-}
-
-public void testLegacyComparable_builder_reverse() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testLegacyComparable_builder_reverse();
-}
-
-public void testLegacyComparable_copyOf_collection() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testLegacyComparable_copyOf_collection();
-}
-
-public void testLegacyComparable_copyOf_iterator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testLegacyComparable_copyOf_iterator();
-}
-
-public void testLegacyComparable_of() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testLegacyComparable_of();
-}
-
-public void testOf_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_comparator();
-}
-
-public void testOf_first() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_first();
-}
-
-public void testOf_gwtArraycopyBug() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_gwtArraycopyBug();
-}
-
-public void testOf_headSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_headSet();
-}
-
-public void testOf_last() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_last();
-}
-
-public void testOf_ordering() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_ordering();
-}
-
-public void testOf_ordering_dupes() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_ordering_dupes();
-}
-
-public void testOf_subSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_subSet();
-}
-
-public void testOf_tailSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testOf_tailSet();
-}
-
-public void testReuseBuilderWithDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testReuseBuilderWithDuplicateElements();
-}
-
-public void testReuseBuilderWithNonDuplicateElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testReuseBuilderWithNonDuplicateElements();
-}
-
-public void testReverseOrder() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testReverseOrder();
-}
-
-public void testSingle_comparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSingle_comparator();
-}
-
-public void testSingle_first() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSingle_first();
-}
-
-public void testSingle_headSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSingle_headSet();
-}
-
-public void testSingle_last() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSingle_last();
-}
-
-public void testSingle_subSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSingle_subSet();
-}
-
-public void testSingle_tailSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSingle_tailSet();
-}
-
-public void testSubSetExclusiveExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSubSetExclusiveExclusive();
-}
-
-public void testSubSetExclusiveInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSubSetExclusiveInclusive();
-}
-
-public void testSubSetInclusiveExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSubSetInclusiveExclusive();
-}
-
-public void testSubSetInclusiveInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSubSetInclusiveInclusive();
-}
-
-public void testSubsetAsList() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSubsetAsList();
-}
-
-public void testSupertypeComparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSupertypeComparator();
-}
-
-public void testSupertypeComparatorSubtypeElements() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testSupertypeComparatorSubtypeElements();
-}
-
-public void testTailSetExclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testTailSetExclusive();
-}
-
-public void testTailSetInclusive() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testTailSetInclusive();
-}
-
-public void testToImmutableSortedSet() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testToImmutableSortedSet();
-}
-
-public void testToImmutableSortedSet_customComparator() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testToImmutableSortedSet_customComparator();
-}
-
-public void testToImmutableSortedSet_duplicates() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testToImmutableSortedSet_duplicates();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.ImmutableSortedSetTest testCase = new com.google.common.collect.ImmutableSortedSetTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ImmutableTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/ImmutableTableTest_gwt.java
deleted file mode 100644
index 920c8ca..0000000
--- a/guava-gwt/test/com/google/common/collect/ImmutableTableTest_gwt.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * 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.collect;
-public class ImmutableTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBuilder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder();
-}
-
-public void testBuilder_noDuplicates() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_noDuplicates();
-}
-
-public void testBuilder_noNulls() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_noNulls();
-}
-
-public void testBuilder_orderColumnsBy_dense() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderColumnsBy_dense();
-}
-
-public void testBuilder_orderColumnsBy_sparse() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderColumnsBy_sparse();
-}
-
-public void testBuilder_orderRowsAndColumnsBy_dense() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderRowsAndColumnsBy_dense();
-}
-
-public void testBuilder_orderRowsAndColumnsBy_putAll() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderRowsAndColumnsBy_putAll();
-}
-
-public void testBuilder_orderRowsAndColumnsBy_sparse() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderRowsAndColumnsBy_sparse();
-}
-
-public void testBuilder_orderRowsBy_dense() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderRowsBy_dense();
-}
-
-public void testBuilder_orderRowsBy_sparse() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_orderRowsBy_sparse();
-}
-
-public void testBuilder_withImmutableCell() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_withImmutableCell();
-}
-
-public void testBuilder_withImmutableCellAndNullContents() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_withImmutableCellAndNullContents();
-}
-
-public void testBuilder_withMutableCell() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testBuilder_withMutableCell();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testCopyOf() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testCopyOf();
-}
-
-public void testCopyOfDense() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testCopyOfDense();
-}
-
-public void testCopyOfSparse() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testCopyOfSparse();
-}
-
-public void testDenseSerialization_bothOrders() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testDenseSerialization_bothOrders();
-}
-
-public void testDenseSerialization_columnOrder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testDenseSerialization_columnOrder();
-}
-
-public void testDenseSerialization_manualOrder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testDenseSerialization_manualOrder();
-}
-
-public void testDenseSerialization_rowOrder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testDenseSerialization_rowOrder();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testSerialization_empty() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSerialization_empty();
-}
-
-public void testSerialization_singleElement() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSerialization_singleElement();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testSparseSerialization_bothOrders() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSparseSerialization_bothOrders();
-}
-
-public void testSparseSerialization_columnOrder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSparseSerialization_columnOrder();
-}
-
-public void testSparseSerialization_manualOrder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSparseSerialization_manualOrder();
-}
-
-public void testSparseSerialization_rowOrder() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testSparseSerialization_rowOrder();
-}
-
-public void testToImmutableTable() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTable();
-}
-
-public void testToImmutableTableConflict() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableConflict();
-}
-
-public void testToImmutableTableMerging() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableMerging();
-}
-
-public void testToImmutableTableMergingNullColumnKey() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableMergingNullColumnKey();
-}
-
-public void testToImmutableTableMergingNullMerge() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableMergingNullMerge();
-}
-
-public void testToImmutableTableMergingNullRowKey() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableMergingNullRowKey();
-}
-
-public void testToImmutableTableMergingNullValue() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableMergingNullValue();
-}
-
-public void testToImmutableTableNullColumnKey() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableNullColumnKey();
-}
-
-public void testToImmutableTableNullRowKey() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableNullRowKey();
-}
-
-public void testToImmutableTableNullValue() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToImmutableTableNullValue();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.ImmutableTableTest testCase = new com.google.common.collect.ImmutableTableTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/IterablesTest_gwt.java b/guava-gwt/test/com/google/common/collect/IterablesTest_gwt.java
deleted file mode 100644
index fabcd41..0000000
--- a/guava-gwt/test/com/google/common/collect/IterablesTest_gwt.java
+++ /dev/null
@@ -1,620 +0,0 @@
-/*
- * 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.collect;
-public class IterablesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAddAllToList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testAddAllToList();
-}
-
-public void testAll() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testAll();
-}
-
-public void testAny() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testAny();
-}
-
-public void testConcatIterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConcatIterable();
-}
-
-public void testConcatNullPointerException() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConcatNullPointerException();
-}
-
-public void testConcatPeformingFiniteCycle() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConcatPeformingFiniteCycle();
-}
-
-public void testConcatVarargs() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConcatVarargs();
-}
-
-public void testConsumingIterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConsumingIterable();
-}
-
-public void testConsumingIterable_noIteratorCall() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConsumingIterable_noIteratorCall();
-}
-
-public void testConsumingIterable_queue_iterator() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConsumingIterable_queue_iterator();
-}
-
-public void testConsumingIterable_queue_removesFromQueue() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testConsumingIterable_queue_removesFromQueue();
-}
-
-public void testCycle() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testCycle();
-}
-
-public void testElementsEqual() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testElementsEqual();
-}
-
-public void testFind() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testFind();
-}
-
-public void testFind_withDefault() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testFind_withDefault();
-}
-
-public void testFrequency_list() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testFrequency_list();
-}
-
-public void testFrequency_multiset() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testFrequency_multiset();
-}
-
-public void testFrequency_set() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testFrequency_set();
-}
-
-public void testGetFirst_withDefault_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetFirst_withDefault_empty();
-}
-
-public void testGetFirst_withDefault_empty_null() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetFirst_withDefault_empty_null();
-}
-
-public void testGetFirst_withDefault_multiple() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetFirst_withDefault_multiple();
-}
-
-public void testGetFirst_withDefault_singleton() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetFirst_withDefault_singleton();
-}
-
-public void testGetLast_emptyIterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_emptyIterable();
-}
-
-public void testGetLast_emptyList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_emptyList();
-}
-
-public void testGetLast_emptySortedSet() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_emptySortedSet();
-}
-
-public void testGetLast_iterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_iterable();
-}
-
-public void testGetLast_list() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_list();
-}
-
-public void testGetLast_sortedSet() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_sortedSet();
-}
-
-public void testGetLast_withDefault_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_withDefault_empty();
-}
-
-public void testGetLast_withDefault_empty_null() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_withDefault_empty_null();
-}
-
-public void testGetLast_withDefault_multiple() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_withDefault_multiple();
-}
-
-public void testGetLast_withDefault_not_empty_list() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_withDefault_not_empty_list();
-}
-
-public void testGetLast_withDefault_singleton() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetLast_withDefault_singleton();
-}
-
-public void testGetOnlyElement_noDefault_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_noDefault_empty();
-}
-
-public void testGetOnlyElement_noDefault_multiple() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_noDefault_multiple();
-}
-
-public void testGetOnlyElement_noDefault_valid() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_noDefault_valid();
-}
-
-public void testGetOnlyElement_withDefault_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_withDefault_empty();
-}
-
-public void testGetOnlyElement_withDefault_empty_null() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_withDefault_empty_null();
-}
-
-public void testGetOnlyElement_withDefault_multiple() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_withDefault_multiple();
-}
-
-public void testGetOnlyElement_withDefault_singleton() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGetOnlyElement_withDefault_singleton();
-}
-
-public void testGet_emptyIterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_emptyIterable();
-}
-
-public void testGet_emptyList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_emptyList();
-}
-
-public void testGet_emptySortedSet() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_emptySortedSet();
-}
-
-public void testGet_iterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_iterable();
-}
-
-public void testGet_list() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_list();
-}
-
-public void testGet_sortedSet() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_sortedSet();
-}
-
-public void testGet_withDefault_doesntIterate() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_withDefault_doesntIterate();
-}
-
-public void testGet_withDefault_iterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_withDefault_iterable();
-}
-
-public void testGet_withDefault_last() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_withDefault_last();
-}
-
-public void testGet_withDefault_lastPlusOne() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_withDefault_lastPlusOne();
-}
-
-public void testGet_withDefault_negativePosition() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_withDefault_negativePosition();
-}
-
-public void testGet_withDefault_simple() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testGet_withDefault_simple();
-}
-
-public void testIndexOf_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIndexOf_empty();
-}
-
-public void testIndexOf_genericPredicate() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIndexOf_genericPredicate();
-}
-
-public void testIndexOf_genericPredicate2() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIndexOf_genericPredicate2();
-}
-
-public void testIndexOf_oneElement() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIndexOf_oneElement();
-}
-
-public void testIndexOf_twoElements() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIndexOf_twoElements();
-}
-
-public void testIndexOf_withDuplicates() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIndexOf_withDuplicates();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIsEmpty();
-}
-
-public void testIterableWithToString() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIterableWithToString();
-}
-
-public void testIterableWithToStringNull() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testIterableWithToStringNull();
-}
-
-public void testLimit() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testLimit();
-}
-
-public void testLimit_illegalArgument() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testLimit_illegalArgument();
-}
-
-public void testMergeSorted_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testMergeSorted_empty();
-}
-
-public void testMergeSorted_pyramid() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testMergeSorted_pyramid();
-}
-
-public void testMergeSorted_single() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testMergeSorted_single();
-}
-
-public void testMergeSorted_single_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testMergeSorted_single_empty();
-}
-
-public void testMergeSorted_skipping_pyramid() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testMergeSorted_skipping_pyramid();
-}
-
-public void testNullFriendlyTransform() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testNullFriendlyTransform();
-}
-
-public void testPaddedPartitionNonRandomAccessInput() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPaddedPartitionNonRandomAccessInput();
-}
-
-public void testPaddedPartitionRandomAccessInput() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPaddedPartitionRandomAccessInput();
-}
-
-public void testPaddedPartition_basic() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPaddedPartition_basic();
-}
-
-public void testPartition_badSize() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPartition_badSize();
-}
-
-public void testPartition_empty() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPartition_empty();
-}
-
-public void testPartition_singleton1() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPartition_singleton1();
-}
-
-public void testPartition_view() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPartition_view();
-}
-
-public void testPoorlyBehavedTransform() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testPoorlyBehavedTransform();
-}
-
-public void testRemoveAll_collection() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveAll_collection();
-}
-
-public void testRemoveAll_iterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveAll_iterable();
-}
-
-public void testRemoveIf_iterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveIf_iterable();
-}
-
-public void testRemoveIf_noRandomAccess() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveIf_noRandomAccess();
-}
-
-public void testRemoveIf_randomAccess() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveIf_randomAccess();
-}
-
-public void testRemoveIf_randomAccess_notPermittingDuplicates() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveIf_randomAccess_notPermittingDuplicates();
-}
-
-public void testRemoveIf_transformedList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRemoveIf_transformedList();
-}
-
-public void testRetainAll_collection() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRetainAll_collection();
-}
-
-public void testRetainAll_iterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testRetainAll_iterable();
-}
-
-public void testSize0() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSize0();
-}
-
-public void testSize1Collection() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSize1Collection();
-}
-
-public void testSize2NonCollection() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSize2NonCollection();
-}
-
-public void testSize_collection_doesntIterate() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSize_collection_doesntIterate();
-}
-
-public void testSkip_allOfImmutableList_modifiable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_allOfImmutableList_modifiable();
-}
-
-public void testSkip_allOfMutableList_modifiable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_allOfMutableList_modifiable();
-}
-
-public void testSkip_illegalArgument() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_illegalArgument();
-}
-
-public void testSkip_nonStructurallyModifiedList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_nonStructurallyModifiedList();
-}
-
-public void testSkip_pastEnd() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_pastEnd();
-}
-
-public void testSkip_pastEndList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_pastEndList();
-}
-
-public void testSkip_removal() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_removal();
-}
-
-public void testSkip_simple() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_simple();
-}
-
-public void testSkip_simpleList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_simpleList();
-}
-
-public void testSkip_skipNone() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_skipNone();
-}
-
-public void testSkip_skipNoneList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_skipNoneList();
-}
-
-public void testSkip_structurallyModifiedSkipAll() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_structurallyModifiedSkipAll();
-}
-
-public void testSkip_structurallyModifiedSkipAllList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_structurallyModifiedSkipAllList();
-}
-
-public void testSkip_structurallyModifiedSkipSome() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_structurallyModifiedSkipSome();
-}
-
-public void testSkip_structurallyModifiedSkipSomeList() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testSkip_structurallyModifiedSkipSomeList();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testToString();
-}
-
-public void testTransform_forEach() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testTransform_forEach();
-}
-
-public void testTransform_iterator() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testTransform_iterator();
-}
-
-public void testTryFind() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testTryFind();
-}
-
-public void testUnmodifiableIterable() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testUnmodifiableIterable();
-}
-
-public void testUnmodifiableIterableShortCircuit() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testUnmodifiableIterableShortCircuit();
-}
-
-public void testUnmodifiableIterable_forEach() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.testUnmodifiableIterable_forEach();
-}
-
-public void test_contains_nonnull_iterable_no() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_nonnull_iterable_no();
-}
-
-public void test_contains_nonnull_iterable_yes() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_nonnull_iterable_yes();
-}
-
-public void test_contains_nonnull_set_no() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_nonnull_set_no();
-}
-
-public void test_contains_nonnull_set_yes() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_nonnull_set_yes();
-}
-
-public void test_contains_null_iterable_no() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_null_iterable_no();
-}
-
-public void test_contains_null_iterable_yes() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_null_iterable_yes();
-}
-
-public void test_contains_null_set_no() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_null_set_no();
-}
-
-public void test_contains_null_set_yes() throws Exception {
-  com.google.common.collect.IterablesTest testCase = new com.google.common.collect.IterablesTest();
-  testCase.test_contains_null_set_yes();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/IteratorsTest_gwt.java b/guava-gwt/test/com/google/common/collect/IteratorsTest_gwt.java
deleted file mode 100644
index efef971..0000000
--- a/guava-gwt/test/com/google/common/collect/IteratorsTest_gwt.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * 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.collect;
-public class IteratorsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAddAllToList() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAddAllToList();
-}
-
-public void testAddAllToSet() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAddAllToSet();
-}
-
-public void testAddAllWithEmptyIterator() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAddAllWithEmptyIterator();
-}
-
-public void testAdvance_basic() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAdvance_basic();
-}
-
-public void testAdvance_illegalArgument() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAdvance_illegalArgument();
-}
-
-public void testAdvance_pastEnd() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAdvance_pastEnd();
-}
-
-public void testAll() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAll();
-}
-
-public void testAny() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAny();
-}
-
-public void testAsEnumerationEmpty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAsEnumerationEmpty();
-}
-
-public void testAsEnumerationSingleton() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAsEnumerationSingleton();
-}
-
-public void testAsEnumerationTypical() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testAsEnumerationTypical();
-}
-
-public void testConcatContainingNull() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConcatContainingNull();
-}
-
-public void testConcatNested_appendToBeginning() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConcatNested_appendToBeginning();
-}
-
-public void testConcatNested_appendToEnd() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConcatNested_appendToEnd();
-}
-
-public void testConcatPartiallyAdvancedFirst() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConcatPartiallyAdvancedFirst();
-}
-
-public void testConcatPartiallyAdvancedSecond() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConcatPartiallyAdvancedSecond();
-}
-
-public void testConcatVarArgsContainingNull() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConcatVarArgsContainingNull();
-}
-
-public void testConsumingIterator() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testConsumingIterator();
-}
-
-public void testCycleNoSuchElementException() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleNoSuchElementException();
-}
-
-public void testCycleOfEmpty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleOfEmpty();
-}
-
-public void testCycleOfOne() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleOfOne();
-}
-
-public void testCycleOfOneWithRemove() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleOfOneWithRemove();
-}
-
-public void testCycleOfTwo() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleOfTwo();
-}
-
-public void testCycleOfTwoWithRemove() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleOfTwoWithRemove();
-}
-
-public void testCycleRemoveAfterHasNext() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleRemoveAfterHasNext();
-}
-
-public void testCycleRemoveAfterHasNextExtraPicky() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleRemoveAfterHasNextExtraPicky();
-}
-
-public void testCycleRemoveSameElementTwice() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleRemoveSameElementTwice();
-}
-
-public void testCycleRemoveWithoutNext() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleRemoveWithoutNext();
-}
-
-public void testCycleWhenRemoveIsNotSupported() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testCycleWhenRemoveIsNotSupported();
-}
-
-public void testElementsEqual() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testElementsEqual();
-}
-
-public void testEmptyIterator() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testEmptyIterator();
-}
-
-public void testEmptyListIterator() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testEmptyListIterator();
-}
-
-public void testEmptyModifiableIterator() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testEmptyModifiableIterator();
-}
-
-public void testFilterMatchAll() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFilterMatchAll();
-}
-
-public void testFilterNoMatch() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFilterNoMatch();
-}
-
-public void testFilterNothing() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFilterNothing();
-}
-
-public void testFilterSimple() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFilterSimple();
-}
-
-public void testFind_firstElement() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_firstElement();
-}
-
-public void testFind_lastElement() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_lastElement();
-}
-
-public void testFind_matchAlways() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_matchAlways();
-}
-
-public void testFind_notPresent() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_notPresent();
-}
-
-public void testFind_withDefault_first() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_withDefault_first();
-}
-
-public void testFind_withDefault_last() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_withDefault_last();
-}
-
-public void testFind_withDefault_matchAlways() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_withDefault_matchAlways();
-}
-
-public void testFind_withDefault_notPresent() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_withDefault_notPresent();
-}
-
-public void testFind_withDefault_notPresent_nullReturn() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFind_withDefault_notPresent_nullReturn();
-}
-
-public void testForArrayEmpty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForArrayEmpty();
-}
-
-public void testForArrayLength0() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForArrayLength0();
-}
-
-public void testForArrayOffset() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForArrayOffset();
-}
-
-public void testForArrayTypical() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForArrayTypical();
-}
-
-public void testForEnumerationEmpty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForEnumerationEmpty();
-}
-
-public void testForEnumerationSingleton() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForEnumerationSingleton();
-}
-
-public void testForEnumerationTypical() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testForEnumerationTypical();
-}
-
-public void testFrequency() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testFrequency();
-}
-
-public void testGetLast_basic() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetLast_basic();
-}
-
-public void testGetLast_exception() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetLast_exception();
-}
-
-public void testGetLast_withDefault_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetLast_withDefault_empty();
-}
-
-public void testGetLast_withDefault_empty_null() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetLast_withDefault_empty_null();
-}
-
-public void testGetLast_withDefault_singleton() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetLast_withDefault_singleton();
-}
-
-public void testGetLast_withDefault_two() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetLast_withDefault_two();
-}
-
-public void testGetNext_withDefault_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetNext_withDefault_empty();
-}
-
-public void testGetNext_withDefault_empty_null() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetNext_withDefault_empty_null();
-}
-
-public void testGetNext_withDefault_singleton() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetNext_withDefault_singleton();
-}
-
-public void testGetNext_withDefault_two() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetNext_withDefault_two();
-}
-
-public void testGetOnlyElement_noDefault_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_noDefault_empty();
-}
-
-public void testGetOnlyElement_noDefault_fiveElements() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_noDefault_fiveElements();
-}
-
-public void testGetOnlyElement_noDefault_moreThanFiveElements() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_noDefault_moreThanFiveElements();
-}
-
-public void testGetOnlyElement_noDefault_moreThanOneLessThanFiveElements() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_noDefault_moreThanOneLessThanFiveElements();
-}
-
-public void testGetOnlyElement_noDefault_valid() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_noDefault_valid();
-}
-
-public void testGetOnlyElement_withDefault_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_withDefault_empty();
-}
-
-public void testGetOnlyElement_withDefault_empty_null() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_withDefault_empty_null();
-}
-
-public void testGetOnlyElement_withDefault_singleton() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_withDefault_singleton();
-}
-
-public void testGetOnlyElement_withDefault_two() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGetOnlyElement_withDefault_two();
-}
-
-public void testGet_atSize() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_atSize();
-}
-
-public void testGet_basic() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_basic();
-}
-
-public void testGet_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_empty();
-}
-
-public void testGet_negativeIndex() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_negativeIndex();
-}
-
-public void testGet_pastEnd() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_pastEnd();
-}
-
-public void testGet_withDefault_atSize() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_withDefault_atSize();
-}
-
-public void testGet_withDefault_basic() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_withDefault_basic();
-}
-
-public void testGet_withDefault_negativeIndex() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_withDefault_negativeIndex();
-}
-
-public void testGet_withDefault_pastEnd() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testGet_withDefault_pastEnd();
-}
-
-public void testIndexOf_consumedData() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testIndexOf_consumedData();
-}
-
-public void testIndexOf_consumedDataNoMatch() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testIndexOf_consumedDataNoMatch();
-}
-
-public void testIndexOf_consumedDataWithDuplicates() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testIndexOf_consumedDataWithDuplicates();
-}
-
-public void testLimit() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testLimit();
-}
-
-public void testLimitRemove() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testLimitRemove();
-}
-
-public void testNullFriendlyTransform() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testNullFriendlyTransform();
-}
-
-public void testPaddedPartitionRandomAccess() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPaddedPartitionRandomAccess();
-}
-
-public void testPaddedPartition_badSize() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPaddedPartition_badSize();
-}
-
-public void testPaddedPartition_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPaddedPartition_empty();
-}
-
-public void testPaddedPartition_singleton1() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPaddedPartition_singleton1();
-}
-
-public void testPaddedPartition_singleton2() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPaddedPartition_singleton2();
-}
-
-public void testPaddedPartition_view() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPaddedPartition_view();
-}
-
-public void testPartition_badSize() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPartition_badSize();
-}
-
-public void testPartition_empty() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPartition_empty();
-}
-
-public void testPartition_singleton1() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPartition_singleton1();
-}
-
-public void testPartition_singleton2() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPartition_singleton2();
-}
-
-public void testPartition_view() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPartition_view();
-}
-
-public void testPeekingIteratorShortCircuit() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPeekingIteratorShortCircuit();
-}
-
-public void testPoorlyBehavedTransform() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testPoorlyBehavedTransform();
-}
-
-public void testRemoveAll() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testRemoveAll();
-}
-
-public void testRemoveIf() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testRemoveIf();
-}
-
-public void testRetainAll() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testRetainAll();
-}
-
-public void testSize0() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testSize0();
-}
-
-public void testSize1() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testSize1();
-}
-
-public void testSize_partiallyConsumed() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testSize_partiallyConsumed();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testToString();
-}
-
-public void testToStringEmptyIterator() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testToStringEmptyIterator();
-}
-
-public void testToStringWithNull() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testToStringWithNull();
-}
-
-public void testTransform() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTransform();
-}
-
-public void testTransformRemove() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTransformRemove();
-}
-
-public void testTryFind_alwaysFalse_isPresent() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTryFind_alwaysFalse_isPresent();
-}
-
-public void testTryFind_alwaysFalse_orDefault() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTryFind_alwaysFalse_orDefault();
-}
-
-public void testTryFind_alwaysTrue() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTryFind_alwaysTrue();
-}
-
-public void testTryFind_firstElement() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTryFind_firstElement();
-}
-
-public void testTryFind_lastElement() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testTryFind_lastElement();
-}
-
-public void testUnmodifiableIteratorShortCircuit() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.testUnmodifiableIteratorShortCircuit();
-}
-
-public void test_contains_nonnull_no() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.test_contains_nonnull_no();
-}
-
-public void test_contains_nonnull_yes() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.test_contains_nonnull_yes();
-}
-
-public void test_contains_null_no() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.test_contains_null_no();
-}
-
-public void test_contains_null_yes() throws Exception {
-  com.google.common.collect.IteratorsTest testCase = new com.google.common.collect.IteratorsTest();
-  testCase.test_contains_null_yes();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/LinkedHashMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/LinkedHashMultimapTest_gwt.java
deleted file mode 100644
index 3a70b11..0000000
--- a/guava-gwt/test/com/google/common/collect/LinkedHashMultimapTest_gwt.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.collect;
-public class LinkedHashMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromIllegalSizes() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testCreateFromIllegalSizes();
-}
-
-public void testCreateFromMultimap() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testCreateFromMultimap();
-}
-
-public void testCreateFromSizes() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testCreateFromSizes();
-}
-
-public void testEntriesSpliterator() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testEntriesSpliterator();
-}
-
-public void testKeysSpliterator() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testKeysSpliterator();
-}
-
-public void testKeysToString_ordering() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testKeysToString_ordering();
-}
-
-public void testOrderingReadOnly() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testOrderingReadOnly();
-}
-
-public void testOrderingSynchronized() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testOrderingSynchronized();
-}
-
-public void testOrderingUnmodifiable() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testOrderingUnmodifiable();
-}
-
-public void testOrderingUpdates() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testOrderingUpdates();
-}
-
-public void testPutMultimapOrdered() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testPutMultimapOrdered();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testToString();
-}
-
-public void testToStringNullExact() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testToStringNullExact();
-}
-
-public void testValueSetHashTableExpansion() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testValueSetHashTableExpansion();
-}
-
-public void testValuesSpliterator() throws Exception {
-  com.google.common.collect.LinkedHashMultimapTest testCase = new com.google.common.collect.LinkedHashMultimapTest();
-  testCase.testValuesSpliterator();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/LinkedHashMultisetTest_gwt.java b/guava-gwt/test/com/google/common/collect/LinkedHashMultisetTest_gwt.java
deleted file mode 100644
index fbdb31f..0000000
--- a/guava-gwt/test/com/google/common/collect/LinkedHashMultisetTest_gwt.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.collect;
-public class LinkedHashMultisetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.LinkedHashMultisetTest testCase = new com.google.common.collect.LinkedHashMultisetTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromIterable() throws Exception {
-  com.google.common.collect.LinkedHashMultisetTest testCase = new com.google.common.collect.LinkedHashMultisetTest();
-  testCase.testCreateFromIterable();
-}
-
-public void testCreateWithSize() throws Exception {
-  com.google.common.collect.LinkedHashMultisetTest testCase = new com.google.common.collect.LinkedHashMultisetTest();
-  testCase.testCreateWithSize();
-}
-
-public void testLosesPlaceInLine() throws Exception {
-  com.google.common.collect.LinkedHashMultisetTest testCase = new com.google.common.collect.LinkedHashMultisetTest();
-  testCase.testLosesPlaceInLine();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.LinkedHashMultisetTest testCase = new com.google.common.collect.LinkedHashMultisetTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/LinkedListMultimapTest_gwt.java b/guava-gwt/test/com/google/common/collect/LinkedListMultimapTest_gwt.java
deleted file mode 100644
index 6fe6292..0000000
--- a/guava-gwt/test/com/google/common/collect/LinkedListMultimapTest_gwt.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.collect;
-public class LinkedListMultimapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreateFromIllegalSize() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testCreateFromIllegalSize();
-}
-
-public void testCreateFromMultimap() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testCreateFromMultimap();
-}
-
-public void testCreateFromSize() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testCreateFromSize();
-}
-
-public void testEntriesAfterMultimapUpdate() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testEntriesAfterMultimapUpdate();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testEquals();
-}
-
-public void testGetRandomAccess() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testGetRandomAccess();
-}
-
-public void testLinkedAsMapEntries() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedAsMapEntries();
-}
-
-public void testLinkedClear() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedClear();
-}
-
-public void testLinkedEntries() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedEntries();
-}
-
-public void testLinkedGetAdd() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedGetAdd();
-}
-
-public void testLinkedGetInsert() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedGetInsert();
-}
-
-public void testLinkedKeySet() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedKeySet();
-}
-
-public void testLinkedKeys() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedKeys();
-}
-
-public void testLinkedPutAllMultimap() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedPutAllMultimap();
-}
-
-public void testLinkedPutInOrder() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedPutInOrder();
-}
-
-public void testLinkedPutOutOfOrder() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedPutOutOfOrder();
-}
-
-public void testLinkedReplaceValues() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedReplaceValues();
-}
-
-public void testLinkedValues() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testLinkedValues();
-}
-
-public void testRemoveAllRandomAccess() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testRemoveAllRandomAccess();
-}
-
-public void testReplaceValuesRandomAccess() throws Exception {
-  com.google.common.collect.LinkedListMultimapTest testCase = new com.google.common.collect.LinkedListMultimapTest();
-  testCase.testReplaceValuesRandomAccess();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ListsImplTest_gwt.java b/guava-gwt/test/com/google/common/collect/ListsImplTest_gwt.java
deleted file mode 100644
index cfef364..0000000
--- a/guava-gwt/test/com/google/common/collect/ListsImplTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.collect;
-public class ListsImplTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAddAllImpl() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testAddAllImpl();
-}
-
-public void testEqualsImpl() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testEqualsImpl();
-}
-
-public void testHashCodeImpl() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testHashCodeImpl();
-}
-
-public void testIndexOfImpl_nonNull() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testIndexOfImpl_nonNull();
-}
-
-public void testIndexOfImpl_null() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testIndexOfImpl_null();
-}
-
-public void testLastIndexOfImpl_nonNull() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testLastIndexOfImpl_nonNull();
-}
-
-public void testLastIndexOfImpl_null() throws Exception {
-  com.google.common.collect.ListsImplTest testCase = new com.google.common.collect.ListsImplTest();
-  testCase.testLastIndexOfImpl_null();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ListsTest_gwt.java b/guava-gwt/test/com/google/common/collect/ListsTest_gwt.java
deleted file mode 100644
index 7d818a9..0000000
--- a/guava-gwt/test/com/google/common/collect/ListsTest_gwt.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * 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.collect;
-public class ListsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testArraysAsList() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testArraysAsList();
-}
-
-public void testAsList1Small() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testAsList1Small();
-}
-
-public void testAsList2() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testAsList2();
-}
-
-public void testCartesianProductTooBig() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProductTooBig();
-}
-
-public void testCartesianProduct_2x2x2() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_2x2x2();
-}
-
-public void testCartesianProduct_binary1x1() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_binary1x1();
-}
-
-public void testCartesianProduct_binary1x2() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_binary1x2();
-}
-
-public void testCartesianProduct_binary2x2() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_binary2x2();
-}
-
-public void testCartesianProduct_contains() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_contains();
-}
-
-public void testCartesianProduct_indexOf() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_indexOf();
-}
-
-public void testCartesianProduct_unrelatedTypes() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCartesianProduct_unrelatedTypes();
-}
-
-public void testCharactersOfIsView() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testCharactersOfIsView();
-}
-
-public void testComputeArrayListCapacity() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testComputeArrayListCapacity();
-}
-
-public void testNewArrayListEmpty() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListEmpty();
-}
-
-public void testNewArrayListFromCollection() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListFromCollection();
-}
-
-public void testNewArrayListFromIterable() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListFromIterable();
-}
-
-public void testNewArrayListFromIterator() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListFromIterator();
-}
-
-public void testNewArrayListVarArgs() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListVarArgs();
-}
-
-public void testNewArrayListWithCapacity() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListWithCapacity();
-}
-
-public void testNewArrayListWithCapacity_negative() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListWithCapacity_negative();
-}
-
-public void testNewArrayListWithExpectedSize() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListWithExpectedSize();
-}
-
-public void testNewArrayListWithExpectedSize_negative() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewArrayListWithExpectedSize_negative();
-}
-
-public void testNewLinkedListEmpty() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewLinkedListEmpty();
-}
-
-public void testNewLinkedListFromCollection() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewLinkedListFromCollection();
-}
-
-public void testNewLinkedListFromIterable() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testNewLinkedListFromIterable();
-}
-
-public void testPartitionRandomAccessFalse() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartitionRandomAccessFalse();
-}
-
-public void testPartitionSize_1() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartitionSize_1();
-}
-
-public void testPartition_1_1() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_1_1();
-}
-
-public void testPartition_1_2() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_1_2();
-}
-
-public void testPartition_2_1() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_2_1();
-}
-
-public void testPartition_3_2() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_3_2();
-}
-
-public void testPartition_badSize() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_badSize();
-}
-
-public void testPartition_empty() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_empty();
-}
-
-public void testPartition_view() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testPartition_view();
-}
-
-public void testReverseViewRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testReverseViewRandomAccess();
-}
-
-public void testReverseViewSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testReverseViewSequential();
-}
-
-public void testTransformHashCodeRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformHashCodeRandomAccess();
-}
-
-public void testTransformHashCodeSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformHashCodeSequential();
-}
-
-public void testTransformIteratorRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformIteratorRandomAccess();
-}
-
-public void testTransformIteratorSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformIteratorSequential();
-}
-
-public void testTransformListIteratorRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformListIteratorRandomAccess();
-}
-
-public void testTransformListIteratorSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformListIteratorSequential();
-}
-
-public void testTransformModifiableRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformModifiableRandomAccess();
-}
-
-public void testTransformModifiableSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformModifiableSequential();
-}
-
-public void testTransformPreservesIOOBEsThrownByFunction() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformPreservesIOOBEsThrownByFunction();
-}
-
-public void testTransformRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformRandomAccess();
-}
-
-public void testTransformSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformSequential();
-}
-
-public void testTransformViewRandomAccess() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformViewRandomAccess();
-}
-
-public void testTransformViewSequential() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformViewSequential();
-}
-
-public void testTransformedSequentialIterationUsesBackingListIterationOnly() throws Exception {
-  com.google.common.collect.ListsTest testCase = new com.google.common.collect.ListsTest();
-  testCase.testTransformedSequentialIterationUsesBackingListIterationOnly();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MapMakerTest_gwt.java b/guava-gwt/test/com/google/common/collect/MapMakerTest_gwt.java
deleted file mode 100644
index 720d4e5..0000000
--- a/guava-gwt/test/com/google/common/collect/MapMakerTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.collect;
-public class MapMakerTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testInitialCapacity_negative__MakerTest() throws Exception {
-  com.google.common.collect.MapMakerTest.MakerTest testCase = new com.google.common.collect.MapMakerTest.MakerTest();
-  testCase.testInitialCapacity_negative();
-}
-
-public void testReturnsPlainConcurrentHashMapWhenPossible__MakerTest() throws Exception {
-  com.google.common.collect.MapMakerTest.MakerTest testCase = new com.google.common.collect.MapMakerTest.MakerTest();
-  testCase.testReturnsPlainConcurrentHashMapWhenPossible();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MapsSortedTransformValuesTest_gwt.java b/guava-gwt/test/com/google/common/collect/MapsSortedTransformValuesTest_gwt.java
deleted file mode 100644
index cfd9337..0000000
--- a/guava-gwt/test/com/google/common/collect/MapsSortedTransformValuesTest_gwt.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * 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.collect;
-public class MapsSortedTransformValuesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testSize();
-}
-
-public void testTransformChangesAreReflectedInUnderlyingMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformChangesAreReflectedInUnderlyingMap();
-}
-
-public void testTransformEmptyMapEquality() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformEmptyMapEquality();
-}
-
-public void testTransformEntrySetContains() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformEntrySetContains();
-}
-
-public void testTransformEqualityOfMapsWithNullValues() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformEqualityOfMapsWithNullValues();
-}
-
-public void testTransformEquals() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformEquals();
-}
-
-public void testTransformIdentityFunctionEquality() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformIdentityFunctionEquality();
-}
-
-public void testTransformPutEntryIsUnsupported() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformPutEntryIsUnsupported();
-}
-
-public void testTransformReflectsUnderlyingMap() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformReflectsUnderlyingMap();
-}
-
-public void testTransformRemoveEntry() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformRemoveEntry();
-}
-
-public void testTransformSingletonMapEquality() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testTransformSingletonMapEquality();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsSortedTransformValuesTest testCase = new com.google.common.collect.MapsSortedTransformValuesTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MapsTest_gwt.java b/guava-gwt/test/com/google/common/collect/MapsTest_gwt.java
deleted file mode 100644
index b6b7bc5..0000000
--- a/guava-gwt/test/com/google/common/collect/MapsTest_gwt.java
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * 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.collect;
-public class MapsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsConverter_inverse() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_inverse();
-}
-
-public void testAsConverter_isAView() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_isAView();
-}
-
-public void testAsConverter_noMapping() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_noMapping();
-}
-
-public void testAsConverter_nominal() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_nominal();
-}
-
-public void testAsConverter_nullConversions() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_nullConversions();
-}
-
-public void testAsConverter_serialization() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_serialization();
-}
-
-public void testAsConverter_toString() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_toString();
-}
-
-public void testAsConverter_withNullMapping() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsConverter_withNullMapping();
-}
-
-public void testAsMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMap();
-}
-
-public void testAsMapEmpty() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapEmpty();
-}
-
-public void testAsMapReadsThrough() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapReadsThrough();
-}
-
-public void testAsMapSorted() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapSorted();
-}
-
-public void testAsMapSortedEmpty() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapSortedEmpty();
-}
-
-public void testAsMapSortedReadsThrough() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapSortedReadsThrough();
-}
-
-public void testAsMapSortedSubViewKeySetsDoNotSupportAdd() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapSortedSubViewKeySetsDoNotSupportAdd();
-}
-
-public void testAsMapSortedWritesThrough() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapSortedWritesThrough();
-}
-
-public void testAsMapWritesThrough() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testAsMapWritesThrough();
-}
-
-public void testCapacityForLargeSizes() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testCapacityForLargeSizes();
-}
-
-public void testCapacityForNegativeSizeFails() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testCapacityForNegativeSizeFails();
-}
-
-public void testConcurrentMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testConcurrentMap();
-}
-
-public void testEnumMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testEnumMap();
-}
-
-public void testEnumMapNullClass() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testEnumMapNullClass();
-}
-
-public void testEnumMapWithInitialEmptyEnumMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testEnumMapWithInitialEmptyEnumMap();
-}
-
-public void testEnumMapWithInitialEmptyMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testEnumMapWithInitialEmptyMap();
-}
-
-public void testEnumMapWithInitialEnumMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testEnumMapWithInitialEnumMap();
-}
-
-public void testEnumMapWithInitialMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testEnumMapWithInitialMap();
-}
-
-public void testHashMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testHashMap();
-}
-
-public void testHashMapGeneralizesTypes() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testHashMapGeneralizesTypes();
-}
-
-public void testHashMapWithInitialMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testHashMapWithInitialMap();
-}
-
-public void testIdentityHashMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testIdentityHashMap();
-}
-
-public void testImmutableEntry() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testImmutableEntry();
-}
-
-public void testImmutableEntryNull() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testImmutableEntryNull();
-}
-
-public void testLinkedHashMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testLinkedHashMap();
-}
-
-public void testLinkedHashMapGeneralizesTypes() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testLinkedHashMapGeneralizesTypes();
-}
-
-public void testLinkedHashMapWithInitialMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testLinkedHashMapWithInitialMap();
-}
-
-public void testMapDifferenceEmptyEmpty() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferenceEmptyEmpty();
-}
-
-public void testMapDifferenceEmptySingleton() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferenceEmptySingleton();
-}
-
-public void testMapDifferenceEquals() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferenceEquals();
-}
-
-public void testMapDifferenceOfSortedMapIsSorted() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferenceOfSortedMapIsSorted();
-}
-
-public void testMapDifferencePredicateTypical() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferencePredicateTypical();
-}
-
-public void testMapDifferenceSingletonEmpty() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferenceSingletonEmpty();
-}
-
-public void testMapDifferenceTypical() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testMapDifferenceTypical();
-}
-
-public void testSortedMapDifferenceEmptyEmpty() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapDifferenceEmptyEmpty();
-}
-
-public void testSortedMapDifferenceEmptySingleton() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapDifferenceEmptySingleton();
-}
-
-public void testSortedMapDifferenceEquals() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapDifferenceEquals();
-}
-
-public void testSortedMapDifferenceImmutable() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapDifferenceImmutable();
-}
-
-public void testSortedMapDifferenceSingletonEmpty() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapDifferenceSingletonEmpty();
-}
-
-public void testSortedMapDifferenceTypical() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapDifferenceTypical();
-}
-
-public void testSortedMapTransformEntries() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapTransformEntries();
-}
-
-public void testSortedMapTransformValues() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSortedMapTransformValues();
-}
-
-public void testSynchronizedBiMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testSynchronizedBiMap();
-}
-
-public void testToMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToMap();
-}
-
-public void testToMapIterator() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToMapIterator();
-}
-
-public void testToMapWithDuplicateKeys() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToMapWithDuplicateKeys();
-}
-
-public void testToMapWithNullKeys() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToMapWithNullKeys();
-}
-
-public void testToMapWithNullValues() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToMapWithNullValues();
-}
-
-public void testToStringImplWithNullKeys() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToStringImplWithNullKeys();
-}
-
-public void testToStringImplWithNullValues() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testToStringImplWithNullValues();
-}
-
-public void testTransformEntries() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTransformEntries();
-}
-
-public void testTransformEntriesExample() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTransformEntriesExample();
-}
-
-public void testTransformEntriesGenerics() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTransformEntriesGenerics();
-}
-
-public void testTransformValues() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTransformValues();
-}
-
-public void testTreeMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTreeMap();
-}
-
-public void testTreeMapDerived() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTreeMapDerived();
-}
-
-public void testTreeMapNonGeneric() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTreeMapNonGeneric();
-}
-
-public void testTreeMapWithComparator() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTreeMapWithComparator();
-}
-
-public void testTreeMapWithInitialMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testTreeMapWithInitialMap();
-}
-
-public void testUniqueIndexCollection() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUniqueIndexCollection();
-}
-
-public void testUniqueIndexDuplicates() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUniqueIndexDuplicates();
-}
-
-public void testUniqueIndexIterable() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUniqueIndexIterable();
-}
-
-public void testUniqueIndexIterator() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUniqueIndexIterator();
-}
-
-public void testUniqueIndexNullKey() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUniqueIndexNullKey();
-}
-
-public void testUniqueIndexNullValue() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUniqueIndexNullValue();
-}
-
-public void testUnmodifiableBiMap() throws Exception {
-  com.google.common.collect.MapsTest testCase = new com.google.common.collect.MapsTest();
-  testCase.testUnmodifiableBiMap();
-}
-
-public void testFilteredEntriesIllegalPut__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredEntriesIllegalPut();
-}
-
-public void testFilteredEntriesIllegalPutAll__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredEntriesIllegalPutAll();
-}
-
-public void testFilteredEntriesObjectPredicate__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredEntriesObjectPredicate();
-}
-
-public void testFilteredEntriesWildCardEntryPredicate__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredEntriesWildCardEntryPredicate();
-}
-
-public void testFilteredKeysFilteredReflectsBackingChanges__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredKeysFilteredReflectsBackingChanges();
-}
-
-public void testFilteredKeysIllegalPut__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredKeysIllegalPut();
-}
-
-public void testFilteredKeysIllegalPutAll__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredKeysIllegalPutAll();
-}
-
-public void testFilteredValuesClear__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredValuesClear();
-}
-
-public void testFilteredValuesIllegalPut__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredValuesIllegalPut();
-}
-
-public void testFilteredValuesIllegalPutAll__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredValuesIllegalPutAll();
-}
-
-public void testFilteredValuesIllegalSetValue__FilteredBiMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredBiMapTest testCase = new com.google.common.collect.MapsTest.FilteredBiMapTest();
-  testCase.testFilteredValuesIllegalSetValue();
-}
-
-public void testFilteredEntriesIllegalPut__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredEntriesIllegalPut();
-}
-
-public void testFilteredEntriesIllegalPutAll__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredEntriesIllegalPutAll();
-}
-
-public void testFilteredEntriesObjectPredicate__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredEntriesObjectPredicate();
-}
-
-public void testFilteredEntriesWildCardEntryPredicate__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredEntriesWildCardEntryPredicate();
-}
-
-public void testFilteredKeysFilteredReflectsBackingChanges__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredKeysFilteredReflectsBackingChanges();
-}
-
-public void testFilteredKeysIllegalPut__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredKeysIllegalPut();
-}
-
-public void testFilteredKeysIllegalPutAll__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredKeysIllegalPutAll();
-}
-
-public void testFilteredValuesClear__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredValuesClear();
-}
-
-public void testFilteredValuesIllegalPut__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredValuesIllegalPut();
-}
-
-public void testFilteredValuesIllegalPutAll__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredValuesIllegalPutAll();
-}
-
-public void testFilteredValuesIllegalSetValue__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFilteredValuesIllegalSetValue();
-}
-
-public void testFirstAndLastKeyFilteredMap__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testFirstAndLastKeyFilteredMap();
-}
-
-public void testHeadSubTailMap_FilteredMap__FilteredSortedMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredSortedMapTest testCase = new com.google.common.collect.MapsTest.FilteredSortedMapTest();
-  testCase.testHeadSubTailMap_FilteredMap();
-}
-
-public void testFilteredEntriesIllegalPut__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredEntriesIllegalPut();
-}
-
-public void testFilteredEntriesIllegalPutAll__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredEntriesIllegalPutAll();
-}
-
-public void testFilteredEntriesObjectPredicate__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredEntriesObjectPredicate();
-}
-
-public void testFilteredEntriesWildCardEntryPredicate__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredEntriesWildCardEntryPredicate();
-}
-
-public void testFilteredKeysFilteredReflectsBackingChanges__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredKeysFilteredReflectsBackingChanges();
-}
-
-public void testFilteredKeysIllegalPut__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredKeysIllegalPut();
-}
-
-public void testFilteredKeysIllegalPutAll__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredKeysIllegalPutAll();
-}
-
-public void testFilteredValuesClear__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredValuesClear();
-}
-
-public void testFilteredValuesIllegalPut__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredValuesIllegalPut();
-}
-
-public void testFilteredValuesIllegalPutAll__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredValuesIllegalPutAll();
-}
-
-public void testFilteredValuesIllegalSetValue__FilteredMapTest() throws Exception {
-  com.google.common.collect.MapsTest.FilteredMapTest testCase = new com.google.common.collect.MapsTest.FilteredMapTest();
-  testCase.testFilteredValuesIllegalSetValue();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MapsTransformValuesTest_gwt.java b/guava-gwt/test/com/google/common/collect/MapsTransformValuesTest_gwt.java
deleted file mode 100644
index 50bccbc..0000000
--- a/guava-gwt/test/com/google/common/collect/MapsTransformValuesTest_gwt.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * 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.collect;
-public class MapsTransformValuesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testSize();
-}
-
-public void testTransformChangesAreReflectedInUnderlyingMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformChangesAreReflectedInUnderlyingMap();
-}
-
-public void testTransformEmptyMapEquality() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformEmptyMapEquality();
-}
-
-public void testTransformEntrySetContains() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformEntrySetContains();
-}
-
-public void testTransformEqualityOfMapsWithNullValues() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformEqualityOfMapsWithNullValues();
-}
-
-public void testTransformEquals() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformEquals();
-}
-
-public void testTransformIdentityFunctionEquality() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformIdentityFunctionEquality();
-}
-
-public void testTransformPutEntryIsUnsupported() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformPutEntryIsUnsupported();
-}
-
-public void testTransformReflectsUnderlyingMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformReflectsUnderlyingMap();
-}
-
-public void testTransformRemoveEntry() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformRemoveEntry();
-}
-
-public void testTransformSingletonMapEquality() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testTransformSingletonMapEquality();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesTest testCase = new com.google.common.collect.MapsTransformValuesTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest_gwt.java b/guava-gwt/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest_gwt.java
deleted file mode 100644
index aa32e7f..0000000
--- a/guava-gwt/test/com/google/common/collect/MapsTransformValuesUnmodifiableIteratorTest_gwt.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * 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.collect;
-public class MapsTransformValuesUnmodifiableIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testSize();
-}
-
-public void testTransformChangesAreReflectedInUnderlyingMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformChangesAreReflectedInUnderlyingMap();
-}
-
-public void testTransformEmptyMapEquality() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformEmptyMapEquality();
-}
-
-public void testTransformEntrySetContains() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformEntrySetContains();
-}
-
-public void testTransformEqualityOfMapsWithNullValues() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformEqualityOfMapsWithNullValues();
-}
-
-public void testTransformEquals() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformEquals();
-}
-
-public void testTransformIdentityFunctionEquality() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformIdentityFunctionEquality();
-}
-
-public void testTransformPutEntryIsUnsupported() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformPutEntryIsUnsupported();
-}
-
-public void testTransformReflectsUnderlyingMap() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformReflectsUnderlyingMap();
-}
-
-public void testTransformRemoveEntry() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformRemoveEntry();
-}
-
-public void testTransformSingletonMapEquality() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testTransformSingletonMapEquality();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest testCase = new com.google.common.collect.MapsTransformValuesUnmodifiableIteratorTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MinMaxPriorityQueueTest_gwt.java b/guava-gwt/test/com/google/common/collect/MinMaxPriorityQueueTest_gwt.java
deleted file mode 100644
index 1635764..0000000
--- a/guava-gwt/test/com/google/common/collect/MinMaxPriorityQueueTest_gwt.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * 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.collect;
-public class MinMaxPriorityQueueTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testContains() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testContains();
-}
-
-public void testCorrectOrdering_73ElementBug() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_73ElementBug();
-}
-
-public void testCorrectOrdering_mediumHeapsPollFirst() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_mediumHeapsPollFirst();
-}
-
-public void testCorrectOrdering_mediumHeapsPollLast() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_mediumHeapsPollLast();
-}
-
-public void testCorrectOrdering_randomAccess() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_randomAccess();
-}
-
-public void testCorrectOrdering_regression() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_regression();
-}
-
-public void testCorrectOrdering_smallHeapsPollFirst() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_smallHeapsPollFirst();
-}
-
-public void testCorrectOrdering_smallHeapsPollLast() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCorrectOrdering_smallHeapsPollLast();
-}
-
-public void testCreateWithCapacityAndOrdering() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreateWithCapacityAndOrdering();
-}
-
-public void testCreateWithOrdering() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreateWithOrdering();
-}
-
-public void testCreation_allOptions() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_allOptions();
-}
-
-public void testCreation_comparator() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_comparator();
-}
-
-public void testCreation_comparator_maximumSize() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_comparator_maximumSize();
-}
-
-public void testCreation_comparator_withContents() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_comparator_withContents();
-}
-
-public void testCreation_expectedSize() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_expectedSize();
-}
-
-public void testCreation_expectedSize_comparator() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_expectedSize_comparator();
-}
-
-public void testCreation_expectedSize_maximumSize() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_expectedSize_maximumSize();
-}
-
-public void testCreation_expectedSize_withContents() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_expectedSize_withContents();
-}
-
-public void testCreation_maximumSize() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_maximumSize();
-}
-
-public void testCreation_maximumSize_withContents() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_maximumSize_withContents();
-}
-
-public void testCreation_simple() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_simple();
-}
-
-public void testCreation_withContents() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testCreation_withContents();
-}
-
-public void testExhaustive_pollAndPush() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testExhaustive_pollAndPush();
-}
-
-public void testHeapIntact() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testHeapIntact();
-}
-
-public void testInvalidatingRemove() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testInvalidatingRemove();
-}
-
-public void testInvalidatingRemove2() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testInvalidatingRemove2();
-}
-
-public void testIsEvenLevel() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIsEvenLevel();
-}
-
-public void testIteratorConcurrentModification() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorConcurrentModification();
-}
-
-public void testIteratorInvalidatingIteratorRemove() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorInvalidatingIteratorRemove();
-}
-
-public void testIteratorInvalidatingIteratorRemove2() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorInvalidatingIteratorRemove2();
-}
-
-public void testIteratorPastEndException() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorPastEndException();
-}
-
-public void testIteratorRegressionChildlessUncle() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorRegressionChildlessUncle();
-}
-
-public void testIteratorTester() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorTester();
-}
-
-public void testIteratorTesterLarger() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testIteratorTesterLarger();
-}
-
-public void testRandomAddsAndRemoves() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRandomAddsAndRemoves();
-}
-
-public void testRandomAddsAndRemoves_duplicateElements() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRandomAddsAndRemoves_duplicateElements();
-}
-
-public void testRandomRemoves() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRandomRemoves();
-}
-
-public void testRegression_dataCorruption() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRegression_dataCorruption();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRemove();
-}
-
-public void testRemoveAt() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRemoveAt();
-}
-
-public void testRemoveAt_exhaustive() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRemoveAt_exhaustive();
-}
-
-public void testRemoveFromStringHeap() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRemoveFromStringHeap();
-}
-
-public void testRemoveRegression() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testRemoveRegression();
-}
-
-public void testSmall() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testSmall();
-}
-
-public void testSmallMinHeap() throws Exception {
-  com.google.common.collect.MinMaxPriorityQueueTest testCase = new com.google.common.collect.MinMaxPriorityQueueTest();
-  testCase.testSmallMinHeap();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MoreCollectorsTest_gwt.java b/guava-gwt/test/com/google/common/collect/MoreCollectorsTest_gwt.java
deleted file mode 100644
index dca00b2..0000000
--- a/guava-gwt/test/com/google/common/collect/MoreCollectorsTest_gwt.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.collect;
-public class MoreCollectorsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testOnlyElement() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testOnlyElement();
-}
-
-public void testOnlyElementMany() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testOnlyElementMany();
-}
-
-public void testOnlyElementMultiple() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testOnlyElementMultiple();
-}
-
-public void testOnlyElementNull() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testOnlyElementNull();
-}
-
-public void testOnlyElementSingleton() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testOnlyElementSingleton();
-}
-
-public void testToOptionalEmpty() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testToOptionalEmpty();
-}
-
-public void testToOptionalMany() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testToOptionalMany();
-}
-
-public void testToOptionalMultiple() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testToOptionalMultiple();
-}
-
-public void testToOptionalNull() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testToOptionalNull();
-}
-
-public void testToOptionalSingleton() throws Exception {
-  com.google.common.collect.MoreCollectorsTest testCase = new com.google.common.collect.MoreCollectorsTest();
-  testCase.testToOptionalSingleton();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MultimapBuilderTest_gwt.java b/guava-gwt/test/com/google/common/collect/MultimapBuilderTest_gwt.java
deleted file mode 100644
index d1e18cc..0000000
--- a/guava-gwt/test/com/google/common/collect/MultimapBuilderTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.collect;
-public class MultimapBuilderTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testGenerics_gwtCompatible() throws Exception {
-  com.google.common.collect.MultimapBuilderTest testCase = new com.google.common.collect.MultimapBuilderTest();
-  testCase.testGenerics_gwtCompatible();
-}
-
-public void testTreeKeys_gwtCompatible() throws Exception {
-  com.google.common.collect.MultimapBuilderTest testCase = new com.google.common.collect.MultimapBuilderTest();
-  testCase.testTreeKeys_gwtCompatible();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MultimapsTest_gwt.java b/guava-gwt/test/com/google/common/collect/MultimapsTest_gwt.java
deleted file mode 100644
index 68f6600..0000000
--- a/guava-gwt/test/com/google/common/collect/MultimapsTest_gwt.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * 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.collect;
-public class MultimapsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAsMap_listMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testAsMap_listMultimap();
-}
-
-public void testAsMap_multimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testAsMap_multimap();
-}
-
-public void testAsMap_setMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testAsMap_setMultimap();
-}
-
-public void testAsMap_sortedSetMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testAsMap_sortedSetMultimap();
-}
-
-public void testFilteredKeysListMultimapGetBadValue() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testFilteredKeysListMultimapGetBadValue();
-}
-
-public void testFilteredKeysSetMultimapGetBadValue() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testFilteredKeysSetMultimapGetBadValue();
-}
-
-public void testFilteredKeysSetMultimapReplaceValues() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testFilteredKeysSetMultimapReplaceValues();
-}
-
-public void testFlatteningToMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testFlatteningToMultimap();
-}
-
-public void testForMap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testForMap();
-}
-
-public void testForMapAsMap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testForMapAsMap();
-}
-
-public void testForMapGetIteration() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testForMapGetIteration();
-}
-
-public void testForMapRemoveAll() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testForMapRemoveAll();
-}
-
-public void testIndex() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testIndex();
-}
-
-public void testIndexIterator() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testIndexIterator();
-}
-
-public void testIndex_nullKey() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testIndex_nullKey();
-}
-
-public void testIndex_nullValue() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testIndex_nullValue();
-}
-
-public void testIndex_ordering() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testIndex_ordering();
-}
-
-public void testInvertFrom() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testInvertFrom();
-}
-
-public void testMultimapCollectorGenerics() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testMultimapCollectorGenerics();
-}
-
-public void testNewListMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewListMultimap();
-}
-
-public void testNewMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewMultimap();
-}
-
-public void testNewMultimapValueCollectionMatchesList() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewMultimapValueCollectionMatchesList();
-}
-
-public void testNewMultimapValueCollectionMatchesNavigableSet() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewMultimapValueCollectionMatchesNavigableSet();
-}
-
-public void testNewMultimapWithCollectionRejectingNegativeElements() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewMultimapWithCollectionRejectingNegativeElements();
-}
-
-public void testNewSetMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewSetMultimap();
-}
-
-public void testNewSortedSetMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testNewSortedSetMultimap();
-}
-
-public void testSynchronizedMultimapSampleCodeCompilation() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testSynchronizedMultimapSampleCodeCompilation();
-}
-
-public void testToMultimap() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testToMultimap();
-}
-
-public void testUnmodifiableArrayListMultimapRandomAccess() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableArrayListMultimapRandomAccess();
-}
-
-public void testUnmodifiableLinkedListMultimapRandomAccess() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableLinkedListMultimapRandomAccess();
-}
-
-public void testUnmodifiableListMultimapShortCircuit() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableListMultimapShortCircuit();
-}
-
-public void testUnmodifiableMultimapEntries() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableMultimapEntries();
-}
-
-public void testUnmodifiableMultimapIsView() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableMultimapIsView();
-}
-
-public void testUnmodifiableMultimapShortCircuit() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableMultimapShortCircuit();
-}
-
-public void testUnmodifiableSetMultimapShortCircuit() throws Exception {
-  com.google.common.collect.MultimapsTest testCase = new com.google.common.collect.MultimapsTest();
-  testCase.testUnmodifiableSetMultimapShortCircuit();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MultimapsTransformValuesAsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/MultimapsTransformValuesAsMapTest_gwt.java
deleted file mode 100644
index 26dd8bd..0000000
--- a/guava-gwt/test/com/google/common/collect/MultimapsTransformValuesAsMapTest_gwt.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * 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.collect;
-public class MultimapsTransformValuesAsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.MultimapsTransformValuesAsMapTest testCase = new com.google.common.collect.MultimapsTransformValuesAsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MultisetsImmutableEntryTest_gwt.java b/guava-gwt/test/com/google/common/collect/MultisetsImmutableEntryTest_gwt.java
deleted file mode 100644
index 5d04848..0000000
--- a/guava-gwt/test/com/google/common/collect/MultisetsImmutableEntryTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.collect;
-public class MultisetsImmutableEntryTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testEquals() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testEquals();
-}
-
-public void testEqualsNull() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testEqualsNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeNull() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testHashCodeNull();
-}
-
-public void testNegativeCount() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testNegativeCount();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testToString();
-}
-
-public void testToStringNull() throws Exception {
-  com.google.common.collect.MultisetsImmutableEntryTest testCase = new com.google.common.collect.MultisetsImmutableEntryTest();
-  testCase.testToStringNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/MultisetsTest_gwt.java b/guava-gwt/test/com/google/common/collect/MultisetsTest_gwt.java
deleted file mode 100644
index 30a12bc..0000000
--- a/guava-gwt/test/com/google/common/collect/MultisetsTest_gwt.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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.collect;
-public class MultisetsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testContainsOccurrences() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testContainsOccurrences();
-}
-
-public void testContainsOccurrencesEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testContainsOccurrencesEmpty();
-}
-
-public void testDifferenceEmptyNonempty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testDifferenceEmptyNonempty();
-}
-
-public void testDifferenceNonemptyEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testDifferenceNonemptyEmpty();
-}
-
-public void testDifferenceWithMoreElementsInSecondMultiset() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testDifferenceWithMoreElementsInSecondMultiset();
-}
-
-public void testDifferenceWithNoRemovedElements() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testDifferenceWithNoRemovedElements();
-}
-
-public void testDifferenceWithRemovedElement() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testDifferenceWithRemovedElement();
-}
-
-public void testHighestCountFirst() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testHighestCountFirst();
-}
-
-public void testIntersectEmptyNonempty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testIntersectEmptyNonempty();
-}
-
-public void testIntersectNonemptyEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testIntersectNonemptyEmpty();
-}
-
-public void testNewTreeMultisetComparator() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testNewTreeMultisetComparator();
-}
-
-public void testNewTreeMultisetDerived() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testNewTreeMultisetDerived();
-}
-
-public void testNewTreeMultisetNonGeneric() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testNewTreeMultisetNonGeneric();
-}
-
-public void testRemoveEmptyOccurrencesIterable() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRemoveEmptyOccurrencesIterable();
-}
-
-public void testRemoveEmptyOccurrencesMultiset() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRemoveEmptyOccurrencesMultiset();
-}
-
-public void testRemoveOccurrencesIterableEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRemoveOccurrencesIterableEmpty();
-}
-
-public void testRemoveOccurrencesMultiset() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRemoveOccurrencesMultiset();
-}
-
-public void testRemoveOccurrencesMultisetEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRemoveOccurrencesMultisetEmpty();
-}
-
-public void testRemoveOccurrencesMultisetIterable() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRemoveOccurrencesMultisetIterable();
-}
-
-public void testRetainEmptyOccurrences() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRetainEmptyOccurrences();
-}
-
-public void testRetainOccurrences() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRetainOccurrences();
-}
-
-public void testRetainOccurrencesEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testRetainOccurrencesEmpty();
-}
-
-public void testSum() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testSum();
-}
-
-public void testSumEmptyNonempty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testSumEmptyNonempty();
-}
-
-public void testSumNonemptyEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testSumNonemptyEmpty();
-}
-
-public void testToMultisetCountFunction() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testToMultisetCountFunction();
-}
-
-public void testUnion() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testUnion();
-}
-
-public void testUnionEmptyNonempty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testUnionEmptyNonempty();
-}
-
-public void testUnionEqualMultisets() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testUnionEqualMultisets();
-}
-
-public void testUnionNonemptyEmpty() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testUnionNonemptyEmpty();
-}
-
-public void testUnmodifiableMultisetShortCircuit() throws Exception {
-  com.google.common.collect.MultisetsTest testCase = new com.google.common.collect.MultisetsTest();
-  testCase.testUnmodifiableMultisetShortCircuit();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/NewCustomTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/NewCustomTableTest_gwt.java
deleted file mode 100644
index b023180..0000000
--- a/guava-gwt/test/com/google/common/collect/NewCustomTableTest_gwt.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * 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.collect;
-public class NewCustomTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testPut();
-}
-
-public void testPutAllTable() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testPutAllTable();
-}
-
-public void testPutNull() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testPutNull();
-}
-
-public void testPutNullReplace() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testPutNullReplace();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowClearAndPut() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testRowClearAndPut();
-}
-
-public void testRowKeySetOrdering() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetOrdering();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testRowOrdering() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testRowOrdering();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.NewCustomTableTest testCase = new com.google.common.collect.NewCustomTableTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/ObjectArraysTest_gwt.java b/guava-gwt/test/com/google/common/collect/ObjectArraysTest_gwt.java
deleted file mode 100644
index a1a1be7..0000000
--- a/guava-gwt/test/com/google/common/collect/ObjectArraysTest_gwt.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.collect;
-public class ObjectArraysTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAppendOneElement() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testAppendOneElement();
-}
-
-public void testAppendTwoElements() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testAppendTwoElements();
-}
-
-public void testAppendZeroElements() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testAppendZeroElements();
-}
-
-public void testEmptyArrayToEmpty() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testEmptyArrayToEmpty();
-}
-
-public void testEmptyArrayToNonEmpty() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testEmptyArrayToNonEmpty();
-}
-
-public void testNewArray_fromArray_Empty() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testNewArray_fromArray_Empty();
-}
-
-public void testNewArray_fromArray_Nonempty() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testNewArray_fromArray_Nonempty();
-}
-
-public void testNewArray_fromArray_OfArray() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testNewArray_fromArray_OfArray();
-}
-
-public void testNonEmptyToLonger() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testNonEmptyToLonger();
-}
-
-public void testNonEmptyToSameLength() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testNonEmptyToSameLength();
-}
-
-public void testNonEmptyToShorter() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testNonEmptyToShorter();
-}
-
-public void testPrependOneElement() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testPrependOneElement();
-}
-
-public void testPrependTwoElements() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testPrependTwoElements();
-}
-
-public void testPrependZeroElements() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testPrependZeroElements();
-}
-
-public void testToArrayImpl1() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testToArrayImpl1();
-}
-
-public void testToArrayImpl2() throws Exception {
-  com.google.common.collect.ObjectArraysTest testCase = new com.google.common.collect.ObjectArraysTest();
-  testCase.testToArrayImpl2();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/OrderingTest_gwt.java b/guava-gwt/test/com/google/common/collect/OrderingTest_gwt.java
deleted file mode 100644
index 576fc46..0000000
--- a/guava-gwt/test/com/google/common/collect/OrderingTest_gwt.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * 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.collect;
-public class OrderingTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAllEqual() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testAllEqual();
-}
-
-public void testArbitrary_withCollisions() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testArbitrary_withCollisions();
-}
-
-public void testArbitrary_withoutCollisions() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testArbitrary_withoutCollisions();
-}
-
-public void testBinarySearch() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testBinarySearch();
-}
-
-public void testCombinationsExhaustively_startingFromNatural() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testCombinationsExhaustively_startingFromNatural();
-}
-
-public void testComplicatedOrderingExample() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testComplicatedOrderingExample();
-}
-
-public void testCompound_instance() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testCompound_instance();
-}
-
-public void testCompound_instance_generics() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testCompound_instance_generics();
-}
-
-public void testCompound_static() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testCompound_static();
-}
-
-public void testExplicit_none() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testExplicit_none();
-}
-
-public void testExplicit_one() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testExplicit_one();
-}
-
-public void testExplicit_sortingExample() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testExplicit_sortingExample();
-}
-
-public void testExplicit_two() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testExplicit_two();
-}
-
-public void testExplicit_withDuplicates() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testExplicit_withDuplicates();
-}
-
-public void testFrom() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testFrom();
-}
-
-public void testGreatestOfIterable_simple() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testGreatestOfIterable_simple();
-}
-
-public void testGreatestOfIterator_simple() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testGreatestOfIterator_simple();
-}
-
-public void testImmutableSortedCopy() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testImmutableSortedCopy();
-}
-
-public void testIsOrdered() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testIsOrdered();
-}
-
-public void testIsStrictlyOrdered() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testIsStrictlyOrdered();
-}
-
-public void testIterableMinAndMax() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testIterableMinAndMax();
-}
-
-public void testIteratorMaxExhaustsIterator() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testIteratorMaxExhaustsIterator();
-}
-
-public void testIteratorMinAndMax() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testIteratorMinAndMax();
-}
-
-public void testIteratorMinExhaustsIterator() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testIteratorMinExhaustsIterator();
-}
-
-public void testLeastOfIterableLargeK() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterableLargeK();
-}
-
-public void testLeastOfIterable_empty_0() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_empty_0();
-}
-
-public void testLeastOfIterable_empty_1() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_empty_1();
-}
-
-public void testLeastOfIterable_simple_0() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_0();
-}
-
-public void testLeastOfIterable_simple_1() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_1();
-}
-
-public void testLeastOfIterable_simple_n() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_n();
-}
-
-public void testLeastOfIterable_simple_nMinusOne() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_nMinusOne();
-}
-
-public void testLeastOfIterable_simple_nMinusOne_withNullElement() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_nMinusOne_withNullElement();
-}
-
-public void testLeastOfIterable_simple_nPlusOne() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_nPlusOne();
-}
-
-public void testLeastOfIterable_simple_n_withNullElement() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_n_withNullElement();
-}
-
-public void testLeastOfIterable_simple_negativeOne() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_simple_negativeOne();
-}
-
-public void testLeastOfIterable_singleton_0() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_singleton_0();
-}
-
-public void testLeastOfIterable_ties() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterable_ties();
-}
-
-public void testLeastOfIteratorLargeK() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIteratorLargeK();
-}
-
-public void testLeastOfIterator_empty_0() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_empty_0();
-}
-
-public void testLeastOfIterator_empty_1() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_empty_1();
-}
-
-public void testLeastOfIterator_simple_0() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_0();
-}
-
-public void testLeastOfIterator_simple_1() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_1();
-}
-
-public void testLeastOfIterator_simple_n() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_n();
-}
-
-public void testLeastOfIterator_simple_nMinusOne() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_nMinusOne();
-}
-
-public void testLeastOfIterator_simple_nMinusOne_withNullElement() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_nMinusOne_withNullElement();
-}
-
-public void testLeastOfIterator_simple_nPlusOne() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_nPlusOne();
-}
-
-public void testLeastOfIterator_simple_n_withNullElement() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_n_withNullElement();
-}
-
-public void testLeastOfIterator_simple_negativeOne() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_simple_negativeOne();
-}
-
-public void testLeastOfIterator_singleton_0() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_singleton_0();
-}
-
-public void testLeastOfIterator_ties() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOfIterator_ties();
-}
-
-public void testLeastOf_reconcileAgainstSortAndSublistSmall() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLeastOf_reconcileAgainstSortAndSublistSmall();
-}
-
-public void testLexicographical() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testLexicographical();
-}
-
-public void testNatural() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testNatural();
-}
-
-public void testNullsFirst() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testNullsFirst();
-}
-
-public void testNullsLast() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testNullsLast();
-}
-
-public void testOnResultOf_chained() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testOnResultOf_chained();
-}
-
-public void testOnResultOf_natural() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testOnResultOf_natural();
-}
-
-public void testParameterMinAndMax() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testParameterMinAndMax();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testReverse();
-}
-
-public void testReverseOfReverseSameAsForward() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testReverseOfReverseSameAsForward();
-}
-
-public void testSortedCopy() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testSortedCopy();
-}
-
-public void testUsingToString() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testUsingToString();
-}
-
-public void testVarargsMinAndMax() throws Exception {
-  com.google.common.collect.OrderingTest testCase = new com.google.common.collect.OrderingTest();
-  testCase.testVarargsMinAndMax();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/PeekingIteratorTest_gwt.java b/guava-gwt/test/com/google/common/collect/PeekingIteratorTest_gwt.java
deleted file mode 100644
index f2da981..0000000
--- a/guava-gwt/test/com/google/common/collect/PeekingIteratorTest_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.collect;
-public class PeekingIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCantRemoveAfterPeek() throws Exception {
-  com.google.common.collect.PeekingIteratorTest testCase = new com.google.common.collect.PeekingIteratorTest();
-  testCase.testCantRemoveAfterPeek();
-}
-
-public void testPeekDoesntChangeIteration() throws Exception {
-  com.google.common.collect.PeekingIteratorTest testCase = new com.google.common.collect.PeekingIteratorTest();
-  testCase.testPeekDoesntChangeIteration();
-}
-
-public void testPeekOnEmptyList() throws Exception {
-  com.google.common.collect.PeekingIteratorTest testCase = new com.google.common.collect.PeekingIteratorTest();
-  testCase.testPeekOnEmptyList();
-}
-
-public void testPeekingIteratorBehavesLikeIteratorOnEmptyIterable() throws Exception {
-  com.google.common.collect.PeekingIteratorTest testCase = new com.google.common.collect.PeekingIteratorTest();
-  testCase.testPeekingIteratorBehavesLikeIteratorOnEmptyIterable();
-}
-
-public void testPeekingIteratorBehavesLikeIteratorOnSingletonIterable() throws Exception {
-  com.google.common.collect.PeekingIteratorTest testCase = new com.google.common.collect.PeekingIteratorTest();
-  testCase.testPeekingIteratorBehavesLikeIteratorOnSingletonIterable();
-}
-
-public void testPeekingIteratorDoesntAdvancePrematurely() throws Exception {
-  com.google.common.collect.PeekingIteratorTest testCase = new com.google.common.collect.PeekingIteratorTest();
-  testCase.testPeekingIteratorDoesntAdvancePrematurely();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/RangeTest_gwt.java b/guava-gwt/test/com/google/common/collect/RangeTest_gwt.java
deleted file mode 100644
index 97da5d7..0000000
--- a/guava-gwt/test/com/google/common/collect/RangeTest_gwt.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * 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.collect;
-public class RangeTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAll() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testAll();
-}
-
-public void testApply() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testApply();
-}
-
-public void testAtLeast() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testAtLeast();
-}
-
-public void testAtMost() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testAtMost();
-}
-
-public void testCanonical() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testCanonical();
-}
-
-public void testCanonical_unboundedDomain() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testCanonical_unboundedDomain();
-}
-
-public void testClosed() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testClosed();
-}
-
-public void testClosedOpen() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testClosedOpen();
-}
-
-public void testClosed_invalid() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testClosed_invalid();
-}
-
-public void testContainsAll() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testContainsAll();
-}
-
-public void testEmpty1() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEmpty1();
-}
-
-public void testEmpty2() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEmpty2();
-}
-
-public void testEncloseAll() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEncloseAll();
-}
-
-public void testEncloseAll_empty() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEncloseAll_empty();
-}
-
-public void testEncloseAll_nullValue() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEncloseAll_nullValue();
-}
-
-public void testEncloses_closed() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEncloses_closed();
-}
-
-public void testEncloses_open() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEncloses_open();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEquals();
-}
-
-public void testEquivalentFactories() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testEquivalentFactories();
-}
-
-public void testGap_connectedAdjacentYieldsEmpty() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testGap_connectedAdjacentYieldsEmpty();
-}
-
-public void testGap_general() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testGap_general();
-}
-
-public void testGap_overlapping() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testGap_overlapping();
-}
-
-public void testGreaterThan() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testGreaterThan();
-}
-
-public void testIntersection_deFactoEmpty() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testIntersection_deFactoEmpty();
-}
-
-public void testIntersection_empty() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testIntersection_empty();
-}
-
-public void testIntersection_general() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testIntersection_general();
-}
-
-public void testIntersection_singleton() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testIntersection_singleton();
-}
-
-public void testIsConnected() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testIsConnected();
-}
-
-public void testLegacyComparable() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testLegacyComparable();
-}
-
-public void testLessThan() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testLessThan();
-}
-
-public void testOpen() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testOpen();
-}
-
-public void testOpenClosed() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testOpenClosed();
-}
-
-public void testOpen_invalid() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testOpen_invalid();
-}
-
-public void testOrderingCuts() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testOrderingCuts();
-}
-
-public void testSingleton() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testSingleton();
-}
-
-public void testSpan_general() throws Exception {
-  com.google.common.collect.RangeTest testCase = new com.google.common.collect.RangeTest();
-  testCase.testSpan_general();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/RegularImmutableAsListTest_gwt.java b/guava-gwt/test/com/google/common/collect/RegularImmutableAsListTest_gwt.java
deleted file mode 100644
index e684436..0000000
--- a/guava-gwt/test/com/google/common/collect/RegularImmutableAsListTest_gwt.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.collect;
-public class RegularImmutableAsListTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testDoesntCheckForNull() throws Exception {
-  com.google.common.collect.RegularImmutableAsListTest testCase = new com.google.common.collect.RegularImmutableAsListTest();
-  testCase.testDoesntCheckForNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/RegularImmutableTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/RegularImmutableTableTest_gwt.java
deleted file mode 100644
index cbcc3d6..0000000
--- a/guava-gwt/test/com/google/common/collect/RegularImmutableTableTest_gwt.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.collect;
-public class RegularImmutableTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCellSet() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testCellSet();
-}
-
-public void testClear() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testColumn();
-}
-
-public void testColumnKeySet() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testColumnKeySet();
-}
-
-public void testColumnMap() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testColumnMap();
-}
-
-public void testConsistentHashCode() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testConsistentHashCode();
-}
-
-public void testConsistentToString() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testConsistentToString();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testContainsValue();
-}
-
-public void testForCells() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testForCells();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testGet();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testPut();
-}
-
-public void testPutAll() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testPutAll();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testRow();
-}
-
-public void testRowKeySet() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testRowKeySet();
-}
-
-public void testRowMap() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testRowMap();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.RegularImmutableTableTest testCase = new com.google.common.collect.RegularImmutableTableTest();
-  testCase.testValues();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SetOperationsTest_gwt.java b/guava-gwt/test/com/google/common/collect/SetOperationsTest_gwt.java
deleted file mode 100644
index a14d822..0000000
--- a/guava-gwt/test/com/google/common/collect/SetOperationsTest_gwt.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.collect;
-public class SetOperationsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testDifference__MoreTests() throws Exception {
-  com.google.common.collect.SetOperationsTest.MoreTests testCase = new com.google.common.collect.SetOperationsTest.MoreTests();
-  testCase.setUp();
-  testCase.testDifference();
-}
-
-public void testIntersection__MoreTests() throws Exception {
-  com.google.common.collect.SetOperationsTest.MoreTests testCase = new com.google.common.collect.SetOperationsTest.MoreTests();
-  testCase.setUp();
-  testCase.testIntersection();
-}
-
-public void testSymmetricDifference__MoreTests() throws Exception {
-  com.google.common.collect.SetOperationsTest.MoreTests testCase = new com.google.common.collect.SetOperationsTest.MoreTests();
-  testCase.setUp();
-  testCase.testSymmetricDifference();
-}
-
-public void testUnion__MoreTests() throws Exception {
-  com.google.common.collect.SetOperationsTest.MoreTests testCase = new com.google.common.collect.SetOperationsTest.MoreTests();
-  testCase.setUp();
-  testCase.testUnion();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SetsTest_gwt.java b/guava-gwt/test/com/google/common/collect/SetsTest_gwt.java
deleted file mode 100644
index 338c917..0000000
--- a/guava-gwt/test/com/google/common/collect/SetsTest_gwt.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * 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.collect;
-public class SetsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCartesianProductTooBig() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProductTooBig();
-}
-
-public void testCartesianProduct_2x2x2() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_2x2x2();
-}
-
-public void testCartesianProduct_binary0x0() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_binary0x0();
-}
-
-public void testCartesianProduct_binary0x1() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_binary0x1();
-}
-
-public void testCartesianProduct_binary1x0() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_binary1x0();
-}
-
-public void testCartesianProduct_binary1x1() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_binary1x1();
-}
-
-public void testCartesianProduct_binary1x2() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_binary1x2();
-}
-
-public void testCartesianProduct_binary2x2() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_binary2x2();
-}
-
-public void testCartesianProduct_contains() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_contains();
-}
-
-public void testCartesianProduct_hashCode() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_hashCode();
-}
-
-public void testCartesianProduct_unary() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_unary();
-}
-
-public void testCartesianProduct_unrelatedTypes() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_unrelatedTypes();
-}
-
-public void testCartesianProduct_zeroary() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCartesianProduct_zeroary();
-}
-
-public void testCombinations() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testCombinations();
-}
-
-public void testComplementOfEmptyEnumSetWithoutType() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfEmptyEnumSetWithoutType();
-}
-
-public void testComplementOfEmptySet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfEmptySet();
-}
-
-public void testComplementOfEmptySetWithoutTypeDoesntWork() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfEmptySetWithoutTypeDoesntWork();
-}
-
-public void testComplementOfEnumSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfEnumSet();
-}
-
-public void testComplementOfEnumSetWithType() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfEnumSetWithType();
-}
-
-public void testComplementOfFullSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfFullSet();
-}
-
-public void testComplementOfRegularSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfRegularSet();
-}
-
-public void testComplementOfRegularSetWithType() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testComplementOfRegularSetWithType();
-}
-
-public void testImmutableEnumSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testImmutableEnumSet();
-}
-
-public void testImmutableEnumSet_fromIterable() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testImmutableEnumSet_fromIterable();
-}
-
-public void testNewConcurrentHashSetEmpty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewConcurrentHashSetEmpty();
-}
-
-public void testNewConcurrentHashSetFromCollection() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewConcurrentHashSetFromCollection();
-}
-
-public void testNewEnumSet_collection() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewEnumSet_collection();
-}
-
-public void testNewEnumSet_empty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewEnumSet_empty();
-}
-
-public void testNewEnumSet_enumSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewEnumSet_enumSet();
-}
-
-public void testNewEnumSet_iterable() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewEnumSet_iterable();
-}
-
-public void testNewHashSetEmpty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetEmpty();
-}
-
-public void testNewHashSetFromCollection() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetFromCollection();
-}
-
-public void testNewHashSetFromIterable() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetFromIterable();
-}
-
-public void testNewHashSetFromIterator() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetFromIterator();
-}
-
-public void testNewHashSetVarArgs() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetVarArgs();
-}
-
-public void testNewHashSetWithExpectedSizeLarge() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetWithExpectedSizeLarge();
-}
-
-public void testNewHashSetWithExpectedSizeSmall() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewHashSetWithExpectedSizeSmall();
-}
-
-public void testNewIdentityHashSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewIdentityHashSet();
-}
-
-public void testNewLinkedHashSetEmpty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewLinkedHashSetEmpty();
-}
-
-public void testNewLinkedHashSetFromCollection() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewLinkedHashSetFromCollection();
-}
-
-public void testNewLinkedHashSetFromIterable() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewLinkedHashSetFromIterable();
-}
-
-public void testNewLinkedHashSetWithExpectedSizeLarge() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewLinkedHashSetWithExpectedSizeLarge();
-}
-
-public void testNewLinkedHashSetWithExpectedSizeSmall() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewLinkedHashSetWithExpectedSizeSmall();
-}
-
-public void testNewSetFromMap() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewSetFromMap();
-}
-
-public void testNewSetFromMapIllegal() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewSetFromMapIllegal();
-}
-
-public void testNewTreeSetEmpty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetEmpty();
-}
-
-public void testNewTreeSetEmptyDerived() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetEmptyDerived();
-}
-
-public void testNewTreeSetEmptyNonGeneric() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetEmptyNonGeneric();
-}
-
-public void testNewTreeSetEmptyWithComparator() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetEmptyWithComparator();
-}
-
-public void testNewTreeSetFromCollection() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetFromCollection();
-}
-
-public void testNewTreeSetFromIterable() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetFromIterable();
-}
-
-public void testNewTreeSetFromIterableDerived() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetFromIterableDerived();
-}
-
-public void testNewTreeSetFromIterableNonGeneric() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testNewTreeSetFromIterableNonGeneric();
-}
-
-public void testPowerSetContents() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetContents();
-}
-
-public void testPowerSetCreationErrors() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetCreationErrors();
-}
-
-public void testPowerSetEmpty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetEmpty();
-}
-
-public void testPowerSetEqualsAndHashCode_verifyAgainstHashSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetEqualsAndHashCode_verifyAgainstHashSet();
-}
-
-public void testPowerSetHashCode_inputHashCodeTimesTooFarValueIsZero() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetHashCode_inputHashCodeTimesTooFarValueIsZero();
-}
-
-public void testPowerSetIteration_iteratorTester_fast() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetIteration_iteratorTester_fast();
-}
-
-public void testPowerSetIteration_manual() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetIteration_manual();
-}
-
-public void testPowerSetShowOff() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetShowOff();
-}
-
-public void testPowerSetSize() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testPowerSetSize();
-}
-
-public void testToImmutableEnumSet() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testToImmutableEnumSet();
-}
-
-public void testToImmutableEnumSetEmpty() throws Exception {
-  com.google.common.collect.SetsTest testCase = new com.google.common.collect.SetsTest();
-  testCase.testToImmutableEnumSetEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SimpleAbstractMultisetTest_gwt.java b/guava-gwt/test/com/google/common/collect/SimpleAbstractMultisetTest_gwt.java
deleted file mode 100644
index f699aeb..0000000
--- a/guava-gwt/test/com/google/common/collect/SimpleAbstractMultisetTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.collect;
-public class SimpleAbstractMultisetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testFastAddAllMultiset() throws Exception {
-  com.google.common.collect.SimpleAbstractMultisetTest testCase = new com.google.common.collect.SimpleAbstractMultisetTest();
-  testCase.testFastAddAllMultiset();
-}
-
-public void testRemoveUnsupported() throws Exception {
-  com.google.common.collect.SimpleAbstractMultisetTest testCase = new com.google.common.collect.SimpleAbstractMultisetTest();
-  testCase.testRemoveUnsupported();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SingletonImmutableTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/SingletonImmutableTableTest_gwt.java
deleted file mode 100644
index 48e80d1..0000000
--- a/guava-gwt/test/com/google/common/collect/SingletonImmutableTableTest_gwt.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.collect;
-public class SingletonImmutableTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCellSet() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testCellSet();
-}
-
-public void testClear() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testColumn();
-}
-
-public void testColumnKeySet() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testColumnKeySet();
-}
-
-public void testColumnMap() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testColumnMap();
-}
-
-public void testConsistentHashCode() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testConsistentHashCode();
-}
-
-public void testConsistentToString() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testConsistentToString();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testContainsValue();
-}
-
-public void testEqualsObject() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testEqualsObject();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testPut();
-}
-
-public void testPutAll() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testPutAll();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testRow();
-}
-
-public void testRowKeySet() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testRowKeySet();
-}
-
-public void testRowMap() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testRowMap();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testSize();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testToString();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.SingletonImmutableTableTest testCase = new com.google.common.collect.SingletonImmutableTableTest();
-  testCase.testValues();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SortedIterablesTest_gwt.java b/guava-gwt/test/com/google/common/collect/SortedIterablesTest_gwt.java
deleted file mode 100644
index f1fe967..0000000
--- a/guava-gwt/test/com/google/common/collect/SortedIterablesTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.collect;
-public class SortedIterablesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testComparator() throws Exception {
-  com.google.common.collect.SortedIterablesTest testCase = new com.google.common.collect.SortedIterablesTest();
-  testCase.testComparator();
-}
-
-public void testSameComparator() throws Exception {
-  com.google.common.collect.SortedIterablesTest testCase = new com.google.common.collect.SortedIterablesTest();
-  testCase.testSameComparator();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SortedListsTest_gwt.java b/guava-gwt/test/com/google/common/collect/SortedListsTest_gwt.java
deleted file mode 100644
index 043a54b..0000000
--- a/guava-gwt/test/com/google/common/collect/SortedListsTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.collect;
-public class SortedListsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testWithDups() throws Exception {
-  com.google.common.collect.SortedListsTest testCase = new com.google.common.collect.SortedListsTest();
-  testCase.testWithDups();
-}
-
-public void testWithoutDups() throws Exception {
-  com.google.common.collect.SortedListsTest testCase = new com.google.common.collect.SortedListsTest();
-  testCase.testWithoutDups();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/StreamsTest_gwt.java b/guava-gwt/test/com/google/common/collect/StreamsTest_gwt.java
deleted file mode 100644
index eace8c0..0000000
--- a/guava-gwt/test/com/google/common/collect/StreamsTest_gwt.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * 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.collect;
-public class StreamsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testConcat_doubleStream() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_doubleStream();
-}
-
-public void testConcat_intStream() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_intStream();
-}
-
-public void testConcat_longStream() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_longStream();
-}
-
-public void testConcat_refStream() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_refStream();
-}
-
-public void testConcat_refStream_closeIsPropagated() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_refStream_closeIsPropagated();
-}
-
-public void testConcat_refStream_closeIsPropagated_Stream_concat() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_refStream_closeIsPropagated_Stream_concat();
-}
-
-public void testConcat_refStream_closeIsPropagated_Stream_flatMap() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_refStream_closeIsPropagated_Stream_flatMap();
-}
-
-public void testConcat_refStream_parallel() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testConcat_refStream_parallel();
-}
-
-public void testForEachPair() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testForEachPair();
-}
-
-public void testForEachPair_differingLengths1() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testForEachPair_differingLengths1();
-}
-
-public void testForEachPair_differingLengths2() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testForEachPair_differingLengths2();
-}
-
-public void testForEachPair_finiteWithInfinite() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testForEachPair_finiteWithInfinite();
-}
-
-public void testForEachPair_oneEmpty() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testForEachPair_oneEmpty();
-}
-
-public void testForEachPair_parallel() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testForEachPair_parallel();
-}
-
-public void testMapWithIndex_arrayListSource() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_arrayListSource();
-}
-
-public void testMapWithIndex_closeIsPropagated_sizedSource() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_closeIsPropagated_sizedSource();
-}
-
-public void testMapWithIndex_closeIsPropagated_unsizedSource() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_closeIsPropagated_unsizedSource();
-}
-
-public void testMapWithIndex_doubleStream_closeIsPropagated_sized() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_doubleStream_closeIsPropagated_sized();
-}
-
-public void testMapWithIndex_doubleStream_closeIsPropagated_unsized() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_doubleStream_closeIsPropagated_unsized();
-}
-
-public void testMapWithIndex_intStream() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_intStream();
-}
-
-public void testMapWithIndex_intStream_closeIsPropagated_sized() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_intStream_closeIsPropagated_sized();
-}
-
-public void testMapWithIndex_intStream_closeIsPropagated_unsized() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_intStream_closeIsPropagated_unsized();
-}
-
-public void testMapWithIndex_linkedHashSetSource() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_linkedHashSetSource();
-}
-
-public void testMapWithIndex_longStream() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_longStream();
-}
-
-public void testMapWithIndex_longStream_closeIsPropagated_sized() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_longStream_closeIsPropagated_sized();
-}
-
-public void testMapWithIndex_longStream_closeIsPropagated_unsized() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_longStream_closeIsPropagated_unsized();
-}
-
-public void testMapWithIndex_unsizedSource() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testMapWithIndex_unsizedSource();
-}
-
-public void testStream_collection() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_collection();
-}
-
-public void testStream_googleOptional() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_googleOptional();
-}
-
-public void testStream_iterator() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_iterator();
-}
-
-public void testStream_javaOptional() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_javaOptional();
-}
-
-public void testStream_nonCollection() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_nonCollection();
-}
-
-public void testStream_optionalDouble() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_optionalDouble();
-}
-
-public void testStream_optionalInt() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_optionalInt();
-}
-
-public void testStream_optionalLong() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testStream_optionalLong();
-}
-
-public void testZip() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testZip();
-}
-
-public void testZipDifferingLengths() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testZipDifferingLengths();
-}
-
-public void testZipFiniteWithInfinite() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testZipFiniteWithInfinite();
-}
-
-public void testZipInfiniteWithInfinite() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testZipInfiniteWithInfinite();
-}
-
-public void testZip_closeIsPropagated() throws Exception {
-  com.google.common.collect.StreamsTest testCase = new com.google.common.collect.StreamsTest();
-  testCase.testZip_closeIsPropagated();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/SubMapMultimapAsMapImplementsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/SubMapMultimapAsMapImplementsMapTest_gwt.java
deleted file mode 100644
index 99675e1..0000000
--- a/guava-gwt/test/com/google/common/collect/SubMapMultimapAsMapImplementsMapTest_gwt.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * 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.collect;
-public class SubMapMultimapAsMapImplementsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.SubMapMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.SubMapMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TableCollectionTest_gwt.java b/guava-gwt/test/com/google/common/collect/TableCollectionTest_gwt.java
deleted file mode 100644
index 60fddbc..0000000
--- a/guava-gwt/test/com/google/common/collect/TableCollectionTest_gwt.java
+++ /dev/null
@@ -1,7020 +0,0 @@
-/*
- * 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.collect;
-public class TableCollectionTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableTreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableHashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TransformValueColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testSize();
-}
-
-public void testValues__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__HashColumnMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnMapTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableTreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableHashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TransformValueRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeRowMapSubMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapSubMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeRowMapTailMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTailMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeRowMapHeadMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapHeadMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowMapTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testSize();
-}
-
-public void testValues__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__HashRowMapTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowMapTests testCase = new com.google.common.collect.TableCollectionTest.HashRowMapTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableTreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeColumnTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableHashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashColumnTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testSize();
-}
-
-public void testValues__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TransformValueColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueColumnTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testSize();
-}
-
-public void testValues__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TransposeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TransposeColumnTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeColumnTests testCase = new com.google.common.collect.TableCollectionTest.TreeColumnTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testSize();
-}
-
-public void testValues__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__HashColumnTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashColumnTests testCase = new com.google.common.collect.TableCollectionTest.HashColumnTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableTreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableTreeRowTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testSize();
-}
-
-public void testValues__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__UnmodifiableHashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests testCase = new com.google.common.collect.TableCollectionTest.UnmodifiableHashRowTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testSize();
-}
-
-public void testValues__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TransformValueRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransformValueRowTests testCase = new com.google.common.collect.TableCollectionTest.TransformValueRowTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testSize();
-}
-
-public void testValues__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TransposeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TransposeRowTests testCase = new com.google.common.collect.TableCollectionTest.TransposeRowTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testSize();
-}
-
-public void testValues__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.TreeRowTests testCase = new com.google.common.collect.TableCollectionTest.TreeRowTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-
-public void testClear__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testClear();
-}
-
-public void testContainsKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testGetNull();
-}
-
-public void testHashCode__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testSize();
-}
-
-public void testValues__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValues();
-}
-
-public void testValuesClear__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__HashRowTests() throws Exception {
-  com.google.common.collect.TableCollectionTest.HashRowTests testCase = new com.google.common.collect.TableCollectionTest.HashRowTests();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TablesTest_gwt.java b/guava-gwt/test/com/google/common/collect/TablesTest_gwt.java
deleted file mode 100644
index 36d5390..0000000
--- a/guava-gwt/test/com/google/common/collect/TablesTest_gwt.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.collect;
-public class TablesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testEntryEquals() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testEntryEquals();
-}
-
-public void testEntryEqualsNull() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testEntryEqualsNull();
-}
-
-public void testImmutableEntryToString() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testImmutableEntryToString();
-}
-
-public void testToTable() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testToTable();
-}
-
-public void testToTableConflict() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testToTableConflict();
-}
-
-public void testToTableMerging() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testToTableMerging();
-}
-
-public void testToTableNullMerge() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testToTableNullMerge();
-}
-
-public void testToTableNullValues() throws Exception {
-  com.google.common.collect.TablesTest testCase = new com.google.common.collect.TablesTest();
-  testCase.testToTableNullValues();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TablesTransformValuesTest_gwt.java b/guava-gwt/test/com/google/common/collect/TablesTransformValuesTest_gwt.java
deleted file mode 100644
index f8ec56e..0000000
--- a/guava-gwt/test/com/google/common/collect/TablesTransformValuesTest_gwt.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.collect;
-public class TablesTransformValuesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testPut();
-}
-
-public void testPutAllTable() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testPutAllTable();
-}
-
-public void testPutNull() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testPutNull();
-}
-
-public void testPutNullReplace() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testPutNullReplace();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowClearAndPut() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testRowClearAndPut();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.TablesTransformValuesTest testCase = new com.google.common.collect.TablesTransformValuesTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/collect/TestModuleEntryPoint.java
deleted file mode 100644
index 5c171b2..0000000
--- a/guava-gwt/test/com/google/common/collect/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/collect/TransposedTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/TransposedTableTest_gwt.java
deleted file mode 100644
index 83f13ac..0000000
--- a/guava-gwt/test/com/google/common/collect/TransposedTableTest_gwt.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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.collect;
-public class TransposedTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testPut();
-}
-
-public void testPutAllTable() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testPutAllTable();
-}
-
-public void testPutNull() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testPutNull();
-}
-
-public void testPutNullReplace() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testPutNullReplace();
-}
-
-public void testPutOriginalModifiesTranspose() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testPutOriginalModifiesTranspose();
-}
-
-public void testPutTransposeModifiesOriginal() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testPutTransposeModifiesOriginal();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowClearAndPut() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testRowClearAndPut();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-
-public void testTransposeTransposed() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testTransposeTransposed();
-}
-
-public void testTransposedViews() throws Exception {
-  com.google.common.collect.TransposedTableTest testCase = new com.google.common.collect.TransposedTableTest();
-  testCase.setUp();
-  testCase.testTransposedViews();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TreeBasedTableTest_gwt.java b/guava-gwt/test/com/google/common/collect/TreeBasedTableTest_gwt.java
deleted file mode 100644
index ebbfc32..0000000
--- a/guava-gwt/test/com/google/common/collect/TreeBasedTableTest_gwt.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * 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.collect;
-public class TreeBasedTableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCellSetToString_ordered() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testCellSetToString_ordered();
-}
-
-public void testClear() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testClear();
-}
-
-public void testColumn() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumn();
-}
-
-public void testColumnComparator() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnComparator();
-}
-
-public void testColumnKeySet_empty() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySet_empty();
-}
-
-public void testColumnKeySet_isSorted() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySet_isSorted();
-}
-
-public void testColumnKeySet_isSortedWithRealComparator() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySet_isSortedWithRealComparator();
-}
-
-public void testColumnKeySet_oneColumn() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySet_oneColumn();
-}
-
-public void testColumnKeySet_oneEntry() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySet_oneEntry();
-}
-
-public void testColumnKeySet_oneRow() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnKeySet_oneRow();
-}
-
-public void testColumnNull() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnNull();
-}
-
-public void testColumnSetPartialOverlap() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testColumnSetPartialOverlap();
-}
-
-public void testContains() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testContains();
-}
-
-public void testContainsColumn() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testContainsColumn();
-}
-
-public void testContainsRow() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testContainsRow();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testContainsValue();
-}
-
-public void testCreateCopy() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testCreateCopy();
-}
-
-public void testCreateExplicitComparators() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testCreateExplicitComparators();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testEquals();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testGet();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testHashCode();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testIsEmpty();
-}
-
-public void testPut() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testPut();
-}
-
-public void testPutAllTable() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testPutAllTable();
-}
-
-public void testPutNull() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testPutNull();
-}
-
-public void testPutNullReplace() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testPutNullReplace();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRemove();
-}
-
-public void testRow() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRow();
-}
-
-public void testRowClearAndPut() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowClearAndPut();
-}
-
-public void testRowComparator() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowComparator();
-}
-
-public void testRowEntrySetContains() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowEntrySetContains();
-}
-
-public void testRowEntrySetRemove() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowEntrySetRemove();
-}
-
-public void testRowKeyMapHeadMap() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeyMapHeadMap();
-}
-
-public void testRowKeyMapSubMap() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeyMapSubMap();
-}
-
-public void testRowKeyMapTailMap() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeyMapTailMap();
-}
-
-public void testRowKeySetComparator() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetComparator();
-}
-
-public void testRowKeySetFirst() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetFirst();
-}
-
-public void testRowKeySetHeadSet() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetHeadSet();
-}
-
-public void testRowKeySetLast() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetLast();
-}
-
-public void testRowKeySetSubSet() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetSubSet();
-}
-
-public void testRowKeySetTailSet() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetTailSet();
-}
-
-public void testRowKeySetToString_ordered() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowKeySetToString_ordered();
-}
-
-public void testRowMapComparator() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowMapComparator();
-}
-
-public void testRowMapFirstKey() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowMapFirstKey();
-}
-
-public void testRowMapLastKey() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowMapLastKey();
-}
-
-public void testRowMapValuesAreSorted() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowMapValuesAreSorted();
-}
-
-public void testRowNull() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowNull();
-}
-
-public void testRowSize() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testRowSize();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testSize();
-}
-
-public void testSubRowClearAndPut() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testSubRowClearAndPut();
-}
-
-public void testToStringSize1() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testToStringSize1();
-}
-
-public void testToString_ordered() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testToString_ordered();
-}
-
-public void testValuesToString_ordered() throws Exception {
-  com.google.common.collect.TreeBasedTableTest testCase = new com.google.common.collect.TreeBasedTableTest();
-  testCase.setUp();
-  testCase.testValuesToString_ordered();
-}
-
-public void testClear__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testClear();
-}
-
-public void testClearSubMapOfRowMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testClearSubMapOfRowMap();
-}
-
-public void testContainsKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testSize();
-}
-
-public void testTailMapClearThrough__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testTailMapClearThrough();
-}
-
-public void testTailMapRemoveThrough__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testTailMapRemoveThrough();
-}
-
-public void testTailMapWriteThrough__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testTailMapWriteThrough();
-}
-
-public void testValues__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValues();
-}
-
-public void testValuesClear__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty__TreeRowTest() throws Exception {
-  com.google.common.collect.TreeBasedTableTest.TreeRowTest testCase = new com.google.common.collect.TreeBasedTableTest.TreeRowTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TreeMultimapExplicitTest_gwt.java b/guava-gwt/test/com/google/common/collect/TreeMultimapExplicitTest_gwt.java
deleted file mode 100644
index ae34cc3..0000000
--- a/guava-gwt/test/com/google/common/collect/TreeMultimapExplicitTest_gwt.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.collect;
-public class TreeMultimapExplicitTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testComparator() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testComparator();
-}
-
-public void testGetComparator() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testGetComparator();
-}
-
-public void testMultimapComparators() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testMultimapComparators();
-}
-
-public void testMultimapCreateFromTreeMultimap() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testMultimapCreateFromTreeMultimap();
-}
-
-public void testOrderedAsMapEntries() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testOrderedAsMapEntries();
-}
-
-public void testOrderedEntries() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testOrderedEntries();
-}
-
-public void testOrderedGet() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testOrderedGet();
-}
-
-public void testOrderedKeySet() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testOrderedKeySet();
-}
-
-public void testOrderedValues() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testOrderedValues();
-}
-
-public void testSortedKeySet() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testSortedKeySet();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.TreeMultimapExplicitTest testCase = new com.google.common.collect.TreeMultimapExplicitTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TreeMultimapNaturalTest_gwt.java b/guava-gwt/test/com/google/common/collect/TreeMultimapNaturalTest_gwt.java
deleted file mode 100644
index aee331a..0000000
--- a/guava-gwt/test/com/google/common/collect/TreeMultimapNaturalTest_gwt.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.collect;
-public class TreeMultimapNaturalTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testComparators() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testComparators();
-}
-
-public void testCreateFromHashMultimap() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testCreateFromHashMultimap();
-}
-
-public void testCreateFromSortedSetMultimap() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testCreateFromSortedSetMultimap();
-}
-
-public void testCreateFromTreeMultimap() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testCreateFromTreeMultimap();
-}
-
-public void testMultimapConstructor() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testMultimapConstructor();
-}
-
-public void testOrderedAsMapEntries() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testOrderedAsMapEntries();
-}
-
-public void testOrderedEntries() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testOrderedEntries();
-}
-
-public void testOrderedGet() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testOrderedGet();
-}
-
-public void testOrderedKeySet() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testOrderedKeySet();
-}
-
-public void testOrderedValues() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testOrderedValues();
-}
-
-public void testTailSetClear() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testTailSetClear();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testToString();
-}
-
-public void testTreeMultimapAsMapSorted() throws Exception {
-  com.google.common.collect.TreeMultimapNaturalTest testCase = new com.google.common.collect.TreeMultimapNaturalTest();
-  testCase.testTreeMultimapAsMapSorted();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TreeMultisetTest_gwt.java b/guava-gwt/test/com/google/common/collect/TreeMultisetTest_gwt.java
deleted file mode 100644
index 79d864c..0000000
--- a/guava-gwt/test/com/google/common/collect/TreeMultisetTest_gwt.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.collect;
-public class TreeMultisetTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testCreate() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testCreate();
-}
-
-public void testCreateFromIterable() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testCreateFromIterable();
-}
-
-public void testCreateWithComparator() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testCreateWithComparator();
-}
-
-public void testCustomComparator() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testCustomComparator();
-}
-
-public void testDegenerateComparator() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testDegenerateComparator();
-}
-
-public void testElementSetSortedSetMethods() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testElementSetSortedSetMethods();
-}
-
-public void testElementSetSubsetClear() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testElementSetSubsetClear();
-}
-
-public void testElementSetSubsetRemove() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testElementSetSubsetRemove();
-}
-
-public void testElementSetSubsetRemoveAll() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testElementSetSubsetRemoveAll();
-}
-
-public void testElementSetSubsetRetainAll() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testElementSetSubsetRetainAll();
-}
-
-public void testNullAcceptingComparator() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testNullAcceptingComparator();
-}
-
-public void testSubMultisetSize() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testSubMultisetSize();
-}
-
-public void testToString() throws Exception {
-  com.google.common.collect.TreeMultisetTest testCase = new com.google.common.collect.TreeMultisetTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/TreeTraverserTest_gwt.java b/guava-gwt/test/com/google/common/collect/TreeTraverserTest_gwt.java
deleted file mode 100644
index 9a772e3..0000000
--- a/guava-gwt/test/com/google/common/collect/TreeTraverserTest_gwt.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.collect;
-public class TreeTraverserTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testBreadthOrder() throws Exception {
-  com.google.common.collect.TreeTraverserTest testCase = new com.google.common.collect.TreeTraverserTest();
-  testCase.testBreadthOrder();
-}
-
-public void testPostOrder() throws Exception {
-  com.google.common.collect.TreeTraverserTest testCase = new com.google.common.collect.TreeTraverserTest();
-  testCase.testPostOrder();
-}
-
-public void testPreOrder() throws Exception {
-  com.google.common.collect.TreeTraverserTest testCase = new com.google.common.collect.TreeTraverserTest();
-  testCase.testPreOrder();
-}
-
-public void testUsing() throws Exception {
-  com.google.common.collect.TreeTraverserTest testCase = new com.google.common.collect.TreeTraverserTest();
-  testCase.testUsing();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/UnmodifiableIteratorTest_gwt.java b/guava-gwt/test/com/google/common/collect/UnmodifiableIteratorTest_gwt.java
deleted file mode 100644
index c56424e..0000000
--- a/guava-gwt/test/com/google/common/collect/UnmodifiableIteratorTest_gwt.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.collect;
-public class UnmodifiableIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testRemove() throws Exception {
-  com.google.common.collect.UnmodifiableIteratorTest testCase = new com.google.common.collect.UnmodifiableIteratorTest();
-  testCase.testRemove();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/UnmodifiableListIteratorTest_gwt.java b/guava-gwt/test/com/google/common/collect/UnmodifiableListIteratorTest_gwt.java
deleted file mode 100644
index cab3690..0000000
--- a/guava-gwt/test/com/google/common/collect/UnmodifiableListIteratorTest_gwt.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.collect;
-public class UnmodifiableListIteratorTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testAdd() throws Exception {
-  com.google.common.collect.UnmodifiableListIteratorTest testCase = new com.google.common.collect.UnmodifiableListIteratorTest();
-  testCase.testAdd();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.UnmodifiableListIteratorTest testCase = new com.google.common.collect.UnmodifiableListIteratorTest();
-  testCase.testRemove();
-}
-
-public void testSet() throws Exception {
-  com.google.common.collect.UnmodifiableListIteratorTest testCase = new com.google.common.collect.UnmodifiableListIteratorTest();
-  testCase.testSet();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/UnmodifiableMultimapAsMapImplementsMapTest_gwt.java b/guava-gwt/test/com/google/common/collect/UnmodifiableMultimapAsMapImplementsMapTest_gwt.java
deleted file mode 100644
index 769fa01..0000000
--- a/guava-gwt/test/com/google/common/collect/UnmodifiableMultimapAsMapImplementsMapTest_gwt.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * 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.collect;
-public class UnmodifiableMultimapAsMapImplementsMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testModule";
-}
-public void testClear() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testClear();
-}
-
-public void testContainsKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testContainsKey();
-}
-
-public void testContainsValue() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testContainsValue();
-}
-
-public void testEntrySet() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySet();
-}
-
-public void testEntrySetAddAndAddAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetAddAndAddAll();
-}
-
-public void testEntrySetClear() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetClear();
-}
-
-public void testEntrySetContainsEntryIncompatibleKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryIncompatibleKey();
-}
-
-public void testEntrySetContainsEntryNullKeyMissing() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyMissing();
-}
-
-public void testEntrySetContainsEntryNullKeyPresent() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetContainsEntryNullKeyPresent();
-}
-
-public void testEntrySetForEmptyMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetForEmptyMap();
-}
-
-public void testEntrySetIteratorRemove() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetIteratorRemove();
-}
-
-public void testEntrySetRemove() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemove();
-}
-
-public void testEntrySetRemoveAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAll();
-}
-
-public void testEntrySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveAllNullFromEmpty();
-}
-
-public void testEntrySetRemoveDifferentValue() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveDifferentValue();
-}
-
-public void testEntrySetRemoveMissingKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveMissingKey();
-}
-
-public void testEntrySetRemoveNullKeyMissing() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyMissing();
-}
-
-public void testEntrySetRemoveNullKeyPresent() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRemoveNullKeyPresent();
-}
-
-public void testEntrySetRetainAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAll();
-}
-
-public void testEntrySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetRetainAllNullFromEmpty();
-}
-
-public void testEntrySetSetValue() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValue();
-}
-
-public void testEntrySetSetValueSameValue() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEntrySetSetValueSameValue();
-}
-
-public void testEqualsForEmptyMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEmptyMap();
-}
-
-public void testEqualsForEqualMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForEqualMap();
-}
-
-public void testEqualsForLargerMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForLargerMap();
-}
-
-public void testEqualsForSmallerMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testEqualsForSmallerMap();
-}
-
-public void testGet() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testGet();
-}
-
-public void testGetForEmptyMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testGetForEmptyMap();
-}
-
-public void testGetNull() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testGetNull();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testHashCode();
-}
-
-public void testHashCodeForEmptyMap() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testHashCodeForEmptyMap();
-}
-
-public void testKeySetClear() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetClear();
-}
-
-public void testKeySetRemove() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemove();
-}
-
-public void testKeySetRemoveAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAll();
-}
-
-public void testKeySetRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRemoveAllNullFromEmpty();
-}
-
-public void testKeySetRetainAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAll();
-}
-
-public void testKeySetRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testKeySetRetainAllNullFromEmpty();
-}
-
-public void testPutAllExistingKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutAllExistingKey();
-}
-
-public void testPutAllNewKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutAllNewKey();
-}
-
-public void testPutExistingKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutExistingKey();
-}
-
-public void testPutNewKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutNewKey();
-}
-
-public void testPutNullKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutNullKey();
-}
-
-public void testPutNullValue() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValue();
-}
-
-public void testPutNullValueForExistingKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testPutNullValueForExistingKey();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveMissingKey() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testRemoveMissingKey();
-}
-
-public void testSize() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testSize();
-}
-
-public void testValues() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValues();
-}
-
-public void testValuesClear() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesClear();
-}
-
-public void testValuesIteratorRemove() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesIteratorRemove();
-}
-
-public void testValuesRemove() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemove();
-}
-
-public void testValuesRemoveAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAll();
-}
-
-public void testValuesRemoveAllNullFromEmpty() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveAllNullFromEmpty();
-}
-
-public void testValuesRemoveMissing() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRemoveMissing();
-}
-
-public void testValuesRetainAll() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAll();
-}
-
-public void testValuesRetainAllNullFromEmpty() throws Exception {
-  com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest testCase = new com.google.common.collect.UnmodifiableMultimapAsMapImplementsMapTest();
-  testCase.testValuesRetainAllNullFromEmpty();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/testModule.gwt.xml b/guava-gwt/test/com/google/common/collect/testModule.gwt.xml
index 068334b..a5f868d 100644
--- a/guava-gwt/test/com/google/common/collect/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/collect/testModule.gwt.xml
@@ -1,21 +1,30 @@
 <?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"/>
-  <inherits name="com.google.common.truth.Truth8"/>
+        
   <entry-point class="com.google.common.collect.TestModuleEntryPoint"/>
    
-  <source path=""/>
-    
   <super-source path="super"/>
    
 </module>
diff --git a/guava-gwt/test/com/google/common/collect/testing/HelpersTest_gwt.java b/guava-gwt/test/com/google/common/collect/testing/HelpersTest_gwt.java
deleted file mode 100644
index ef380ef..0000000
--- a/guava-gwt/test/com/google/common/collect/testing/HelpersTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.collect.testing;
-public class HelpersTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testing.testModule";
-}
-public void testAssertContains() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testAssertContains();
-}
-
-public void testAssertContainsAllOf() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testAssertContainsAllOf();
-}
-
-public void testAssertContentsInOrder() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testAssertContentsInOrder();
-}
-
-public void testAssertEqualInOrder() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testAssertEqualInOrder();
-}
-
-public void testIsEmpty_iterable() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testIsEmpty_iterable();
-}
-
-public void testIsEmpty_map() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testIsEmpty_map();
-}
-
-public void testNullsBeforeB() throws Exception {
-  com.google.common.collect.testing.HelpersTest testCase = new com.google.common.collect.testing.HelpersTest();
-  testCase.testNullsBeforeB();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/testing/IteratorTesterTest_gwt.java b/guava-gwt/test/com/google/common/collect/testing/IteratorTesterTest_gwt.java
deleted file mode 100644
index 76171b3..0000000
--- a/guava-gwt/test/com/google/common/collect/testing/IteratorTesterTest_gwt.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.collect.testing;
-public class IteratorTesterTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testing.testModule";
-}
-public void testCanCatchDifferentContents() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testCanCatchDifferentContents();
-}
-
-public void testCanCatchDifferentLengthOfIteration() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testCanCatchDifferentLengthOfIteration();
-}
-
-public void testCanCatchDifferentRemoveBehaviour() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testCanCatchDifferentRemoveBehaviour();
-}
-
-public void testCanCatchSunJavaBug6529795InTargetIterator() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testCanCatchSunJavaBug6529795InTargetIterator();
-}
-
-public void testMismatchedException() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testMismatchedException();
-}
-
-public void testMissingException() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testMissingException();
-}
-
-public void testSimilarException() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testSimilarException();
-}
-
-public void testUnexpectedException() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testUnexpectedException();
-}
-
-public void testUnknownOrder() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testUnknownOrder();
-}
-
-public void testUnknownOrderUnrecognizedElement() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testUnknownOrderUnrecognizedElement();
-}
-
-public void testVerifyCanThrowAssertionThatFailsTest() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testVerifyCanThrowAssertionThatFailsTest();
-}
-
-public void testVerifyGetsCalled() throws Exception {
-  com.google.common.collect.testing.IteratorTesterTest testCase = new com.google.common.collect.testing.IteratorTesterTest();
-  testCase.testVerifyGetsCalled();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/testing/MinimalIterableTest_gwt.java b/guava-gwt/test/com/google/common/collect/testing/MinimalIterableTest_gwt.java
deleted file mode 100644
index 66a4c3c..0000000
--- a/guava-gwt/test/com/google/common/collect/testing/MinimalIterableTest_gwt.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.collect.testing;
-public class MinimalIterableTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.collect.testing.testModule";
-}
-public void testFrom_empty() throws Exception {
-  com.google.common.collect.testing.MinimalIterableTest testCase = new com.google.common.collect.testing.MinimalIterableTest();
-  testCase.testFrom_empty();
-}
-
-public void testFrom_one() throws Exception {
-  com.google.common.collect.testing.MinimalIterableTest testCase = new com.google.common.collect.testing.MinimalIterableTest();
-  testCase.testFrom_one();
-}
-
-public void testOf_empty() throws Exception {
-  com.google.common.collect.testing.MinimalIterableTest testCase = new com.google.common.collect.testing.MinimalIterableTest();
-  testCase.testOf_empty();
-}
-
-public void testOf_one() throws Exception {
-  com.google.common.collect.testing.MinimalIterableTest testCase = new com.google.common.collect.testing.MinimalIterableTest();
-  testCase.testOf_one();
-}
-}
diff --git a/guava-gwt/test/com/google/common/collect/testing/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/collect/testing/TestModuleEntryPoint.java
deleted file mode 100644
index bace3c2..0000000
--- a/guava-gwt/test/com/google/common/collect/testing/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.testing;
-
-import com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
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 f65ce31..d152637 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
@@ -14,12 +14,19 @@
   <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"/>
    
+  <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"/>
+    
 </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 caf0b73..5d88b92 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
@@ -14,13 +14,21 @@
   <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"/>
    
+  <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"/>
+      
 </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
index d70f1d8..42b4a60 100644
--- a/guava-gwt/test/com/google/common/collect/testing/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/collect/testing/testModule.gwt.xml
@@ -1,15 +1,22 @@
 <?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"/>
    
-  <source path=""/>
-    
 </module>
diff --git a/guava-gwt/test/com/google/common/escape/ArrayBasedCharEscaperTest_gwt.java b/guava-gwt/test/com/google/common/escape/ArrayBasedCharEscaperTest_gwt.java
deleted file mode 100644
index 65c6392..0000000
--- a/guava-gwt/test/com/google/common/escape/ArrayBasedCharEscaperTest_gwt.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.escape;
-public class ArrayBasedCharEscaperTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.escape.testModule";
-}
-public void testDeleteUnsafeChars() throws Exception {
-  com.google.common.escape.ArrayBasedCharEscaperTest testCase = new com.google.common.escape.ArrayBasedCharEscaperTest();
-  testCase.testDeleteUnsafeChars();
-}
-
-public void testReplacementPriority() throws Exception {
-  com.google.common.escape.ArrayBasedCharEscaperTest testCase = new com.google.common.escape.ArrayBasedCharEscaperTest();
-  testCase.testReplacementPriority();
-}
-
-public void testSafeRange() throws Exception {
-  com.google.common.escape.ArrayBasedCharEscaperTest testCase = new com.google.common.escape.ArrayBasedCharEscaperTest();
-  testCase.testSafeRange();
-}
-
-public void testSafeRange_maxLessThanMin() throws Exception {
-  com.google.common.escape.ArrayBasedCharEscaperTest testCase = new com.google.common.escape.ArrayBasedCharEscaperTest();
-  testCase.testSafeRange_maxLessThanMin();
-}
-}
diff --git a/guava-gwt/test/com/google/common/escape/ArrayBasedEscaperMapTest_gwt.java b/guava-gwt/test/com/google/common/escape/ArrayBasedEscaperMapTest_gwt.java
deleted file mode 100644
index 5d3ea9c..0000000
--- a/guava-gwt/test/com/google/common/escape/ArrayBasedEscaperMapTest_gwt.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.escape;
-public class ArrayBasedEscaperMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.escape.testModule";
-}
-public void testEmptyMap() throws Exception {
-  com.google.common.escape.ArrayBasedEscaperMapTest testCase = new com.google.common.escape.ArrayBasedEscaperMapTest();
-  testCase.testEmptyMap();
-}
-
-public void testMapLength() throws Exception {
-  com.google.common.escape.ArrayBasedEscaperMapTest testCase = new com.google.common.escape.ArrayBasedEscaperMapTest();
-  testCase.testMapLength();
-}
-
-public void testMapping() throws Exception {
-  com.google.common.escape.ArrayBasedEscaperMapTest testCase = new com.google.common.escape.ArrayBasedEscaperMapTest();
-  testCase.testMapping();
-}
-
-public void testNullMap() throws Exception {
-  com.google.common.escape.ArrayBasedEscaperMapTest testCase = new com.google.common.escape.ArrayBasedEscaperMapTest();
-  testCase.testNullMap();
-}
-}
diff --git a/guava-gwt/test/com/google/common/escape/ArrayBasedUnicodeEscaperTest_gwt.java b/guava-gwt/test/com/google/common/escape/ArrayBasedUnicodeEscaperTest_gwt.java
deleted file mode 100644
index b30f269..0000000
--- a/guava-gwt/test/com/google/common/escape/ArrayBasedUnicodeEscaperTest_gwt.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.escape;
-public class ArrayBasedUnicodeEscaperTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.escape.testModule";
-}
-public void testCodePointsFromSurrogatePairs() throws Exception {
-  com.google.common.escape.ArrayBasedUnicodeEscaperTest testCase = new com.google.common.escape.ArrayBasedUnicodeEscaperTest();
-  testCase.testCodePointsFromSurrogatePairs();
-}
-
-public void testDeleteUnsafeChars() throws Exception {
-  com.google.common.escape.ArrayBasedUnicodeEscaperTest testCase = new com.google.common.escape.ArrayBasedUnicodeEscaperTest();
-  testCase.testDeleteUnsafeChars();
-}
-
-public void testReplacementPriority() throws Exception {
-  com.google.common.escape.ArrayBasedUnicodeEscaperTest testCase = new com.google.common.escape.ArrayBasedUnicodeEscaperTest();
-  testCase.testReplacementPriority();
-}
-
-public void testReplacements() throws Exception {
-  com.google.common.escape.ArrayBasedUnicodeEscaperTest testCase = new com.google.common.escape.ArrayBasedUnicodeEscaperTest();
-  testCase.testReplacements();
-}
-
-public void testSafeRange() throws Exception {
-  com.google.common.escape.ArrayBasedUnicodeEscaperTest testCase = new com.google.common.escape.ArrayBasedUnicodeEscaperTest();
-  testCase.testSafeRange();
-}
-}
diff --git a/guava-gwt/test/com/google/common/escape/EscapersTest_gwt.java b/guava-gwt/test/com/google/common/escape/EscapersTest_gwt.java
deleted file mode 100644
index 1823766..0000000
--- a/guava-gwt/test/com/google/common/escape/EscapersTest_gwt.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.escape;
-public class EscapersTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.escape.testModule";
-}
-public void testAsUnicodeEscaper() throws Exception {
-  com.google.common.escape.EscapersTest testCase = new com.google.common.escape.EscapersTest();
-  testCase.testAsUnicodeEscaper();
-}
-
-public void testBuilderCreatesIndependentEscapers() throws Exception {
-  com.google.common.escape.EscapersTest testCase = new com.google.common.escape.EscapersTest();
-  testCase.testBuilderCreatesIndependentEscapers();
-}
-
-public void testBuilderInitialStateNoReplacement() throws Exception {
-  com.google.common.escape.EscapersTest testCase = new com.google.common.escape.EscapersTest();
-  testCase.testBuilderInitialStateNoReplacement();
-}
-
-public void testBuilderInitialStateNoneUnsafe() throws Exception {
-  com.google.common.escape.EscapersTest testCase = new com.google.common.escape.EscapersTest();
-  testCase.testBuilderInitialStateNoneUnsafe();
-}
-
-public void testBuilderRetainsState() throws Exception {
-  com.google.common.escape.EscapersTest testCase = new com.google.common.escape.EscapersTest();
-  testCase.testBuilderRetainsState();
-}
-
-public void testNullEscaper() throws Exception {
-  com.google.common.escape.EscapersTest testCase = new com.google.common.escape.EscapersTest();
-  testCase.testNullEscaper();
-}
-}
diff --git a/guava-gwt/test/com/google/common/escape/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/escape/TestModuleEntryPoint.java
deleted file mode 100644
index 9c81c28..0000000
--- a/guava-gwt/test/com/google/common/escape/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/escape/UnicodeEscaperTest_gwt.java b/guava-gwt/test/com/google/common/escape/UnicodeEscaperTest_gwt.java
deleted file mode 100644
index 0c01d4e..0000000
--- a/guava-gwt/test/com/google/common/escape/UnicodeEscaperTest_gwt.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.escape;
-public class UnicodeEscaperTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.escape.testModule";
-}
-public void testBadStrings() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testBadStrings();
-}
-
-public void testCodePointAt_IndexOutOfBoundsException() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testCodePointAt_IndexOutOfBoundsException();
-}
-
-public void testFalsePositivesForNextEscapedIndex() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testFalsePositivesForNextEscapedIndex();
-}
-
-public void testGrowBuffer() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testGrowBuffer();
-}
-
-public void testNopEscaper() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testNopEscaper();
-}
-
-public void testNullInput() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testNullInput();
-}
-
-public void testSimpleEscaper() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testSimpleEscaper();
-}
-
-public void testSurrogatePairs() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testSurrogatePairs();
-}
-
-public void testTrailingHighSurrogate() throws Exception {
-  com.google.common.escape.UnicodeEscaperTest testCase = new com.google.common.escape.UnicodeEscaperTest();
-  testCase.testTrailingHighSurrogate();
-}
-}
diff --git a/guava-gwt/test/com/google/common/escape/testModule.gwt.xml b/guava-gwt/test/com/google/common/escape/testModule.gwt.xml
index ae6d05b..e52723e 100644
--- a/guava-gwt/test/com/google/common/escape/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/escape/testModule.gwt.xml
@@ -1,16 +1,24 @@
 <?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"/>
    
-  <source path=""/>
-    
 </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 909ca45..85cb436 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,5 +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.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" />
 </module>
diff --git a/guava-gwt/test/com/google/common/html/HtmlEscapersTest_gwt.java b/guava-gwt/test/com/google/common/html/HtmlEscapersTest_gwt.java
deleted file mode 100644
index 90329f2..0000000
--- a/guava-gwt/test/com/google/common/html/HtmlEscapersTest_gwt.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.html;
-public class HtmlEscapersTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.html.testModule";
-}
-
-public void testHtmlEscaper() throws Exception {
-  com.google.common.html.HtmlEscapersTest testCase = new com.google.common.html.HtmlEscapersTest();
-  testCase.testHtmlEscaper();
-}
-}
diff --git a/guava-gwt/test/com/google/common/html/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/html/TestModuleEntryPoint.java
deleted file mode 100644
index 4dcd183..0000000
--- a/guava-gwt/test/com/google/common/html/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/html/testModule.gwt.xml b/guava-gwt/test/com/google/common/html/testModule.gwt.xml
index 3e03493..57719c0 100644
--- a/guava-gwt/test/com/google/common/html/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/html/testModule.gwt.xml
@@ -1,14 +1,20 @@
 <?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"/>
    
-  <source path=""/>
-    
 </module>
diff --git a/guava-gwt/test/com/google/common/io/BaseEncodingTest_gwt.java b/guava-gwt/test/com/google/common/io/BaseEncodingTest_gwt.java
deleted file mode 100644
index 37deb9d..0000000
--- a/guava-gwt/test/com/google/common/io/BaseEncodingTest_gwt.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * 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.io;
-public class BaseEncodingTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.io.testModule";
-}
-public void testAtMostOneSeparator() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testAtMostOneSeparator();
-}
-
-public void testBase16() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase16();
-}
-
-public void testBase16InvalidDecodings() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase16InvalidDecodings();
-}
-
-public void testBase16Offset() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase16Offset();
-}
-
-public void testBase16UpperCaseIsNoOp() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase16UpperCaseIsNoOp();
-}
-
-public void testBase32() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32();
-}
-
-public void testBase32AlternatePadding() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32AlternatePadding();
-}
-
-public void testBase32Hex() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32Hex();
-}
-
-public void testBase32HexInvalidDecodings() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32HexInvalidDecodings();
-}
-
-public void testBase32HexLenientPadding() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32HexLenientPadding();
-}
-
-public void testBase32HexUpperCaseIsNoOp() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32HexUpperCaseIsNoOp();
-}
-
-public void testBase32InvalidDecodings() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32InvalidDecodings();
-}
-
-public void testBase32LenientPadding() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32LenientPadding();
-}
-
-public void testBase32Offset() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32Offset();
-}
-
-public void testBase32UpperCaseIsNoOp() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase32UpperCaseIsNoOp();
-}
-
-public void testBase64() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64();
-}
-
-public void testBase64AlternatePadding() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64AlternatePadding();
-}
-
-public void testBase64CannotLowerCase() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64CannotLowerCase();
-}
-
-public void testBase64CannotUpperCase() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64CannotUpperCase();
-}
-
-public void testBase64InvalidDecodings() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64InvalidDecodings();
-}
-
-public void testBase64LenientPadding() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64LenientPadding();
-}
-
-public void testBase64Offset() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64Offset();
-}
-
-public void testBase64OmitPadding() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testBase64OmitPadding();
-}
-
-public void testSeparatorSameAsPadChar() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testSeparatorSameAsPadChar();
-}
-
-public void testSeparatorsExplicitly() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testSeparatorsExplicitly();
-}
-
-public void testToString() throws Exception {
-  com.google.common.io.BaseEncodingTest testCase = new com.google.common.io.BaseEncodingTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/io/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/io/TestModuleEntryPoint.java
deleted file mode 100644
index e06885a..0000000
--- a/guava-gwt/test/com/google/common/io/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/io/testModule.gwt.xml b/guava-gwt/test/com/google/common/io/testModule.gwt.xml
index 9e58e05..8b66886 100644
--- a/guava-gwt/test/com/google/common/io/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/io/testModule.gwt.xml
@@ -1,19 +1,28 @@
 <?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"/>
    
-  <source path=""/>
-    
   <super-source path="super"/>
    
 </module>
diff --git a/guava-gwt/test/com/google/common/math/BigIntegerMathTest_gwt.java b/guava-gwt/test/com/google/common/math/BigIntegerMathTest_gwt.java
deleted file mode 100644
index 92e2843..0000000
--- a/guava-gwt/test/com/google/common/math/BigIntegerMathTest_gwt.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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.math;
-public class BigIntegerMathTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.math.testModule";
-}
-public void testBinomialOutside() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testBinomialOutside();
-}
-
-public void testBinomialSmall() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testBinomialSmall();
-}
-
-public void testCeilingPowerOfTwo() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testCeilingPowerOfTwo();
-}
-
-public void testCeilingPowerOfTwoNegative() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testCeilingPowerOfTwoNegative();
-}
-
-public void testCeilingPowerOfTwoZero() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testCeilingPowerOfTwoZero();
-}
-
-public void testFactorial() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testFactorial();
-}
-
-public void testFactorial0() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testFactorial0();
-}
-
-public void testFactorialNegative() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testFactorialNegative();
-}
-
-public void testFloorPowerOfTwo() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testFloorPowerOfTwo();
-}
-
-public void testFloorPowerOfTwoNegative() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testFloorPowerOfTwoNegative();
-}
-
-public void testFloorPowerOfTwoZero() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testFloorPowerOfTwoZero();
-}
-
-public void testIsPowerOfTwo() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testIsPowerOfTwo();
-}
-
-public void testLog2Ceiling() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2Ceiling();
-}
-
-public void testLog2Exact() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2Exact();
-}
-
-public void testLog2Floor() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2Floor();
-}
-
-public void testLog2HalfDown() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2HalfDown();
-}
-
-public void testLog2HalfEven() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2HalfEven();
-}
-
-public void testLog2HalfUp() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2HalfUp();
-}
-
-public void testLog2NegativeAlwaysThrows() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2NegativeAlwaysThrows();
-}
-
-public void testLog2ZeroAlwaysThrows() throws Exception {
-  com.google.common.math.BigIntegerMathTest testCase = new com.google.common.math.BigIntegerMathTest();
-  testCase.testLog2ZeroAlwaysThrows();
-}
-}
diff --git a/guava-gwt/test/com/google/common/math/IntMathTest_gwt.java b/guava-gwt/test/com/google/common/math/IntMathTest_gwt.java
deleted file mode 100644
index b77ebd6..0000000
--- a/guava-gwt/test/com/google/common/math/IntMathTest_gwt.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * 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.math;
-public class IntMathTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.math.testModule";
-}
-public void testBinomial() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testBinomial();
-}
-
-public void testBinomialNegative() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testBinomialNegative();
-}
-
-public void testBinomialOutside() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testBinomialOutside();
-}
-
-public void testCeilingPowerOfTwo() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCeilingPowerOfTwo();
-}
-
-public void testCeilingPowerOfTwoNegative() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCeilingPowerOfTwoNegative();
-}
-
-public void testCeilingPowerOfTwoZero() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCeilingPowerOfTwoZero();
-}
-
-public void testCheckedAdd() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCheckedAdd();
-}
-
-public void testCheckedMultiply() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCheckedMultiply();
-}
-
-public void testCheckedPow() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCheckedPow();
-}
-
-public void testCheckedSubtract() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testCheckedSubtract();
-}
-
-public void testConstantsBiggestBinomials() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testConstantsBiggestBinomials();
-}
-
-public void testDivByZeroAlwaysFails() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testDivByZeroAlwaysFails();
-}
-
-public void testDivNonZero() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testDivNonZero();
-}
-
-public void testDivNonZeroExact() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testDivNonZeroExact();
-}
-
-public void testFactorial() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testFactorial();
-}
-
-public void testFactorialNegative() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testFactorialNegative();
-}
-
-public void testFloorPowerOfTwo() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testFloorPowerOfTwo();
-}
-
-public void testFloorPowerOfTwoNegative() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testFloorPowerOfTwoNegative();
-}
-
-public void testFloorPowerOfTwoZero() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testFloorPowerOfTwoZero();
-}
-
-public void testGCD() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testGCD();
-}
-
-public void testGCDNegativePositiveThrows() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testGCDNegativePositiveThrows();
-}
-
-public void testGCDNegativeZeroThrows() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testGCDNegativeZeroThrows();
-}
-
-public void testGCDZero() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testGCDZero();
-}
-
-public void testLessThanBranchFree() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testLessThanBranchFree();
-}
-
-public void testLog2Exact() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testLog2Exact();
-}
-
-public void testLog2MatchesBigInteger() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testLog2MatchesBigInteger();
-}
-
-public void testLog2NegativeAlwaysThrows() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testLog2NegativeAlwaysThrows();
-}
-
-public void testLog2ZeroAlwaysThrows() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testLog2ZeroAlwaysThrows();
-}
-
-public void testMaxSignedPowerOfTwo() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testMaxSignedPowerOfTwo();
-}
-
-public void testMod() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testMod();
-}
-
-public void testModNegativeModulusFails() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testModNegativeModulusFails();
-}
-
-public void testModZeroModulusFails() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testModZeroModulusFails();
-}
-
-public void testZeroDivIsAlwaysZero() throws Exception {
-  com.google.common.math.IntMathTest testCase = new com.google.common.math.IntMathTest();
-  testCase.testZeroDivIsAlwaysZero();
-}
-}
diff --git a/guava-gwt/test/com/google/common/math/LongMathTest_gwt.java b/guava-gwt/test/com/google/common/math/LongMathTest_gwt.java
deleted file mode 100644
index cfc4c15..0000000
--- a/guava-gwt/test/com/google/common/math/LongMathTest_gwt.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.math;
-public class LongMathTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.math.testModule";
-}
-public void testBinomial() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testBinomial();
-}
-
-public void testBinomialNegative() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testBinomialNegative();
-}
-
-public void testBinomialOutside() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testBinomialOutside();
-}
-
-public void testCeilingPowerOfTwo() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testCeilingPowerOfTwo();
-}
-
-public void testCeilingPowerOfTwoNegative() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testCeilingPowerOfTwoNegative();
-}
-
-public void testCeilingPowerOfTwoZero() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testCeilingPowerOfTwoZero();
-}
-
-public void testCheckedMultiply() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testCheckedMultiply();
-}
-
-public void testFloorPowerOfTwo() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testFloorPowerOfTwo();
-}
-
-public void testFloorPowerOfTwoNegative() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testFloorPowerOfTwoNegative();
-}
-
-public void testFloorPowerOfTwoZero() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testFloorPowerOfTwoZero();
-}
-
-public void testGCDExhaustive() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testGCDExhaustive();
-}
-
-public void testLessThanBranchFree() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testLessThanBranchFree();
-}
-
-public void testLog2Exact() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testLog2Exact();
-}
-
-public void testLog2MatchesBigInteger() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testLog2MatchesBigInteger();
-}
-
-public void testLog2NegativeAlwaysThrows() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testLog2NegativeAlwaysThrows();
-}
-
-public void testLog2ZeroAlwaysThrows() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testLog2ZeroAlwaysThrows();
-}
-
-public void testMaxSignedPowerOfTwo() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testMaxSignedPowerOfTwo();
-}
-
-public void testSqrtOfLongIsAtMostFloorSqrtMaxLong() throws Exception {
-  com.google.common.math.LongMathTest testCase = new com.google.common.math.LongMathTest();
-  testCase.testSqrtOfLongIsAtMostFloorSqrtMaxLong();
-}
-}
diff --git a/guava-gwt/test/com/google/common/math/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/math/TestModuleEntryPoint.java
deleted file mode 100644
index 9e6813c..0000000
--- a/guava-gwt/test/com/google/common/math/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/math/testModule.gwt.xml b/guava-gwt/test/com/google/common/math/testModule.gwt.xml
index 76a0c99..af911d9 100644
--- a/guava-gwt/test/com/google/common/math/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/math/testModule.gwt.xml
@@ -1,17 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
 <module>
    
-  <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"/>
-   
   <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"/>
    
diff --git a/guava-gwt/test/com/google/common/net/HostAndPortTest_gwt.java b/guava-gwt/test/com/google/common/net/HostAndPortTest_gwt.java
deleted file mode 100644
index 4c70d40..0000000
--- a/guava-gwt/test/com/google/common/net/HostAndPortTest_gwt.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.net;
-public class HostAndPortTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.net.testModule";
-}
-public void testFromHost() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromHost();
-}
-
-public void testFromParts() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromParts();
-}
-
-public void testFromStringBadDefaultPort() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromStringBadDefaultPort();
-}
-
-public void testFromStringBadPort() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromStringBadPort();
-}
-
-public void testFromStringParseableNonsense() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromStringParseableNonsense();
-}
-
-public void testFromStringUnparseableNonsense() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromStringUnparseableNonsense();
-}
-
-public void testFromStringUnusedDefaultPort() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromStringUnusedDefaultPort();
-}
-
-public void testFromStringWellFormed() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testFromStringWellFormed();
-}
-
-public void testGetPortOrDefault() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testGetPortOrDefault();
-}
-
-public void testHashCodeAndEquals() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testHashCodeAndEquals();
-}
-
-public void testRequireBracketsForIPv6() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testRequireBracketsForIPv6();
-}
-
-public void testSerialization() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testSerialization();
-}
-
-public void testToString() throws Exception {
-  com.google.common.net.HostAndPortTest testCase = new com.google.common.net.HostAndPortTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/net/InternetDomainNameTest_gwt.java b/guava-gwt/test/com/google/common/net/InternetDomainNameTest_gwt.java
deleted file mode 100644
index 2d3e719..0000000
--- a/guava-gwt/test/com/google/common/net/InternetDomainNameTest_gwt.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.net;
-public class InternetDomainNameTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.net.testModule";
-}
-public void testChild() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testChild();
-}
-
-public void testEquality() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testEquality();
-}
-
-public void testInvalid() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testInvalid();
-}
-
-public void testInvalidTopPrivateDomain() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testInvalidTopPrivateDomain();
-}
-
-public void testIsValid() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testIsValid();
-}
-
-public void testParent() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testParent();
-}
-
-public void testParentChild() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testParentChild();
-}
-
-public void testPublicSuffix() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testPublicSuffix();
-}
-
-public void testPublicSuffixExclusion() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testPublicSuffixExclusion();
-}
-
-public void testPublicSuffixMultipleUnders() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testPublicSuffixMultipleUnders();
-}
-
-public void testRegistrySuffix() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testRegistrySuffix();
-}
-
-public void testRegistrySuffixExclusion() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testRegistrySuffixExclusion();
-}
-
-public void testRegistrySuffixMultipleUnders() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testRegistrySuffixMultipleUnders();
-}
-
-public void testToString() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testToString();
-}
-
-public void testTopDomainUnderRegistrySuffix() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testTopDomainUnderRegistrySuffix();
-}
-
-public void testTopPrivateDomain() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testTopPrivateDomain();
-}
-
-public void testUnderPrivateDomain() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testUnderPrivateDomain();
-}
-
-public void testUnderPublicSuffix() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testUnderPublicSuffix();
-}
-
-public void testUnderRegistrySuffix() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testUnderRegistrySuffix();
-}
-
-public void testUnderTopDomainUnderRegistrySuffix() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testUnderTopDomainUnderRegistrySuffix();
-}
-
-public void testValid() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testValid();
-}
-
-public void testValidTopPrivateDomain() throws Exception {
-  com.google.common.net.InternetDomainNameTest testCase = new com.google.common.net.InternetDomainNameTest();
-  testCase.testValidTopPrivateDomain();
-}
-}
diff --git a/guava-gwt/test/com/google/common/net/MediaTypeTest_gwt.java b/guava-gwt/test/com/google/common/net/MediaTypeTest_gwt.java
deleted file mode 100644
index 2333ec6..0000000
--- a/guava-gwt/test/com/google/common/net/MediaTypeTest_gwt.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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.net;
-public class MediaTypeTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.net.testModule";
-}
-public void testCreateApplicationType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreateApplicationType();
-}
-
-public void testCreateAudioType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreateAudioType();
-}
-
-public void testCreateImageType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreateImageType();
-}
-
-public void testCreateTextType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreateTextType();
-}
-
-public void testCreateVideoType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreateVideoType();
-}
-
-public void testCreate_invalidSubtype() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreate_invalidSubtype();
-}
-
-public void testCreate_invalidType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreate_invalidType();
-}
-
-public void testCreate_wildcardTypeDeclaredSubtype() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testCreate_wildcardTypeDeclaredSubtype();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testEquals();
-}
-
-public void testGetCharset() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetCharset();
-}
-
-public void testGetCharset_illegalCharset() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetCharset_illegalCharset();
-}
-
-public void testGetCharset_tooMany() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetCharset_tooMany();
-}
-
-public void testGetCharset_unsupportedCharset() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetCharset_unsupportedCharset();
-}
-
-public void testGetParameters() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetParameters();
-}
-
-public void testGetSubtype() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetSubtype();
-}
-
-public void testGetType() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testGetType();
-}
-
-public void testHasWildcard() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testHasWildcard();
-}
-
-public void testIs() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testIs();
-}
-
-public void testParse_badInput() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testParse_badInput();
-}
-
-public void testParse_empty() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testParse_empty();
-}
-
-public void testToString() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testToString();
-}
-
-public void testWithCharset() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithCharset();
-}
-
-public void testWithParameter() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParameter();
-}
-
-public void testWithParameter_invalidAttribute() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParameter_invalidAttribute();
-}
-
-public void testWithParameters() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParameters();
-}
-
-public void testWithParametersIterable() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParametersIterable();
-}
-
-public void testWithParametersIterable_invalidAttribute() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParametersIterable_invalidAttribute();
-}
-
-public void testWithParametersIterable_nullValue() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParametersIterable_nullValue();
-}
-
-public void testWithParameters_invalidAttribute() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithParameters_invalidAttribute();
-}
-
-public void testWithoutParameters() throws Exception {
-  com.google.common.net.MediaTypeTest testCase = new com.google.common.net.MediaTypeTest();
-  testCase.testWithoutParameters();
-}
-}
diff --git a/guava-gwt/test/com/google/common/net/PercentEscaperTest_gwt.java b/guava-gwt/test/com/google/common/net/PercentEscaperTest_gwt.java
deleted file mode 100644
index 711261c..0000000
--- a/guava-gwt/test/com/google/common/net/PercentEscaperTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.net;
-public class PercentEscaperTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.net.testModule";
-}
-public void testBadArguments_badchars() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testBadArguments_badchars();
-}
-
-public void testBadArguments_null() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testBadArguments_null();
-}
-
-public void testBadArguments_plusforspace() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testBadArguments_plusforspace();
-}
-
-public void testCustomEscaper() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testCustomEscaper();
-}
-
-public void testCustomEscaper_withpercent() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testCustomEscaper_withpercent();
-}
-
-public void testPlusForSpace() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testPlusForSpace();
-}
-
-public void testSimpleEscaper() throws Exception {
-  com.google.common.net.PercentEscaperTest testCase = new com.google.common.net.PercentEscaperTest();
-  testCase.testSimpleEscaper();
-}
-}
diff --git a/guava-gwt/test/com/google/common/net/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/net/TestModuleEntryPoint.java
deleted file mode 100644
index d7237aa..0000000
--- a/guava-gwt/test/com/google/common/net/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/net/UrlEscapersTest_gwt.java b/guava-gwt/test/com/google/common/net/UrlEscapersTest_gwt.java
deleted file mode 100644
index 599fe15..0000000
--- a/guava-gwt/test/com/google/common/net/UrlEscapersTest_gwt.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.net;
-public class UrlEscapersTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.net.testModule";
-}
-public void testUrlFormParameterEscaper() throws Exception {
-  com.google.common.net.UrlEscapersTest testCase = new com.google.common.net.UrlEscapersTest();
-  testCase.testUrlFormParameterEscaper();
-}
-
-public void testUrlFragmentEscaper() throws Exception {
-  com.google.common.net.UrlEscapersTest testCase = new com.google.common.net.UrlEscapersTest();
-  testCase.testUrlFragmentEscaper();
-}
-
-public void testUrlPathSegmentEscaper() throws Exception {
-  com.google.common.net.UrlEscapersTest testCase = new com.google.common.net.UrlEscapersTest();
-  testCase.testUrlPathSegmentEscaper();
-}
-}
diff --git a/guava-gwt/test/com/google/common/net/testModule.gwt.xml b/guava-gwt/test/com/google/common/net/testModule.gwt.xml
index a42cced..d0ae466 100644
--- a/guava-gwt/test/com/google/common/net/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/net/testModule.gwt.xml
@@ -1,21 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <module>
    
-  <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"/>
-   
   <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"/>
    
diff --git a/guava-gwt/test/com/google/common/primitives/BooleansTest_gwt.java b/guava-gwt/test/com/google/common/primitives/BooleansTest_gwt.java
deleted file mode 100644
index 63a86e5..0000000
--- a/guava-gwt/test/com/google/common/primitives/BooleansTest_gwt.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * 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.primitives;
-public class BooleansTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListContains() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListContains();
-}
-
-public void testAsListEquals() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListEquals();
-}
-
-public void testAsListHashcode() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListHashcode();
-}
-
-public void testAsListIndexOf() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListIndexOf();
-}
-
-public void testAsListIsEmpty() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListIsEmpty();
-}
-
-public void testAsListLastIndexOf() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListLastIndexOf();
-}
-
-public void testAsListSet() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListSet();
-}
-
-public void testAsListSize() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListSize();
-}
-
-public void testAsListToString() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testAsListToString();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testConcat();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testContains();
-}
-
-public void testCountTrue() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testCountTrue();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testFalseFirst() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testFalseFirst();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrays() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testIndexOf_arrays();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testJoin();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testReverseIndexed();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testToArray_withNull();
-}
-
-public void testTrueFirst() throws Exception {
-  com.google.common.primitives.BooleansTest testCase = new com.google.common.primitives.BooleansTest();
-  testCase.testTrueFirst();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/BytesTest_gwt.java b/guava-gwt/test/com/google/common/primitives/BytesTest_gwt.java
deleted file mode 100644
index a3628c8..0000000
--- a/guava-gwt/test/com/google/common/primitives/BytesTest_gwt.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.primitives;
-public class BytesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testConcat();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testLastIndexOf();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testReverseIndexed();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withConversion() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testToArray_withConversion();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.BytesTest testCase = new com.google.common.primitives.BytesTest();
-  testCase.testToArray_withNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/CharsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/CharsTest_gwt.java
deleted file mode 100644
index 61e144c..0000000
--- a/guava-gwt/test/com/google/common/primitives/CharsTest_gwt.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * 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.primitives;
-public class CharsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testCheckedCast() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testCheckedCast();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testConcat();
-}
-
-public void testConstrainToRange() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testConstrainToRange();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testJoin();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testReverseIndexed();
-}
-
-public void testSaturatedCast() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testSaturatedCast();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.CharsTest testCase = new com.google.common.primitives.CharsTest();
-  testCase.testToArray_withNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/DoublesTest_gwt.java b/guava-gwt/test/com/google/common/primitives/DoublesTest_gwt.java
deleted file mode 100644
index fab1668..0000000
--- a/guava-gwt/test/com/google/common/primitives/DoublesTest_gwt.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.primitives;
-public class DoublesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testConcat();
-}
-
-public void testConstrainToRange() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testConstrainToRange();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testIsFinite() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testIsFinite();
-}
-
-public void testJoinNonTrivialDoubles() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testJoinNonTrivialDoubles();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testMin_noArgs();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testReverseIndexed();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testStringConverter_convert() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testStringConverter_convert();
-}
-
-public void testStringConverter_convertError() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testStringConverter_convertError();
-}
-
-public void testStringConverter_nullConversions() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testStringConverter_nullConversions();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withConversion() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testToArray_withConversion();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.DoublesTest testCase = new com.google.common.primitives.DoublesTest();
-  testCase.testToArray_withNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/FloatsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/FloatsTest_gwt.java
deleted file mode 100644
index ad24cec..0000000
--- a/guava-gwt/test/com/google/common/primitives/FloatsTest_gwt.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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.primitives;
-public class FloatsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testConcat();
-}
-
-public void testConstrainToRange() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testConstrainToRange();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testIsFinite() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testIsFinite();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testReverseIndexed();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testStringConverter_convertError() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testStringConverter_convertError();
-}
-
-public void testStringConverter_nullConversions() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testStringConverter_nullConversions();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withConversion() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testToArray_withConversion();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.FloatsTest testCase = new com.google.common.primitives.FloatsTest();
-  testCase.testToArray_withNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/ImmutableDoubleArrayTest_gwt.java b/guava-gwt/test/com/google/common/primitives/ImmutableDoubleArrayTest_gwt.java
deleted file mode 100644
index f7b0919..0000000
--- a/guava-gwt/test/com/google/common/primitives/ImmutableDoubleArrayTest_gwt.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * 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.primitives;
-public class ImmutableDoubleArrayTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testBuilder_bruteForce() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testBuilder_bruteForce();
-}
-
-public void testBuilder_presize_negative() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testBuilder_presize_negative();
-}
-
-public void testBuilder_presize_zero() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testBuilder_presize_zero();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testContains();
-}
-
-public void testCopyOf_array_empty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_array_empty();
-}
-
-public void testCopyOf_array_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_array_nonempty();
-}
-
-public void testCopyOf_collection_empty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_collection_nonempty();
-}
-
-public void testCopyOf_iterable_collection_empty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_iterable_collection_empty();
-}
-
-public void testCopyOf_iterable_collection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_iterable_collection_nonempty();
-}
-
-public void testCopyOf_iterable_notCollection_empty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_iterable_notCollection_empty();
-}
-
-public void testCopyOf_iterable_notCollection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_iterable_notCollection_nonempty();
-}
-
-public void testCopyOf_stream() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testCopyOf_stream();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testEquals();
-}
-
-public void testForEach() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testForEach();
-}
-
-public void testGet_bad() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testGet_bad();
-}
-
-public void testGet_good() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testGet_good();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_specialValues() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testIndexOf_specialValues();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testIsEmpty();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLength() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testLength();
-}
-
-public void testOf0() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf0();
-}
-
-public void testOf1() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf1();
-}
-
-public void testOf2() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf2();
-}
-
-public void testOf3() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf3();
-}
-
-public void testOf4() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf4();
-}
-
-public void testOf5() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf5();
-}
-
-public void testOf6() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf6();
-}
-
-public void testOf7() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testOf7();
-}
-
-public void testStream() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testStream();
-}
-
-public void testSubArray() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testSubArray();
-}
-
-public void testTrimmed() throws Exception {
-  com.google.common.primitives.ImmutableDoubleArrayTest testCase = new com.google.common.primitives.ImmutableDoubleArrayTest();
-  testCase.testTrimmed();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/ImmutableIntArrayTest_gwt.java b/guava-gwt/test/com/google/common/primitives/ImmutableIntArrayTest_gwt.java
deleted file mode 100644
index 7a1df90..0000000
--- a/guava-gwt/test/com/google/common/primitives/ImmutableIntArrayTest_gwt.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.primitives;
-public class ImmutableIntArrayTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testBuilder_bruteForce() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testBuilder_bruteForce();
-}
-
-public void testBuilder_presize_negative() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testBuilder_presize_negative();
-}
-
-public void testBuilder_presize_zero() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testBuilder_presize_zero();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testContains();
-}
-
-public void testCopyOf_array_empty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_array_empty();
-}
-
-public void testCopyOf_array_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_array_nonempty();
-}
-
-public void testCopyOf_collection_empty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_collection_nonempty();
-}
-
-public void testCopyOf_iterable_collection_empty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_iterable_collection_empty();
-}
-
-public void testCopyOf_iterable_collection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_iterable_collection_nonempty();
-}
-
-public void testCopyOf_iterable_notCollection_empty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_iterable_notCollection_empty();
-}
-
-public void testCopyOf_iterable_notCollection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_iterable_notCollection_nonempty();
-}
-
-public void testCopyOf_stream() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testCopyOf_stream();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testEquals();
-}
-
-public void testForEach() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testForEach();
-}
-
-public void testGet_bad() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testGet_bad();
-}
-
-public void testGet_good() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testGet_good();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testIndexOf();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testIsEmpty();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLength() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testLength();
-}
-
-public void testOf0() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf0();
-}
-
-public void testOf1() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf1();
-}
-
-public void testOf2() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf2();
-}
-
-public void testOf3() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf3();
-}
-
-public void testOf4() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf4();
-}
-
-public void testOf5() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf5();
-}
-
-public void testOf6() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf6();
-}
-
-public void testOf7() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testOf7();
-}
-
-public void testStream() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testStream();
-}
-
-public void testSubArray() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testSubArray();
-}
-
-public void testTrimmed() throws Exception {
-  com.google.common.primitives.ImmutableIntArrayTest testCase = new com.google.common.primitives.ImmutableIntArrayTest();
-  testCase.testTrimmed();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/ImmutableLongArrayTest_gwt.java b/guava-gwt/test/com/google/common/primitives/ImmutableLongArrayTest_gwt.java
deleted file mode 100644
index 0abd8b4..0000000
--- a/guava-gwt/test/com/google/common/primitives/ImmutableLongArrayTest_gwt.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * 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.primitives;
-public class ImmutableLongArrayTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testBuilder_bruteForce() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testBuilder_bruteForce();
-}
-
-public void testBuilder_presize_negative() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testBuilder_presize_negative();
-}
-
-public void testBuilder_presize_zero() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testBuilder_presize_zero();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testContains();
-}
-
-public void testCopyOf_array_empty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_array_empty();
-}
-
-public void testCopyOf_array_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_array_nonempty();
-}
-
-public void testCopyOf_collection_empty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_collection_empty();
-}
-
-public void testCopyOf_collection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_collection_nonempty();
-}
-
-public void testCopyOf_iterable_collection_empty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_iterable_collection_empty();
-}
-
-public void testCopyOf_iterable_collection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_iterable_collection_nonempty();
-}
-
-public void testCopyOf_iterable_notCollection_empty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_iterable_notCollection_empty();
-}
-
-public void testCopyOf_iterable_notCollection_nonempty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_iterable_notCollection_nonempty();
-}
-
-public void testCopyOf_stream() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testCopyOf_stream();
-}
-
-public void testEquals() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testEquals();
-}
-
-public void testForEach() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testForEach();
-}
-
-public void testGet_bad() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testGet_bad();
-}
-
-public void testGet_good() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testGet_good();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testIndexOf();
-}
-
-public void testIsEmpty() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testIsEmpty();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLength() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testLength();
-}
-
-public void testOf0() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf0();
-}
-
-public void testOf1() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf1();
-}
-
-public void testOf2() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf2();
-}
-
-public void testOf3() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf3();
-}
-
-public void testOf4() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf4();
-}
-
-public void testOf5() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf5();
-}
-
-public void testOf6() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf6();
-}
-
-public void testOf7() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testOf7();
-}
-
-public void testStream() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testStream();
-}
-
-public void testSubArray() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testSubArray();
-}
-
-public void testTrimmed() throws Exception {
-  com.google.common.primitives.ImmutableLongArrayTest testCase = new com.google.common.primitives.ImmutableLongArrayTest();
-  testCase.testTrimmed();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/IntsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/IntsTest_gwt.java
deleted file mode 100644
index 47f3f8b..0000000
--- a/guava-gwt/test/com/google/common/primitives/IntsTest_gwt.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * 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.primitives;
-public class IntsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testByteArrayRoundTrips() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testByteArrayRoundTrips();
-}
-
-public void testCheckedCast() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testCheckedCast();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testConcat();
-}
-
-public void testConstrainToRange() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testConstrainToRange();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testFromByteArray() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testFromByteArray();
-}
-
-public void testFromByteArrayFails() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testFromByteArrayFails();
-}
-
-public void testFromBytes() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testFromBytes();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testJoin();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testReverseIndexed();
-}
-
-public void testSaturatedCast() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testSaturatedCast();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testStringConverter_convert() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testStringConverter_convert();
-}
-
-public void testStringConverter_convertError() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testStringConverter_convertError();
-}
-
-public void testStringConverter_nullConversions() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testStringConverter_nullConversions();
-}
-
-public void testStringConverter_reverse() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testStringConverter_reverse();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withConversion() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testToArray_withConversion();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testToArray_withNull();
-}
-
-public void testToByteArray() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testToByteArray();
-}
-
-public void testTryParse() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testTryParse();
-}
-
-public void testTryParse_radix() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testTryParse_radix();
-}
-
-public void testTryParse_radixTooBig() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testTryParse_radixTooBig();
-}
-
-public void testTryParse_radixTooSmall() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testTryParse_radixTooSmall();
-}
-
-public void testTryParse_withNullGwt() throws Exception {
-  com.google.common.primitives.IntsTest testCase = new com.google.common.primitives.IntsTest();
-  testCase.testTryParse_withNullGwt();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/LongsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/LongsTest_gwt.java
deleted file mode 100644
index 37284a6..0000000
--- a/guava-gwt/test/com/google/common/primitives/LongsTest_gwt.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * 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.primitives;
-public class LongsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testByteArrayRoundTrips() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testByteArrayRoundTrips();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testConcat();
-}
-
-public void testConstrainToRange() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testConstrainToRange();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testFromByteArray() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testFromByteArray();
-}
-
-public void testFromByteArrayFails() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testFromByteArrayFails();
-}
-
-public void testFromBytes() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testFromBytes();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testJoin();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testReverseIndexed();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testStringConverter_convert() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testStringConverter_convert();
-}
-
-public void testStringConverter_convertError() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testStringConverter_convertError();
-}
-
-public void testStringConverter_nullConversions() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testStringConverter_nullConversions();
-}
-
-public void testStringConverter_reverse() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testStringConverter_reverse();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withConversion() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testToArray_withConversion();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testToArray_withNull();
-}
-
-public void testToByteArray() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testToByteArray();
-}
-
-public void testTryParse() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testTryParse();
-}
-
-public void testTryParse_radix() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testTryParse_radix();
-}
-
-public void testTryParse_radixTooBig() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testTryParse_radixTooBig();
-}
-
-public void testTryParse_radixTooSmall() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testTryParse_radixTooSmall();
-}
-
-public void testTryParse_withNullGwt() throws Exception {
-  com.google.common.primitives.LongsTest testCase = new com.google.common.primitives.LongsTest();
-  testCase.testTryParse_withNullGwt();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/ShortsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/ShortsTest_gwt.java
deleted file mode 100644
index ac62282..0000000
--- a/guava-gwt/test/com/google/common/primitives/ShortsTest_gwt.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * 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.primitives;
-public class ShortsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsListEmpty() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testAsListEmpty();
-}
-
-public void testAsList_isAView() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testAsList_isAView();
-}
-
-public void testAsList_subList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testAsList_subList_toArray_roundTrip();
-}
-
-public void testAsList_toArray_roundTrip() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testAsList_toArray_roundTrip();
-}
-
-public void testCheckedCast() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testCheckedCast();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testCompare();
-}
-
-public void testConcat() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testConcat();
-}
-
-public void testConstrainToRange() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testConstrainToRange();
-}
-
-public void testContains() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testContains();
-}
-
-public void testEnsureCapacity() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testEnsureCapacity();
-}
-
-public void testEnsureCapacity_fail() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testEnsureCapacity_fail();
-}
-
-public void testHashCode() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testHashCode();
-}
-
-public void testIndexOf() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testIndexOf();
-}
-
-public void testIndexOf_arrayTarget() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testIndexOf_arrayTarget();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testJoin();
-}
-
-public void testLastIndexOf() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testLastIndexOf();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testReverse() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testReverse();
-}
-
-public void testReverseIndexed() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testReverseIndexed();
-}
-
-public void testSaturatedCast() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testSaturatedCast();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testStringConverter_convert() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testStringConverter_convert();
-}
-
-public void testStringConverter_convertError() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testStringConverter_convertError();
-}
-
-public void testStringConverter_nullConversions() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testStringConverter_nullConversions();
-}
-
-public void testStringConverter_reverse() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testStringConverter_reverse();
-}
-
-public void testToArray() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testToArray();
-}
-
-public void testToArray_threadSafe() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testToArray_threadSafe();
-}
-
-public void testToArray_withConversion() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testToArray_withConversion();
-}
-
-public void testToArray_withNull() throws Exception {
-  com.google.common.primitives.ShortsTest testCase = new com.google.common.primitives.ShortsTest();
-  testCase.testToArray_withNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/SignedBytesTest_gwt.java b/guava-gwt/test/com/google/common/primitives/SignedBytesTest_gwt.java
deleted file mode 100644
index bdc1fb1..0000000
--- a/guava-gwt/test/com/google/common/primitives/SignedBytesTest_gwt.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.primitives;
-public class SignedBytesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testCheckedCast() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testCheckedCast();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testCompare();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testJoin();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testMin_noArgs();
-}
-
-public void testSaturatedCast() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testSaturatedCast();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.SignedBytesTest testCase = new com.google.common.primitives.SignedBytesTest();
-  testCase.testSortDescendingIndexed();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/primitives/TestModuleEntryPoint.java
deleted file mode 100644
index b1daa47..0000000
--- a/guava-gwt/test/com/google/common/primitives/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/primitives/UnsignedIntsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/UnsignedIntsTest_gwt.java
deleted file mode 100644
index 2231161..0000000
--- a/guava-gwt/test/com/google/common/primitives/UnsignedIntsTest_gwt.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.primitives;
-public class UnsignedIntsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testCheckedCast() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testCheckedCast();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testCompare();
-}
-
-public void testDecodeInt() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testDecodeInt();
-}
-
-public void testDecodeIntFails() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testDecodeIntFails();
-}
-
-public void testDivide() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testDivide();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testJoin();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testParseInt() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testParseInt();
-}
-
-public void testParseIntFail() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testParseIntFail();
-}
-
-public void testParseIntThrowsExceptionForInvalidRadix() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testParseIntThrowsExceptionForInvalidRadix();
-}
-
-public void testParseIntWithRadix() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testParseIntWithRadix();
-}
-
-public void testParseIntWithRadixLimits() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testParseIntWithRadixLimits();
-}
-
-public void testRemainder() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testRemainder();
-}
-
-public void testSaturatedCast() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testSaturatedCast();
-}
-
-public void testSort() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testSort();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testSortIndexed() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testSortIndexed();
-}
-
-public void testToLong() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testToLong();
-}
-
-public void testToString() throws Exception {
-  com.google.common.primitives.UnsignedIntsTest testCase = new com.google.common.primitives.UnsignedIntsTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/UnsignedLongTest_gwt.java b/guava-gwt/test/com/google/common/primitives/UnsignedLongTest_gwt.java
deleted file mode 100644
index 64003d0..0000000
--- a/guava-gwt/test/com/google/common/primitives/UnsignedLongTest_gwt.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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.primitives;
-public class UnsignedLongTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testAsUnsignedAndLongValueAreInverses() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testAsUnsignedAndLongValueAreInverses();
-}
-
-public void testAsUnsignedBigIntegerValue() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testAsUnsignedBigIntegerValue();
-}
-
-public void testCompare() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testCompare();
-}
-
-public void testDivideByZeroThrows() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testDivideByZeroThrows();
-}
-
-public void testDividedBy() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testDividedBy();
-}
-
-public void testDoubleValue() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testDoubleValue();
-}
-
-public void testFloatValue() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testFloatValue();
-}
-
-public void testIntValue() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testIntValue();
-}
-
-public void testMinus() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testMinus();
-}
-
-public void testMod() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testMod();
-}
-
-public void testModByZero() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testModByZero();
-}
-
-public void testPlus() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testPlus();
-}
-
-public void testTimes() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testTimes();
-}
-
-public void testToString() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testToString();
-}
-
-public void testToStringRadixQuick() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testToStringRadixQuick();
-}
-
-public void testValueOfBigInteger() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testValueOfBigInteger();
-}
-
-public void testValueOfLong() throws Exception {
-  com.google.common.primitives.UnsignedLongTest testCase = new com.google.common.primitives.UnsignedLongTest();
-  testCase.testValueOfLong();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/UnsignedLongsTest_gwt.java b/guava-gwt/test/com/google/common/primitives/UnsignedLongsTest_gwt.java
deleted file mode 100644
index def8102..0000000
--- a/guava-gwt/test/com/google/common/primitives/UnsignedLongsTest_gwt.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.primitives;
-public class UnsignedLongsTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.primitives.testModule";
-}
-public void testCompare() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testCompare();
-}
-
-public void testDecodeLong() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testDecodeLong();
-}
-
-public void testDecodeLongFails() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testDecodeLongFails();
-}
-
-public void testDivide() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testDivide();
-}
-
-public void testJoin() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testJoin();
-}
-
-public void testLexicographicalComparator() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testLexicographicalComparator();
-}
-
-public void testMax() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testMax();
-}
-
-public void testMax_noArgs() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testMax_noArgs();
-}
-
-public void testMin() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testMin();
-}
-
-public void testMin_noArgs() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testMin_noArgs();
-}
-
-public void testParseLong() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testParseLong();
-}
-
-public void testParseLongEmptyString() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testParseLongEmptyString();
-}
-
-public void testParseLongFails() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testParseLongFails();
-}
-
-public void testParseLongThrowsExceptionForInvalidRadix() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testParseLongThrowsExceptionForInvalidRadix();
-}
-
-public void testParseLongWithRadix() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testParseLongWithRadix();
-}
-
-public void testParseLongWithRadixLimits() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testParseLongWithRadixLimits();
-}
-
-public void testRemainder() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testRemainder();
-}
-
-public void testSort() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testSort();
-}
-
-public void testSortDescending() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testSortDescending();
-}
-
-public void testSortDescendingIndexed() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testSortDescendingIndexed();
-}
-
-public void testSortIndexed() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testSortIndexed();
-}
-
-public void testToString() throws Exception {
-  com.google.common.primitives.UnsignedLongsTest testCase = new com.google.common.primitives.UnsignedLongsTest();
-  testCase.testToString();
-}
-}
diff --git a/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml b/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml
index 935d3bd..e37c58f 100644
--- a/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml
@@ -1,15 +1,21 @@
 <?xml version="1.0" encoding="utf-8"?>
 <module>
    
-  <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"/>
-   
   <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"/>
    
diff --git a/guava-gwt/test/com/google/common/testing/EqualsTesterTest_gwt.java b/guava-gwt/test/com/google/common/testing/EqualsTesterTest_gwt.java
deleted file mode 100644
index 1c1fade..0000000
--- a/guava-gwt/test/com/google/common/testing/EqualsTesterTest_gwt.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * 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.testing;
-public class EqualsTesterTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.testing.testModule";
-}
-public void testAddEqualObjectWithOArgConstructor() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testAddEqualObjectWithOArgConstructor();
-}
-
-public void testAddNullEqualObject() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testAddNullEqualObject();
-}
-
-public void testAddNullReference() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testAddNullReference();
-}
-
-public void testAddTwoEqualObjectsAtOnceWithNull() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testAddTwoEqualObjectsAtOnceWithNull();
-}
-
-public void testEqualityGroups() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testEqualityGroups();
-}
-
-public void testInvalidEqualsIncompatibleClass() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testInvalidEqualsIncompatibleClass();
-}
-
-public void testInvalidEqualsNull() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testInvalidEqualsNull();
-}
-
-public void testInvalidHashCode() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testInvalidHashCode();
-}
-
-public void testInvalidNotEqualsEqualObject() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testInvalidNotEqualsEqualObject();
-}
-
-public void testNonreflexiveEquals() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testNonreflexiveEquals();
-}
-
-public void testNullEqualityGroup() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testNullEqualityGroup();
-}
-
-public void testNullObjectInEqualityGroup() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testNullObjectInEqualityGroup();
-}
-
-public void testSymmetryBroken() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testSymmetryBroken();
-}
-
-public void testTestEqualsEmptyLists() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testTestEqualsEmptyLists();
-}
-
-public void testTestEqualsEqualsObjects() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testTestEqualsEqualsObjects();
-}
-
-public void testTransitivityBrokenAcrossEqualityGroups() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testTransitivityBrokenAcrossEqualityGroups();
-}
-
-public void testTransitivityBrokenInEqualityGroup() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testTransitivityBrokenInEqualityGroup();
-}
-
-public void testUnequalObjectsInEqualityGroup() throws Exception {
-  com.google.common.testing.EqualsTesterTest testCase = new com.google.common.testing.EqualsTesterTest();
-  testCase.setUp();
-  testCase.testUnequalObjectsInEqualityGroup();
-}
-}
diff --git a/guava-gwt/test/com/google/common/testing/EquivalenceTesterTest_gwt.java b/guava-gwt/test/com/google/common/testing/EquivalenceTesterTest_gwt.java
deleted file mode 100644
index 8f2edef..0000000
--- a/guava-gwt/test/com/google/common/testing/EquivalenceTesterTest_gwt.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.testing;
-public class EquivalenceTesterTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.testing.testModule";
-}
-public void testOf_NullPointerException() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testOf_NullPointerException();
-}
-
-public void testTest() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testTest();
-}
-
-public void testTest_NoData() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testTest_NoData();
-}
-
-public void testTest_hash() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testTest_hash();
-}
-
-public void testTest_inequivalence() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testTest_inequivalence();
-}
-
-public void testTest_symmetric() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testTest_symmetric();
-}
-
-public void testTest_trasitive() throws Exception {
-  com.google.common.testing.EquivalenceTesterTest testCase = new com.google.common.testing.EquivalenceTesterTest();
-  testCase.setUp();
-  testCase.testTest_trasitive();
-}
-}
diff --git a/guava-gwt/test/com/google/common/testing/FakeTickerTest_gwt.java b/guava-gwt/test/com/google/common/testing/FakeTickerTest_gwt.java
deleted file mode 100644
index d5705af..0000000
--- a/guava-gwt/test/com/google/common/testing/FakeTickerTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.testing;
-public class FakeTickerTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.testing.testModule";
-}
-public void testAdvance() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAdvance();
-}
-
-public void testAutoIncrementStep_millis() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAutoIncrementStep_millis();
-}
-
-public void testAutoIncrementStep_nanos() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAutoIncrementStep_nanos();
-}
-
-public void testAutoIncrementStep_resetToZero() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAutoIncrementStep_resetToZero();
-}
-
-public void testAutoIncrementStep_returnsSameInstance() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAutoIncrementStep_returnsSameInstance();
-}
-
-public void testAutoIncrementStep_seconds() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAutoIncrementStep_seconds();
-}
-
-public void testAutoIncrement_negative() throws Exception {
-  com.google.common.testing.FakeTickerTest testCase = new com.google.common.testing.FakeTickerTest();
-  testCase.testAutoIncrement_negative();
-}
-}
diff --git a/guava-gwt/test/com/google/common/testing/TearDownStackTest_gwt.java b/guava-gwt/test/com/google/common/testing/TearDownStackTest_gwt.java
deleted file mode 100644
index 1f4eb6b..0000000
--- a/guava-gwt/test/com/google/common/testing/TearDownStackTest_gwt.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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.testing;
-public class TearDownStackTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.testing.testModule";
-}
-public void testMultipleTearDownsHappenInOrder() throws Exception {
-  com.google.common.testing.TearDownStackTest testCase = new com.google.common.testing.TearDownStackTest();
-  Throwable failure = null;
-  try {
-    testCase.testMultipleTearDownsHappenInOrder();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSingleTearDown() throws Exception {
-  com.google.common.testing.TearDownStackTest testCase = new com.google.common.testing.TearDownStackTest();
-  Throwable failure = null;
-  try {
-    testCase.testSingleTearDown();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testThrowingTearDown() throws Exception {
-  com.google.common.testing.TearDownStackTest testCase = new com.google.common.testing.TearDownStackTest();
-  Throwable failure = null;
-  try {
-    testCase.testThrowingTearDown();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-}
diff --git a/guava-gwt/test/com/google/common/testing/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/testing/TestModuleEntryPoint.java
deleted file mode 100644
index ed6e199..0000000
--- a/guava-gwt/test/com/google/common/testing/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.testing;
-
-import com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
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 f9089db..9929e53 100644
--- a/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
@@ -14,10 +14,15 @@
   <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"/>
    
+  <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"/>
+    
 </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
index c3cea41..ed7645b 100644
--- a/guava-gwt/test/com/google/common/testing/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/testing/testModule.gwt.xml
@@ -1,15 +1,20 @@
 <?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"/>
    
-  <source path=""/>
-    
   <super-source path="super"/>
    
 </module>
diff --git a/guava-gwt/test/com/google/common/util/concurrent/AtomicLongMapTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/AtomicLongMapTest_gwt.java
deleted file mode 100644
index d6ff5ad..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/AtomicLongMapTest_gwt.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * 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.util.concurrent;
-public class AtomicLongMapTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testAddAndGet() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testAddAndGet();
-}
-
-public void testAddAndGet_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testAddAndGet_zero();
-}
-
-public void testClear() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testClear();
-}
-
-public void testCreate_map() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testCreate_map();
-}
-
-public void testDecrementAndGet() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testDecrementAndGet();
-}
-
-public void testDecrementAndGet_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testDecrementAndGet_zero();
-}
-
-public void testEmpty() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testEmpty();
-}
-
-public void testGetAndAdd() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testGetAndAdd();
-}
-
-public void testGetAndAdd_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testGetAndAdd_zero();
-}
-
-public void testGetAndDecrement() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testGetAndDecrement();
-}
-
-public void testGetAndDecrement_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testGetAndDecrement_zero();
-}
-
-public void testGetAndIncrement() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testGetAndIncrement();
-}
-
-public void testGetAndIncrement_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testGetAndIncrement_zero();
-}
-
-public void testIncrementAndGet() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testIncrementAndGet();
-}
-
-public void testIncrementAndGet_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testIncrementAndGet_zero();
-}
-
-public void testPut() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testPut();
-}
-
-public void testPutAll() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testPutAll();
-}
-
-public void testPutIfAbsent() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testPutIfAbsent();
-}
-
-public void testPutIfAbsent_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testPutIfAbsent_zero();
-}
-
-public void testPut_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testPut_zero();
-}
-
-public void testRemove() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testRemove();
-}
-
-public void testRemoveIfZero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testRemoveIfZero();
-}
-
-public void testRemoveValue() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testRemoveValue();
-}
-
-public void testRemoveValue_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testRemoveValue_zero();
-}
-
-public void testRemoveZeros() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testRemoveZeros();
-}
-
-public void testRemove_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testRemove_zero();
-}
-
-public void testReplace() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testReplace();
-}
-
-public void testReplace_zero() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testReplace_zero();
-}
-
-public void testSerialization() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testSerialization();
-}
-
-public void testSum() throws Exception {
-  com.google.common.util.concurrent.AtomicLongMapTest testCase = new com.google.common.util.concurrent.AtomicLongMapTest();
-  testCase.testSum();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/CallablesTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/CallablesTest_gwt.java
deleted file mode 100644
index f055cf3..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/CallablesTest_gwt.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.util.concurrent;
-public class CallablesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testReturning() throws Exception {
-  com.google.common.util.concurrent.CallablesTest testCase = new com.google.common.util.concurrent.CallablesTest();
-  testCase.testReturning();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/FluentFutureTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/FluentFutureTest_gwt.java
deleted file mode 100644
index 865d749..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/FluentFutureTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.util.concurrent;
-public class FluentFutureTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testAddCallback() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testAddCallback();
-}
-
-public void testCatching() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testCatching();
-}
-
-public void testCatchingAsync() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testCatchingAsync();
-}
-
-public void testFromFluentFuture() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testFromFluentFuture();
-}
-
-public void testFromNonFluentFuture() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testFromNonFluentFuture();
-}
-
-public void testTransform() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testTransform();
-}
-
-public void testTransformAsync() throws Exception {
-  com.google.common.util.concurrent.FluentFutureTest testCase = new com.google.common.util.concurrent.FluentFutureTest();
-  testCase.testTransformAsync();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/FutureCallbackTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/FutureCallbackTest_gwt.java
deleted file mode 100644
index e960766..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/FutureCallbackTest_gwt.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.util.concurrent;
-public class FutureCallbackTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testCancel() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testCancel();
-}
-
-public void testExecutorSuccess() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testExecutorSuccess();
-}
-
-public void testRuntimeExeceptionFromGet() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testRuntimeExeceptionFromGet();
-}
-
-public void testSameThreadExecutionException() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testSameThreadExecutionException();
-}
-
-public void testSameThreadSuccess() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testSameThreadSuccess();
-}
-
-public void testThrowErrorFromGet() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testThrowErrorFromGet();
-}
-
-public void testWildcardFuture() throws Exception {
-  com.google.common.util.concurrent.FutureCallbackTest testCase = new com.google.common.util.concurrent.FutureCallbackTest();
-  testCase.testWildcardFuture();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/FuturesGetDoneTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/FuturesGetDoneTest_gwt.java
deleted file mode 100644
index 97ed812..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/FuturesGetDoneTest_gwt.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.util.concurrent;
-public class FuturesGetDoneTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testCancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesGetDoneTest testCase = new com.google.common.util.concurrent.FuturesGetDoneTest();
-  testCase.testCancelled();
-}
-
-public void testFailed() throws Exception {
-  com.google.common.util.concurrent.FuturesGetDoneTest testCase = new com.google.common.util.concurrent.FuturesGetDoneTest();
-  testCase.testFailed();
-}
-
-public void testPending() throws Exception {
-  com.google.common.util.concurrent.FuturesGetDoneTest testCase = new com.google.common.util.concurrent.FuturesGetDoneTest();
-  testCase.testPending();
-}
-
-public void testSuccessful() throws Exception {
-  com.google.common.util.concurrent.FuturesGetDoneTest testCase = new com.google.common.util.concurrent.FuturesGetDoneTest();
-  testCase.testSuccessful();
-}
-
-public void testSuccessfulNull() throws Exception {
-  com.google.common.util.concurrent.FuturesGetDoneTest testCase = new com.google.common.util.concurrent.FuturesGetDoneTest();
-  testCase.testSuccessfulNull();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/FuturesGetUncheckedTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/FuturesGetUncheckedTest_gwt.java
deleted file mode 100644
index 1b201d8..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/FuturesGetUncheckedTest_gwt.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.util.concurrent;
-public class FuturesGetUncheckedTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testGetUnchecked_Error() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_Error();
-}
-
-public void testGetUnchecked_ExecutionExceptionChecked() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_ExecutionExceptionChecked();
-}
-
-public void testGetUnchecked_ExecutionExceptionError() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_ExecutionExceptionError();
-}
-
-public void testGetUnchecked_ExecutionExceptionOtherThrowable() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_ExecutionExceptionOtherThrowable();
-}
-
-public void testGetUnchecked_ExecutionExceptionUnchecked() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_ExecutionExceptionUnchecked();
-}
-
-public void testGetUnchecked_RuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_RuntimeException();
-}
-
-public void testGetUnchecked_cancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_cancelled();
-}
-
-public void testGetUnchecked_success() throws Exception {
-  com.google.common.util.concurrent.FuturesGetUncheckedTest testCase = new com.google.common.util.concurrent.FuturesGetUncheckedTest();
-  testCase.testGetUnchecked_success();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/FuturesTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/FuturesTest_gwt.java
deleted file mode 100644
index dacbfa1..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/FuturesTest_gwt.java
+++ /dev/null
@@ -1,3071 +0,0 @@
-/*
- * 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.util.concurrent;
-public class FuturesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testAllAsList() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_cancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_cancelled();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_doneFutures() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_doneFutures();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_emptyArray() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_emptyArray();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_emptyList() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_emptyList();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_error() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_error();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_failure() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_failure();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_immediateFailure() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_immediateFailure();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_error() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_error();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_exception() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_exception();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_multipleExceptions_alreadyDone() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_multipleExceptions_alreadyDone();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_multipleExceptions_doneLater() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_multipleExceptions_doneLater();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_same_cause() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_same_cause();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_same_exception() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_same_exception();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_seenExceptionUpdateCancelRace() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_seenExceptionUpdateCancelRace();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_logging_seenExceptionUpdateRace() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_logging_seenExceptionUpdateRace();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_resultCancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_resultCancelled();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_resultCancelledInterrupted_withSecondaryListFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_resultCancelledInterrupted_withSecondaryListFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_resultCancelled_withSecondaryListFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_resultCancelled_withSecondaryListFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_resultInterrupted() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_resultInterrupted();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testAllAsList_singleFailure() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testAllAsList_singleFailure();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCancellingADelegatePropagates() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCancellingADelegatePropagates();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCancellingAllDelegatesIsNotQuadratic() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCancellingAllDelegatesIsNotQuadratic();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_ErrorAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_ErrorAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_ExceptionAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_ExceptionAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_Throwable() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_Throwable();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_fallbackGeneratesCheckedException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_fallbackGeneratesCheckedException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_fallbackGeneratesError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_fallbackGeneratesError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_fallbackGeneratesRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_fallbackGeneratesRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_fallbackNotReady() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_fallbackNotReady();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_fallbackReturnsCheckedException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_fallbackReturnsCheckedException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_fallbackReturnsRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_fallbackReturnsRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_futureToString() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_futureToString();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_getThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_getThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_getThrowsRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_getThrowsRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_inputDoesNotRaiseException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_inputDoesNotRaiseException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_inputRaisesException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_inputRaisesException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_listenerThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_listenerThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_nullInsteadOfFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_nullInsteadOfFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_rejectionPropagatesToOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_rejectionPropagatesToOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_resultCancelledBeforeFallback() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_resultCancelledBeforeFallback();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatchingAsync_resultInterruptedBeforeFallback() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatchingAsync_resultInterruptedBeforeFallback();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_ErrorAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_ErrorAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_ExceptionAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_ExceptionAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_Throwable() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_Throwable();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_fallbackGeneratesError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_fallbackGeneratesError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_fallbackGeneratesRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_fallbackGeneratesRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_getThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_getThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_getThrowsRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_getThrowsRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_inputDoesNotRaiseException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_inputDoesNotRaiseException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_inputRaisesException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_inputRaisesException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_listenerThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_listenerThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_rejectionPropagatesToOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_rejectionPropagatesToOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_resultCancelledBeforeFallback() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_resultCancelledBeforeFallback();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCatching_resultInterruptedBeforeFallback() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCatching_resultInterruptedBeforeFallback();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCompletionOrder() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCompletionOrder();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCompletionOrderExceptionThrown() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCompletionOrderExceptionThrown();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCompletionOrderFutureCancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCompletionOrderFutureCancelled();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCompletionOrderFutureInterruption() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCompletionOrderFutureInterruption();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testCompletionOrderMixedBagOTypes() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testCompletionOrderMixedBagOTypes();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testImmediateCancelledFutureBasic() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testImmediateCancelledFutureBasic();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testImmediateFailedFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testImmediateFailedFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testImmediateFailedFuture_cancellationException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testImmediateFailedFuture_cancellationException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testImmediateFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testImmediateFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testNonCancellationPropagating_delegateCancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testNonCancellationPropagating_delegateCancelled();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testNonCancellationPropagating_doesNotPropagate() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testNonCancellationPropagating_doesNotPropagate();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testNonCancellationPropagating_failure() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testNonCancellationPropagating_failure();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testNonCancellationPropagating_successful() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testNonCancellationPropagating_successful();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSubmitAsync_asyncCallable_error() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSubmitAsync_asyncCallable_error();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSubmitAsync_asyncCallable_nullInsteadOfFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSubmitAsync_asyncCallable_nullInsteadOfFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_cancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_cancelled();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_emptyArray() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_emptyArray();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_emptyList() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_emptyList();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_logging_error() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_logging_error();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_logging_exception() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_logging_exception();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_mixed() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_mixed();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_partialFailure() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_partialFailure();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_resultCancelled() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_resultCancelled();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_resultCancelledRacingInputDone() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_resultCancelledRacingInputDone();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_resultInterrupted() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_resultInterrupted();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testSuccessfulAsList_totalFailure() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testSuccessfulAsList_totalFailure();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_ErrorAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_ErrorAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_ExceptionAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_ExceptionAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_asyncFunction_error() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_asyncFunction_error();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_asyncFunction_nullInsteadOfFuture() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_asyncFunction_nullInsteadOfFuture();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_cancelPropagatesToAsyncOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_cancelPropagatesToAsyncOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_cancelPropagatesToInput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_cancelPropagatesToInput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_genericsHierarchy_AsyncFunction() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_genericsHierarchy_AsyncFunction();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_genericsWildcard_AsyncFunction() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_genericsWildcard_AsyncFunction();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_getThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_getThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_getThrowsRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_getThrowsRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_inputCancelButNotInterruptPropagatesToOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_inputCancelButNotInterruptPropagatesToOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_interruptPropagatesToAsyncOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_interruptPropagatesToAsyncOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_interruptPropagatesToInput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_interruptPropagatesToInput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_listenerThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_listenerThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformAsync_rejectionPropagatesToOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformAsync_rejectionPropagatesToOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransformValueRemainsMemoized() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransformValueRemainsMemoized();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_ErrorAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_ErrorAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_ExceptionAfterCancellation() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_ExceptionAfterCancellation();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_Executor() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_Executor();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_genericsHierarchy() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_genericsHierarchy();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_genericsNull() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_genericsNull();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_getThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_getThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_getThrowsRuntimeException() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_getThrowsRuntimeException();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_listenerThrowsError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_listenerThrowsError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testTransform_rejectionPropagatesToOutput() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testTransform_rejectionPropagatesToOutput();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testWhenAllComplete_asyncError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testWhenAllComplete_asyncError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testWhenAllComplete_asyncResult() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testWhenAllComplete_asyncResult();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testWhenAllComplete_runnableError() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testWhenAllComplete_runnableError();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testWhenAllComplete_runnableResult() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testWhenAllComplete_runnableResult();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testWhenAllComplete_wildcard() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testWhenAllComplete_wildcard();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-
-public void testWhenAllSucceed() throws Exception {
-  com.google.common.util.concurrent.FuturesTest testCase = new com.google.common.util.concurrent.FuturesTest();
-  testCase.setUp();
-  Throwable failure = null;
-  try {
-    testCase.testWhenAllSucceed();
-  } catch (Throwable t) {
-    failure = t;
-  }
-  try {
-    testCase.tearDown();
-  } catch (Throwable t) {
-    if (failure == null) {
-      failure = t;
-    }
-  }
-  if (failure instanceof Exception) {
-    throw (Exception) failure;
-  }
-  if (failure instanceof Error) {
-    throw (Error) failure;
-  }
-  if (failure != null) {
-    throw new RuntimeException(failure);
-  }
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/RunnablesTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/RunnablesTest_gwt.java
deleted file mode 100644
index b85e39b..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/RunnablesTest_gwt.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.util.concurrent;
-public class RunnablesTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testDoNothingRunnableIsSingleton() throws Exception {
-  com.google.common.util.concurrent.RunnablesTest testCase = new com.google.common.util.concurrent.RunnablesTest();
-  testCase.testDoNothingRunnableIsSingleton();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/util/concurrent/TestModuleEntryPoint.java
deleted file mode 100644
index 7ed9721..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/TrustedInputFutureTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/TrustedInputFutureTest_gwt.java
deleted file mode 100644
index c3a31b3..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/TrustedInputFutureTest_gwt.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * 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.util.concurrent;
-public class TrustedInputFutureTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testCanceled() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testCanceled();
-}
-
-public void testFailed() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testFailed();
-}
-
-public void testInterrupted() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testInterrupted();
-}
-
-public void testListenLaterCancelled() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterCancelled();
-}
-
-public void testListenLaterFailed() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterFailed();
-}
-
-public void testListenLaterInterrupted() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterInterrupted();
-}
-
-public void testListenLaterSetAsynchronously() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronously();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateCancelled() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateCancelled();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateFailed() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateFailed();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateInterrupted() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateInterrupted();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateSuccessful() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateSuccessful();
-}
-
-public void testListenLaterSetAsynchronouslyLaterSelfCancelled() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterSelfCancelled();
-}
-
-public void testListenLaterSetAsynchronouslyLaterSelfInterrupted() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterSelfInterrupted();
-}
-
-public void testListenLaterSuccessful() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSuccessful();
-}
-
-public void testMisbehavingListenerAlreadyDone() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testMisbehavingListenerAlreadyDone();
-}
-
-public void testMisbehavingListenerLaterDone() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testMisbehavingListenerLaterDone();
-}
-
-public void testNegativeTimeout() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNegativeTimeout();
-}
-
-public void testNullExecutor() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNullExecutor();
-}
-
-public void testNullListener() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNullListener();
-}
-
-public void testNullTimeUnit() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNullTimeUnit();
-}
-
-public void testPending() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testPending();
-}
-
-public void testSetExceptionNull() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetExceptionNull();
-}
-
-public void testSetFutureDelegateAlreadyCancelled() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateAlreadyCancelled();
-}
-
-public void testSetFutureDelegateAlreadyInterrupted() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateAlreadyInterrupted();
-}
-
-public void testSetFutureDelegateAlreadySuccessful() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateAlreadySuccessful();
-}
-
-public void testSetFutureDelegateLaterCancelled() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateLaterCancelled();
-}
-
-public void testSetFutureDelegateLaterInterrupted() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateLaterInterrupted();
-}
-
-public void testSetFutureDelegateLaterSuccessful() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateLaterSuccessful();
-}
-
-public void testSetFutureNull() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureNull();
-}
-
-public void testSetFuturePending() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFuturePending();
-}
-
-public void testSetFutureThenCancel() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureThenCancel();
-}
-
-public void testSetFutureThenInterrupt() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureThenInterrupt();
-}
-
-public void testSetNull() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetNull();
-}
-
-public void testSuccessful() throws Exception {
-  com.google.common.util.concurrent.TrustedInputFutureTest testCase = new com.google.common.util.concurrent.TrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSuccessful();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest_gwt.java
deleted file mode 100644
index f91659d..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/TrustedListenableFutureTaskTest_gwt.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.util.concurrent;
-public class TrustedListenableFutureTaskTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testCancelled() throws Exception {
-  com.google.common.util.concurrent.TrustedListenableFutureTaskTest testCase = new com.google.common.util.concurrent.TrustedListenableFutureTaskTest();
-  testCase.testCancelled();
-}
-
-public void testFailed() throws Exception {
-  com.google.common.util.concurrent.TrustedListenableFutureTaskTest testCase = new com.google.common.util.concurrent.TrustedListenableFutureTaskTest();
-  testCase.testFailed();
-}
-
-public void testSuccessful() throws Exception {
-  com.google.common.util.concurrent.TrustedListenableFutureTaskTest testCase = new com.google.common.util.concurrent.TrustedListenableFutureTaskTest();
-  testCase.testSuccessful();
-}
-}
diff --git a/guava-gwt/test/com/google/common/util/concurrent/UntrustedInputFutureTest_gwt.java b/guava-gwt/test/com/google/common/util/concurrent/UntrustedInputFutureTest_gwt.java
deleted file mode 100644
index 9e2e1d8..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/UntrustedInputFutureTest_gwt.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * 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.util.concurrent;
-public class UntrustedInputFutureTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.util.concurrent.testModule";
-}
-public void testCanceled() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testCanceled();
-}
-
-public void testFailed() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testFailed();
-}
-
-public void testInterrupted() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testInterrupted();
-}
-
-public void testListenLaterCancelled() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterCancelled();
-}
-
-public void testListenLaterFailed() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterFailed();
-}
-
-public void testListenLaterInterrupted() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterInterrupted();
-}
-
-public void testListenLaterSetAsynchronously() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronously();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateCancelled() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateCancelled();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateFailed() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateFailed();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateInterrupted() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateInterrupted();
-}
-
-public void testListenLaterSetAsynchronouslyLaterDelegateSuccessful() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterDelegateSuccessful();
-}
-
-public void testListenLaterSetAsynchronouslyLaterSelfCancelled() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterSelfCancelled();
-}
-
-public void testListenLaterSetAsynchronouslyLaterSelfInterrupted() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSetAsynchronouslyLaterSelfInterrupted();
-}
-
-public void testListenLaterSuccessful() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testListenLaterSuccessful();
-}
-
-public void testMisbehavingListenerAlreadyDone() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testMisbehavingListenerAlreadyDone();
-}
-
-public void testMisbehavingListenerLaterDone() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testMisbehavingListenerLaterDone();
-}
-
-public void testNegativeTimeout() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNegativeTimeout();
-}
-
-public void testNullExecutor() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNullExecutor();
-}
-
-public void testNullListener() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNullListener();
-}
-
-public void testNullTimeUnit() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testNullTimeUnit();
-}
-
-public void testPending() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testPending();
-}
-
-public void testSetExceptionNull() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetExceptionNull();
-}
-
-public void testSetFutureDelegateAlreadyCancelled() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateAlreadyCancelled();
-}
-
-public void testSetFutureDelegateAlreadyInterrupted() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateAlreadyInterrupted();
-}
-
-public void testSetFutureDelegateAlreadySuccessful() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateAlreadySuccessful();
-}
-
-public void testSetFutureDelegateLaterCancelled() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateLaterCancelled();
-}
-
-public void testSetFutureDelegateLaterInterrupted() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateLaterInterrupted();
-}
-
-public void testSetFutureDelegateLaterSuccessful() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureDelegateLaterSuccessful();
-}
-
-public void testSetFutureNull() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureNull();
-}
-
-public void testSetFuturePending() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFuturePending();
-}
-
-public void testSetFutureThenCancel() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureThenCancel();
-}
-
-public void testSetFutureThenInterrupt() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetFutureThenInterrupt();
-}
-
-public void testSetNull() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSetNull();
-}
-
-public void testSuccessful() throws Exception {
-  com.google.common.util.concurrent.UntrustedInputFutureTest testCase = new com.google.common.util.concurrent.UntrustedInputFutureTest();
-  testCase.setUp();
-  testCase.testSuccessful();
-}
-}
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
index 34c94d6..cea4250 100644
--- a/guava-gwt/test/com/google/common/util/concurrent/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/util/concurrent/testModule.gwt.xml
@@ -1,17 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
 <module>
    
-  <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"/>
-   
   <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"/>
    
diff --git a/guava-gwt/test/com/google/common/xml/TestModuleEntryPoint.java b/guava-gwt/test/com/google/common/xml/TestModuleEntryPoint.java
deleted file mode 100644
index b8ba365..0000000
--- a/guava-gwt/test/com/google/common/xml/TestModuleEntryPoint.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2010 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 com.google.gwt.core.client.EntryPoint;
-
-/**
- * A dummy entry point of the test module.
- *
- * @author Hayward Chan
- */
-public class TestModuleEntryPoint implements EntryPoint {
-
-  @Override public void onModuleLoad() {
-  }
-}
diff --git a/guava-gwt/test/com/google/common/xml/XmlEscapersTest_gwt.java b/guava-gwt/test/com/google/common/xml/XmlEscapersTest_gwt.java
deleted file mode 100644
index 7ac54ed..0000000
--- a/guava-gwt/test/com/google/common/xml/XmlEscapersTest_gwt.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.xml;
-public class XmlEscapersTest_gwt extends com.google.gwt.junit.client.GWTTestCase {
-@Override public String getModuleName() {
-  return "com.google.common.xml.testModule";
-}
-public void testXmlAttributeEscaper() throws Exception {
-  com.google.common.xml.XmlEscapersTest testCase = new com.google.common.xml.XmlEscapersTest();
-  testCase.testXmlAttributeEscaper();
-}
-
-public void testXmlContentEscaper() throws Exception {
-  com.google.common.xml.XmlEscapersTest testCase = new com.google.common.xml.XmlEscapersTest();
-  testCase.testXmlContentEscaper();
-}
-}
diff --git a/guava-gwt/test/com/google/common/xml/testModule.gwt.xml b/guava-gwt/test/com/google/common/xml/testModule.gwt.xml
index d377994..7f48ca0 100644
--- a/guava-gwt/test/com/google/common/xml/testModule.gwt.xml
+++ b/guava-gwt/test/com/google/common/xml/testModule.gwt.xml
@@ -1,15 +1,22 @@
 <?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"/>
    
-  <source path=""/>
-    
 </module>
diff --git a/guava-testlib/README.md b/guava-testlib/README.md
new file mode 100644
index 0000000..c33f421
--- /dev/null
+++ b/guava-testlib/README.md
@@ -0,0 +1,51 @@
+# Guava Testlib: Google Testing Libraries for Java
+
+Guava testlib is a set of Java classes for more convenient
+unit testing.
+
+## Adding Guava Testlib to your build
+
+Guava testlib's Maven group ID is `com.google.guava` and its artifact ID is `guava-testlib`.
+
+To add a dependency on Guava testlib using Maven, use the following:
+
+```xml
+<dependency>
+  <groupId>com.google.guava</groupId>
+  <artifactId>guava-testlib</artifactId>
+  <version>30.0-jre</version>
+  <scope>test</scope>
+</dependency>
+```
+
+To add a dependency using Gradle:
+
+```gradle
+dependencies {
+  test 'com.google.guava:guava-testlib:30.0-jre'
+}
+```
+
+## Links
+
+- [GitHub project](https://github.com/google/guava)
+- [Issue tracker: Report a defect or feature request](https://github.com/google/guava/issues/new)
+- [StackOverflow: Ask "how-to" and "why-didn't-it-work" questions](https://stackoverflow.com/questions/ask?tags=guava+java)
+- [guava-discuss: For open-ended questions and discussion](http://groups.google.com/group/guava-discuss)
+
+## IMPORTANT WARNINGS
+
+1. APIs marked with the `@Beta` annotation at the class or method level
+are subject to change. They can be modified in any way, or even
+removed, at any time. If your code is a library itself (i.e. it is
+used on the CLASSPATH of users outside your own control), you should
+not use beta APIs, unless you [repackage] them. **If your
+code is a library, we strongly recommend using the [Guava Beta Checker] to
+ensure that you do not use any `@Beta` APIs!**
+
+[Guava Beta Checker]: https://github.com/google/guava-beta-checker
+
+<!-- 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 81caea0..9411f74 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>27.1-jre</version>
+    <version>30.0-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 c2d9542..cf1ed23 100644
--- a/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
@@ -91,8 +91,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedCollectionFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(SERIALIZABLE);
     derivedFeatures.remove(SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
diff --git a/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java b/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
index af50129..3588e85 100644
--- a/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
+++ b/guava-testlib/src/com/google/common/collect/testing/DerivedCollectionGenerators.java
@@ -375,8 +375,7 @@
 
     @Override
     public SortedSet<E> create(Object... elements) {
-      @SuppressWarnings("unchecked") // set generators must pass SampleElements values
-      List<E> normalValues = (List) Arrays.asList(elements);
+      List<?> normalValues = (List<?>) Arrays.asList(elements);
       List<E> extremeValues = new ArrayList<>();
 
       // nulls are usually out of bounds for a subset, so ban them altogether
@@ -399,12 +398,12 @@
       }
 
       // the regular values should be visible after filtering
-      List<E> allEntries = new ArrayList<>();
+      List<Object> allEntries = new ArrayList<>();
       allEntries.addAll(extremeValues);
       allEntries.addAll(normalValues);
-      SortedSet<E> map = delegate.create(allEntries.toArray());
+      SortedSet<E> set = delegate.create(allEntries.toArray());
 
-      return createSubSet(map, firstExclusive, lastExclusive);
+      return createSubSet(set, firstExclusive, lastExclusive);
     }
 
     /** Calls the smallest subSet overload that filters out the extreme values. */
@@ -474,8 +473,6 @@
 
     @Override
     public SortedMap<K, V> create(Object... entries) {
-      @SuppressWarnings("unchecked") // map generators must past entry objects
-      List<Entry<K, V>> normalValues = (List) Arrays.asList(entries);
       List<Entry<K, V>> extremeValues = new ArrayList<>();
 
       // prepare extreme values to be filtered out of view
@@ -491,12 +488,12 @@
       }
 
       // the regular values should be visible after filtering
-      List<Entry<K, V>> allEntries = new ArrayList<>();
+      List<Entry<?, ?>> allEntries = new ArrayList<>();
       allEntries.addAll(extremeValues);
-      allEntries.addAll(normalValues);
-      SortedMap<K, V> map =
-          (SortedMap<K, V>)
-              delegate.create((Object[]) allEntries.toArray(new Entry<?, ?>[allEntries.size()]));
+      for (Object entry : entries) {
+        allEntries.add((Entry<?, ?>) entry);
+      }
+      SortedMap<K, V> map = (SortedMap<K, V>) delegate.create(allEntries.toArray());
 
       return createSubMap(map, firstExclusive, lastExclusive);
     }
diff --git a/guava-testlib/src/com/google/common/collect/testing/Helpers.java b/guava-testlib/src/com/google/common/collect/testing/Helpers.java
index 5023d39..8efafc3 100644
--- a/guava-testlib/src/com/google/common/collect/testing/Helpers.java
+++ b/guava-testlib/src/com/google/common/collect/testing/Helpers.java
@@ -169,8 +169,7 @@
   }
 
   public static void assertContainsAllOf(Iterable<?> actual, Object... expected) {
-    List<Object> expectedList = new ArrayList<>();
-    expectedList.addAll(Arrays.asList(expected));
+    List<Object> expectedList = new ArrayList<>(Arrays.asList(expected));
 
     for (Object o : actual) {
       expectedList.remove(o);
diff --git a/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java b/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java
index fd1643b..fdc418a 100644
--- a/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/IteratorTester.java
@@ -50,6 +50,36 @@
  * verify() method, which is called <em>after</em> each sequence and is guaranteed to be called
  * using the latest values obtained from {@link IteratorTester#newTargetIterator()}.
  *
+ * <p>The value you pass to the parameter {@code steps} should be greater than the length of your
+ * iterator, so that this class can check that your iterator behaves correctly when it is exhausted.
+ *
+ * <p>For example, to test {@link java.util.Collections#unmodifiableList(java.util.List)
+ * Collections.unmodifiableList}'s iterator:
+ *
+ * <pre>{@code
+ * List<String> expectedElements =
+ *     Arrays.asList("a", "b", "c", "d", "e");
+ * List<String> actualElements =
+ *     Collections.unmodifiableList(
+ *         Arrays.asList("a", "b", "c", "d", "e"));
+ * IteratorTester<String> iteratorTester =
+ *     new IteratorTester<String>(
+ *         6,
+ *         IteratorFeature.UNMODIFIABLE,
+ *         expectedElements,
+ *         IteratorTester.KnownOrder.KNOWN_ORDER) {
+ *       @Override
+ *       protected Iterator<String> newTargetIterator() {
+ *         return actualElements.iterator();
+ *       }
+ *     };
+ * iteratorTester.test();
+ * iteratorTester.testForEachRemaining();
+ * }</pre>
+ *
+ * <p><b>Note</b>: It is necessary to use {@code IteratorTester.KnownOrder} as shown above, rather
+ * than {@code KnownOrder} directly, because otherwise the code cannot be compiled.
+ *
  * @author Kevin Bourrillion
  * @author Chris Povirk
  */
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 8e8d4ba..5355f48 100644
--- a/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
@@ -148,8 +148,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedCollectionFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(SERIALIZABLE);
     derivedFeatures.remove(SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
diff --git a/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java b/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
index c8053b1..b8b5c28 100644
--- a/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
+++ b/guava-testlib/src/com/google/common/collect/testing/MapInterfaceTest.java
@@ -301,10 +301,10 @@
     }
     assertTrue(map.containsKey(map.keySet().iterator().next()));
     if (allowsNullKeys) {
-      map.containsKey(null);
+      boolean unused = map.containsKey(null);
     } else {
       try {
-        map.containsKey(null);
+        boolean unused2 = map.containsKey(null);
       } catch (NullPointerException optional) {
       }
     }
@@ -323,10 +323,10 @@
     assertFalse(map.containsValue(unmappedValue));
     assertTrue(map.containsValue(map.values().iterator().next()));
     if (allowsNullValues) {
-      map.containsValue(null);
+      boolean unused = map.containsValue(null);
     } else {
       try {
-        map.containsKey(null);
+        boolean unused2 = map.containsKey(null);
       } catch (NullPointerException optional) {
       }
     }
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 042ba9d..26a2870 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
@@ -112,8 +112,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedCollectionFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(SERIALIZABLE);
     derivedFeatures.remove(SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
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 ce01adb..e97b08f 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
@@ -86,8 +86,7 @@
     final TestSortedSetGenerator<E> delegate =
         (TestSortedSetGenerator<E>) parentBuilder.getSubjectGenerator().getInnerGenerator();
 
-    List<Feature<?>> features = new ArrayList<>();
-    features.addAll(parentBuilder.getFeatures());
+    List<Feature<?>> features = new ArrayList<>(parentBuilder.getFeatures());
     features.remove(CollectionFeature.ALLOWS_NULL_VALUES);
     features.add(CollectionFeature.SUBSET_VIEW);
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java b/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java
index 6822a27..08c771e 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SpliteratorTester.java
@@ -26,6 +26,7 @@
 import static junit.framework.Assert.fail;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Ordering;
 import com.google.common.primitives.Ints;
 import java.util.ArrayList;
@@ -35,6 +36,7 @@
 import java.util.List;
 import java.util.Spliterator;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Supplier;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -50,6 +52,99 @@
     void inOrder();
   }
 
+  private abstract static class GeneralSpliterator<E> {
+    final Spliterator<E> spliterator;
+
+    GeneralSpliterator(Spliterator<E> spliterator) {
+      this.spliterator = checkNotNull(spliterator);
+    }
+
+    abstract void forEachRemaining(Consumer<? super E> action);
+
+    abstract boolean tryAdvance(Consumer<? super E> action);
+
+    abstract GeneralSpliterator<E> trySplit();
+
+    final int characteristics() {
+      return spliterator.characteristics();
+    }
+
+    final long estimateSize() {
+      return spliterator.estimateSize();
+    }
+
+    final Comparator<? super E> getComparator() {
+      return spliterator.getComparator();
+    }
+
+    final long getExactSizeIfKnown() {
+      return spliterator.getExactSizeIfKnown();
+    }
+
+    final boolean hasCharacteristics(int characteristics) {
+      return spliterator.hasCharacteristics(characteristics);
+    }
+  }
+
+  private static final class GeneralSpliteratorOfObject<E> extends GeneralSpliterator<E> {
+    GeneralSpliteratorOfObject(Spliterator<E> spliterator) {
+      super(spliterator);
+    }
+
+    @Override
+    void forEachRemaining(Consumer<? super E> action) {
+      spliterator.forEachRemaining(action);
+    }
+
+    @Override
+    boolean tryAdvance(Consumer<? super E> action) {
+      return spliterator.tryAdvance(action);
+    }
+
+    @Override
+    GeneralSpliterator<E> trySplit() {
+      Spliterator<E> split = spliterator.trySplit();
+      return split == null ? null : new GeneralSpliteratorOfObject<>(split);
+    }
+  }
+
+  /*
+   * The AndroidJdkLibsChecker violation is informing us that this method isn't usable under
+   * Desugar. But we want to include it here for Nougat+ users -- and, mainly, for non-Android
+   * users. Fortunately, anyone who tries to use it under Desugar will presumably already see errors
+   * from creating the Spliterator.OfInt in the first place. So it's probably OK for us to suppress
+   * this particular violation.
+   */
+  @SuppressWarnings("AndroidJdkLibsChecker")
+  private static final class GeneralSpliteratorOfPrimitive<E, C> extends GeneralSpliterator<E> {
+    final Spliterator.OfPrimitive<E, C, ?> spliterator;
+    final Function<Consumer<? super E>, C> consumerizer;
+
+    GeneralSpliteratorOfPrimitive(
+        Spliterator.OfPrimitive<E, C, ?> spliterator,
+        Function<Consumer<? super E>, C> consumerizer) {
+      super(spliterator);
+      this.spliterator = spliterator;
+      this.consumerizer = consumerizer;
+    }
+
+    @Override
+    void forEachRemaining(Consumer<? super E> action) {
+      spliterator.forEachRemaining(consumerizer.apply(action));
+    }
+
+    @Override
+    boolean tryAdvance(Consumer<? super E> action) {
+      return spliterator.tryAdvance(consumerizer.apply(action));
+    }
+
+    @Override
+    GeneralSpliterator<E> trySplit() {
+      Spliterator.OfPrimitive<E, C, ?> split = spliterator.trySplit();
+      return split == null ? null : new GeneralSpliteratorOfPrimitive<>(split, consumerizer);
+    }
+  }
+
   /**
    * Different ways of decomposing a Spliterator, all of which must produce the same elements (up to
    * ordering, if Spliterator.ORDERED is not present).
@@ -57,13 +152,13 @@
   enum SpliteratorDecompositionStrategy {
     NO_SPLIT_FOR_EACH_REMAINING {
       @Override
-      <E> void forEach(Spliterator<E> spliterator, Consumer<? super E> consumer) {
+      <E> void forEach(GeneralSpliterator<E> spliterator, Consumer<? super E> consumer) {
         spliterator.forEachRemaining(consumer);
       }
     },
     NO_SPLIT_TRY_ADVANCE {
       @Override
-      <E> void forEach(Spliterator<E> spliterator, Consumer<? super E> consumer) {
+      <E> void forEach(GeneralSpliterator<E> spliterator, Consumer<? super E> consumer) {
         while (spliterator.tryAdvance(consumer)) {
           // do nothing
         }
@@ -71,8 +166,8 @@
     },
     MAXIMUM_SPLIT {
       @Override
-      <E> void forEach(Spliterator<E> spliterator, Consumer<? super E> consumer) {
-        for (Spliterator<E> prefix = trySplitTestingSize(spliterator);
+      <E> void forEach(GeneralSpliterator<E> spliterator, Consumer<? super E> consumer) {
+        for (GeneralSpliterator<E> prefix = trySplitTestingSize(spliterator);
             prefix != null;
             prefix = trySplitTestingSize(spliterator)) {
           forEach(prefix, consumer);
@@ -91,9 +186,9 @@
     },
     ALTERNATE_ADVANCE_AND_SPLIT {
       @Override
-      <E> void forEach(Spliterator<E> spliterator, Consumer<? super E> consumer) {
+      <E> void forEach(GeneralSpliterator<E> spliterator, Consumer<? super E> consumer) {
         while (spliterator.tryAdvance(consumer)) {
-          Spliterator<E> prefix = trySplitTestingSize(spliterator);
+          GeneralSpliterator<E> prefix = trySplitTestingSize(spliterator);
           if (prefix != null) {
             forEach(prefix, consumer);
           }
@@ -101,14 +196,14 @@
       }
     };
 
-    abstract <E> void forEach(Spliterator<E> spliterator, Consumer<? super E> consumer);
+    abstract <E> void forEach(GeneralSpliterator<E> spliterator, Consumer<? super E> consumer);
   }
 
-  @Nullable
-  private static <E> Spliterator<E> trySplitTestingSize(Spliterator<E> spliterator) {
+  private static <E> @Nullable GeneralSpliterator<E> trySplitTestingSize(
+      GeneralSpliterator<E> spliterator) {
     boolean subsized = spliterator.hasCharacteristics(Spliterator.SUBSIZED);
     long originalSize = spliterator.estimateSize();
-    Spliterator<E> trySplit = spliterator.trySplit();
+    GeneralSpliterator<E> trySplit = spliterator.trySplit();
     if (spliterator.estimateSize() > originalSize) {
       fail(
           format(
@@ -140,13 +235,42 @@
   }
 
   public static <E> SpliteratorTester<E> of(Supplier<Spliterator<E>> spliteratorSupplier) {
-    return new SpliteratorTester<E>(spliteratorSupplier);
+    return new SpliteratorTester<>(
+        ImmutableSet.of(() -> new GeneralSpliteratorOfObject<>(spliteratorSupplier.get())));
   }
 
-  private final Supplier<Spliterator<E>> spliteratorSupplier;
+  /** @since 28.1 */
+  @SuppressWarnings("AndroidJdkLibsChecker") // see comment on GeneralSpliteratorOfPrimitive
+  public static SpliteratorTester<Integer> ofInt(Supplier<Spliterator.OfInt> spliteratorSupplier) {
+    return new SpliteratorTester<>(
+        ImmutableSet.of(
+            () -> new GeneralSpliteratorOfObject<>(spliteratorSupplier.get()),
+            () -> new GeneralSpliteratorOfPrimitive<>(spliteratorSupplier.get(), c -> c::accept)));
+  }
 
-  private SpliteratorTester(Supplier<Spliterator<E>> spliteratorSupplier) {
-    this.spliteratorSupplier = checkNotNull(spliteratorSupplier);
+  /** @since 28.1 */
+  @SuppressWarnings("AndroidJdkLibsChecker") // see comment on GeneralSpliteratorOfPrimitive
+  public static SpliteratorTester<Long> ofLong(Supplier<Spliterator.OfLong> spliteratorSupplier) {
+    return new SpliteratorTester<>(
+        ImmutableSet.of(
+            () -> new GeneralSpliteratorOfObject<>(spliteratorSupplier.get()),
+            () -> new GeneralSpliteratorOfPrimitive<>(spliteratorSupplier.get(), c -> c::accept)));
+  }
+
+  /** @since 28.1 */
+  @SuppressWarnings("AndroidJdkLibsChecker") // see comment on GeneralSpliteratorOfPrimitive
+  public static SpliteratorTester<Double> ofDouble(
+      Supplier<Spliterator.OfDouble> spliteratorSupplier) {
+    return new SpliteratorTester<>(
+        ImmutableSet.of(
+            () -> new GeneralSpliteratorOfObject<>(spliteratorSupplier.get()),
+            () -> new GeneralSpliteratorOfPrimitive<>(spliteratorSupplier.get(), c -> c::accept)));
+  }
+
+  private final ImmutableSet<Supplier<GeneralSpliterator<E>>> spliteratorSuppliers;
+
+  private SpliteratorTester(ImmutableSet<Supplier<GeneralSpliterator<E>>> spliteratorSuppliers) {
+    this.spliteratorSuppliers = checkNotNull(spliteratorSuppliers);
   }
 
   @SafeVarargs
@@ -156,37 +280,40 @@
 
   public final Ordered expect(Iterable<?> elements) {
     List<List<E>> resultsForAllStrategies = new ArrayList<>();
-    Spliterator<E> spliterator = spliteratorSupplier.get();
-    int characteristics = spliterator.characteristics();
-    long estimatedSize = spliterator.estimateSize();
-    for (SpliteratorDecompositionStrategy strategy :
-        EnumSet.allOf(SpliteratorDecompositionStrategy.class)) {
-      List<E> resultsForStrategy = new ArrayList<>();
-      strategy.forEach(spliteratorSupplier.get(), resultsForStrategy::add);
+    for (Supplier<GeneralSpliterator<E>> spliteratorSupplier : spliteratorSuppliers) {
+      GeneralSpliterator<E> spliterator = spliteratorSupplier.get();
+      int characteristics = spliterator.characteristics();
+      long estimatedSize = spliterator.estimateSize();
+      for (SpliteratorDecompositionStrategy strategy :
+          EnumSet.allOf(SpliteratorDecompositionStrategy.class)) {
+        List<E> resultsForStrategy = new ArrayList<>();
+        strategy.forEach(spliteratorSupplier.get(), resultsForStrategy::add);
 
-      // TODO(cpovirk): better failure messages
-      if ((characteristics & Spliterator.NONNULL) != 0) {
-        assertFalse(resultsForStrategy.contains(null));
-      }
-      if ((characteristics & Spliterator.SORTED) != 0) {
-        Comparator<? super E> comparator = spliterator.getComparator();
-        if (comparator == null) {
-          comparator = (Comparator) Comparator.naturalOrder();
+        // TODO(cpovirk): better failure messages
+        if ((characteristics & Spliterator.NONNULL) != 0) {
+          assertFalse(resultsForStrategy.contains(null));
         }
-        assertTrue(Ordering.from(comparator).isOrdered(resultsForStrategy));
-      }
-      if ((characteristics & Spliterator.SIZED) != 0) {
-        assertEquals(Ints.checkedCast(estimatedSize), resultsForStrategy.size());
-      }
+        if ((characteristics & Spliterator.SORTED) != 0) {
+          Comparator<? super E> comparator = spliterator.getComparator();
+          if (comparator == null) {
+            comparator = (Comparator) Comparator.naturalOrder();
+          }
+          assertTrue(Ordering.from(comparator).isOrdered(resultsForStrategy));
+        }
+        if ((characteristics & Spliterator.SIZED) != 0) {
+          assertEquals(Ints.checkedCast(estimatedSize), resultsForStrategy.size());
+        }
 
-      assertEqualIgnoringOrder(elements, resultsForStrategy);
-      resultsForAllStrategies.add(resultsForStrategy);
+        assertEqualIgnoringOrder(elements, resultsForStrategy);
+        resultsForAllStrategies.add(resultsForStrategy);
+      }
     }
     return new Ordered() {
       @Override
       public void inOrder() {
-        resultsForAllStrategies.forEach(
-            resultsForStrategy -> assertEqualInOrder(elements, resultsForStrategy));
+        for (List<E> resultsForStrategy : resultsForAllStrategies) {
+          assertEqualInOrder(elements, resultsForStrategy);
+        }
       }
     };
   }
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 c6d51be..9e3d750 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
@@ -89,8 +89,7 @@
   }
 
   private static Set<Feature<?>> computeEntrySetFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(CollectionFeature.GENERAL_PURPOSE);
     derivedFeatures.remove(CollectionFeature.SUPPORTS_ADD);
     derivedFeatures.remove(CollectionFeature.ALLOWS_NULL_VALUES);
@@ -102,8 +101,7 @@
   }
 
   static Set<Feature<?>> computeElementSetFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(CollectionFeature.GENERAL_PURPOSE);
     derivedFeatures.remove(CollectionFeature.SUPPORTS_ADD);
     if (!derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS)) {
@@ -113,8 +111,7 @@
   }
 
   private static Set<Feature<?>> computeReserializedMultisetFeatures(Set<Feature<?>> features) {
-    Set<Feature<?>> derivedFeatures = new HashSet<>();
-    derivedFeatures.addAll(features);
+    Set<Feature<?>> derivedFeatures = new HashSet<>(features);
     derivedFeatures.remove(CollectionFeature.SERIALIZABLE);
     derivedFeatures.remove(CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS);
     return derivedFeatures;
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
index f763dcc..dafd521 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/SortedMultisetTestSuiteBuilder.java
@@ -168,10 +168,10 @@
               public SortedMultiset<E> create(Object... entries) {
                 @SuppressWarnings("unchecked")
                 // we dangerously assume E is a string
-                List<E> extremeValues = (List) getExtremeValues();
+                List<E> extremeValues = (List<E>) getExtremeValues();
                 @SuppressWarnings("unchecked")
                 // map generators must past entry objects
-                List<E> normalValues = (List) Arrays.asList(entries);
+                List<E> normalValues = (List<E>) Arrays.asList(entries);
 
                 // prepare extreme values to be filtered out of view
                 Collections.sort(extremeValues, comparator);
@@ -266,8 +266,7 @@
     final TestMultisetGenerator<E> delegate =
         (TestMultisetGenerator<E>) parentBuilder.getSubjectGenerator();
 
-    Set<Feature<?>> features = new HashSet<>();
-    features.addAll(parentBuilder.getFeatures());
+    Set<Feature<?>> features = new HashSet<>(parentBuilder.getFeatures());
     features.remove(SERIALIZABLE);
     features.remove(SERIALIZABLE_INCLUDING_VIEWS);
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
index 89e0662..b170497 100644
--- a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionIteratorTester.java
@@ -19,9 +19,11 @@
 import static com.google.common.collect.testing.Helpers.mapEntry;
 import static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
 import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
+import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
 import static com.google.common.collect.testing.features.CollectionFeature.KNOWN_ORDER;
 import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
+import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.testing.AbstractCollectionTester;
@@ -66,6 +68,17 @@
     assertEquals("Different ordered iteration", expected, iteratorElements);
   }
 
+  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
+  @CollectionSize.Require(absent = ZERO)
+  public void testIterator_nullElement() {
+    initCollectionWithNullElement();
+    List<E> iteratorElements = new ArrayList<E>();
+    for (E element : collection) { // uses iterator()
+      iteratorElements.add(element);
+    }
+    Helpers.assertEqualIgnoringOrder(asList(createArrayWithNullElement()), iteratorElements);
+  }
+
   @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
   @CollectionSize.Require(absent = ZERO)
   public void testIterator_removeAffectsBackingCollection() {
diff --git a/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java b/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
index 19eda63..f38c52e 100644
--- a/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
+++ b/guava-testlib/src/com/google/common/testing/ArbitraryInstances.java
@@ -127,6 +127,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import java.util.UUID;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -214,6 +215,7 @@
           .put(OptionalInt.class, OptionalInt.empty())
           .put(OptionalLong.class, OptionalLong.empty())
           .put(OptionalDouble.class, OptionalDouble.empty())
+          .put(UUID.class, UUID.randomUUID())
           // common.base
           .put(CharMatcher.class, CharMatcher.none())
           .put(Joiner.class, Joiner.on(','))
@@ -334,8 +336,7 @@
   }
 
   @SuppressWarnings("unchecked") // it's a subtype map
-  @Nullable
-  private static <T> Class<? extends T> getImplementation(Class<T> type) {
+  private static <T> @Nullable Class<? extends T> getImplementation(Class<T> type) {
     return (Class<? extends T>) implementations.get(type);
   }
 
@@ -345,8 +346,7 @@
    * Returns an arbitrary instance for {@code type}, or {@code null} if no arbitrary instance can be
    * determined.
    */
-  @Nullable
-  public static <T> T get(Class<T> type) {
+  public static <T> @Nullable T get(Class<T> type) {
     T defaultValue = DEFAULTS.getInstance(type);
     if (defaultValue != null) {
       return defaultValue;
@@ -381,7 +381,14 @@
     constructor.setAccessible(true); // accessibility check is too slow
     try {
       return constructor.newInstance();
-    } catch (InstantiationException | IllegalAccessException impossible) {
+      /*
+       * Do not merge the 2 catch blocks below. javac would infer a type of
+       * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
+       * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
+       */
+    } catch (InstantiationException impossible) {
+      throw new AssertionError(impossible);
+    } catch (IllegalAccessException impossible) {
       throw new AssertionError(impossible);
     } catch (InvocationTargetException e) {
       logger.log(Level.WARNING, "Exception while invoking default constructor.", e.getCause());
@@ -389,8 +396,7 @@
     }
   }
 
-  @Nullable
-  private static <T> T arbitraryConstantInstanceOrNull(Class<T> type) {
+  private static <T> @Nullable T arbitraryConstantInstanceOrNull(Class<T> type) {
     Field[] fields = type.getDeclaredFields();
     Arrays.sort(fields, BY_FIELD_NAME);
     for (Field field : fields) {
diff --git a/guava-testlib/src/com/google/common/testing/ClusterException.java b/guava-testlib/src/com/google/common/testing/ClusterException.java
index 5f50ff8..7665ab1 100644
--- a/guava-testlib/src/com/google/common/testing/ClusterException.java
+++ b/guava-testlib/src/com/google/common/testing/ClusterException.java
@@ -67,8 +67,7 @@
     super(
         exceptions.size() + " exceptions were thrown. The first exception is listed as a cause.",
         exceptions.iterator().next());
-    ArrayList<Throwable> temp = new ArrayList<>();
-    temp.addAll(exceptions);
+    ArrayList<Throwable> temp = new ArrayList<>(exceptions);
     this.exceptions = Collections.unmodifiableCollection(temp);
   }
 
diff --git a/guava-testlib/src/com/google/common/testing/EqualsTester.java b/guava-testlib/src/com/google/common/testing/EqualsTester.java
index dc2d197..2c8e08b 100644
--- a/guava-testlib/src/com/google/common/testing/EqualsTester.java
+++ b/guava-testlib/src/com/google/common/testing/EqualsTester.java
@@ -127,6 +127,11 @@
           "the Object#hashCode of " + item + " must be consistent",
           item.hashCode(),
           item.hashCode());
+      if (!(item instanceof String)) {
+        assertTrue(
+            item + " must not be Object#equals to its Object#toString representation",
+            !item.equals(item.toString()));
+      }
     }
   }
 
diff --git a/guava-testlib/src/com/google/common/testing/FakeTicker.java b/guava-testlib/src/com/google/common/testing/FakeTicker.java
index 698db6a..cc18e65 100644
--- a/guava-testlib/src/com/google/common/testing/FakeTicker.java
+++ b/guava-testlib/src/com/google/common/testing/FakeTicker.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Ticker;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -56,6 +57,16 @@
   }
 
   /**
+   * Advances the ticker value by {@code duration}.
+   *
+   * @since 28.0
+   */
+  @GwtIncompatible
+  public FakeTicker advance(java.time.Duration duration) {
+    return advance(duration.toNanos());
+  }
+
+  /**
    * Sets the increment applied to the ticker whenever it is queried.
    *
    * <p>The default behavior is to auto increment by zero. i.e: The ticker is left unchanged when
@@ -68,6 +79,19 @@
     return this;
   }
 
+  /**
+   * Sets the increment applied to the ticker whenever it is queried.
+   *
+   * <p>The default behavior is to auto increment by zero. i.e: The ticker is left unchanged when
+   * queried.
+   *
+   * @since 28.0
+   */
+  @GwtIncompatible
+  public FakeTicker setAutoIncrementStep(java.time.Duration autoIncrementStep) {
+    return setAutoIncrementStep(autoIncrementStep.toNanos(), TimeUnit.NANOSECONDS);
+  }
+
   @Override
   public long read() {
     return nanos.getAndAdd(autoIncrementStepNanos);
diff --git a/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java b/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
index af0131d..a2fe93a 100644
--- a/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
+++ b/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
@@ -179,8 +179,7 @@
    *   <li>null if no value can be generated.
    * </ul>
    */
-  @Nullable
-  final Object generateFresh(TypeToken<?> type) {
+  final @Nullable Object generateFresh(TypeToken<?> type) {
     Object generated = generate(type);
     if (generated != null) {
       freshness.incrementAndGet();
@@ -188,8 +187,7 @@
     return generated;
   }
 
-  @Nullable
-  final <T> T generateFresh(Class<T> type) {
+  final <T> @Nullable T generateFresh(Class<T> type) {
     return Primitives.wrap(type).cast(generateFresh(TypeToken.of(type)));
   }
 
@@ -512,7 +510,14 @@
       @SuppressWarnings("unchecked") // getAvailableCurrencies() returns Set<Currency>.
       Set<Currency> currencies = (Set<Currency>) method.invoke(null);
       return pickInstance(currencies, Currency.getInstance(Locale.US));
-    } catch (NoSuchMethodException | InvocationTargetException notJava7) {
+      /*
+       * Do not merge the 2 catch blocks below. javac would infer a type of
+       * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
+       * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
+       */
+    } catch (NoSuchMethodException notJava7) {
+      return preJava7FreshCurrency();
+    } catch (InvocationTargetException notJava7) {
       return preJava7FreshCurrency();
     } catch (IllegalAccessException impossible) {
       throw new AssertionError(impossible);
diff --git a/guava-testlib/src/com/google/common/testing/GcFinalization.java b/guava-testlib/src/com/google/common/testing/GcFinalization.java
index 92394f1..015afea 100644
--- a/guava-testlib/src/com/google/common/testing/GcFinalization.java
+++ b/guava-testlib/src/com/google/common/testing/GcFinalization.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.j2objc.annotations.J2ObjCIncompatible;
 import java.lang.ref.WeakReference;
 import java.util.Locale;
@@ -241,6 +242,7 @@
    *   <li>enqueuing weak references to unreachable referents in their reference queue
    * </ul>
    */
+  @DoNotMock("Implement with a lambda")
   public interface FinalizationPredicate {
     boolean isDone();
   }
diff --git a/guava-testlib/src/com/google/common/testing/TearDownAccepter.java b/guava-testlib/src/com/google/common/testing/TearDownAccepter.java
index a1d1f00..bad1f19 100644
--- a/guava-testlib/src/com/google/common/testing/TearDownAccepter.java
+++ b/guava-testlib/src/com/google/common/testing/TearDownAccepter.java
@@ -17,6 +17,7 @@
 package com.google.common.testing;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.common.annotations.GwtCompatible;
 
 /**
@@ -26,6 +27,7 @@
  * @since 10.0
  */
 @Beta
+@DoNotMock("Implement with a lambda")
 @GwtCompatible
 public interface TearDownAccepter {
   /**
diff --git a/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractCheckedFutureTest.java b/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractCheckedFutureTest.java
deleted file mode 100644
index 5c2ce32..0000000
--- a/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractCheckedFutureTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2007 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.testing;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.GwtIncompatible;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Test case to make sure the {@link CheckedFuture#checkedGet()} and {@link
- * CheckedFuture#checkedGet(long, TimeUnit)} methods work correctly.
- *
- * @author Sven Mawson
- * @since 10.0
- */
-@Beta
-@GwtIncompatible
-public abstract class AbstractCheckedFutureTest extends AbstractListenableFutureTest {
-
-  /** More specific type for the create method. */
-  protected abstract <V> CheckedFuture<V, ?> createCheckedFuture(
-      V value, Exception except, CountDownLatch waitOn);
-
-  /** Checks that the exception is the correct type of cancellation exception. */
-  protected abstract void checkCancelledException(Exception e);
-
-  /** Checks that the exception is the correct type of execution exception. */
-  protected abstract void checkExecutionException(Exception e);
-
-  /** Checks that the exception is the correct type of interruption exception. */
-  protected abstract void checkInterruptedException(Exception e);
-
-  @Override
-  protected <V> ListenableFuture<V> createListenableFuture(
-      V value, Exception except, CountDownLatch waitOn) {
-    return createCheckedFuture(value, except, waitOn);
-  }
-
-  /**
-   * Tests that the {@link CheckedFuture#checkedGet()} method throws the correct type of
-   * cancellation exception when it is cancelled.
-   */
-  public void testCheckedGetThrowsApplicationExceptionOnCancellation() {
-
-    final CheckedFuture<Boolean, ?> future = createCheckedFuture(Boolean.TRUE, null, latch);
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-
-    new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                future.cancel(true);
-              }
-            })
-        .start();
-
-    try {
-      future.checkedGet();
-      fail("RPC Should have been cancelled.");
-    } catch (Exception e) {
-      checkCancelledException(e);
-    }
-
-    assertTrue(future.isDone());
-    assertTrue(future.isCancelled());
-  }
-
-  public void testCheckedGetThrowsApplicationExceptionOnInterruption() throws InterruptedException {
-
-    final CheckedFuture<Boolean, ?> future = createCheckedFuture(Boolean.TRUE, null, latch);
-
-    final CountDownLatch startingGate = new CountDownLatch(1);
-    final CountDownLatch successLatch = new CountDownLatch(1);
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-
-    Thread getThread =
-        new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                startingGate.countDown();
-
-                try {
-                  future.checkedGet();
-                } catch (Exception e) {
-                  checkInterruptedException(e);
-
-                  // This only gets hit if the original call throws an exception and
-                  // the check call above passes.
-                  successLatch.countDown();
-                }
-              }
-            });
-    getThread.start();
-
-    assertTrue(startingGate.await(500, TimeUnit.MILLISECONDS));
-    getThread.interrupt();
-
-    assertTrue(successLatch.await(500, TimeUnit.MILLISECONDS));
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-  }
-
-  public void testCheckedGetThrowsApplicationExceptionOnError() {
-    final CheckedFuture<Boolean, ?> future =
-        createCheckedFuture(Boolean.TRUE, new Exception("Error"), latch);
-
-    assertFalse(future.isDone());
-    assertFalse(future.isCancelled());
-
-    new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                latch.countDown();
-              }
-            })
-        .start();
-
-    try {
-      future.checkedGet();
-      fail();
-    } catch (Exception e) {
-      checkExecutionException(e);
-    }
-
-    assertTrue(future.isDone());
-    assertFalse(future.isCancelled());
-  }
-}
diff --git a/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java b/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java
index 666d726..cb6ba6a 100644
--- a/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java
+++ b/guava-testlib/test/com/google/common/testing/AbstractPackageSanityTestsTest.java
@@ -72,7 +72,7 @@
     assertThat(findClassesToTest(ImmutableList.of(Foo.class))).contains(Foo.class);
   }
 
-  public void testFindClassesToTeset_ignoreUnderscores() {
+  public void testFindClassesToTest_ignoreUnderscores() {
     assertThat(findClassesToTest(ImmutableList.of(Foo.class, Foo_Bar.class)))
         .containsExactly(Foo.class, Foo_Bar.class);
     sanityTests.ignoreClasses(AbstractPackageSanityTests.UNDERSCORE_IN_NAME);
diff --git a/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java b/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
index 2df7dc1..dfd26a0 100644
--- a/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
+++ b/guava-testlib/test/com/google/common/testing/ArbitraryInstancesTest.java
@@ -113,6 +113,7 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.UUID;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentMap;
@@ -171,6 +172,7 @@
     assertEquals(OptionalInt.empty(), ArbitraryInstances.get(OptionalInt.class));
     assertEquals(OptionalLong.empty(), ArbitraryInstances.get(OptionalLong.class));
     assertEquals(OptionalDouble.empty(), ArbitraryInstances.get(OptionalDouble.class));
+    assertNotNull(ArbitraryInstances.get(UUID.class));
   }
 
   public void testGet_collections() {
diff --git a/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java b/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
index 16798a1..c5db2d5 100644
--- a/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/ClassSanityTesterTest.java
@@ -289,8 +289,7 @@
   }
 
   public static class FactoryThatReturnsNullAndAnnotated {
-    @Nullable
-    public static Object bad() {
+    public static @Nullable Object bad() {
       return null;
     }
   }
@@ -759,8 +758,7 @@
 
     // keep trying
     @SuppressWarnings("unused")
-    @Nullable
-    public static GoodEquals createMayReturnNull(int a, int b) {
+    public static @Nullable GoodEquals createMayReturnNull(int a, int b) {
       return null;
     }
 
@@ -1191,8 +1189,7 @@
   static class FactoryMethodReturnsNullAndAnnotated {
     private FactoryMethodReturnsNullAndAnnotated() {}
 
-    @Nullable
-    public static FactoryMethodReturnsNullAndAnnotated returnsNull() {
+    public static @Nullable FactoryMethodReturnsNullAndAnnotated returnsNull() {
       return null;
     }
   }
diff --git a/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java b/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java
index b992f1b..d615af6 100644
--- a/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/EqualsTesterTest.java
@@ -272,6 +272,15 @@
         .testEquals();
   }
 
+  public void testEqualityBasedOnToString() {
+    try {
+      new EqualsTester().addEqualityGroup(new EqualsBasedOnToString("foo")).testEquals();
+      fail();
+    } catch (AssertionFailedError e) {
+      assertTrue(e.getMessage().contains("toString representation"));
+    }
+  }
+
   private static void assertErrorMessage(Throwable e, String message) {
     // TODO(kevinb): use a Truth assertion here
     if (!e.getMessage().contains(message)) {
@@ -422,4 +431,27 @@
       return name;
     }
   }
+
+  private static final class EqualsBasedOnToString {
+    private final String s;
+
+    private EqualsBasedOnToString(String s) {
+      this.s = s;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      return obj != null && obj.toString().equals(toString());
+    }
+
+    @Override
+    public int hashCode() {
+      return s.hashCode();
+    }
+
+    @Override
+    public String toString() {
+      return s;
+    }
+  }
 }
diff --git a/guava-testlib/test/com/google/common/testing/FakeTickerTest.java b/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
index 5c00832..09e4a31 100644
--- a/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
+++ b/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
@@ -41,6 +41,7 @@
     tester.testAllPublicInstanceMethods(new FakeTicker());
   }
 
+  @GwtIncompatible // java.time.Duration
   public void testAdvance() {
     FakeTicker ticker = new FakeTicker();
     assertEquals(0, ticker.read());
@@ -48,6 +49,8 @@
     assertEquals(10, ticker.read());
     ticker.advance(1, TimeUnit.MILLISECONDS);
     assertEquals(1000010L, ticker.read());
+    ticker.advance(java.time.Duration.ofMillis(1));
+    assertEquals(2000010L, ticker.read());
   }
 
   public void testAutoIncrementStep_returnsSameInstance() {
@@ -76,6 +79,14 @@
     assertEquals(6000000000L, ticker.read());
   }
 
+  @GwtIncompatible // java.time.Duration
+  public void testAutoIncrementStep_duration() {
+    FakeTicker ticker = new FakeTicker().setAutoIncrementStep(java.time.Duration.ofMillis(1));
+    assertEquals(0, ticker.read());
+    assertEquals(1000000, ticker.read());
+    assertEquals(2000000, ticker.read());
+  }
+
   public void testAutoIncrementStep_resetToZero() {
     FakeTicker ticker = new FakeTicker().setAutoIncrementStep(10, TimeUnit.NANOSECONDS);
     assertEquals(0, ticker.read());
diff --git a/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java b/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
index f232c5b..3c7bf31 100644
--- a/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
@@ -392,21 +392,25 @@
     }
 
     /** Two-arg method with no Nullable params. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void normalNormal(String first, Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the second param Nullable. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void normalNullable(String first, @Nullable Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the first param Nullable. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void nullableNormal(@Nullable String first, Integer second) {
       reactToNullParameters(first, second);
     }
 
     /** Two-arg method with the both params Nullable. */
+    @SuppressWarnings("GoodTime") // false positive; b/122617528
     public void nullableNullable(@Nullable String first, @Nullable Integer second) {
       reactToNullParameters(first, second);
     }
diff --git a/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java b/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java
index 24d75b9..43fc75c 100644
--- a/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/cache/ChainBenchmark.java
@@ -35,6 +35,7 @@
   private ReferenceEntry<Object, Object> head;
   private ReferenceEntry<Object, Object> chain;
 
+  @SuppressWarnings("GuardedBy")
   @BeforeExperiment
   void setUp() {
     LocalCache<Object, Object> cache =
@@ -43,6 +44,8 @@
     chain = null;
     for (int i = 0; i < length; i++) {
       Object key = new Object();
+      // TODO(b/145386688): This access should be guarded by 'this.segment', which is not currently
+      // held
       chain = segment.newEntry(key, cache.hash(key), chain);
       if (i == 0) {
         head = chain;
@@ -50,10 +53,13 @@
     }
   }
 
+  @SuppressWarnings("GuardedBy")
   @Benchmark
   int time(int reps) {
     int dummy = 0;
     for (int i = 0; i < reps; i++) {
+      // TODO(b/145386688): This access should be guarded by 'this.segment', which is not currently
+      // held
       segment.removeEntryFromChain(chain, head);
       dummy += segment.count;
     }
diff --git a/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java b/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java
index 5b82f83..a473d75 100644
--- a/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/cache/SegmentBenchmark.java
@@ -50,11 +50,14 @@
     checkState(segment.table.length() == capacity);
   }
 
+  @SuppressWarnings("GuardedBy")
   @Benchmark
   int time(int reps) {
     int dummy = 0;
     AtomicReferenceArray<ReferenceEntry<Object, Object>> oldTable = segment.table;
     for (int i = 0; i < reps; i++) {
+      // TODO(b/145386688): This access should be guarded by 'this.segment', which is not currently
+      // held
       segment.expand();
       segment.table = oldTable;
       dummy += segment.count;
diff --git a/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java b/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
index fb8a26e..f10b94e 100644
--- a/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/collect/MapBenchmark.java
@@ -26,7 +26,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 
@@ -224,12 +223,24 @@
   }
 
   @Benchmark
+  boolean createPopulateAndRemove(int reps) {
+    boolean dummy = false;
+    for (int i = 1; i < reps; i++) {
+      Map<Element, Element> map = impl.create(values);
+      for (Element value : values) {
+        dummy |= map.remove(value) == null;
+      }
+    }
+    return dummy;
+  }
+
+  @Benchmark
   boolean iterateWithEntrySet(int reps) {
     Map<Element, Element> map = mapToTest;
 
     boolean dummy = false;
     for (int i = 0; i < reps; i++) {
-      for (Entry<Element, Element> entry : map.entrySet()) {
+      for (Map.Entry<Element, Element> entry : map.entrySet()) {
         dummy ^= entry.getKey() != entry.getValue();
       }
     }
diff --git a/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java b/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java
index e8616ee..be387f7 100644
--- a/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/math/BigIntegerMathRoundingBenchmark.java
@@ -88,4 +88,14 @@
     }
     return tmp;
   }
+
+  @Benchmark
+  long roundToDouble(int reps) {
+    long tmp = 0;
+    for (int i = 0; i < reps; i++) {
+      int j = i & ARRAY_MASK;
+      tmp += Double.doubleToRawLongBits(BigIntegerMath.roundToDouble(nonzero1[j], mode));
+    }
+    return tmp;
+  }
 }
diff --git a/guava-tests/pom.xml b/guava-tests/pom.xml
index be3c775..bff476b 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>27.1-jre</version>
+    <version>30.0-jre</version>
   </parent>
   <artifactId>guava-tests</artifactId>
   <name>Guava Unit Tests</name>
diff --git a/guava-tests/test/com/google/common/base/CharMatcherTest.java b/guava-tests/test/com/google/common/base/CharMatcherTest.java
index db56260..5412882 100644
--- a/guava-tests/test/com/google/common/base/CharMatcherTest.java
+++ b/guava-tests/test/com/google/common/base/CharMatcherTest.java
@@ -727,12 +727,9 @@
     Set<Character> chars = new HashSet<>(size);
     for (int i = 0; i < size; i++) {
       char c;
-      while (true) {
+      do {
         c = (char) rand.nextInt(Character.MAX_VALUE - Character.MIN_VALUE + 1);
-        if (!chars.contains(c)) {
-          break;
-        }
-      }
+      } while (chars.contains(c));
       chars.add(c);
     }
     char[] retValue = new char[chars.size()];
diff --git a/guava-tests/test/com/google/common/base/OptionalTest.java b/guava-tests/test/com/google/common/base/OptionalTest.java
index 9864235..db7a9e3 100644
--- a/guava-tests/test/com/google/common/base/OptionalTest.java
+++ b/guava-tests/test/com/google/common/base/OptionalTest.java
@@ -263,7 +263,7 @@
     List<Optional<? extends Number>> optionals =
         ImmutableList.<Optional<? extends Number>>of(Optional.<Double>absent(), Optional.of(2));
     Iterable<Number> onlyPresent = Optional.presentInstances(optionals);
-    assertThat(onlyPresent).containsExactly(2).inOrder();
+    assertThat(onlyPresent).containsExactly(2);
   }
 
   private static Optional<Integer> getSomeOptionalInt() {
@@ -305,7 +305,7 @@
     // Sadly, the following is what users will have to do in some circumstances.
 
     @SuppressWarnings("unchecked") // safe covariant cast
-    Optional<Number> first = (Optional) numbers.first();
+    Optional<Number> first = (Optional<Number>) numbers.first();
     Number value = first.or(0.5); // fine
   }
 
diff --git a/guava-tests/test/com/google/common/base/SplitterTest.java b/guava-tests/test/com/google/common/base/SplitterTest.java
index 6b3d861..0c697b8 100644
--- a/guava-tests/test/com/google/common/base/SplitterTest.java
+++ b/guava-tests/test/com/google/common/base/SplitterTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.base;
 
+import static com.google.common.collect.ImmutableList.toImmutableList;
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtCompatible;
@@ -62,6 +63,12 @@
     assertThat(letters).containsExactly("a", "b", "c").inOrder();
   }
 
+  public void testCharacterSimpleSplitToStream() {
+    String simple = "a,b,c";
+    List<String> letters = COMMA_SPLITTER.splitToStream(simple).collect(toImmutableList());
+    assertThat(letters).containsExactly("a", "b", "c").inOrder();
+  }
+
   public void testToString() {
     assertEquals("[]", COMMA_SPLITTER.split("").toString());
     assertEquals("[a, b, c]", COMMA_SPLITTER.split("a,b,c").toString());
@@ -758,6 +765,18 @@
     }
   }
 
+  /**
+   * Testing the behavior in https://github.com/google/guava/issues/1900 - this behavior may want to
+   * be changed?
+   */
+  public void testMapSplitter_extraValueDelimiter() {
+    try {
+      COMMA_SPLITTER.withKeyValueSeparator("=").split("a=1,c=2=");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testMapSplitter_orderedResults() {
     Map<String, String> m =
         COMMA_SPLITTER.withKeyValueSeparator(":").split("boy:tom,girl:tina,cat:kitty,dog:tommy");
diff --git a/guava-tests/test/com/google/common/base/ThrowablesTest.java b/guava-tests/test/com/google/common/base/ThrowablesTest.java
index 076f899..e4c64aa 100644
--- a/guava-tests/test/com/google/common/base/ThrowablesTest.java
+++ b/guava-tests/test/com/google/common/base/ThrowablesTest.java
@@ -575,7 +575,7 @@
       Throwables.getRootCause(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(cause);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(cause);
     }
   }
 
@@ -675,7 +675,7 @@
       Throwables.getCausalChain(cause);
       fail("Should have throw IAE");
     } catch (IllegalArgumentException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(cause);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(cause);
     }
   }
 
@@ -684,15 +684,15 @@
     SomeCheckedException cause = new SomeCheckedException();
     SomeChainingException thrown = new SomeChainingException(cause);
 
-    assertThat(thrown).hasCauseThat().isSameAs(cause);
-    assertThat(Throwables.getCauseAs(thrown, SomeCheckedException.class)).isSameAs(cause);
-    assertThat(Throwables.getCauseAs(thrown, Exception.class)).isSameAs(cause);
+    assertThat(thrown).hasCauseThat().isSameInstanceAs(cause);
+    assertThat(Throwables.getCauseAs(thrown, SomeCheckedException.class)).isSameInstanceAs(cause);
+    assertThat(Throwables.getCauseAs(thrown, Exception.class)).isSameInstanceAs(cause);
 
     try {
       Throwables.getCauseAs(thrown, IllegalStateException.class);
       fail("Should have thrown CCE");
     } catch (ClassCastException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(thrown);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(thrown);
     }
   }
 
diff --git a/guava-tests/test/com/google/common/cache/AbstractCacheTest.java b/guava-tests/test/com/google/common/cache/AbstractCacheTest.java
index a9dcbfb..13ef33d 100644
--- a/guava-tests/test/com/google/common/cache/AbstractCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/AbstractCacheTest.java
@@ -146,6 +146,14 @@
     assertEquals(27, stats.evictionCount());
   }
 
+  public void testSimpleStatsOverflow() {
+    StatsCounter counter = new SimpleStatsCounter();
+    counter.recordLoadSuccess(Long.MAX_VALUE);
+    counter.recordLoadSuccess(1);
+    CacheStats stats = counter.snapshot();
+    assertEquals(Long.MAX_VALUE, stats.totalLoadTime());
+  }
+
   public void testSimpleStatsIncrementBy() {
     long totalLoadTime = 0;
 
diff --git a/guava-tests/test/com/google/common/cache/CacheBuilderTest.java b/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
index 1d6e4a3..8042ea7 100644
--- a/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
@@ -277,24 +277,13 @@
   }
 
   @GwtIncompatible // java.time.Duration
-  public void testLargeDurations() {
+  public void testLargeDurationsAreOk() {
     java.time.Duration threeHundredYears = java.time.Duration.ofDays(365 * 300);
-    CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();
-    try {
-      builder.expireAfterWrite(threeHundredYears);
-      fail();
-    } catch (ArithmeticException expected) {
-    }
-    try {
-      builder.expireAfterAccess(threeHundredYears);
-      fail();
-    } catch (ArithmeticException expected) {
-    }
-    try {
-      builder.refreshAfterWrite(threeHundredYears);
-      fail();
-    } catch (ArithmeticException expected) {
-    }
+    CacheBuilder<Object, Object> builder =
+        CacheBuilder.newBuilder()
+            .expireAfterWrite(threeHundredYears)
+            .expireAfterAccess(threeHundredYears)
+            .refreshAfterWrite(threeHundredYears);
   }
 
   public void testTimeToLive_negative() {
diff --git a/guava-tests/test/com/google/common/cache/CacheLoadingTest.java b/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
index bc2cbd3..ba3e7e9 100644
--- a/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
@@ -91,7 +91,7 @@
   }
 
   private void checkLoggedCause(Throwable t) {
-    assertThat(popLoggedThrowable()).hasCauseThat().isSameAs(t);
+    assertThat(popLoggedThrowable()).hasCauseThat().isSameInstanceAs(t);
   }
 
   private void checkLoggedInvalidLoad() {
@@ -889,7 +889,7 @@
       cache.get(new Object());
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -901,7 +901,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(2, stats.missCount());
@@ -929,7 +929,7 @@
           });
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableError);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableError);
     }
     stats = cache.stats();
     assertEquals(3, stats.missCount());
@@ -941,7 +941,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(4, stats.missCount());
@@ -1122,7 +1122,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionError expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1145,7 +1145,7 @@
       cache.get(new Object());
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1157,7 +1157,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(2, stats.missCount());
@@ -1178,7 +1178,7 @@
       cache.get(new Object(), throwing(callableException));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableException);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableException);
     }
     stats = cache.stats();
     assertEquals(3, stats.missCount());
@@ -1190,7 +1190,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(4, stats.missCount());
@@ -1216,7 +1216,7 @@
       cache.get(new Object());
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1229,7 +1229,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1252,7 +1252,7 @@
       cache.get(new Object(), throwing(callableException));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableException);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableException);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1265,7 +1265,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1447,7 +1447,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1471,7 +1471,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(currentThread().interrupted());
     stats = cache.stats();
@@ -1495,7 +1495,7 @@
       cache.get(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1507,7 +1507,7 @@
       cache.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(2, stats.missCount());
@@ -1528,7 +1528,7 @@
       cache.get(new Object(), throwing(callableException));
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(callableException);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(callableException);
     }
     stats = cache.stats();
     assertEquals(3, stats.missCount());
@@ -1540,7 +1540,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(4, stats.missCount());
@@ -1721,7 +1721,7 @@
       cache.getAll(asList(new Object()));
       fail();
     } catch (UncheckedExecutionException expected) {
-      assertThat(expected).hasCauseThat().isSameAs(e);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(e);
     }
     stats = cache.stats();
     assertEquals(1, stats.missCount());
@@ -1752,7 +1752,7 @@
       cache.getUnchecked(1);
       fail();
     } catch (UncheckedExecutionException ue) {
-      assertThat(ue).hasCauseThat().isSameAs(e);
+      assertThat(ue).hasCauseThat().isSameInstanceAs(e);
     }
 
     assertEquals("1", cache.getUnchecked(1));
@@ -1866,14 +1866,14 @@
     } catch (ExecutionException e) {
       fail();
     } catch (UncheckedExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(uee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(uee);
     }
 
     try {
       cacheUnchecked.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException caughtUee) {
-      assertThat(caughtUee).hasCauseThat().isSameAs(uee);
+      assertThat(caughtUee).hasCauseThat().isSameInstanceAs(uee);
     }
 
     cacheUnchecked.refresh(new Object());
@@ -1885,21 +1885,21 @@
     } catch (ExecutionException e) {
       fail();
     } catch (UncheckedExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(uee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(uee);
     }
 
     try {
       cacheChecked.get(new Object());
       fail();
     } catch (ExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(ee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(ee);
     }
 
     try {
       cacheChecked.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException caughtUee) {
-      assertThat(caughtUee).hasCauseThat().isSameAs(ee);
+      assertThat(caughtUee).hasCauseThat().isSameInstanceAs(ee);
     }
 
     cacheChecked.refresh(new Object());
@@ -1909,7 +1909,7 @@
       cacheChecked.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(ee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(ee);
     }
   }
 
@@ -1929,14 +1929,14 @@
     } catch (ExecutionException e) {
       fail();
     } catch (UncheckedExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(uee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(uee);
     }
 
     try {
       cacheChecked.getAll(asList(new Object()));
       fail();
     } catch (ExecutionException caughtEe) {
-      assertThat(caughtEe).hasCauseThat().isSameAs(ee);
+      assertThat(caughtEe).hasCauseThat().isSameInstanceAs(ee);
     }
   }
 
@@ -2057,7 +2057,7 @@
       // doConcurrentGet alternates between calling getUnchecked and calling get, but an unchecked
       // exception thrown by the loader is always wrapped as an UncheckedExecutionException.
       assertThat(result.get(i)).isInstanceOf(UncheckedExecutionException.class);
-      assertThat(((UncheckedExecutionException) result.get(i))).hasCauseThat().isSameAs(e);
+      assertThat(((UncheckedExecutionException) result.get(i))).hasCauseThat().isSameInstanceAs(e);
     }
 
     // subsequent calls should call the loader again, not get the old exception
@@ -2103,10 +2103,10 @@
       int mod = i % 3;
       if (mod == 0 || mod == 2) {
         assertThat(result.get(i)).isInstanceOf(ExecutionException.class);
-        assertThat((ExecutionException) result.get(i)).hasCauseThat().isSameAs(e);
+        assertThat((ExecutionException) result.get(i)).hasCauseThat().isSameInstanceAs(e);
       } else {
         assertThat(result.get(i)).isInstanceOf(UncheckedExecutionException.class);
-        assertThat((UncheckedExecutionException) result.get(i)).hasCauseThat().isSameAs(e);
+        assertThat((UncheckedExecutionException) result.get(i)).hasCauseThat().isSameInstanceAs(e);
       }
     }
 
diff --git a/guava-tests/test/com/google/common/cache/CacheStatsTest.java b/guava-tests/test/com/google/common/cache/CacheStatsTest.java
index f029d37..3e715f1 100644
--- a/guava-tests/test/com/google/common/cache/CacheStatsTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheStatsTest.java
@@ -98,4 +98,32 @@
 
     assertEquals(sum, one.plus(two));
   }
+
+  public void testPlusLarge() {
+    CacheStats maxCacheStats =
+        new CacheStats(
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE,
+            Long.MAX_VALUE);
+    CacheStats smallCacheStats = new CacheStats(1, 1, 1, 1, 1, 1);
+
+    CacheStats sum = smallCacheStats.plus(maxCacheStats);
+    assertEquals(Long.MAX_VALUE, sum.requestCount());
+    assertEquals(Long.MAX_VALUE, sum.hitCount());
+    assertEquals(1.0, sum.hitRate());
+    assertEquals(Long.MAX_VALUE, sum.missCount());
+    assertEquals(1.0, sum.missRate());
+    assertEquals(Long.MAX_VALUE, sum.loadSuccessCount());
+    assertEquals(Long.MAX_VALUE, sum.loadExceptionCount());
+    assertEquals(1.0, sum.loadExceptionRate());
+    assertEquals(Long.MAX_VALUE, sum.loadCount());
+    assertEquals(Long.MAX_VALUE, sum.totalLoadTime());
+    assertEquals(1.0, sum.averageLoadPenalty());
+    assertEquals(Long.MAX_VALUE, sum.evictionCount());
+
+    assertEquals(sum, maxCacheStats.plus(smallCacheStats));
+  }
 }
diff --git a/guava-tests/test/com/google/common/cache/CacheTesting.java b/guava-tests/test/com/google/common/cache/CacheTesting.java
index 3616e51..42b50b9 100644
--- a/guava-tests/test/com/google/common/cache/CacheTesting.java
+++ b/guava-tests/test/com/google/common/cache/CacheTesting.java
@@ -393,7 +393,7 @@
 
       ReferenceEntry<?, ?> originalHead = segment.accessQueue.peek();
       @SuppressWarnings("unchecked")
-      ReferenceEntry<Integer, Integer> entry = (ReferenceEntry) originalHead;
+      ReferenceEntry<Integer, Integer> entry = (ReferenceEntry<Integer, Integer>) originalHead;
       operation.accept(entry);
       drainRecencyQueue(segment);
 
diff --git a/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java b/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java
index 127b3c5..412ff78 100644
--- a/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/ForwardingCacheTest.java
@@ -34,7 +34,7 @@
   private Cache<String, Boolean> forward;
   private Cache<String, Boolean> mock;
 
-  @SuppressWarnings("unchecked") // mock
+  @SuppressWarnings({"unchecked", "DoNotMock"}) // mock
   @Override
   public void setUp() throws Exception {
     super.setUp();
diff --git a/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java b/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
index 01704ef..c5681d2 100644
--- a/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
@@ -34,7 +34,7 @@
   private LoadingCache<String, Boolean> forward;
   private LoadingCache<String, Boolean> mock;
 
-  @SuppressWarnings("unchecked") // mock
+  @SuppressWarnings({"unchecked", "DoNotMock"}) // mock
   @Override
   public void setUp() throws Exception {
     super.setUp();
diff --git a/guava-tests/test/com/google/common/cache/LocalCacheTest.java b/guava-tests/test/com/google/common/cache/LocalCacheTest.java
index 81bdaa9..f3d3f94 100644
--- a/guava-tests/test/com/google/common/cache/LocalCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/LocalCacheTest.java
@@ -2462,7 +2462,7 @@
         ReferenceEntry<Object, Object> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -2492,7 +2492,7 @@
         ValueReference<Object, Object> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -2520,7 +2520,7 @@
         ReferenceEntry<Object, Object> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
@@ -2551,7 +2551,7 @@
         ValueReference<Object, Object> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
diff --git a/guava-tests/test/com/google/common/cache/LongAdderTest.java b/guava-tests/test/com/google/common/cache/LongAdderTest.java
index 78f6edc..876f907 100644
--- a/guava-tests/test/com/google/common/cache/LongAdderTest.java
+++ b/guava-tests/test/com/google/common/cache/LongAdderTest.java
@@ -14,11 +14,27 @@
 
 package com.google.common.cache;
 
-/**
- * No-op null-pointer test for {@link LongAdder} to override the {@link PackageSanityTests} version,
- * which checks package-private methods that we don't want to have to annotate as {@code Nullable}
- * because we don't want diffs from jsr166e.
- */
-public class LongAdderTest {
+import static com.google.common.truth.Truth.assertThat;
+
+import junit.framework.TestCase;
+
+/** Unit tests for {@link LongAdder}. */
+public class LongAdderTest extends TestCase {
+
+  /**
+   * No-op null-pointer test for {@link LongAdder} to override the {@link PackageSanityTests}
+   * version, which checks package-private methods that we don't want to have to annotate as {@code
+   * Nullable} because we don't want diffs from jsr166e.
+   */
   public void testNulls() {}
+
+  public void testOverflows() {
+    LongAdder longAdder = new LongAdder();
+    longAdder.add(Long.MAX_VALUE);
+    assertThat(longAdder.sum()).isEqualTo(Long.MAX_VALUE);
+    longAdder.add(1);
+    // silently overflows; is this a bug?
+    // See https://github.com/google/guava/issues/3503
+    assertThat(longAdder.sum()).isEqualTo(-9223372036854775808L);
+  }
 }
diff --git a/guava-tests/test/com/google/common/cache/NullCacheTest.java b/guava-tests/test/com/google/common/cache/NullCacheTest.java
index e418f6c..89dc3fb 100644
--- a/guava-tests/test/com/google/common/cache/NullCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/NullCacheTest.java
@@ -123,7 +123,7 @@
       map.getUnchecked(new Object());
       fail();
     } catch (UncheckedExecutionException uee) {
-      assertThat(uee).hasCauseThat().isSameAs(e);
+      assertThat(uee).hasCauseThat().isSameInstanceAs(e);
     }
     assertTrue(listener.isEmpty());
     checkEmpty(map);
diff --git a/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java b/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
index 06f0d27..1e71b63 100644
--- a/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
+++ b/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
@@ -237,21 +237,15 @@
     }
   }
 
-  @SuppressWarnings("unchecked") // generic array creation
-
   public void testEntrySet_populated() {
     for (LoadingCache<Object, Object> cache : caches()) {
       Set<Entry<Object, Object>> entries = cache.asMap().entrySet();
       List<Entry<Object, Object>> warmed = warmUp(cache, WARMUP_MIN, WARMUP_MAX);
 
       Set<?> expected = Maps.newHashMap(cache.asMap()).entrySet();
-      assertThat(entries).containsExactlyElementsIn((Collection<Entry<Object, Object>>) expected);
-      assertThat(entries.toArray())
-          .asList()
-          .containsExactlyElementsIn((Collection<Object>) expected);
-      assertThat(entries.toArray(new Entry[0]))
-          .asList()
-          .containsExactlyElementsIn((Collection<Entry>) expected);
+      assertThat(entries).containsExactlyElementsIn(expected);
+      assertThat(entries.toArray()).asList().containsExactlyElementsIn(expected);
+      assertThat(entries.toArray(new Object[0])).asList().containsExactlyElementsIn(expected);
 
       new EqualsTester()
           .addEqualityGroup(cache.asMap().entrySet(), entries)
diff --git a/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java b/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java
index 55a455b..e430f0e 100644
--- a/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java
+++ b/guava-tests/test/com/google/common/collect/AbstractBiMapTest.java
@@ -28,6 +28,7 @@
 
   // The next two tests verify that map entries are not accessed after they're
   // removed, since IdentityHashMap throws an exception when that occurs.
+  @SuppressWarnings("IdentityHashMapBoxing") // explicitly testing IdentityHashMap
   public void testIdentityKeySetIteratorRemove() {
     BiMap<Integer, String> bimap =
         new AbstractBiMap<Integer, String>(
@@ -45,6 +46,7 @@
     assertEquals(1, bimap.inverse().size());
   }
 
+  @SuppressWarnings("IdentityHashMapBoxing") // explicitly testing IdentityHashMap
   public void testIdentityEntrySetIteratorRemove() {
     BiMap<Integer, String> bimap =
         new AbstractBiMap<Integer, String>(
diff --git a/guava-tests/test/com/google/common/collect/AbstractHashFloodingTest.java b/guava-tests/test/com/google/common/collect/AbstractHashFloodingTest.java
new file mode 100644
index 0000000..049da4c
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/AbstractHashFloodingTest.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 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.collect;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.IntToDoubleFunction;
+import java.util.function.Supplier;
+import junit.framework.TestCase;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/**
+ * Abstract superclass for tests that hash flooding a collection has controlled worst-case
+ * performance.
+ */
+@GwtCompatible
+public abstract class AbstractHashFloodingTest<T> extends TestCase {
+  private final List<Construction<T>> constructions;
+  private final IntToDoubleFunction constructionAsymptotics;
+  private final List<QueryOp<T>> queries;
+
+  AbstractHashFloodingTest(
+      List<Construction<T>> constructions,
+      IntToDoubleFunction constructionAsymptotics,
+      List<QueryOp<T>> queries) {
+    this.constructions = constructions;
+    this.constructionAsymptotics = constructionAsymptotics;
+    this.queries = queries;
+  }
+
+  /**
+   * A Comparable wrapper around a String which executes callbacks on calls to hashCode, equals, and
+   * compareTo.
+   */
+  private static class CountsHashCodeAndEquals implements Comparable<CountsHashCodeAndEquals> {
+    private final String delegateString;
+    private final Runnable onHashCode;
+    private final Runnable onEquals;
+    private final Runnable onCompareTo;
+
+    CountsHashCodeAndEquals(
+        String delegateString, Runnable onHashCode, Runnable onEquals, Runnable onCompareTo) {
+      this.delegateString = delegateString;
+      this.onHashCode = onHashCode;
+      this.onEquals = onEquals;
+      this.onCompareTo = onCompareTo;
+    }
+
+    @Override
+    public int hashCode() {
+      onHashCode.run();
+      return delegateString.hashCode();
+    }
+
+    @Override
+    public boolean equals(@Nullable Object other) {
+      onEquals.run();
+      return other instanceof CountsHashCodeAndEquals
+          && delegateString.equals(((CountsHashCodeAndEquals) other).delegateString);
+    }
+
+    @Override
+    public int compareTo(CountsHashCodeAndEquals o) {
+      onCompareTo.run();
+      return delegateString.compareTo(o.delegateString);
+    }
+  }
+
+  /** A holder of counters for calls to hashCode, equals, and compareTo. */
+  private static final class CallsCounter {
+    long hashCode;
+    long equals;
+    long compareTo;
+
+    long total() {
+      return hashCode + equals + compareTo;
+    }
+
+    void zero() {
+      hashCode = 0;
+      equals = 0;
+      compareTo = 0;
+    }
+  }
+
+  @FunctionalInterface
+  interface Construction<T> {
+    @CanIgnoreReturnValue
+    abstract T create(List<?> keys);
+
+    static Construction<Map<Object, Object>> mapFromKeys(
+        Supplier<Map<Object, Object>> mutableSupplier) {
+      return keys -> {
+        Map<Object, Object> map = mutableSupplier.get();
+        for (Object key : keys) {
+          map.put(key, new Object());
+        }
+        return map;
+      };
+    }
+
+    static Construction<Set<Object>> setFromElements(Supplier<Set<Object>> mutableSupplier) {
+      return elements -> {
+        Set<Object> set = mutableSupplier.get();
+        set.addAll(elements);
+        return set;
+      };
+    }
+  }
+
+  abstract static class QueryOp<T> {
+    static <T> QueryOp<T> create(
+        String name, BiConsumer<T, Object> queryLambda, IntToDoubleFunction asymptotic) {
+      return new QueryOp<T>() {
+        @Override
+        void apply(T collection, Object query) {
+          queryLambda.accept(collection, query);
+        }
+
+        @Override
+        double expectedAsymptotic(int n) {
+          return asymptotic.applyAsDouble(n);
+        }
+
+        @Override
+        public String toString() {
+          return name;
+        }
+      };
+    }
+
+    static final QueryOp<Map<Object, Object>> MAP_GET =
+        QueryOp.create("Map.get", Map::get, Math::log);
+
+    @SuppressWarnings("ReturnValueIgnored")
+    static final QueryOp<Set<Object>> SET_CONTAINS =
+        QueryOp.create("Set.contains", Set::contains, Math::log);
+
+    abstract void apply(T collection, Object query);
+
+    abstract double expectedAsymptotic(int n);
+  }
+
+  /**
+   * Returns a list of objects with the same hash code, of size 2^power, counting calls to equals,
+   * hashCode, and compareTo in counter.
+   */
+  static List<CountsHashCodeAndEquals> createAdversarialInput(int power, CallsCounter counter) {
+    String str1 = "Aa";
+    String str2 = "BB";
+    assertEquals(str1.hashCode(), str2.hashCode());
+    List<String> haveSameHashes2 = Arrays.asList(str1, str2);
+    List<CountsHashCodeAndEquals> result =
+        Lists.newArrayList(
+            Lists.transform(
+                Lists.cartesianProduct(Collections.nCopies(power, haveSameHashes2)),
+                strs ->
+                    new CountsHashCodeAndEquals(
+                        String.join("", strs),
+                        () -> counter.hashCode++,
+                        () -> counter.equals++,
+                        () -> counter.compareTo++)));
+    assertEquals(
+        result.get(0).delegateString.hashCode(),
+        result.get(result.size() - 1).delegateString.hashCode());
+    return result;
+  }
+
+  @GwtIncompatible
+  public void testResistsHashFloodingInConstruction() {
+    CallsCounter smallCounter = new CallsCounter();
+    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
+    int smallSize = haveSameHashesSmall.size();
+
+    CallsCounter largeCounter = new CallsCounter();
+    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
+    int largeSize = haveSameHashesLarge.size();
+
+    for (Construction<T> pathway : constructions) {
+      smallCounter.zero();
+      pathway.create(haveSameHashesSmall);
+      long smallOps = smallCounter.total();
+
+      largeCounter.zero();
+      pathway.create(haveSameHashesLarge);
+      long largeOps = largeCounter.total();
+
+      double ratio = (double) largeOps / smallOps;
+      assertWithMessage(
+              "ratio of equals/hashCode/compareTo operations to build with %s entries versus %s"
+                  + " entries",
+              largeSize, smallSize)
+          .that(ratio)
+          .isAtMost(
+              2
+                  * constructionAsymptotics.applyAsDouble(largeSize)
+                  / constructionAsymptotics.applyAsDouble(smallSize));
+      // allow up to 2x wobble in the constant factors
+    }
+  }
+
+  @GwtIncompatible
+  public void testResistsHashFloodingOnQuery() {
+    CallsCounter smallCounter = new CallsCounter();
+    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
+    int smallSize = haveSameHashesSmall.size();
+
+    CallsCounter largeCounter = new CallsCounter();
+    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
+    int largeSize = haveSameHashesLarge.size();
+
+    for (QueryOp<T> query : queries) {
+      for (Construction<T> pathway : constructions) {
+        long worstSmallOps = getWorstCaseOps(smallCounter, haveSameHashesSmall, query, pathway);
+        long worstLargeOps = getWorstCaseOps(largeCounter, haveSameHashesLarge, query, pathway);
+
+        double ratio = (double) worstLargeOps / worstSmallOps;
+        assertWithMessage(
+                "ratio of equals/hashCode/compareTo operations to query %s with %s entries versus"
+                    + " %s entries",
+                query, largeSize, smallSize)
+            .that(ratio)
+            .isAtMost(
+                2 * query.expectedAsymptotic(largeSize) / query.expectedAsymptotic(smallSize));
+        // allow up to 2x wobble in the constant factors
+      }
+    }
+  }
+
+  private long getWorstCaseOps(
+      CallsCounter counter,
+      List<CountsHashCodeAndEquals> haveSameHashes,
+      QueryOp<T> query,
+      Construction<T> pathway) {
+    T collection = pathway.create(haveSameHashes);
+    long worstOps = 0;
+    for (Object o : haveSameHashes) {
+      counter.zero();
+      query.apply(collection, o);
+      worstOps = Math.max(worstOps, counter.total());
+    }
+    return worstOps;
+  }
+}
diff --git a/guava-tests/test/com/google/common/collect/CollectSpliteratorsTest.java b/guava-tests/test/com/google/common/collect/CollectSpliteratorsTest.java
index cdc293d..2b5e6e5 100644
--- a/guava-tests/test/com/google/common/collect/CollectSpliteratorsTest.java
+++ b/guava-tests/test/com/google/common/collect/CollectSpliteratorsTest.java
@@ -22,6 +22,9 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Spliterator;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
 import junit.framework.TestCase;
 
 /** Tests for {@code CollectSpliterators}. */
@@ -46,6 +49,50 @@
         .expect('a', 'b', 'c', 'd', 'e', 'f', 'g');
   }
 
+  public void testFlatMap_nullStream() {
+    SpliteratorTester.of(
+            () ->
+                CollectSpliterators.flatMap(
+                    Arrays.spliterator(new String[] {"abc", "", "de", "f", "g", ""}),
+                    (String str) -> str.isEmpty() ? null : Lists.charactersOf(str).spliterator(),
+                    Spliterator.SIZED | Spliterator.DISTINCT | Spliterator.NONNULL,
+                    7))
+        .expect('a', 'b', 'c', 'd', 'e', 'f', 'g');
+  }
+
+  public void testFlatMapToInt_nullStream() {
+    SpliteratorTester.ofInt(
+            () ->
+                CollectSpliterators.flatMapToInt(
+                    Arrays.spliterator(new Integer[] {1, 0, 1, 2, 3}),
+                    (Integer i) -> i == 0 ? null : IntStream.of(i).spliterator(),
+                    Spliterator.SIZED | Spliterator.DISTINCT | Spliterator.NONNULL,
+                    4))
+        .expect(1, 1, 2, 3);
+  }
+
+  public void testFlatMapToLong_nullStream() {
+    SpliteratorTester.ofLong(
+            () ->
+                CollectSpliterators.flatMapToLong(
+                    Arrays.spliterator(new Long[] {1L, 0L, 1L, 2L, 3L}),
+                    (Long i) -> i == 0L ? null : LongStream.of(i).spliterator(),
+                    Spliterator.SIZED | Spliterator.DISTINCT | Spliterator.NONNULL,
+                    4))
+        .expect(1L, 1L, 2L, 3L);
+  }
+
+  public void testFlatMapToDouble_nullStream() {
+    SpliteratorTester.ofDouble(
+            () ->
+                CollectSpliterators.flatMapToDouble(
+                    Arrays.spliterator(new Double[] {1.0, 0.0, 1.0, 2.0, 3.0}),
+                    (Double i) -> i == 0.0 ? null : DoubleStream.of(i).spliterator(),
+                    Spliterator.SIZED | Spliterator.DISTINCT | Spliterator.NONNULL,
+                    4))
+        .expect(1.0, 1.0, 2.0, 3.0);
+  }
+
   public void testMultisetsSpliterator() {
     Multiset<String> multiset = TreeMultiset.create();
     multiset.add("a", 3);
diff --git a/guava-tests/test/com/google/common/collect/CompactHashMapTest.java b/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
index 33e6015..095b1c9 100644
--- a/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactHashMapTest.java
@@ -13,6 +13,7 @@
  * 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.Iterables.getOnlyElement;
@@ -58,7 +59,30 @@
                 CollectionFeature.SERIALIZABLE,
                 CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
             .createTestSuite());
+    suite.addTest(
+        MapTestSuiteBuilder.using(
+                new TestStringMapGenerator() {
+                  @Override
+                  protected Map<String, String> create(Entry<String, String>[] entries) {
+                    CompactHashMap<String, String> map = CompactHashMap.create();
+                    map.convertToHashFloodingResistantImplementation();
+                    for (Entry<String, String> entry : entries) {
+                      map.put(entry.getKey(), entry.getValue());
+                    }
+                    return map;
+                  }
+                })
+            .named("CompactHashMap with flooding resistance")
+            .withFeatures(
+                CollectionSize.ANY,
+                MapFeature.GENERAL_PURPOSE,
+                MapFeature.ALLOWS_NULL_KEYS,
+                MapFeature.ALLOWS_NULL_VALUES,
+                CollectionFeature.SERIALIZABLE,
+                CollectionFeature.SUPPORTS_ITERATOR_REMOVE)
+            .createTestSuite());
     suite.addTestSuite(CompactHashMapTest.class);
+    suite.addTestSuite(FloodingTest.class);
     return suite;
   }
 
@@ -85,4 +109,44 @@
     entry.setValue("one");
     assertThat(map).containsEntry(1, "one");
   }
+
+  public void testAllocArraysDefault() {
+    CompactHashMap<Integer, String> map = CompactHashMap.create();
+    assertThat(map.needsAllocArrays()).isTrue();
+    assertThat(map.entries).isNull();
+    assertThat(map.keys).isNull();
+    assertThat(map.values).isNull();
+
+    map.put(1, "1");
+    assertThat(map.needsAllocArrays()).isFalse();
+    assertThat(map.entries).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.keys).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.values).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactHashMap<Integer, String> map = CompactHashMap.createWithExpectedSize(i);
+      assertThat(map.needsAllocArrays()).isTrue();
+      assertThat(map.entries).isNull();
+      assertThat(map.keys).isNull();
+      assertThat(map.values).isNull();
+
+      map.put(1, "1");
+      assertThat(map.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(map.entries).hasLength(expectedSize);
+      assertThat(map.keys).hasLength(expectedSize);
+      assertThat(map.values).hasLength(expectedSize);
+    }
+  }
+
+  public static class FloodingTest extends AbstractHashFloodingTest<Map<Object, Object>> {
+    public FloodingTest() {
+      super(
+          ImmutableList.of(Construction.mapFromKeys(CompactHashMap::create)),
+          n -> n * Math.log(n),
+          ImmutableList.of(QueryOp.MAP_GET));
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/CompactHashSetTest.java b/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
index e5c3a45..6e2817b 100644
--- a/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactHashSetTest.java
@@ -16,6 +16,8 @@
 
 package com.google.common.collect;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.testing.SetTestSuiteBuilder;
 import com.google.common.collect.testing.TestStringSetGenerator;
@@ -23,6 +25,7 @@
 import com.google.common.collect.testing.features.CollectionSize;
 import com.google.common.collect.testing.features.Feature;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import junit.framework.Test;
@@ -50,6 +53,7 @@
 
     TestSuite suite = new TestSuite();
     suite.addTestSuite(CompactHashSetTest.class);
+    suite.addTestSuite(FloodingTest.class);
     suite.addTest(
         SetTestSuiteBuilder.using(
                 new TestStringSetGenerator() {
@@ -66,6 +70,20 @@
                 new TestStringSetGenerator() {
                   @Override
                   protected Set<String> create(String[] elements) {
+                    CompactHashSet<String> set = CompactHashSet.create();
+                    set.convertToHashFloodingResistantImplementation();
+                    Collections.addAll(set, elements);
+                    return set;
+                  }
+                })
+            .named("CompactHashSet with flooding protection")
+            .withFeatures(allFeatures)
+            .createTestSuite());
+    suite.addTest(
+        SetTestSuiteBuilder.using(
+                new TestStringSetGenerator() {
+                  @Override
+                  protected Set<String> create(String[] elements) {
                     CompactHashSet set = CompactHashSet.create(Arrays.asList(elements));
                     for (int i = 0; i < 100; i++) {
                       set.add(i);
@@ -83,7 +101,35 @@
     return suite;
   }
 
-  public void testDummyMethod() {
-    // Just make sure the test runner doesn't complain about no test methods.
+  public void testAllocArraysDefault() {
+    CompactHashSet<Integer> set = CompactHashSet.create();
+    assertThat(set.needsAllocArrays()).isTrue();
+    assertThat(set.elements).isNull();
+
+    set.add(1);
+    assertThat(set.needsAllocArrays()).isFalse();
+    assertThat(set.elements).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactHashSet<Integer> set = CompactHashSet.createWithExpectedSize(i);
+      assertThat(set.needsAllocArrays()).isTrue();
+      assertThat(set.elements).isNull();
+
+      set.add(1);
+      assertThat(set.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(set.elements).hasLength(expectedSize);
+    }
+  }
+
+  public static class FloodingTest extends AbstractHashFloodingTest<Set<Object>> {
+    public FloodingTest() {
+      super(
+          ImmutableList.of(Construction.setFromElements(CompactHashSet::create)),
+          n -> n * Math.log(n),
+          ImmutableList.of(QueryOp.SET_CONTAINS));
+    }
   }
 }
diff --git a/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java b/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
index f7e2857..e8ba94c 100644
--- a/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactLinkedHashMapTest.java
@@ -11,6 +11,7 @@
  * 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.truth.Truth.assertThat;
@@ -57,7 +58,31 @@
                 CollectionFeature.SERIALIZABLE,
                 CollectionFeature.KNOWN_ORDER)
             .createTestSuite());
+    suite.addTest(
+        MapTestSuiteBuilder.using(
+                new TestStringMapGenerator() {
+                  @Override
+                  protected Map<String, String> create(Entry<String, String>[] entries) {
+                    CompactLinkedHashMap<String, String> map = CompactLinkedHashMap.create();
+                    map.convertToHashFloodingResistantImplementation();
+                    for (Entry<String, String> entry : entries) {
+                      map.put(entry.getKey(), entry.getValue());
+                    }
+                    return map;
+                  }
+                })
+            .named("CompactLinkedHashMap with flooding resistance")
+            .withFeatures(
+                CollectionSize.ANY,
+                CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
+                MapFeature.GENERAL_PURPOSE,
+                MapFeature.ALLOWS_NULL_KEYS,
+                MapFeature.ALLOWS_NULL_VALUES,
+                CollectionFeature.SERIALIZABLE,
+                CollectionFeature.KNOWN_ORDER)
+            .createTestSuite());
     suite.addTestSuite(CompactLinkedHashMapTest.class);
+    suite.addTestSuite(FloodingTest.class);
     return suite;
   }
 
@@ -96,8 +121,8 @@
     map.put(4, "b");
     map.put(3, "d");
     map.put(2, "c");
-    map.remove(3);
-    testHasMapEntriesInOrder(map, 1, "a", 4, "b", 2, "c");
+    map.remove(4);
+    testHasMapEntriesInOrder(map, 1, "a", 3, "d", 2, "c");
   }
 
   public void testInsertionOrderAfterRemoveLastEntry() {
@@ -141,4 +166,48 @@
       assertEquals(expectedValue, values.get(i));
     }
   }
+
+  public void testAllocArraysDefault() {
+    CompactLinkedHashMap<Integer, String> map = CompactLinkedHashMap.create();
+    assertThat(map.needsAllocArrays()).isTrue();
+    assertThat(map.entries).isNull();
+    assertThat(map.keys).isNull();
+    assertThat(map.values).isNull();
+    assertThat(map.links).isNull();
+
+    map.put(1, Integer.toString(1));
+    assertThat(map.needsAllocArrays()).isFalse();
+    assertThat(map.entries).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.keys).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.values).hasLength(CompactHashing.DEFAULT_SIZE);
+    assertThat(map.links).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactLinkedHashMap<Integer, String> map = CompactLinkedHashMap.createWithExpectedSize(i);
+      assertThat(map.needsAllocArrays()).isTrue();
+      assertThat(map.entries).isNull();
+      assertThat(map.keys).isNull();
+      assertThat(map.values).isNull();
+      assertThat(map.links).isNull();
+
+      map.put(1, Integer.toString(1));
+      assertThat(map.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(map.entries).hasLength(expectedSize);
+      assertThat(map.keys).hasLength(expectedSize);
+      assertThat(map.values).hasLength(expectedSize);
+      assertThat(map.links).hasLength(expectedSize);
+    }
+  }
+
+  public static class FloodingTest extends AbstractHashFloodingTest<Map<Object, Object>> {
+    public FloodingTest() {
+      super(
+          ImmutableList.of(Construction.mapFromKeys(CompactLinkedHashMap::create)),
+          n -> n * Math.log(n),
+          ImmutableList.of(QueryOp.MAP_GET));
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java b/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
index a95e486..dba9a73 100644
--- a/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
+++ b/guava-tests/test/com/google/common/collect/CompactLinkedHashSetTest.java
@@ -16,6 +16,8 @@
 
 package com.google.common.collect;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.testing.SetTestSuiteBuilder;
 import com.google.common.collect.testing.TestStringSetGenerator;
@@ -23,6 +25,7 @@
 import com.google.common.collect.testing.features.CollectionSize;
 import com.google.common.collect.testing.features.Feature;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import junit.framework.Test;
@@ -51,6 +54,7 @@
 
     TestSuite suite = new TestSuite();
     suite.addTestSuite(CompactLinkedHashSetTest.class);
+    suite.addTestSuite(FloodingTest.class);
     suite.addTest(
         SetTestSuiteBuilder.using(
                 new TestStringSetGenerator() {
@@ -62,10 +66,52 @@
             .named("CompactLinkedHashSet")
             .withFeatures(allFeatures)
             .createTestSuite());
+    suite.addTest(
+        SetTestSuiteBuilder.using(
+                new TestStringSetGenerator() {
+                  @Override
+                  protected Set<String> create(String[] elements) {
+                    CompactLinkedHashSet<String> set = CompactLinkedHashSet.create();
+                    set.convertToHashFloodingResistantImplementation();
+                    Collections.addAll(set, elements);
+                    return set;
+                  }
+                })
+            .named("CompactLinkedHashSet with flooding protection")
+            .withFeatures(allFeatures)
+            .createTestSuite());
     return suite;
   }
 
-  public void testDummyMethod() {
-    // Just make sure the test runner doesn't complain about no test methods.
+  public void testAllocArraysDefault() {
+    CompactHashSet<Integer> set = CompactHashSet.create();
+    assertThat(set.needsAllocArrays()).isTrue();
+    assertThat(set.elements).isNull();
+
+    set.add(1);
+    assertThat(set.needsAllocArrays()).isFalse();
+    assertThat(set.elements).hasLength(CompactHashing.DEFAULT_SIZE);
+  }
+
+  public void testAllocArraysExpectedSize() {
+    for (int i = 0; i <= CompactHashing.DEFAULT_SIZE; i++) {
+      CompactHashSet<Integer> set = CompactHashSet.createWithExpectedSize(i);
+      assertThat(set.needsAllocArrays()).isTrue();
+      assertThat(set.elements).isNull();
+
+      set.add(1);
+      assertThat(set.needsAllocArrays()).isFalse();
+      int expectedSize = Math.max(1, i);
+      assertThat(set.elements).hasLength(expectedSize);
+    }
+  }
+
+  public static class FloodingTest extends AbstractHashFloodingTest<Set<Object>> {
+    public FloodingTest() {
+      super(
+          ImmutableList.of(Construction.setFromElements(CompactLinkedHashSet::create)),
+          n -> n * Math.log(n),
+          ImmutableList.of(QueryOp.SET_CONTAINS));
+    }
   }
 }
diff --git a/guava-tests/test/com/google/common/collect/ComparatorsTest.java b/guava-tests/test/com/google/common/collect/ComparatorsTest.java
index fb79e9e..3f568c1 100644
--- a/guava-tests/test/com/google/common/collect/ComparatorsTest.java
+++ b/guava-tests/test/com/google/common/collect/ComparatorsTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.collect;
 
+import static com.google.common.truth.Truth.assertThat;
 import static java.util.Arrays.asList;
 import static java.util.Comparator.comparing;
 import static java.util.Comparator.naturalOrder;
@@ -114,4 +115,59 @@
     // Just demonstrate that no explicit type parameter is required
     comparator = Comparators.emptiesLast(naturalOrder());
   }
+
+  public void testMinMaxNatural() {
+    assertThat(Comparators.min(1, 2)).isEqualTo(1);
+    assertThat(Comparators.min(2, 1)).isEqualTo(1);
+    assertThat(Comparators.max(1, 2)).isEqualTo(2);
+    assertThat(Comparators.max(2, 1)).isEqualTo(2);
+  }
+
+  public void testMinMaxNatural_equalInstances() {
+    Foo a = new Foo(1);
+    Foo b = new Foo(1);
+    assertThat(Comparators.min(a, b)).isSameInstanceAs(a);
+    assertThat(Comparators.max(a, b)).isSameInstanceAs(a);
+  }
+
+  public void testMinMaxComparator() {
+    Comparator<Integer> natural = Ordering.natural();
+    Comparator<Integer> reverse = Collections.reverseOrder(natural);
+    assertThat(Comparators.min(1, 2, reverse)).isEqualTo(2);
+    assertThat(Comparators.min(2, 1, reverse)).isEqualTo(2);
+    assertThat(Comparators.max(1, 2, reverse)).isEqualTo(1);
+    assertThat(Comparators.max(2, 1, reverse)).isEqualTo(1);
+  }
+
+  public void testMinMaxComparator_equalInstances() {
+    Comparator<Foo> natural = Ordering.natural();
+    Comparator<Foo> reverse = Collections.reverseOrder(natural);
+    Foo a = new Foo(1);
+    Foo b = new Foo(1);
+    assertThat(Comparators.min(a, b, reverse)).isSameInstanceAs(a);
+    assertThat(Comparators.max(a, b, reverse)).isSameInstanceAs(a);
+  }
+
+  private static class Foo implements Comparable<Foo> {
+    final Integer value;
+
+    Foo(int value) {
+      this.value = value;
+    }
+
+    @Override
+    public int hashCode() {
+      return value.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return (o instanceof Foo) && ((Foo) o).value.equals(value);
+    }
+
+    @Override
+    public int compareTo(Foo other) {
+      return value.compareTo(other.value);
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java b/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java
index 592a1c7..1d38c86 100644
--- a/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java
+++ b/guava-tests/test/com/google/common/collect/ConcurrentHashMultisetTest.java
@@ -20,8 +20,8 @@
 import static com.google.common.collect.MapMakerInternalMap.Strength.WEAK;
 import static com.google.common.testing.SerializableTester.reserializeAndAssert;
 import static java.util.Arrays.asList;
+import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.isA;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
diff --git a/guava-tests/test/com/google/common/collect/ForwardingMapTest.java b/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
index 6ca5b8c..cc5d739 100644
--- a/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ForwardingMapTest.java
@@ -17,7 +17,7 @@
 package com.google.common.collect;
 
 import static java.lang.reflect.Modifier.STATIC;
-import static org.mockito.Mockito.anyObject;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -231,10 +231,10 @@
 
     // These are the methods specified by StandardEntrySet
     verify(map, atLeast(0)).clear();
-    verify(map, atLeast(0)).containsKey(anyObject());
-    verify(map, atLeast(0)).get(anyObject());
+    verify(map, atLeast(0)).containsKey(any());
+    verify(map, atLeast(0)).get(any());
     verify(map, atLeast(0)).isEmpty();
-    verify(map, atLeast(0)).remove(anyObject());
+    verify(map, atLeast(0)).remove(any());
     verify(map, atLeast(0)).size();
     verifyNoMoreInteractions(map);
   }
@@ -259,9 +259,9 @@
 
     // These are the methods specified by StandardKeySet
     verify(map, atLeast(0)).clear();
-    verify(map, atLeast(0)).containsKey(anyObject());
+    verify(map, atLeast(0)).containsKey(any());
     verify(map, atLeast(0)).isEmpty();
-    verify(map, atLeast(0)).remove(anyObject());
+    verify(map, atLeast(0)).remove(any());
     verify(map, atLeast(0)).size();
     verify(map, atLeast(0)).entrySet();
     verifyNoMoreInteractions(map);
@@ -287,7 +287,7 @@
 
     // These are the methods specified by StandardValues
     verify(map, atLeast(0)).clear();
-    verify(map, atLeast(0)).containsValue(anyObject());
+    verify(map, atLeast(0)).containsValue(any());
     verify(map, atLeast(0)).isEmpty();
     verify(map, atLeast(0)).size();
     verify(map, atLeast(0)).entrySet();
diff --git a/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
index 36e781c..0f95428 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.collect.testing.Helpers.mapEntry;
 import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -40,6 +39,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -50,7 +50,6 @@
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Tests for {@link ImmutableBiMap}.
@@ -70,6 +69,7 @@
     suite.addTestSuite(InverseMapTests.class);
     suite.addTestSuite(CreationTests.class);
     suite.addTestSuite(BiMapSpecificTests.class);
+    suite.addTestSuite(FloodingTest.class);
 
     suite.addTest(
         BiMapTestSuiteBuilder.using(new ImmutableBiMapGenerator())
@@ -122,6 +122,7 @@
                 MapFeature.ALLOWS_ANY_NULL_QUERIES)
             .suppressing(BiMapInverseTester.getInverseSameAfterSerializingMethods())
             .createTestSuite());
+    suite.addTestSuite(ImmutableBiMapTest.class);
 
     return suite;
   }
@@ -631,300 +632,93 @@
     }
   }
 
-  /**
-   * A Comparable wrapper around a String which executes callbacks on calls to hashCode, equals, and
-   * compareTo.
-   */
-  private static class CountsHashCodeAndEquals implements Comparable<CountsHashCodeAndEquals> {
-    private final String delegateString;
-    private final Runnable onHashCode;
-    private final Runnable onEquals;
-    private final Runnable onCompareTo;
-
-    CountsHashCodeAndEquals(
-        String delegateString, Runnable onHashCode, Runnable onEquals, Runnable onCompareTo) {
-      this.delegateString = delegateString;
-      this.onHashCode = onHashCode;
-      this.onEquals = onEquals;
-      this.onCompareTo = onCompareTo;
+  public static class FloodingTest extends AbstractHashFloodingTest<BiMap<Object, Object>> {
+    public FloodingTest() {
+      super(
+          EnumSet.allOf(ConstructionPathway.class).stream()
+              .flatMap(
+                  path ->
+                      Stream.<Construction<BiMap<Object, Object>>>of(
+                          keys ->
+                              path.create(
+                                  Lists.transform(
+                                      keys, key -> Maps.immutableEntry(key, new Object()))),
+                          keys ->
+                              path.create(
+                                  Lists.transform(
+                                      keys, key -> Maps.immutableEntry(new Object(), key))),
+                          keys ->
+                              path.create(
+                                  Lists.transform(keys, key -> Maps.immutableEntry(key, key)))))
+              .collect(ImmutableList.toImmutableList()),
+          n -> n * Math.log(n),
+          ImmutableList.of(
+              QueryOp.create("BiMap.get", BiMap::get, Math::log),
+              QueryOp.create("BiMap.inverse.get", (bm, o) -> bm.inverse().get(o), Math::log)));
     }
 
-    @Override
-    public int hashCode() {
-      onHashCode.run();
-      return delegateString.hashCode();
-    }
-
-    @Override
-    public boolean equals(@Nullable Object other) {
-      onEquals.run();
-      return other instanceof CountsHashCodeAndEquals
-          && delegateString.equals(((CountsHashCodeAndEquals) other).delegateString);
-    }
-
-    @Override
-    public int compareTo(CountsHashCodeAndEquals o) {
-      onCompareTo.run();
-      return delegateString.compareTo(o.delegateString);
-    }
-  }
-
-  /** A holder of counters for calls to hashCode, equals, and compareTo. */
-  private static final class CallsCounter {
-    long hashCode;
-    long equals;
-    long compareTo;
-
-    long total() {
-      return hashCode + equals + compareTo;
-    }
-
-    void zero() {
-      hashCode = 0;
-      equals = 0;
-      compareTo = 0;
-    }
-  }
-
-  /** All the ways to create an ImmutableBiMap. */
-  enum ConstructionPathway {
-    COPY_OF_MAP {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        Map<Object, Object> sourceMap = new LinkedHashMap<>();
-        for (Entry<?, ?> entry : entries) {
-          if (sourceMap.put(entry.getKey(), entry.getValue()) != null) {
-            throw new UnsupportedOperationException("duplicate key");
+    /** All the ways to create an ImmutableBiMap. */
+    enum ConstructionPathway {
+      COPY_OF_MAP {
+        @Override
+        public ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries) {
+          Map<Object, Object> sourceMap = new LinkedHashMap<>();
+          for (Map.Entry<?, ?> entry : entries) {
+            if (sourceMap.put(entry.getKey(), entry.getValue()) != null) {
+              throw new UnsupportedOperationException("duplicate key");
+            }
           }
+          return ImmutableBiMap.copyOf(sourceMap);
         }
-        counter.zero();
-        return ImmutableBiMap.copyOf(sourceMap);
-      }
-    },
-    COPY_OF_ENTRIES {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        return ImmutableBiMap.copyOf(entries);
-      }
-    },
-    BUILDER_PUT_ONE_BY_ONE {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
-        for (Entry<?, ?> entry : entries) {
-          builder.put(entry.getKey(), entry.getValue());
+      },
+      COPY_OF_ENTRIES {
+        @Override
+        public ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries) {
+          return ImmutableBiMap.copyOf(entries);
         }
-        return builder.build();
-      }
-    },
-    BUILDER_PUT_ENTRY_ONE_BY_ONE {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
-        for (Entry<?, ?> entry : entries) {
-          builder.put(entry);
-        }
-        return builder.build();
-      }
-    },
-    BUILDER_PUT_ALL_MAP {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        Map<Object, Object> sourceMap = new LinkedHashMap<>();
-        for (Entry<?, ?> entry : entries) {
-          if (sourceMap.put(entry.getKey(), entry.getValue()) != null) {
-            throw new UnsupportedOperationException("duplicate key");
+      },
+      BUILDER_PUT_ONE_BY_ONE {
+        @Override
+        public ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries) {
+          ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
+          for (Map.Entry<?, ?> entry : entries) {
+            builder.put(entry.getKey(), entry.getValue());
           }
+          return builder.build();
         }
-        counter.zero();
-        ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
-        builder.putAll(sourceMap);
-        return builder.build();
-      }
-    },
-    BUILDER_PUT_ALL_ENTRIES {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
-        builder.putAll(entries);
-        return builder.build();
-      }
-    },
-    FORCE_JDK {
-      @Override
-      ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter) {
-        ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
-        builder.putAll(entries);
-        return builder.buildJdkBacked();
-      }
-    };
+      },
+      BUILDER_PUT_ALL_MAP {
+        @Override
+        public ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries) {
+          Map<Object, Object> sourceMap = new LinkedHashMap<>();
+          for (Map.Entry<?, ?> entry : entries) {
+            if (sourceMap.put(entry.getKey(), entry.getValue()) != null) {
+              throw new UnsupportedOperationException("duplicate key");
+            }
+          }
+          ImmutableBiMap.Builder<Object, Object> builder = ImmutableBiMap.builder();
+          builder.putAll(sourceMap);
+          return builder.build();
+        }
+      },
+      BUILDER_PUT_ALL_ENTRIES {
+        @Override
+        public ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries) {
+          return ImmutableBiMap.builder().putAll(entries).build();
+        }
+      },
+      FORCE_JDK {
+        @Override
+        public ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries) {
+          return ImmutableBiMap.builder().putAll(entries).buildJdkBacked();
+        }
+      };
 
-    @CanIgnoreReturnValue
-    abstract ImmutableBiMap<?, ?> create(List<? extends Entry<?, ?>> entries, CallsCounter counter);
-  }
-
-  /**
-   * Returns a list of objects with the same hash code, of size 2^power, counting calls to equals,
-   * hashCode, and compareTo in counter.
-   */
-  static List<CountsHashCodeAndEquals> createAdversarialObjects(int power, CallsCounter counter) {
-    String str1 = "Aa";
-    String str2 = "BB";
-    assertEquals(str1.hashCode(), str2.hashCode());
-    List<String> haveSameHashes2 = Arrays.asList(str1, str2);
-    List<CountsHashCodeAndEquals> result =
-        Lists.newArrayList(
-            Lists.transform(
-                Lists.cartesianProduct(Collections.nCopies(power, haveSameHashes2)),
-                strs ->
-                    new CountsHashCodeAndEquals(
-                        String.join("", strs),
-                        () -> counter.hashCode++,
-                        () -> counter.equals++,
-                        () -> counter.compareTo++)));
-    assertEquals(
-        result.get(0).delegateString.hashCode(),
-        result.get(result.size() - 1).delegateString.hashCode());
-    return result;
-  }
-
-  enum AdversaryType {
-    ADVERSARIAL_KEYS {
-      @Override
-      List<? extends Entry<?, ?>> createAdversarialEntries(int power, CallsCounter counter) {
-        return createAdversarialObjects(power, counter).stream()
-            .map(k -> Maps.immutableEntry(k, new Object()))
-            .collect(toList());
-      }
-    },
-    ADVERSARIAL_VALUES {
-      @Override
-      List<? extends Entry<?, ?>> createAdversarialEntries(int power, CallsCounter counter) {
-        return createAdversarialObjects(power, counter).stream()
-            .map(k -> Maps.immutableEntry(new Object(), k))
-            .collect(toList());
-      }
-    },
-    ADVERSARIAL_KEYS_AND_VALUES {
-      @Override
-      List<? extends Entry<?, ?>> createAdversarialEntries(int power, CallsCounter counter) {
-        List<?> keys = createAdversarialObjects(power, counter);
-        List<?> values = createAdversarialObjects(power, counter);
-        return Streams.zip(keys.stream(), values.stream(), Maps::immutableEntry).collect(toList());
-      }
-    };
-
-    abstract List<? extends Entry<?, ?>> createAdversarialEntries(int power, CallsCounter counter);
-  }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingInConstruction() {
-    for (AdversaryType adversary : AdversaryType.values()) {
-      CallsCounter smallCounter = new CallsCounter();
-      List<? extends Entry<?, ?>> smallEntries =
-          adversary.createAdversarialEntries(10, smallCounter);
-      int smallSize = smallEntries.size();
-
-      CallsCounter largeCounter = new CallsCounter();
-      List<? extends Entry<?, ?>> largeEntries =
-          adversary.createAdversarialEntries(15, largeCounter);
-      int largeSize = largeEntries.size();
-
-      for (ConstructionPathway pathway : ConstructionPathway.values()) {
-        smallCounter.zero();
-        pathway.create(smallEntries, smallCounter);
-        long smallOps = smallCounter.total();
-
-        largeCounter.zero();
-        pathway.create(largeEntries, largeCounter);
-        long largeOps = largeCounter.total();
-
-        double ratio = (double) largeOps / smallOps;
-        assertThat(ratio)
-            .named(
-                "ratio of equals/hashCode/compareTo operations to build an ImmutableBiMap with %s"
-                    + " via %s with %s entries versus %s entries",
-                adversary, pathway, largeSize, smallSize)
-            .isAtMost(2 * (largeSize * Math.log(largeSize)) / (smallSize * Math.log(smallSize)));
-        // allow up to 2x wobble in the constant factors
-      }
+      @CanIgnoreReturnValue
+      public abstract ImmutableBiMap<Object, Object> create(List<Map.Entry<?, ?>> entries);
     }
   }
 
-  @GwtIncompatible
-  public void testResistsHashFloodingOnForwardGet() {
-    for (AdversaryType adversary : AdversaryType.values()) {
-      CallsCounter smallCounter = new CallsCounter();
-      List<? extends Entry<?, ?>> smallEntries =
-          adversary.createAdversarialEntries(10, smallCounter);
-      ImmutableBiMap<?, ?> smallMap =
-          ConstructionPathway.COPY_OF_ENTRIES.create(smallEntries, smallCounter);
-      int smallSize = smallEntries.size();
-      long smallOps = worstCaseQueryOperations(smallMap, smallCounter);
-
-      CallsCounter largeCounter = new CallsCounter();
-      List<? extends Entry<?, ?>> largeEntries =
-          adversary.createAdversarialEntries(15, largeCounter);
-      ImmutableBiMap<?, ?> largeMap =
-          ConstructionPathway.COPY_OF_ENTRIES.create(largeEntries, largeCounter);
-      int largeSize = largeEntries.size();
-      long largeOps = worstCaseQueryOperations(largeMap, largeCounter);
-
-      if (smallOps == 0 && largeOps == 0) {
-        continue; // no queries on the CHCAE objects
-      }
-
-      double ratio = (double) largeOps / smallOps;
-      assertThat(ratio)
-          .named(
-              "Ratio of worst case get operations for an ImmutableBiMap with %s of size "
-                  + "%s versus %s",
-              adversary, largeSize, smallSize)
-          .isAtMost(2 * Math.log(largeSize) / Math.log(smallSize));
-      // allow up to 2x wobble in the constant factors
-    }
-  }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingOnInverseGet() {
-    for (AdversaryType adversary : AdversaryType.values()) {
-      CallsCounter smallCounter = new CallsCounter();
-      List<? extends Entry<?, ?>> smallEntries =
-          adversary.createAdversarialEntries(10, smallCounter);
-      ImmutableBiMap<?, ?> smallMap =
-          ConstructionPathway.COPY_OF_ENTRIES.create(smallEntries, smallCounter);
-      int smallSize = smallEntries.size();
-      long smallOps = worstCaseQueryOperations(smallMap.inverse(), smallCounter);
-
-      CallsCounter largeCounter = new CallsCounter();
-      List<? extends Entry<?, ?>> largeEntries =
-          adversary.createAdversarialEntries(15, largeCounter);
-      ImmutableBiMap<?, ?> largeMap =
-          ConstructionPathway.COPY_OF_ENTRIES.create(largeEntries, largeCounter);
-      int largeSize = largeEntries.size();
-      long largeOps = worstCaseQueryOperations(largeMap.inverse(), largeCounter);
-
-      if (smallOps == 0 && largeOps == 0) {
-        continue; // no queries on the CHCAE objects
-      }
-      double ratio = (double) largeOps / smallOps;
-      assertThat(ratio)
-          .named(
-              "Ratio of worst case get operations for an ImmutableBiMap with %s of size "
-                  + "%s versus %s",
-              adversary, largeSize, smallSize)
-          .isAtMost(2 * Math.log(largeSize) / Math.log(smallSize));
-      // allow up to 2x wobble in the constant factors
-    }
-  }
-
-  private static long worstCaseQueryOperations(Map<?, ?> map, CallsCounter counter) {
-    long worstCalls = 0;
-    for (Object k : map.keySet()) {
-      counter.zero();
-      Object unused = map.get(k);
-      worstCalls = Math.max(worstCalls, counter.total());
-    }
-    return worstCalls;
-  }
+  /** No-op test so that the class has at least one method, making Maven's test runner happy. */
+  public void testNoop() {}
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
index c6395b4..34d1e21 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
@@ -51,7 +51,8 @@
 import com.google.common.testing.EqualsTester;
 import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.SerializableTester;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.AbstractMap;
 import java.util.Arrays;
@@ -62,12 +63,12 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Tests for {@link ImmutableMap}.
@@ -82,6 +83,7 @@
   public static Test suite() {
     TestSuite suite = new TestSuite();
     suite.addTestSuite(ImmutableMapTest.class);
+    suite.addTestSuite(FloodingTest.class);
 
     suite.addTest(
         MapTestSuiteBuilder.using(new ImmutableMapGenerator())
@@ -818,6 +820,119 @@
     assertTrue(reserializedValues instanceof ImmutableCollection);
   }
 
+  @GwtIncompatible // SerializableTester
+  public void testKeySetIsSerializable_regularImmutableMap() {
+    class NonSerializableClass {}
+
+    Map<String, NonSerializableClass> map =
+        RegularImmutableMap.fromEntries(ImmutableMap.entryOf("one", new NonSerializableClass()));
+    Set<String> set = map.keySet();
+
+    LenientSerializableTester.reserializeAndAssertLenient(set);
+  }
+
+  @GwtIncompatible // SerializableTester
+  public void testKeySetIsSerializable_jdkBackedImmutableMap() {
+    class NonSerializableClass {}
+
+    Entry<String, NonSerializableClass>[] entries =
+        arrayOf(ImmutableMap.entryOf("one", new NonSerializableClass()));
+
+    Map<String, NonSerializableClass> map = JdkBackedImmutableMap.create(1, entries);
+    Set<String> set = map.keySet();
+
+    LenientSerializableTester.reserializeAndAssertLenient(set);
+  }
+
+  @GwtIncompatible // SerializableTester
+  public void testValuesCollectionIsSerializable_regularImmutableMap() {
+    class NonSerializableClass {}
+
+    Map<NonSerializableClass, String> map =
+        RegularImmutableMap.fromEntries(ImmutableMap.entryOf(new NonSerializableClass(), "value"));
+    Collection<String> collection = map.values();
+
+    LenientSerializableTester.reserializeAndAssertElementsEqual(collection);
+  }
+
+  @GwtIncompatible // SerializableTester
+  public void testValuesCollectionIsSerializable_jdkBackedImmutableMap() {
+    class NonSerializableClass {}
+
+    Entry<NonSerializableClass, String>[] entries =
+        arrayOf(ImmutableMap.entryOf(new NonSerializableClass(), "value"));
+
+    Map<NonSerializableClass, String> map = JdkBackedImmutableMap.create(1, entries);
+    Collection<String> collection = map.values();
+
+    LenientSerializableTester.reserializeAndAssertElementsEqual(collection);
+  }
+
+  // TODO: Re-enable this test after moving to new serialization format in ImmutableMap.
+  @GwtIncompatible // SerializableTester
+  @SuppressWarnings("unchecked")
+  public void ignore_testSerializationNoDuplication_regularImmutableMap() throws Exception {
+    // Tests that searializing a map, its keySet, and values only writes the underlying data once.
+
+    Entry<Integer, Integer>[] entries = (Entry<Integer, Integer>[]) new Entry<?, ?>[1000];
+    for (int i = 0; i < 1000; i++) {
+      entries[i] = ImmutableMap.entryOf(i, i);
+    }
+
+    ImmutableMap<Integer, Integer> map = RegularImmutableMap.fromEntries(entries);
+    Set<Integer> keySet = map.keySet();
+    Collection<Integer> values = map.values();
+
+    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+    ObjectOutputStream oos = new ObjectOutputStream(bytes);
+    oos.writeObject(map);
+    oos.flush();
+
+    int mapSize = bytes.size();
+    oos.writeObject(keySet);
+    oos.writeObject(values);
+    oos.close();
+
+    int finalSize = bytes.size();
+
+    assertThat(finalSize - mapSize).isLessThan(100);
+  }
+
+  // TODO: Re-enable this test after moving to new serialization format in ImmutableMap.
+  @GwtIncompatible // SerializableTester
+  @SuppressWarnings("unchecked")
+  public void ignore_testSerializationNoDuplication_jdkBackedImmutableMap() throws Exception {
+    // Tests that searializing a map, its keySet, and values only writes
+    // the underlying data once.
+
+    Entry<Integer, Integer>[] entries = (Entry<Integer, Integer>[]) new Entry<?, ?>[1000];
+    for (int i = 0; i < 1000; i++) {
+      entries[i] = ImmutableMap.entryOf(i, i);
+    }
+
+    ImmutableMap<Integer, Integer> map = JdkBackedImmutableMap.create(entries.length, entries);
+    Set<Integer> keySet = map.keySet();
+    Collection<Integer> values = map.values();
+
+    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+    ObjectOutputStream oos = new ObjectOutputStream(bytes);
+    oos.writeObject(map);
+    oos.flush();
+
+    int mapSize = bytes.size();
+    oos.writeObject(keySet);
+    oos.writeObject(values);
+    oos.close();
+
+    int finalSize = bytes.size();
+
+    assertThat(finalSize - mapSize).isLessThan(100);
+  }
+
+  private static <T> T[] arrayOf(T... objs) {
+    return objs;
+  }
+
   @GwtIncompatible("assumptions about splitting")
   public void testKeySetSplittable() {
     ImmutableMap<Integer, Integer> map =
@@ -846,230 +961,6 @@
         .testEquals();
   }
 
-  /**
-   * A Comparable wrapper around a String which executes callbacks on calls to hashCode, equals, and
-   * compareTo.
-   */
-  private static class CountsHashCodeAndEquals implements Comparable<CountsHashCodeAndEquals> {
-    private final String delegateString;
-    private final Runnable onHashCode;
-    private final Runnable onEquals;
-    private final Runnable onCompareTo;
-
-    CountsHashCodeAndEquals(
-        String delegateString, Runnable onHashCode, Runnable onEquals, Runnable onCompareTo) {
-      this.delegateString = delegateString;
-      this.onHashCode = onHashCode;
-      this.onEquals = onEquals;
-      this.onCompareTo = onCompareTo;
-    }
-
-    @Override
-    public int hashCode() {
-      onHashCode.run();
-      return delegateString.hashCode();
-    }
-
-    @Override
-    public boolean equals(@Nullable Object other) {
-      onEquals.run();
-      return other instanceof CountsHashCodeAndEquals
-          && delegateString.equals(((CountsHashCodeAndEquals) other).delegateString);
-    }
-
-    @Override
-    public int compareTo(CountsHashCodeAndEquals o) {
-      onCompareTo.run();
-      return delegateString.compareTo(o.delegateString);
-    }
-  }
-
-  /** A holder of counters for calls to hashCode, equals, and compareTo. */
-  private static final class CallsCounter {
-    long hashCode;
-    long equals;
-    long compareTo;
-
-    long total() {
-      return hashCode + equals + compareTo;
-    }
-
-    void zero() {
-      hashCode = 0;
-      equals = 0;
-      compareTo = 0;
-    }
-  }
-
-  /** All the ways to create an ImmutableMap. */
-  enum ConstructionPathway {
-    COPY_OF_MAP {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        Map<Object, Object> sourceMap = new LinkedHashMap<>();
-        for (Object k : keys) {
-          if (sourceMap.put(k, value) != null) {
-            throw new UnsupportedOperationException("duplicate key");
-          }
-        }
-        counter.zero();
-        return ImmutableMap.copyOf(sourceMap);
-      }
-    },
-    COPY_OF_ENTRIES {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        return ImmutableMap.copyOf(Lists.transform(keys, k -> Maps.immutableEntry(k, value)));
-      }
-    },
-    BUILDER_PUT_ONE_BY_ONE {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
-        for (Object k : keys) {
-          builder.put(k, value);
-        }
-        return builder.build();
-      }
-    },
-    BUILDER_PUT_ENTRIES_ONE_BY_ONE {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
-        for (Object k : keys) {
-          builder.put(Maps.immutableEntry(k, value));
-        }
-        return builder.build();
-      }
-    },
-    BUILDER_PUT_ALL_MAP {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        Map<Object, Object> sourceMap = new LinkedHashMap<>();
-        for (Object k : keys) {
-          if (sourceMap.put(k, value) != null) {
-            throw new UnsupportedOperationException("duplicate key");
-          }
-        }
-        counter.zero();
-        return ImmutableMap.builder().putAll(sourceMap).build();
-      }
-    },
-    BUILDER_PUT_ALL_ENTRIES {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        return ImmutableMap.builder()
-            .putAll(Lists.transform(keys, k -> Maps.immutableEntry(k, value)))
-            .build();
-      }
-    },
-    FORCE_JDK {
-      @Override
-      ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter) {
-        ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
-        for (Object k : keys) {
-          builder.put(k, value);
-        }
-        return builder.buildJdkBacked();
-      }
-    };
-
-    @CanIgnoreReturnValue
-    abstract ImmutableMap<?, ?> create(List<?> keys, Object value, CallsCounter counter);
-  }
-
-  /**
-   * Returns a list of objects with the same hash code, of size 2^power, counting calls to equals,
-   * hashCode, and compareTo in counter.
-   */
-  static List<CountsHashCodeAndEquals> createAdversarialInput(int power, CallsCounter counter) {
-    String str1 = "Aa";
-    String str2 = "BB";
-    assertEquals(str1.hashCode(), str2.hashCode());
-    List<String> haveSameHashes2 = Arrays.asList(str1, str2);
-    List<CountsHashCodeAndEquals> result =
-        Lists.newArrayList(
-            Lists.transform(
-                Lists.cartesianProduct(Collections.nCopies(power, haveSameHashes2)),
-                strs ->
-                    new CountsHashCodeAndEquals(
-                        String.join("", strs),
-                        () -> counter.hashCode++,
-                        () -> counter.equals++,
-                        () -> counter.compareTo++)));
-    assertEquals(
-        result.get(0).delegateString.hashCode(),
-        result.get(result.size() - 1).delegateString.hashCode());
-    return result;
-  }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingInConstruction() {
-    CallsCounter smallCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
-    int smallSize = haveSameHashesSmall.size();
-
-    CallsCounter largeCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
-    int largeSize = haveSameHashesLarge.size();
-
-    for (ConstructionPathway pathway : ConstructionPathway.values()) {
-      smallCounter.zero();
-      pathway.create(haveSameHashesSmall, "valueObject", smallCounter);
-      long smallOps = smallCounter.total();
-
-      largeCounter.zero();
-      pathway.create(haveSameHashesLarge, "valueObject", largeCounter);
-      long largeOps = largeCounter.total();
-
-      double ratio = (double) largeOps / smallOps;
-      assertThat(ratio)
-          .named(
-              "ratio of equals/hashCode/compareTo operations to build an ImmutableMap via %s"
-                  + " with %s entries versus %s entries",
-              pathway, largeSize, smallSize)
-          .isAtMost(2 * (largeSize * Math.log(largeSize)) / (smallSize * Math.log(smallSize)));
-      // allow up to 2x wobble in the constant factors
-    }
-  }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingOnGet() {
-    CallsCounter smallCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
-    int smallSize = haveSameHashesSmall.size();
-    ImmutableMap<?, ?> smallMap =
-        ConstructionPathway.BUILDER_PUT_ONE_BY_ONE.create(
-            haveSameHashesSmall, "valueObject", smallCounter);
-    long worstCaseQuerySmall = worstCaseQueryOperations(smallMap, smallCounter);
-
-    CallsCounter largeCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
-    int largeSize = haveSameHashesLarge.size();
-    ImmutableMap<?, ?> largeMap =
-        ConstructionPathway.BUILDER_PUT_ONE_BY_ONE.create(
-            haveSameHashesLarge, "valueObject", largeCounter);
-    long worstCaseQueryLarge = worstCaseQueryOperations(largeMap, largeCounter);
-
-    double ratio = (double) worstCaseQueryLarge / worstCaseQuerySmall;
-    assertThat(ratio)
-        .named(
-            "Ratio of worst case query operations for an ImmutableMap of size %s versus %s",
-            largeSize, smallSize)
-        .isAtMost(2 * Math.log(largeSize) / Math.log(smallSize));
-    // allow up to 2x wobble in the constant factors
-  }
-
-  private static long worstCaseQueryOperations(Map<?, ?> map, CallsCounter counter) {
-    long worstCalls = 0;
-    for (Object k : map.keySet()) {
-      counter.zero();
-      Object unused = map.get(k);
-      worstCalls = Math.max(worstCalls, counter.total());
-    }
-    return worstCalls;
-  }
-
   public void testCopyOfMutableEntryList() {
     List<Entry<String, String>> entryList =
         Arrays.asList(
@@ -1101,4 +992,86 @@
     entryList.get(0).setValue("3");
     assertThat(map).containsExactly("a", "1", "b", "2").inOrder();
   }
+
+  public static class FloodingTest extends AbstractHashFloodingTest<Map<Object, Object>> {
+    public FloodingTest() {
+      super(
+          Arrays.asList(ConstructionPathway.values()),
+          n -> n * Math.log(n),
+          ImmutableList.of(QueryOp.MAP_GET));
+    }
+
+    /** All the ways to create an ImmutableMap. */
+    enum ConstructionPathway implements Construction<Map<Object, Object>> {
+      COPY_OF_MAP {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          Map<Object, Object> sourceMap = new LinkedHashMap<>();
+          for (Object k : keys) {
+            if (sourceMap.put(k, "dummy value") != null) {
+              throw new UnsupportedOperationException("duplicate key");
+            }
+          }
+          return ImmutableMap.copyOf(sourceMap);
+        }
+      },
+      COPY_OF_ENTRIES {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          return ImmutableMap.copyOf(
+              Lists.transform(keys, k -> Maps.immutableEntry(k, "dummy value")));
+        }
+      },
+      BUILDER_PUT_ONE_BY_ONE {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
+          for (Object k : keys) {
+            builder.put(k, "dummy value");
+          }
+          return builder.build();
+        }
+      },
+      BUILDER_PUT_ENTRIES_ONE_BY_ONE {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
+          for (Object k : keys) {
+            builder.put(Maps.immutableEntry(k, "dummy value"));
+          }
+          return builder.build();
+        }
+      },
+      BUILDER_PUT_ALL_MAP {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          Map<Object, Object> sourceMap = new LinkedHashMap<>();
+          for (Object k : keys) {
+            if (sourceMap.put(k, "dummy value") != null) {
+              throw new UnsupportedOperationException("duplicate key");
+            }
+          }
+          return ImmutableMap.builder().putAll(sourceMap).build();
+        }
+      },
+      BUILDER_PUT_ALL_ENTRIES {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          return ImmutableMap.builder()
+              .putAll(Lists.transform(keys, k -> Maps.immutableEntry(k, "dummy value")))
+              .build();
+        }
+      },
+      FORCE_JDK {
+        @Override
+        public Map<Object, Object> create(List<?> keys) {
+          ImmutableMap.Builder<Object, Object> builder = ImmutableMap.builder();
+          for (Object k : keys) {
+            builder.put(k, "dummy value");
+          }
+          return builder.buildJdkBacked();
+        }
+      };
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableMultisetTest.java b/guava-tests/test/com/google/common/collect/ImmutableMultisetTest.java
index 07223b8..3cb6d75 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableMultisetTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableMultisetTest.java
@@ -40,7 +40,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -50,7 +49,6 @@
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Tests for {@link ImmutableMultiset}.
@@ -64,6 +62,7 @@
   public static Test suite() {
     TestSuite suite = new TestSuite();
     suite.addTestSuite(ImmutableMultisetTest.class);
+    suite.addTestSuite(FloodingTest.class);
 
     suite.addTest(
         MultisetTestSuiteBuilder.using(
@@ -669,185 +668,56 @@
     assertThat(multiset.elementSet()).containsExactly("a", "c").inOrder();
   }
 
-  /**
-   * A Comparable wrapper around a String which executes callbacks on calls to hashCode, equals, and
-   * compareTo.
-   */
-  private static class CountsHashCodeAndEquals implements Comparable<CountsHashCodeAndEquals> {
-    private final String delegateString;
-    private final Runnable onHashCode;
-    private final Runnable onEquals;
-    private final Runnable onCompareTo;
-
-    CountsHashCodeAndEquals(
-        String delegateString, Runnable onHashCode, Runnable onEquals, Runnable onCompareTo) {
-      this.delegateString = delegateString;
-      this.onHashCode = onHashCode;
-      this.onEquals = onEquals;
-      this.onCompareTo = onCompareTo;
+  public static class FloodingTest extends AbstractHashFloodingTest<Multiset<Object>> {
+    public FloodingTest() {
+      super(
+          Arrays.asList(ConstructionPathway.values()),
+          n -> n * Math.log(n),
+          ImmutableList.of(
+              QueryOp.create(
+                  "count",
+                  (ms, o) -> {
+                    int unused = ms.count(o);
+                  },
+                  Math::log)));
     }
 
-    @Override
-    public int hashCode() {
-      onHashCode.run();
-      return delegateString.hashCode();
-    }
-
-    @Override
-    public boolean equals(@Nullable Object other) {
-      onEquals.run();
-      return other instanceof CountsHashCodeAndEquals
-          && delegateString.equals(((CountsHashCodeAndEquals) other).delegateString);
-    }
-
-    @Override
-    public int compareTo(CountsHashCodeAndEquals o) {
-      onCompareTo.run();
-      return delegateString.compareTo(o.delegateString);
-    }
-  }
-
-  /** A holder of counters for calls to hashCode, equals, and compareTo. */
-  private static final class CallsCounter {
-    long hashCode;
-    long equals;
-    long compareTo;
-
-    long total() {
-      return hashCode + equals + compareTo;
-    }
-
-    void zero() {
-      hashCode = 0;
-      equals = 0;
-      compareTo = 0;
-    }
-  }
-
-  /** All the ways to create an ImmutableMultiset. */
-  enum ConstructionPathway {
-    COPY_OF_COLLECTION {
-      @Override
-      ImmutableMultiset<?> create(List<?> keys) {
-        return ImmutableMultiset.copyOf(keys);
-      }
-    },
-    COPY_OF_ITERATOR {
-      @Override
-      ImmutableMultiset<?> create(List<?> keys) {
-        return ImmutableMultiset.copyOf(keys.iterator());
-      }
-    },
-    BUILDER_ADD_ENTRY_BY_ENTRY {
-      @Override
-      ImmutableMultiset<?> create(List<?> keys) {
-        ImmutableMultiset.Builder<Object> builder = ImmutableMultiset.builder();
-        for (Object o : keys) {
-          builder.add(o);
+    /** All the ways to create an ImmutableMultiset. */
+    enum ConstructionPathway implements Construction<Multiset<Object>> {
+      COPY_OF_COLLECTION {
+        @Override
+        public ImmutableMultiset<Object> create(List<?> keys) {
+          return ImmutableMultiset.copyOf(keys);
         }
-        return builder.build();
-      }
-    },
-    BUILDER_ADD_ALL_COLLECTION {
+      },
+      COPY_OF_ITERATOR {
+        @Override
+        public ImmutableMultiset<Object> create(List<?> keys) {
+          return ImmutableMultiset.copyOf(keys.iterator());
+        }
+      },
+      BUILDER_ADD_ENTRY_BY_ENTRY {
+        @Override
+        public ImmutableMultiset<Object> create(List<?> keys) {
+          ImmutableMultiset.Builder<Object> builder = ImmutableMultiset.builder();
+          for (Object o : keys) {
+            builder.add(o);
+          }
+          return builder.build();
+        }
+      },
+      BUILDER_ADD_ALL_COLLECTION {
+        @Override
+        public ImmutableMultiset<Object> create(List<?> keys) {
+          ImmutableMultiset.Builder<Object> builder = ImmutableMultiset.builder();
+          builder.addAll(keys);
+          return builder.build();
+        }
+      };
+
+      @CanIgnoreReturnValue
       @Override
-      ImmutableMultiset<?> create(List<?> keys) {
-        ImmutableMultiset.Builder<Object> builder = ImmutableMultiset.builder();
-        builder.addAll(keys);
-        return builder.build();
-      }
-    };
-
-    @CanIgnoreReturnValue
-    abstract ImmutableMultiset<?> create(List<?> keys);
-  }
-
-  /**
-   * Returns a list of objects with the same hash code, of size 2^power, counting calls to equals,
-   * hashCode, and compareTo in counter.
-   */
-  static List<CountsHashCodeAndEquals> createAdversarialInput(int power, CallsCounter counter) {
-    String str1 = "Aa";
-    String str2 = "BB";
-    assertEquals(str1.hashCode(), str2.hashCode());
-    List<String> haveSameHashes2 = Arrays.asList(str1, str2);
-    List<CountsHashCodeAndEquals> result =
-        Lists.newArrayList(
-            Lists.transform(
-                Lists.cartesianProduct(Collections.nCopies(power, haveSameHashes2)),
-                strs ->
-                    new CountsHashCodeAndEquals(
-                        String.join("", strs),
-                        () -> counter.hashCode++,
-                        () -> counter.equals++,
-                        () -> counter.compareTo++)));
-    assertEquals(
-        result.get(0).delegateString.hashCode(),
-        result.get(result.size() - 1).delegateString.hashCode());
-    return result;
-  }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingInConstruction() {
-    CallsCounter smallCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
-    int smallSize = haveSameHashesSmall.size();
-
-    CallsCounter largeCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
-    int largeSize = haveSameHashesLarge.size();
-
-    for (ConstructionPathway pathway : ConstructionPathway.values()) {
-      smallCounter.zero();
-      pathway.create(haveSameHashesSmall);
-      long smallOps = smallCounter.total();
-
-      largeCounter.zero();
-      pathway.create(haveSameHashesLarge);
-      long largeOps = largeCounter.total();
-
-      double ratio = (double) largeOps / smallOps;
-      assertThat(ratio)
-          .named(
-              "ratio of equals/hashCode/compareTo operations to build an ImmutableMultiset via %s"
-                  + " with %s entries versus %s entries",
-              pathway, largeSize, smallSize)
-          .isAtMost(2 * (largeSize * Math.log(largeSize)) / (smallSize * Math.log(smallSize)));
-      // allow up to 2x wobble in the constant factors
+      public abstract ImmutableMultiset<Object> create(List<?> keys);
     }
   }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingOnCount() {
-    CallsCounter smallCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
-    int smallSize = haveSameHashesSmall.size();
-    ImmutableMultiset<?> smallMap =
-        ConstructionPathway.COPY_OF_COLLECTION.create(haveSameHashesSmall);
-    long worstCaseQuerySmall = worstCaseQueryOperations(smallMap, smallCounter);
-
-    CallsCounter largeCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
-    int largeSize = haveSameHashesLarge.size();
-    ImmutableMultiset<?> largeMap =
-        ConstructionPathway.COPY_OF_COLLECTION.create(haveSameHashesLarge);
-    long worstCaseQueryLarge = worstCaseQueryOperations(largeMap, largeCounter);
-
-    double ratio = (double) worstCaseQueryLarge / worstCaseQuerySmall;
-    assertThat(ratio)
-        .named(
-            "Ratio of worst case query operations for an ImmutableMultiset of size %s versus %s",
-            largeSize, smallSize)
-        .isAtMost(2 * Math.log(largeSize) / Math.log(smallSize));
-    // allow up to 2x wobble in the constant factors
-  }
-
-  private static long worstCaseQueryOperations(Multiset<?> multiset, CallsCounter counter) {
-    long worstCalls = 0;
-    for (Object k : multiset.elementSet()) {
-      counter.zero();
-      int unused = multiset.count(k);
-      worstCalls = Math.max(worstCalls, counter.total());
-    }
-    return worstCalls;
-  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSetTest.java b/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
index 6a38fcd..06d6a8e 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
@@ -37,7 +37,6 @@
 import com.google.common.collect.testing.google.SetGenerators.ImmutableSetWithBadHashesGenerator;
 import com.google.common.testing.CollectorTester;
 import com.google.common.testing.EqualsTester;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -48,7 +47,6 @@
 import java.util.stream.Collector;
 import junit.framework.Test;
 import junit.framework.TestSuite;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Unit test for {@link ImmutableSet}.
@@ -162,6 +160,7 @@
             .createTestSuite());
 
     suite.addTestSuite(ImmutableSetTest.class);
+    suite.addTestSuite(FloodingTest.class);
 
     return suite;
   }
@@ -379,206 +378,80 @@
         .testEquals();
   }
 
-  /**
-   * A Comparable wrapper around a String which executes callbacks on calls to hashCode, equals, and
-   * compareTo.
-   */
-  private static class CountsHashCodeAndEquals implements Comparable<CountsHashCodeAndEquals> {
-    private final String delegateString;
-    private final Runnable onHashCode;
-    private final Runnable onEquals;
-    private final Runnable onCompareTo;
-
-    CountsHashCodeAndEquals(
-        String delegateString, Runnable onHashCode, Runnable onEquals, Runnable onCompareTo) {
-      this.delegateString = delegateString;
-      this.onHashCode = onHashCode;
-      this.onEquals = onEquals;
-      this.onCompareTo = onCompareTo;
-    }
-
-    @Override
-    public int hashCode() {
-      onHashCode.run();
-      return delegateString.hashCode();
-    }
-
-    @Override
-    public boolean equals(@Nullable Object other) {
-      onEquals.run();
-      return other instanceof CountsHashCodeAndEquals
-          && delegateString.equals(((CountsHashCodeAndEquals) other).delegateString);
-    }
-
-    @Override
-    public int compareTo(CountsHashCodeAndEquals o) {
-      onCompareTo.run();
-      return delegateString.compareTo(o.delegateString);
-    }
+  public void testReuseBuilderReducingHashTableSizeWithPowerOfTwoTotalElements() {
+    ImmutableSet.Builder<Object> builder = ImmutableSet.builderWithExpectedSize(6);
+    builder.add(0);
+    ImmutableSet<Object> unused = builder.build();
+    ImmutableSet<Object> subject = builder.add(1).add(2).add(3).build();
+    assertFalse(subject.contains(4));
   }
 
-  /** A holder of counters for calls to hashCode, equals, and compareTo. */
-  private static final class CallsCounter {
-    long hashCode;
-    long equals;
-    long compareTo;
-
-    long total() {
-      return hashCode + equals + compareTo;
+  public static class FloodingTest extends AbstractHashFloodingTest<Set<Object>> {
+    public FloodingTest() {
+      super(
+          Arrays.asList(ConstructionPathway.values()),
+          n -> n * Math.log(n),
+          ImmutableList.of(
+              QueryOp.create(
+                  "contains",
+                  (s, o) -> {
+                    boolean unused = s.contains(o);
+                  },
+                  Math::log)));
     }
-
-    void zero() {
-      hashCode = 0;
-      equals = 0;
-      compareTo = 0;
-    }
-  }
-
-  /** All the ways to construct an ImmutableSet. */
-  enum ConstructionPathway {
-    OF {
-      @Override
-      ImmutableSet<?> create(List<?> list) {
-        Object o1 = list.get(0);
-        Object o2 = list.get(1);
-        Object o3 = list.get(2);
-        Object o4 = list.get(3);
-        Object o5 = list.get(4);
-        Object o6 = list.get(5);
-        Object[] rest = list.subList(6, list.size()).toArray();
-        return ImmutableSet.of(o1, o2, o3, o4, o5, o6, rest);
-      }
-    },
-    COPY_OF_ARRAY {
-      @Override
-      ImmutableSet<?> create(List<?> list) {
-        return ImmutableSet.copyOf(list.toArray());
-      }
-    },
-    COPY_OF_LIST {
-      @Override
-      ImmutableSet<?> create(List<?> list) {
-        return ImmutableSet.copyOf(list);
-      }
-    },
-    BUILDER_ADD_ONE_BY_ONE {
-      @Override
-      ImmutableSet<?> create(List<?> list) {
-        ImmutableSet.Builder<Object> builder = ImmutableSet.builder();
-        for (Object o : list) {
-          builder.add(o);
+    /** All the ways to construct an ImmutableSet. */
+    enum ConstructionPathway implements Construction<Set<Object>> {
+      OF {
+        @Override
+        public ImmutableSet<Object> create(List<?> list) {
+          Object o1 = list.get(0);
+          Object o2 = list.get(1);
+          Object o3 = list.get(2);
+          Object o4 = list.get(3);
+          Object o5 = list.get(4);
+          Object o6 = list.get(5);
+          Object[] rest = list.subList(6, list.size()).toArray();
+          return ImmutableSet.of(o1, o2, o3, o4, o5, o6, rest);
         }
-        return builder.build();
-      }
-    },
-    BUILDER_ADD_ARRAY {
-      @Override
-      ImmutableSet<?> create(List<?> list) {
-        ImmutableSet.Builder<Object> builder = ImmutableSet.builder();
-        builder.add(list.toArray());
-        return builder.build();
-      }
-    },
-    BUILDER_ADD_LIST {
-      @Override
-      ImmutableSet<?> create(List<?> list) {
-        ImmutableSet.Builder<Object> builder = ImmutableSet.builder();
-        builder.addAll(list);
-        return builder.build();
-      }
-    };
-
-    @CanIgnoreReturnValue
-    abstract ImmutableSet<?> create(List<?> list);
-  }
-
-  /**
-   * Returns a list of objects with the same hash code, of size 2^power, counting calls to equals,
-   * hashCode, and compareTo in counter.
-   */
-  static List<CountsHashCodeAndEquals> createAdversarialInput(int power, CallsCounter counter) {
-    String str1 = "Aa";
-    String str2 = "BB";
-    assertEquals(str1.hashCode(), str2.hashCode());
-    List<String> haveSameHashes2 = Arrays.asList(str1, str2);
-    List<CountsHashCodeAndEquals> result =
-        Lists.newArrayList(
-            Lists.transform(
-                Lists.cartesianProduct(Collections.nCopies(power, haveSameHashes2)),
-                strs ->
-                    new CountsHashCodeAndEquals(
-                        String.join("", strs),
-                        () -> counter.hashCode++,
-                        () -> counter.equals++,
-                        () -> counter.compareTo++)));
-    assertEquals(
-        result.get(0).delegateString.hashCode(),
-        result.get(result.size() - 1).delegateString.hashCode());
-    return result;
-  }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingInConstruction() {
-    CallsCounter smallCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
-    int smallSize = haveSameHashesSmall.size();
-
-    CallsCounter largeCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
-    int largeSize = haveSameHashesLarge.size();
-
-    for (ConstructionPathway pathway : ConstructionPathway.values()) {
-      smallCounter.zero();
-      pathway.create(haveSameHashesSmall);
-
-      largeCounter.zero();
-      pathway.create(haveSameHashesLarge);
-
-      double ratio = (double) largeCounter.total() / smallCounter.total();
-
-      assertThat(ratio)
-          .named(
-              "ratio of equals/hashCode/compareTo operations to build an ImmutableSet via pathway "
-                  + "%s of size %s versus size %s",
-              pathway, haveSameHashesLarge.size(), haveSameHashesSmall.size())
-          .isAtMost(2.0 * (largeSize * Math.log(largeSize)) / (smallSize * Math.log(smallSize)));
-      // We allow up to 2x wobble in the constant factors.
+      },
+      COPY_OF_ARRAY {
+        @Override
+        public ImmutableSet<Object> create(List<?> list) {
+          return ImmutableSet.copyOf(list.toArray());
+        }
+      },
+      COPY_OF_LIST {
+        @Override
+        public ImmutableSet<Object> create(List<?> list) {
+          return ImmutableSet.copyOf(list);
+        }
+      },
+      BUILDER_ADD_ONE_BY_ONE {
+        @Override
+        public ImmutableSet<Object> create(List<?> list) {
+          ImmutableSet.Builder<Object> builder = ImmutableSet.builder();
+          for (Object o : list) {
+            builder.add(o);
+          }
+          return builder.build();
+        }
+      },
+      BUILDER_ADD_ARRAY {
+        @Override
+        public ImmutableSet<Object> create(List<?> list) {
+          ImmutableSet.Builder<Object> builder = ImmutableSet.builder();
+          builder.add(list.toArray());
+          return builder.build();
+        }
+      },
+      BUILDER_ADD_LIST {
+        @Override
+        public ImmutableSet<Object> create(List<?> list) {
+          ImmutableSet.Builder<Object> builder = ImmutableSet.builder();
+          builder.addAll(list);
+          return builder.build();
+        }
+      };
     }
   }
-
-  @GwtIncompatible
-  public void testResistsHashFloodingOnContains() {
-    CallsCounter smallCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesSmall = createAdversarialInput(10, smallCounter);
-    ImmutableSet<?> smallSet = ConstructionPathway.COPY_OF_LIST.create(haveSameHashesSmall);
-    long worstCaseOpsSmall = worstCaseQueryOperations(smallSet, smallCounter);
-
-    CallsCounter largeCounter = new CallsCounter();
-    List<CountsHashCodeAndEquals> haveSameHashesLarge = createAdversarialInput(15, largeCounter);
-    ImmutableSet<?> largeSet = ConstructionPathway.COPY_OF_LIST.create(haveSameHashesLarge);
-    long worstCaseOpsLarge = worstCaseQueryOperations(largeSet, largeCounter);
-
-    double ratio = (double) worstCaseOpsLarge / worstCaseOpsSmall;
-    int smallSize = haveSameHashesSmall.size();
-    int largeSize = haveSameHashesLarge.size();
-
-    assertThat(ratio)
-        .named(
-            "ratio of equals/hashCode/compareTo operations to worst-case query an ImmutableSet "
-                + "of size %s versus size %s",
-            haveSameHashesLarge.size(), haveSameHashesSmall.size())
-        .isAtMost(2 * Math.log(largeSize) / Math.log(smallSize));
-    // We allow up to 2x wobble in the constant factors.
-  }
-
-  private static long worstCaseQueryOperations(Set<?> set, CallsCounter counter) {
-    long worstCalls = 0;
-    for (Object k : set) {
-      counter.zero();
-      if (set.contains(k)) {
-        worstCalls = Math.max(worstCalls, counter.total());
-      }
-    }
-    return worstCalls;
-  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java b/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
index 03f9af7..1f45227 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
@@ -1081,6 +1081,44 @@
     }
   }
 
+  public void testFloor_emptySet() {
+    ImmutableSortedSet<String> set = ImmutableSortedSet.copyOf(new String[] {});
+    assertThat(set.floor("f")).isNull();
+  }
+
+  public void testFloor_elementPresent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "a", "e", "f", "b", "i", "d", "a", "c", "k"});
+    assertThat(set.floor("f")).isEqualTo("f");
+    assertThat(set.floor("j")).isEqualTo("i");
+    assertThat(set.floor("q")).isEqualTo("k");
+  }
+
+  public void testFloor_elementAbsent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "e", "f", "b", "i", "d", "c", "k"});
+    assertThat(set.floor("a")).isNull();
+  }
+
+  public void testCeiling_emptySet() {
+    ImmutableSortedSet<String> set = ImmutableSortedSet.copyOf(new String[] {});
+    assertThat(set.ceiling("f")).isNull();
+  }
+
+  public void testCeiling_elementPresent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "e", "f", "f", "i", "d", "c", "k", "p", "c"});
+    assertThat(set.ceiling("f")).isEqualTo("f");
+    assertThat(set.ceiling("h")).isEqualTo("i");
+    assertThat(set.ceiling("a")).isEqualTo("c");
+  }
+
+  public void testCeiling_elementAbsent() {
+    ImmutableSortedSet<String> set =
+        ImmutableSortedSet.copyOf(new String[] {"e", "a", "e", "f", "b", "i", "d", "a", "c", "k"});
+    assertThat(set.ceiling("l")).isNull();
+  }
+
   public void testSubSetExclusiveExclusive() {
     String[] strings = NUMBER_NAMES.toArray(new String[0]);
     ImmutableSortedSet<String> set = ImmutableSortedSet.copyOf(strings);
diff --git a/guava-tests/test/com/google/common/collect/IteratorsTest.java b/guava-tests/test/com/google/common/collect/IteratorsTest.java
index afe22b8..15f7ccc 100644
--- a/guava-tests/test/com/google/common/collect/IteratorsTest.java
+++ b/guava-tests/test/com/google/common/collect/IteratorsTest.java
@@ -1279,8 +1279,7 @@
   }
 
   private static Enumeration<Integer> enumerate(Integer... ints) {
-    Vector<Integer> vector = new Vector<>();
-    vector.addAll(asList(ints));
+    Vector<Integer> vector = new Vector<>(asList(ints));
     return vector.elements();
   }
 
diff --git a/guava-tests/test/com/google/common/collect/LenientSerializableTester.java b/guava-tests/test/com/google/common/collect/LenientSerializableTester.java
index 03b35e0..ce3ec9d 100644
--- a/guava-tests/test/com/google/common/collect/LenientSerializableTester.java
+++ b/guava-tests/test/com/google/common/collect/LenientSerializableTester.java
@@ -24,6 +24,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.testing.SerializableTester;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.Collection;
 import java.util.Set;
 
 /**
@@ -60,5 +61,14 @@
     return copy;
   }
 
+  @CanIgnoreReturnValue
+  @GwtIncompatible // SerializableTester
+  static <E> Collection<E> reserializeAndAssertElementsEqual(Collection<E> original) {
+    Collection<E> copy = reserialize(original);
+    assertTrue(Iterables.elementsEqual(original, copy));
+    assertTrue(copy instanceof ImmutableCollection);
+    return copy;
+  }
+
   private LenientSerializableTester() {}
 }
diff --git a/guava-tests/test/com/google/common/collect/ListsImplTest.java b/guava-tests/test/com/google/common/collect/ListsImplTest.java
index 5edbbcc..1569ba5 100644
--- a/guava-tests/test/com/google/common/collect/ListsImplTest.java
+++ b/guava-tests/test/com/google/common/collect/ListsImplTest.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 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;
@@ -138,7 +139,7 @@
     List<Object> unEqualItems =
         Arrays.asList(outOfOrder, diffValue, diffLength, empty, null, new Object());
     for (Object other : unEqualItems) {
-      assertThat(Lists.equalsImpl(base, other)).named("%s", other).isFalse();
+      assertWithMessage("%s", other).that(Lists.equalsImpl(base, other)).isFalse();
     }
   }
 
@@ -167,11 +168,11 @@
       int index = indexes.get(i);
       Iterable<String> iterableToAdd = toAdd.get(i);
       boolean expectedChanged = iterableToAdd.iterator().hasNext();
-      assertThat(Lists.addAllImpl(toTest, index, iterableToAdd))
-          .named(format, iterableToAdd, index)
+      assertWithMessage(format, iterableToAdd, index)
+          .that(Lists.addAllImpl(toTest, index, iterableToAdd))
           .isEqualTo(expectedChanged);
-      assertThat(toTest)
-          .named(format, iterableToAdd, index)
+      assertWithMessage(format, iterableToAdd, index)
+          .that(toTest)
           .containsExactlyElementsIn(expected.get(i));
     }
   }
@@ -216,7 +217,7 @@
     int index = 0;
     for (Object obj : toTest) {
       String name = "toTest[" + index + "] (" + obj + ")";
-      assertThat(Lists.indexOfImpl(toTest, obj)).named(name).isEqualTo(expected[index]);
+      assertWithMessage(name).that(Lists.indexOfImpl(toTest, obj)).isEqualTo(expected[index]);
       index++;
     }
   }
@@ -225,7 +226,7 @@
     int index = 0;
     for (Object obj : toTest) {
       String name = "toTest[" + index + "] (" + obj + ")";
-      assertThat(Lists.lastIndexOfImpl(toTest, obj)).named(name).isEqualTo(expected[index]);
+      assertWithMessage(name).that(Lists.lastIndexOfImpl(toTest, obj)).isEqualTo(expected[index]);
       index++;
     }
   }
diff --git a/guava-tests/test/com/google/common/collect/ListsTest.java b/guava-tests/test/com/google/common/collect/ListsTest.java
index 0d0e6f2..ef90e54 100644
--- a/guava-tests/test/com/google/common/collect/ListsTest.java
+++ b/guava-tests/test/com/google/common/collect/ListsTest.java
@@ -629,6 +629,16 @@
     assertEquals(actual.indexOf(list(1, 1, 1)), -1);
   }
 
+  public void testCartesianProduct_lastIndexOf() {
+    List<List<Integer>> actual = Lists.cartesianProduct(list(1, 1), list(2, 3));
+    assertThat(actual.lastIndexOf(list(1, 2))).isEqualTo(2);
+    assertThat(actual.lastIndexOf(list(1, 3))).isEqualTo(3);
+    assertThat(actual.lastIndexOf(list(1, 1))).isEqualTo(-1);
+
+    assertThat(actual.lastIndexOf(list(1))).isEqualTo(-1);
+    assertThat(actual.lastIndexOf(list(1, 1, 1))).isEqualTo(-1);
+  }
+
   @SuppressWarnings("unchecked") // varargs!
   public void testCartesianProduct_unrelatedTypes() {
     List<Integer> x = list(1, 2);
diff --git a/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java b/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java
index 535eed4..47fc74c 100644
--- a/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java
+++ b/guava-tests/test/com/google/common/collect/MapMakerInternalMapTest.java
@@ -604,6 +604,7 @@
     assertNull(segment.get(key, hash));
   }
 
+  @SuppressWarnings("GuardedBy")
   public void testExpand() {
     MapMakerInternalMap<Object, Object, ?, ?> map =
         makeMap(createMapMaker().concurrencyLevel(1).initialCapacity(1));
@@ -629,6 +630,8 @@
 
     for (int i = 1; i <= originalCount * 2; i *= 2) {
       if (i > 1) {
+        // TODO(b/145386688): This access should be guarded by 'segment', which is not currently
+        // held
         segment.expand();
       }
       assertEquals(i, segment.table.length());
@@ -687,6 +690,7 @@
     assertNull(newFirst.getNext());
   }
 
+  @SuppressWarnings("GuardedBy")
   public void testExpand_cleanup() {
     MapMakerInternalMap<Object, Object, ?, ?> map =
         makeMap(createMapMaker().concurrencyLevel(1).initialCapacity(1));
@@ -719,6 +723,8 @@
 
     for (int i = 1; i <= originalCount * 2; i *= 2) {
       if (i > 1) {
+        // TODO(b/145386688): This access should be guarded by 'segment', which is not currently
+        // held
         segment.expand();
       }
       assertEquals(i, segment.table.length());
@@ -845,7 +851,7 @@
         InternalEntry<Object, Object, ?> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -877,7 +883,7 @@
         WeakValueReference<Object, Object, ?> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         map.put(keyTwo, valueTwo);
@@ -905,7 +911,7 @@
         InternalEntry<Object, Object, ?> entry = segment.getEntry(keyOne, hashOne);
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) entry;
+        Reference<Object> reference = (Reference<Object>) entry;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
@@ -938,7 +944,7 @@
         WeakValueReference<Object, Object, ?> valueReference = entry.getValueReference();
 
         @SuppressWarnings("unchecked")
-        Reference<Object> reference = (Reference) valueReference;
+        Reference<Object> reference = (Reference<Object>) valueReference;
         reference.enqueue();
 
         for (int i = 0; i < SMALL_MAX_SIZE; i++) {
diff --git a/guava-tests/test/com/google/common/collect/MapsTest.java b/guava-tests/test/com/google/common/collect/MapsTest.java
index 8ea3475..76394c8 100644
--- a/guava-tests/test/com/google/common/collect/MapsTest.java
+++ b/guava-tests/test/com/google/common/collect/MapsTest.java
@@ -21,6 +21,7 @@
 import static com.google.common.collect.Maps.unmodifiableNavigableMap;
 import static com.google.common.collect.testing.Helpers.mapEntry;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -155,8 +156,8 @@
     for (int i = 1; i < size; i++) {
       map1.put(i, null);
     }
-    assertThat(bucketsOf(map1))
-        .named("table size after adding " + size + " elements")
+    assertWithMessage("table size after adding " + size + " elements")
+        .that(bucketsOf(map1))
         .isEqualTo(initialBuckets);
 
     /*
@@ -164,8 +165,8 @@
      * once; make sure that passes too.
      */
     map2.putAll(map1);
-    assertThat(bucketsOf(map1))
-        .named("table size after adding " + size + " elements")
+    assertWithMessage("table size after adding " + size + " elements")
+        .that(bucketsOf(map1))
         .isEqualTo(initialBuckets);
   }
 
@@ -244,6 +245,8 @@
     assertEquals(original, map);
   }
 
+  // Intentionally using IdentityHashMap to test creation.
+  @SuppressWarnings("IdentityHashMapBoxing")
   public void testIdentityHashMap() {
     IdentityHashMap<Integer, Integer> map = Maps.newIdentityHashMap();
     assertEquals(Collections.emptyMap(), map);
diff --git a/guava-tests/test/com/google/common/collect/QueuesTest.java b/guava-tests/test/com/google/common/collect/QueuesTest.java
index 4ee1f82..9b45116 100644
--- a/guava-tests/test/com/google/common/collect/QueuesTest.java
+++ b/guava-tests/test/com/google/common/collect/QueuesTest.java
@@ -77,7 +77,7 @@
   @Override
   public void tearDown() throws InterruptedException {
     threadPool.shutdown();
-    assertTrue("Some worker didn't finish in time", threadPool.awaitTermination(1, SECONDS));
+    assertTrue("Some worker didn't finish in time", threadPool.awaitTermination(10, SECONDS));
   }
 
   private static <T> int drain(
diff --git a/guava-tests/test/com/google/common/collect/RangeTest.java b/guava-tests/test/com/google/common/collect/RangeTest.java
index d76b96f..9a2cd74 100644
--- a/guava-tests/test/com/google/common/collect/RangeTest.java
+++ b/guava-tests/test/com/google/common/collect/RangeTest.java
@@ -23,6 +23,7 @@
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Predicate;
 import com.google.common.collect.testing.Helpers;
 import com.google.common.testing.EqualsTester;
@@ -37,7 +38,7 @@
  *
  * @author Kevin Bourrillion
  */
-@GwtCompatible
+@GwtCompatible(emulated = true)
 public class RangeTest extends TestCase {
   public void testOpen() {
     Range<Integer> range = Range.open(4, 8);
@@ -118,6 +119,8 @@
 
   public void testIsConnected() {
     assertTrue(Range.closed(3, 5).isConnected(Range.open(5, 6)));
+    assertTrue(Range.closed(3, 5).isConnected(Range.closed(5, 6)));
+    assertTrue(Range.closed(5, 6).isConnected(Range.closed(3, 5)));
     assertTrue(Range.closed(3, 5).isConnected(Range.openClosed(5, 5)));
     assertTrue(Range.open(3, 5).isConnected(Range.closed(5, 6)));
     assertTrue(Range.closed(3, 7).isConnected(Range.open(6, 8)));
@@ -471,6 +474,32 @@
     }
   }
 
+  public void testGap_invalidRangesWithInfinity() {
+    try {
+      Range.atLeast(1).gap(Range.atLeast(2));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    try {
+      Range.atLeast(2).gap(Range.atLeast(1));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    try {
+      Range.atMost(1).gap(Range.atMost(2));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+
+    try {
+      Range.atMost(2).gap(Range.atMost(1));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testGap_connectedAdjacentYieldsEmpty() {
     Range<Integer> range = Range.open(3, 4);
 
@@ -499,6 +528,8 @@
     assertEquals(Range.open(2, 4), closedRange.gap(Range.atMost(2)));
   }
 
+  // TODO(cpovirk): More extensive testing of gap().
+
   public void testSpan_general() {
     Range<Integer> range = Range.closed(4, 8);
 
@@ -568,6 +599,7 @@
         .testEquals();
   }
 
+  @GwtIncompatible // TODO(b/148207871): Restore once Eclipse compiler no longer flakes for this.
   public void testLegacyComparable() {
     Range<LegacyComparable> range = Range.closed(LegacyComparable.X, LegacyComparable.Y);
   }
diff --git a/guava-tests/test/com/google/common/collect/SetsTest.java b/guava-tests/test/com/google/common/collect/SetsTest.java
index 9ca1064..86cb6c8 100644
--- a/guava-tests/test/com/google/common/collect/SetsTest.java
+++ b/guava-tests/test/com/google/common/collect/SetsTest.java
@@ -24,6 +24,7 @@
 import static com.google.common.collect.Sets.unmodifiableNavigableSet;
 import static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.io.ObjectStreamConstants.TC_REFERENCE;
 import static java.io.ObjectStreamConstants.baseWireHandle;
 import static java.util.Collections.emptySet;
@@ -960,6 +961,13 @@
     }
   }
 
+  public void testPowerSetEquals_independentOfOrder() {
+    ImmutableSet<Integer> elements = ImmutableSet.of(1, 2, 3, 4);
+    Set<Set<Integer>> forward = powerSet(elements);
+    Set<Set<Integer>> reverse = powerSet(ImmutableSet.copyOf(elements.asList().reverse()));
+    new EqualsTester().addEqualityGroup(forward, reverse).testEquals();
+  }
+
   /**
    * Test that a hash code miscomputed by "input.hashCode() * tooFarValue / 2" is correct under our
    * {@code hashCode} implementation.
@@ -1044,8 +1052,8 @@
                     return input.size() == size;
                   }
                 });
-        assertThat(Sets.combinations(sampleSet, k))
-            .named("Sets.combinations(%s, %s)", sampleSet, k)
+        assertWithMessage("Sets.combinations(%s, %s)", sampleSet, k)
+            .that(Sets.combinations(sampleSet, k))
             .containsExactlyElementsIn(expected)
             .inOrder();
       }
diff --git a/guava-tests/test/com/google/common/collect/StreamsTest.java b/guava-tests/test/com/google/common/collect/StreamsTest.java
index e419d3e..9d3dab6 100644
--- a/guava-tests/test/com/google/common/collect/StreamsTest.java
+++ b/guava-tests/test/com/google/common/collect/StreamsTest.java
@@ -172,6 +172,30 @@
     assertThat(stream(OptionalDouble.of(5.0))).containsExactly(5.0);
   }
 
+  public void testConcatInfiniteStream() {
+    assertThat(Streams.concat(Stream.of(1, 2, 3), Stream.generate(() -> 5)).limit(5))
+        .containsExactly(1, 2, 3, 5, 5)
+        .inOrder();
+  }
+
+  public void testConcatInfiniteStream_int() {
+    assertThat(Streams.concat(IntStream.of(1, 2, 3), IntStream.generate(() -> 5)).limit(5))
+        .containsExactly(1, 2, 3, 5, 5)
+        .inOrder();
+  }
+
+  public void testConcatInfiniteStream_long() {
+    assertThat(Streams.concat(LongStream.of(1, 2, 3), LongStream.generate(() -> 5)).limit(5))
+        .containsExactly(1L, 2L, 3L, 5L, 5L)
+        .inOrder();
+  }
+
+  public void testConcatInfiniteStream_double() {
+    assertThat(Streams.concat(DoubleStream.of(1, 2, 3), DoubleStream.generate(() -> 5)).limit(5))
+        .containsExactly(1., 2., 3., 5., 5.)
+        .inOrder();
+  }
+
   private void testMapWithIndex(Function<Collection<String>, Stream<String>> collectionImpl) {
     SpliteratorTester.of(
             () ->
diff --git a/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java b/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
index 1c8de93..0a11b27 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
@@ -263,8 +263,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    create().contains("foo");
-    create().containsAll(ImmutableList.of("foo"));
+    boolean unused = create().contains("foo");
+    boolean unused2 = 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 140720c..34d1c6f 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
@@ -175,11 +175,11 @@
   }
 
   public void testContainsKey() {
-    create().containsKey(null);
+    boolean unused = create().containsKey(null);
   }
 
   public void testContainsValue() {
-    create().containsValue(null);
+    boolean unused = create().containsValue(null);
   }
 
   public void testGet() {
diff --git a/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java b/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
index 249a60e..ac48846 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
@@ -162,8 +162,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    create().contains("foo");
-    create().containsAll(ImmutableList.of("foo"));
+    boolean unused = create().contains("foo");
+    boolean unused2 = 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/TreeRangeMapTest.java b/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
index 439411a..d8ff908 100644
--- a/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
+++ b/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
@@ -28,6 +28,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
+import java.util.function.BiFunction;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -489,6 +490,20 @@
     assertEquals(ImmutableMap.of(Range.closedOpen(0, 2), 1), rangeMap.asMapOfRanges());
   }
 
+  public void testPutCoalescingSubmapEmpty() {
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(0, 1), 1);
+    rangeMap.put(Range.closedOpen(1, 2), 1);
+    assertEquals(
+        ImmutableMap.of(Range.closedOpen(0, 1), 1, Range.closedOpen(1, 2), 1),
+        rangeMap.asMapOfRanges());
+
+    RangeMap<Integer, Integer> subRangeMap = rangeMap.subRangeMap(Range.closedOpen(0, 2));
+    subRangeMap.putCoalescing(Range.closedOpen(1, 1), 1); // empty range coalesces connected ranges
+    assertEquals(ImmutableMap.of(Range.closedOpen(0, 2), 1), subRangeMap.asMapOfRanges());
+    assertEquals(ImmutableMap.of(Range.closedOpen(0, 2), 1), rangeMap.asMapOfRanges());
+  }
+
   public void testPutCoalescingComplex() {
     // {[0..1): 1, [1..3): 1, [3..5): 1, [7..10): 2, [12..15): 2, [18..19): 3}
     RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
@@ -525,6 +540,156 @@
         rangeMap.asMapOfRanges());
   }
 
+  public void testMergeOntoRangeOverlappingLowerBound() {
+    // {[0..2): 1}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(0, 2), 1);
+
+    rangeMap.merge(Range.closedOpen(1, 3), 2, Integer::sum);
+
+    // {[0..1): 1, [1..2): 3, [2, 3): 2}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(0, 1), 1)
+            .put(Range.closedOpen(1, 2), 3)
+            .put(Range.closedOpen(2, 3), 2)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeOntoRangeOverlappingUpperBound() {
+    // {[1..3): 1}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(1, 3), 1);
+
+    rangeMap.merge(Range.closedOpen(0, 2), 2, Integer::sum);
+
+    // {[0..1): 2, [1..2): 3, [2, 3): 1}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(0, 1), 2)
+            .put(Range.closedOpen(1, 2), 3)
+            .put(Range.closedOpen(2, 3), 1)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeOntoIdenticalRange() {
+    // {[0..1): 1}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(0, 1), 1);
+
+    rangeMap.merge(Range.closedOpen(0, 1), 2, Integer::sum);
+
+    // {[0..1): 3}
+    assertEquals(ImmutableMap.of(Range.closedOpen(0, 1), 3), rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeOntoSuperRange() {
+    // {[0..3): 1}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(0, 3), 1);
+
+    rangeMap.merge(Range.closedOpen(1, 2), 2, Integer::sum);
+
+    // {[0..1): 1, [1..2): 3, [2..3): 1}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(0, 1), 1)
+            .put(Range.closedOpen(1, 2), 3)
+            .put(Range.closedOpen(2, 3), 1)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeOntoSubRange() {
+    // {[1..2): 1}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(1, 2), 1);
+
+    rangeMap.merge(Range.closedOpen(0, 3), 2, Integer::sum);
+
+    // {[0..1): 2, [1..2): 3, [2..3): 2}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(0, 1), 2)
+            .put(Range.closedOpen(1, 2), 3)
+            .put(Range.closedOpen(2, 3), 2)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeOntoDisconnectedRanges() {
+    // {[0..1): 1, [2, 3): 2}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(0, 1), 1);
+    rangeMap.put(Range.closedOpen(2, 3), 2);
+
+    rangeMap.merge(Range.closedOpen(0, 3), 3, Integer::sum);
+
+    // {[0..1): 4, [1..2): 3, [2..3): 5}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(0, 1), 4)
+            .put(Range.closedOpen(1, 2), 3)
+            .put(Range.closedOpen(2, 3), 5)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeNullValue() {
+    // {[1..2): 1, [3, 4): 2}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(1, 2), 1);
+    rangeMap.put(Range.closedOpen(3, 4), 2);
+
+    rangeMap.merge(Range.closedOpen(0, 5), null, (v1, v2) -> v1 + 1);
+
+    // {[1..2): 2, [3..4): 3}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(1, 2), 2)
+            .put(Range.closedOpen(3, 4), 3)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeWithRemappingFunctionReturningNullValue() {
+    // {[1..2): 1, [3, 4): 2}
+    RangeMap<Integer, Integer> rangeMap = TreeRangeMap.create();
+    rangeMap.put(Range.closedOpen(1, 2), 1);
+    rangeMap.put(Range.closedOpen(3, 4), 2);
+
+    rangeMap.merge(Range.closedOpen(0, 5), 3, (v1, v2) -> null);
+
+    // {[0..1): 3, [2..3): 3, [4, 5): 3}
+    assertEquals(
+        new ImmutableMap.Builder<>()
+            .put(Range.closedOpen(0, 1), 3)
+            .put(Range.closedOpen(2, 3), 3)
+            .put(Range.closedOpen(4, 5), 3)
+            .build(),
+        rangeMap.asMapOfRanges());
+  }
+
+  public void testMergeAllRangeTriples() {
+    for (Range<Integer> range1 : RANGES) {
+      for (Range<Integer> range2 : RANGES) {
+        for (Range<Integer> range3 : RANGES) {
+          Map<Integer, Integer> model = Maps.newHashMap();
+          mergeModel(model, range1, 1, Integer::sum);
+          mergeModel(model, range2, 2, Integer::sum);
+          mergeModel(model, range3, 3, Integer::sum);
+          RangeMap<Integer, Integer> test = TreeRangeMap.create();
+          test.merge(range1, 1, Integer::sum);
+          test.merge(range2, 2, Integer::sum);
+          test.merge(range3, 3, Integer::sum);
+          verify(model, test);
+        }
+      }
+    }
+  }
+
   public void testSubRangeMapExhaustive() {
     for (Range<Integer> range1 : RANGES) {
       for (Range<Integer> range2 : RANGES) {
@@ -724,4 +889,16 @@
       }
     }
   }
+
+  private static void mergeModel(
+      Map<Integer, Integer> model,
+      Range<Integer> range,
+      int value,
+      BiFunction<? super Integer, ? super Integer, ? extends Integer> remappingFunction) {
+    for (int i = MIN_BOUND - 1; i <= MAX_BOUND + 1; i++) {
+      if (range.contains(i)) {
+        model.merge(i, value, remappingFunction);
+      }
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java b/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
index d033e24..498a1a1 100644
--- a/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
+++ b/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
@@ -285,6 +285,19 @@
     }
   }
 
+  public void testSubRangeSetAdd() {
+    TreeRangeSet<Integer> set = TreeRangeSet.create();
+    Range<Integer> range = Range.closedOpen(0, 5);
+    set.subRangeSet(range).add(range);
+  }
+
+  public void testSubRangeSetReplaceAdd() {
+    TreeRangeSet<Integer> set = TreeRangeSet.create();
+    Range<Integer> range = Range.closedOpen(0, 5);
+    set.add(range);
+    set.subRangeSet(range).add(range);
+  }
+
   public void testComplement() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
diff --git a/guava-tests/test/com/google/common/eventbus/EventBusTest.java b/guava-tests/test/com/google/common/eventbus/EventBusTest.java
index 647663c..249d3b0 100644
--- a/guava-tests/test/com/google/common/eventbus/EventBusTest.java
+++ b/guava-tests/test/com/google/common/eventbus/EventBusTest.java
@@ -289,6 +289,18 @@
     assertEquals(1, calls.get());
   }
 
+  public void testPrimitiveSubscribeFails() {
+    class SubscribesToPrimitive {
+      @Subscribe
+      public void toInt(int i) {}
+    }
+    try {
+      bus.register(new SubscribesToPrimitive());
+      fail("should have thrown");
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   /** Records thrown exception information. */
   private static final class RecordingSubscriberExceptionHandler
       implements SubscriberExceptionHandler {
diff --git a/guava-tests/test/com/google/common/graph/AbstractDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractDirectedGraphTest.java
deleted file mode 100644
index e8b8a43..0000000
--- a/guava-tests/test/com/google/common/graph/AbstractDirectedGraphTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * Abstract base class for testing implementations of {@link Graph} interface.
- *
- * <p>This class is responsible for testing that a directed implementation of {@link Graph} is
- * correctly handling directed edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be directed are found in superclasses.
- */
-public abstract class AbstractDirectedGraphTest extends AbstractGraphTest {
-  @Test
-  public void predecessors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.predecessors(N2)).containsExactly(N1);
-    // Edge direction handled correctly
-    assertThat(graph.predecessors(N1)).isEmpty();
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.successors(N1)).containsExactly(N2);
-    // Edge direction handled correctly
-    assertThat(graph.successors(N2)).isEmpty();
-  }
-
-  @Test
-  public void incidentEdges_oneEdge() {
-    putEdge(N1, N2);
-    EndpointPair<Integer> expectedEndpoints = EndpointPair.ordered(N1, N2);
-    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
-    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.inDegree(N2)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(graph.inDegree(N1)).isEqualTo(0);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.outDegree(N1)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(graph.outDegree(N2)).isEqualTo(0);
-  }
-
-  @Test
-  public void hasEdgeConnecting_correct() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
-  }
-
-  @Test
-  public void hasEdgeConnecting_backwards() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isFalse();
-  }
-
-  @Test
-  public void hasEdgeConnecting_mismatch() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isFalse();
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isFalse();
-  }
-
-  // Element Mutation
-
-  @Test
-  public void putEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(putEdge(N1, N2)).isTrue();
-  }
-
-  @Test
-  public void putEdge_existingEdgeBetweenSameNodes() {
-    assertThat(putEdge(N1, N2)).isTrue();
-    assertThat(putEdge(N1, N2)).isFalse();
-  }
-
-  @Test
-  public void putEdge_orderMismatch() {
-    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
-    try {
-      putEdge(endpoints);
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  public void removeEdge_antiparallelEdges() {
-    putEdge(N1, N2);
-    putEdge(N2, N1);
-
-    assertThat(graph.removeEdge(N1, N2)).isTrue();
-    assertThat(graph.successors(N1)).isEmpty();
-    assertThat(graph.predecessors(N1)).containsExactly(N2);
-    assertThat(graph.edges()).hasSize(1);
-
-    assertThat(graph.removeEdge(N2, N1)).isTrue();
-    assertThat(graph.successors(N1)).isEmpty();
-    assertThat(graph.predecessors(N1)).isEmpty();
-    assertThat(graph.edges()).isEmpty();
-  }
-
-  @Test
-  public void removeEdge_orderMismatch() {
-    putEdge(N1, N2);
-    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
-    try {
-      graph.removeEdge(endpoints);
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/AbstractDirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/AbstractDirectedNetworkTest.java
deleted file mode 100644
index 2b16cc3..0000000
--- a/guava-tests/test/com/google/common/graph/AbstractDirectedNetworkTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
-import static com.google.common.graph.TestUtil.assertEdgeNotInGraphErrorMessage;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.Collections;
-import java.util.Optional;
-import java.util.Set;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Abstract base class for testing implementations of {@link Network} interface.
- *
- * <p>This class is responsible for testing that a directed implementation of {@link Network} is
- * correctly handling directed edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be directed are found in superclasses.
- */
-public abstract class AbstractDirectedNetworkTest extends AbstractNetworkTest {
-
-  @After
-  public void validateSourceAndTarget() {
-    for (Integer node : network.nodes()) {
-      for (String inEdge : network.inEdges(node)) {
-        EndpointPair<Integer> endpointPair = network.incidentNodes(inEdge);
-        assertThat(endpointPair.source()).isEqualTo(endpointPair.adjacentNode(node));
-        assertThat(endpointPair.target()).isEqualTo(node);
-      }
-
-      for (String outEdge : network.outEdges(node)) {
-        EndpointPair<Integer> endpointPair = network.incidentNodes(outEdge);
-        assertThat(endpointPair.source()).isEqualTo(node);
-        assertThat(endpointPair.target()).isEqualTo(endpointPair.adjacentNode(node));
-      }
-
-      for (Integer adjacentNode : network.adjacentNodes(node)) {
-        Set<String> edges = network.edgesConnecting(node, adjacentNode);
-        Set<String> antiParallelEdges = network.edgesConnecting(adjacentNode, node);
-        assertThat(node.equals(adjacentNode) || Collections.disjoint(edges, antiParallelEdges))
-            .isTrue();
-      }
-    }
-  }
-
-  @Test
-  public void edges_containsOrderMismatch() {
-    addEdge(N1, N2, E12);
-    EndpointPair<Integer> endpointsN1N2 = EndpointPair.unordered(N1, N2);
-    EndpointPair<Integer> endpointsN2N1 = EndpointPair.unordered(N2, N1);
-    assertThat(network.asGraph().edges()).doesNotContain(endpointsN1N2);
-    assertThat(network.asGraph().edges()).doesNotContain(endpointsN2N1);
-  }
-
-  @Test
-  public void edgesConnecting_orderMismatch() {
-    addEdge(N1, N2, E12);
-    try {
-      Set<String> unused = network.edgesConnecting(EndpointPair.unordered(N1, N2));
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  @Test
-  public void edgeConnecting_orderMismatch() {
-    addEdge(N1, N2, E12);
-    try {
-      Optional<String> unused = network.edgeConnecting(EndpointPair.unordered(N1, N2));
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  @Test
-  public void edgeConnectingOrNull_orderMismatch() {
-    addEdge(N1, N2, E12);
-    try {
-      String unused = network.edgeConnectingOrNull(EndpointPair.unordered(N1, N2));
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentNodes_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
-    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
-  }
-
-  @Test
-  public void edgesConnecting_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    // Passed nodes should be in the correct edge direction, first is the
-    // source node and the second is the target node
-    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
-  }
-
-  @Test
-  public void inEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inEdges(N2)).containsExactly(E12);
-    // Edge direction handled correctly
-    assertThat(network.inEdges(N1)).isEmpty();
-  }
-
-  @Test
-  public void outEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outEdges(N1)).containsExactly(E12);
-    // Edge direction handled correctly
-    assertThat(network.outEdges(N2)).isEmpty();
-  }
-
-  @Test
-  public void predecessors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.predecessors(N2)).containsExactly(N1);
-    // Edge direction handled correctly
-    assertThat(network.predecessors(N1)).isEmpty();
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.successors(N1)).containsExactly(N2);
-    // Edge direction handled correctly
-    assertThat(network.successors(N2)).isEmpty();
-  }
-
-  @Test
-  public void source_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
-  }
-
-  @Test
-  public void source_edgeNotInGraph() {
-    try {
-      network.incidentNodes(EDGE_NOT_IN_GRAPH).source();
-      fail(ERROR_EDGE_NOT_IN_GRAPH);
-    } catch (IllegalArgumentException e) {
-      assertEdgeNotInGraphErrorMessage(e);
-    }
-  }
-
-  @Test
-  public void target_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
-  }
-
-  @Test
-  public void target_edgeNotInGraph() {
-    try {
-      network.incidentNodes(EDGE_NOT_IN_GRAPH).target();
-      fail(ERROR_EDGE_NOT_IN_GRAPH);
-    } catch (IllegalArgumentException e) {
-      assertEdgeNotInGraphErrorMessage(e);
-    }
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inDegree(N2)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(network.inDegree(N1)).isEqualTo(0);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(1);
-    // Edge direction handled correctly
-    assertThat(network.outDegree(N2)).isEqualTo(0);
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(addEdge(N1, N2, E12)).isTrue();
-    assertThat(network.edges()).contains(E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    // Direction of the added edge is correctly handled
-    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenSameNodes() {
-    addEdge(N1, N2, E12);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N2, E12)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes() {
-    addEdge(N1, N2, E12);
-    try {
-      // Edge between totally different nodes
-      addEdge(N4, N5, E12);
-      fail(ERROR_ADDED_EXISTING_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
-    }
-    try {
-      // Edge between same nodes but in reverse direction
-      addEdge(N2, N1, E12);
-      fail(ERROR_ADDED_EXISTING_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
-      fail(ERROR_ADDED_PARALLEL_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_orderMismatch() {
-    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
-    try {
-      addEdge(endpoints, E12);
-      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
-    } catch (IllegalArgumentException e) {
-      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
-    }
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/AbstractGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractGraphTest.java
index 2f81895..3a489a1 100644
--- a/guava-tests/test/com/google/common/graph/AbstractGraphTest.java
+++ b/guava-tests/test/com/google/common/graph/AbstractGraphTest.java
@@ -21,10 +21,10 @@
 import static com.google.common.graph.TestUtil.assertStronglyEquivalent;
 import static com.google.common.graph.TestUtil.sanityCheckSet;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashSet;
 import java.util.Set;
 import org.junit.After;
@@ -40,7 +40,7 @@
  * graph. The following test cases are left for the subclasses to handle:
  *
  * <ul>
- *   <li>Test cases related to whether the graph is directed, undirected, mutable, or immutable.
+ *   <li>Test cases related to whether the graph is directed or undirected.
  *   <li>Test cases related to the specific implementation of the {@link Graph} interface.
  * </ul>
  *
@@ -48,7 +48,15 @@
  * TODO(user): Differentiate between directed and undirected edge strings.
  */
 public abstract class AbstractGraphTest {
-  MutableGraph<Integer> graph;
+
+  Graph<Integer> graph;
+
+  /**
+   * The same reference as {@link #graph}, except as a mutable graph. This field is null in case
+   * {@link #createGraph()} didn't return a mutable graph.
+   */
+  MutableGraph<Integer> graphAsMutableGraph;
+
   static final Integer N1 = 1;
   static final Integer N2 = 2;
   static final Integer N3 = 3;
@@ -66,57 +74,36 @@
   static final String ERROR_ADDED_SELF_LOOP = "Should not be allowed to add a self-loop edge.";
 
   /** Creates and returns an instance of the graph to be tested. */
-  public abstract MutableGraph<Integer> createGraph();
+  abstract Graph<Integer> createGraph();
 
   /**
    * A proxy method that adds the node {@code n} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code n} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #graph} with a new graph that includes
+   * this node.
    */
-  @CanIgnoreReturnValue
-  protected boolean addNode(Integer n) {
-    return graph.addNode(n);
-  }
+  abstract void addNode(Integer n);
 
   /**
    * A proxy method that adds the edge {@code e} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code e} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * <p>This method should be used in tests of specific implementations if you want to ensure
-   * uniform behavior (including side effects) with how edges are added elsewhere in the tests. For
-   * example, the existing implementations of this method explicitly add the supplied nodes to the
-   * graph, and then call {@code graph.addEdge()} to connect the edge to the nodes; this is not part
-   * of the contract of {@code graph.addEdge()} and is done for convenience. In cases where you want
-   * to avoid such side effects (e.g., if you're testing what happens in your implementation if you
-   * add an edge whose end-points don't already exist in the graph), you should <b>not</b> use this
-   * method.
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #graph} with a new graph that includes
+   * this edge.
    */
-  @CanIgnoreReturnValue
-  protected boolean putEdge(Integer n1, Integer n2) {
-    graph.addNode(n1);
-    graph.addNode(n2);
-    return graph.putEdge(n1, n2);
-  }
+  abstract void putEdge(Integer n1, Integer n2);
 
-  @CanIgnoreReturnValue
-  protected boolean putEdge(EndpointPair<Integer> endpoints) {
-    graph.addNode(endpoints.nodeU());
-    graph.addNode(endpoints.nodeV());
-    return graph.putEdge(endpoints);
+  final boolean graphIsMutable() {
+    return graphAsMutableGraph != null;
   }
 
   @Before
-  public void init() {
+  public final void init() {
     graph = createGraph();
+    if (graph instanceof MutableGraph) {
+      graphAsMutableGraph = (MutableGraph<Integer>) graph;
+    }
   }
 
   @After
-  public void validateGraphState() {
+  public final void validateGraphState() {
     validateGraph(graph);
   }
 
@@ -361,24 +348,30 @@
 
   @Test
   public void addNode_newNode() {
-    assertThat(addNode(N1)).isTrue();
+    assume().that(graphIsMutable()).isTrue();
+
+    assertThat(graphAsMutableGraph.addNode(N1)).isTrue();
     assertThat(graph.nodes()).contains(N1);
   }
 
   @Test
   public void addNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     ImmutableSet<Integer> nodes = ImmutableSet.copyOf(graph.nodes());
-    assertThat(addNode(N1)).isFalse();
+    assertThat(graphAsMutableGraph.addNode(N1)).isFalse();
     assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     putEdge(N4, N1);
-    assertThat(graph.removeNode(N1)).isTrue();
-    assertThat(graph.removeNode(N1)).isFalse();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isFalse();
     assertThat(graph.nodes()).containsExactly(N2, N4);
     assertThat(graph.adjacentNodes(N2)).isEmpty();
     assertThat(graph.adjacentNodes(N4)).isEmpty();
@@ -386,32 +379,38 @@
 
   @Test
   public void removeNode_antiparallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     putEdge(N2, N1);
 
-    assertThat(graph.removeNode(N1)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
     assertThat(graph.nodes()).containsExactly(N2);
     assertThat(graph.edges()).isEmpty();
 
-    assertThat(graph.removeNode(N2)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N2)).isTrue();
     assertThat(graph.nodes()).isEmpty();
     assertThat(graph.edges()).isEmpty();
   }
 
   @Test
   public void removeNode_nodeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     ImmutableSet<Integer> nodes = ImmutableSet.copyOf(graph.nodes());
-    assertThat(graph.removeNode(NODE_NOT_IN_GRAPH)).isFalse();
+    assertThat(graphAsMutableGraph.removeNode(NODE_NOT_IN_GRAPH)).isFalse();
     assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_queryAfterRemoval() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     @SuppressWarnings("unused")
     Set<Integer> unused = graph.adjacentNodes(N1); // ensure cache (if any) is populated
-    assertThat(graph.removeNode(N1)).isTrue();
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
     try {
       graph.adjacentNodes(N1);
       fail(ERROR_NODE_NOT_IN_GRAPH);
@@ -422,36 +421,45 @@
 
   @Test
   public void removeEdge_existingEdge() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     assertThat(graph.successors(N1)).containsExactly(N2);
     assertThat(graph.predecessors(N2)).containsExactly(N1);
-    assertThat(graph.removeEdge(N1, N2)).isTrue();
-    assertThat(graph.removeEdge(N1, N2)).isFalse();
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isTrue();
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isFalse();
     assertThat(graph.successors(N1)).isEmpty();
     assertThat(graph.predecessors(N2)).isEmpty();
   }
 
   @Test
   public void removeEdge_oneOfMany() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     putEdge(N1, N3);
     putEdge(N1, N4);
-    assertThat(graph.removeEdge(N1, N3)).isTrue();
+    assertThat(graphAsMutableGraph.removeEdge(N1, N3)).isTrue();
     assertThat(graph.adjacentNodes(N1)).containsExactly(N2, N4);
   }
 
   @Test
   public void removeEdge_nodeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
-    assertThat(graph.removeEdge(N1, NODE_NOT_IN_GRAPH)).isFalse();
+    assertThat(graphAsMutableGraph.removeEdge(N1, NODE_NOT_IN_GRAPH)).isFalse();
     assertThat(graph.successors(N1)).contains(N2);
   }
 
   @Test
   public void removeEdge_edgeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     putEdge(N1, N2);
     addNode(N3);
-    assertThat(graph.removeEdge(N1, N3)).isFalse();
+
+    assertThat(graphAsMutableGraph.removeEdge(N1, N3)).isFalse();
     assertThat(graph.successors(N1)).contains(N2);
   }
 }
diff --git a/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java b/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
index 9e13710..889f0fb 100644
--- a/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
+++ b/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
@@ -22,14 +22,20 @@
 import static com.google.common.graph.TestUtil.assertStronglyEquivalent;
 import static com.google.common.graph.TestUtil.sanityCheckSet;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -51,7 +57,15 @@
  * TODO(user): Differentiate between directed and undirected edge strings.
  */
 public abstract class AbstractNetworkTest {
-  MutableNetwork<Integer, String> network;
+
+  Network<Integer, String> network;
+
+  /**
+   * The same reference as {@link #network}, except as a mutable network. This field is null in case
+   * {@link #createGraph()} didn't return a mutable network.
+   */
+  MutableNetwork<Integer, String> networkAsMutableNetwork;
+
   static final Integer N1 = 1;
   static final Integer N2 = 2;
   static final Integer N3 = 3;
@@ -92,54 +106,32 @@
       "Reusing an existing edge to connect different nodes succeeded";
 
   /** Creates and returns an instance of the graph to be tested. */
-  public abstract MutableNetwork<Integer, String> createGraph();
+  abstract Network<Integer, String> createGraph();
 
   /**
    * A proxy method that adds the node {@code n} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code n} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #network} with a new graph that
+   * includes this node.
    */
-  @CanIgnoreReturnValue
-  protected boolean addNode(Integer n) {
-    return network.addNode(n);
-  }
+  abstract void addNode(Integer n);
 
   /**
    * A proxy method that adds the edge {@code e} to the graph being tested. In case of Immutable
-   * graph implementations, this method should add {@code e} to the graph builder and build a new
-   * graph with the current builder state.
-   *
-   * <p>This method should be used in tests of specific implementations if you want to ensure
-   * uniform behavior (including side effects) with how edges are added elsewhere in the tests. For
-   * example, the existing implementations of this method explicitly add the supplied nodes to the
-   * graph, and then call {@code graph.addEdge()} to connect the edge to the nodes; this is not part
-   * of the contract of {@code graph.addEdge()} and is done for convenience. In cases where you want
-   * to avoid such side effects (e.g., if you're testing what happens in your implementation if you
-   * add an edge whose end-points don't already exist in the graph), you should <b>not</b> use this
-   * method.
-   *
-   * <p>TODO(user): remove the addNode() calls, that's now contractually guaranteed
-   *
-   * @return {@code true} iff the graph was modified as a result of this call
+   * graph implementations, this method should replace {@link #network} with a new graph that
+   * includes this edge.
    */
-  @CanIgnoreReturnValue
-  protected boolean addEdge(Integer n1, Integer n2, String e) {
-    network.addNode(n1);
-    network.addNode(n2);
-    return network.addEdge(n1, n2, e);
-  }
+  abstract void addEdge(Integer n1, Integer n2, String e);
 
-  protected boolean addEdge(EndpointPair<Integer> endpoints, String e) {
-    network.addNode(endpoints.nodeU());
-    network.addNode(endpoints.nodeV());
-    return network.addEdge(endpoints, e);
+  final boolean graphIsMutable() {
+    return networkAsMutableNetwork != null;
   }
 
   @Before
   public void init() {
     network = createGraph();
+    if (network instanceof MutableNetwork) {
+      networkAsMutableNetwork = (MutableNetwork<Integer, String>) network;
+    }
   }
 
   @After
@@ -504,6 +496,18 @@
   }
 
   @Test
+  public void adjacentEdges_parallelEdges() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+    addEdge(N1, N2, E12_B);
+    addEdge(N3, N4, E34);
+
+    assertThat(network.adjacentEdges(E12)).containsExactly(E12_A, E12_B);
+  }
+
+  @Test
   public void edgesConnecting_disconnectedNodes() {
     addNode(N1);
     addNode(N2);
@@ -535,6 +539,60 @@
   }
 
   @Test
+  public void edgesConnecting_parallelEdges_directed() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.isDirected()).isTrue();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
+    // Passed nodes should be in the correct edge direction, first is the
+    // source node and the second is the target node
+    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
+  }
+
+  @Test
+  public void edgesConnecting_parallelEdges_undirected() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.isDirected()).isFalse();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+    addEdge(N2, N1, E21);
+
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12, E12_A, E21);
+  }
+
+  @Test
+  public void edgesConnecting_parallelSelfLoopEdges() {
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N1, E11_A);
+
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
+  }
+
+  @Test
+  public void hasEdgeConnecting_disconnectedNodes() {
+    addNode(N1);
+    addNode(N2);
+    assertThat(network.hasEdgeConnecting(N1, N2)).isFalse();
+  }
+
+  @Test
+  public void hasEdgesConnecting_nodesNotInGraph() {
+    addNode(N1);
+    addNode(N2);
+    assertThat(network.hasEdgeConnecting(N1, NODE_NOT_IN_GRAPH)).isFalse();
+    assertThat(network.hasEdgeConnecting(NODE_NOT_IN_GRAPH, N2)).isFalse();
+    assertThat(network.hasEdgeConnecting(NODE_NOT_IN_GRAPH, NODE_NOT_IN_GRAPH)).isFalse();
+  }
+
+  @Test
   public void inEdges_noInEdges() {
     addNode(N1);
     assertThat(network.inEdges(N1)).isEmpty();
@@ -600,45 +658,56 @@
 
   @Test
   public void addNode_newNode() {
-    assertTrue(addNode(N1));
-    assertThat(network.nodes()).contains(N1);
+    assume().that(graphIsMutable()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addNode(N1));
+    assertThat(networkAsMutableNetwork.nodes()).contains(N1);
   }
 
   @Test
   public void addNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
-    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(network.nodes());
-    assertFalse(addNode(N1));
-    assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(networkAsMutableNetwork.nodes());
+    assertFalse(networkAsMutableNetwork.addNode(N1));
+    assertThat(networkAsMutableNetwork.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_existingNode() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
     addEdge(N4, N1, E41);
-    assertTrue(network.removeNode(N1));
-    assertFalse(network.removeNode(N1));
-    assertThat(network.nodes()).containsExactly(N2, N4);
-    assertThat(network.edges()).doesNotContain(E12);
-    assertThat(network.edges()).doesNotContain(E41);
+    assertTrue(networkAsMutableNetwork.removeNode(N1));
+    assertFalse(networkAsMutableNetwork.removeNode(N1));
+    assertThat(networkAsMutableNetwork.nodes()).containsExactly(N2, N4);
+    assertThat(networkAsMutableNetwork.edges()).doesNotContain(E12);
+    assertThat(networkAsMutableNetwork.edges()).doesNotContain(E41);
   }
 
   @Test
   public void removeNode_nodeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
-    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(network.nodes());
-    assertFalse(network.removeNode(NODE_NOT_IN_GRAPH));
-    assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    ImmutableSet<Integer> nodes = ImmutableSet.copyOf(networkAsMutableNetwork.nodes());
+    assertFalse(networkAsMutableNetwork.removeNode(NODE_NOT_IN_GRAPH));
+    assertThat(networkAsMutableNetwork.nodes()).containsExactlyElementsIn(nodes);
   }
 
   @Test
   public void removeNode_queryAfterRemoval() {
+    assume().that(graphIsMutable()).isTrue();
+
     addNode(N1);
     @SuppressWarnings("unused")
-    Set<Integer> unused = network.adjacentNodes(N1); // ensure cache (if any) is populated
-    assertTrue(network.removeNode(N1));
+    Set<Integer> unused =
+        networkAsMutableNetwork.adjacentNodes(N1); // ensure cache (if any) is populated
+    assertTrue(networkAsMutableNetwork.removeNode(N1));
     try {
-      network.adjacentNodes(N1);
+      networkAsMutableNetwork.adjacentNodes(N1);
       fail(ERROR_NODE_NOT_IN_GRAPH);
     } catch (IllegalArgumentException e) {
       assertNodeNotInGraphErrorMessage(e);
@@ -647,42 +716,139 @@
 
   @Test
   public void removeEdge_existingEdge() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
-    assertTrue(network.removeEdge(E12));
-    assertFalse(network.removeEdge(E12));
-    assertThat(network.edges()).doesNotContain(E12);
-    assertThat(network.edgesConnecting(N1, N2)).isEmpty();
+    assertTrue(networkAsMutableNetwork.removeEdge(E12));
+    assertFalse(networkAsMutableNetwork.removeEdge(E12));
+    assertThat(networkAsMutableNetwork.edges()).doesNotContain(E12);
+    assertThat(networkAsMutableNetwork.edgesConnecting(N1, N2)).isEmpty();
   }
 
   @Test
   public void removeEdge_oneOfMany() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
     addEdge(N1, N3, E13);
     addEdge(N1, N4, E14);
-    assertThat(network.edges()).containsExactly(E12, E13, E14);
-    assertTrue(network.removeEdge(E13));
-    assertThat(network.edges()).containsExactly(E12, E14);
+    assertThat(networkAsMutableNetwork.edges()).containsExactly(E12, E13, E14);
+    assertTrue(networkAsMutableNetwork.removeEdge(E13));
+    assertThat(networkAsMutableNetwork.edges()).containsExactly(E12, E14);
   }
 
   @Test
   public void removeEdge_edgeNotPresent() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertFalse(network.removeEdge(EDGE_NOT_IN_GRAPH));
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(networkAsMutableNetwork.edges());
+    assertFalse(networkAsMutableNetwork.removeEdge(EDGE_NOT_IN_GRAPH));
+    assertThat(networkAsMutableNetwork.edges()).containsExactlyElementsIn(edges);
   }
 
   @Test
   public void removeEdge_queryAfterRemoval() {
+    assume().that(graphIsMutable()).isTrue();
+
     addEdge(N1, N2, E12);
     @SuppressWarnings("unused")
-    EndpointPair<Integer> unused = network.incidentNodes(E12); // ensure cache (if any) is populated
-    assertTrue(network.removeEdge(E12));
+    EndpointPair<Integer> unused =
+        networkAsMutableNetwork.incidentNodes(E12); // ensure cache (if any) is populated
+    assertTrue(networkAsMutableNetwork.removeEdge(E12));
     try {
-      network.incidentNodes(E12);
+      networkAsMutableNetwork.incidentNodes(E12);
       fail(ERROR_EDGE_NOT_IN_GRAPH);
     } catch (IllegalArgumentException e) {
       assertEdgeNotInGraphErrorMessage(e);
     }
   }
+
+  @Test
+  public void removeEdge_parallelEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    addEdge(N1, N2, E12);
+    addEdge(N1, N2, E12_A);
+    assertTrue(networkAsMutableNetwork.removeEdge(E12_A));
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+  }
+
+  @Test
+  public void removeEdge_parallelSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N1, E11_A);
+    addEdge(N1, N2, E12);
+    assertTrue(networkAsMutableNetwork.removeEdge(E11_A));
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertTrue(networkAsMutableNetwork.removeEdge(E11));
+    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+  }
+
+  @Test
+  public void concurrentIteration() throws Exception {
+    addEdge(1, 2, "foo");
+    addEdge(3, 4, "bar");
+    addEdge(5, 6, "baz");
+
+    int threadCount = 20;
+    ExecutorService executor = newFixedThreadPool(threadCount);
+    final CyclicBarrier barrier = new CyclicBarrier(threadCount);
+    ImmutableList.Builder<Future<?>> futures = ImmutableList.builder();
+    for (int i = 0; i < threadCount; i++) {
+      futures.add(
+          executor.submit(
+              new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                  barrier.await();
+                  Integer first = network.nodes().iterator().next();
+                  for (Integer node : network.nodes()) {
+                    Set<Integer> unused = network.successors(node);
+                  }
+                  /*
+                   * Also look up an earlier node so that, if the graph is using MapRetrievalCache,
+                   * we read one of the fields declared in that class.
+                   */
+                  Set<Integer> unused = network.successors(first);
+                  return null;
+                }
+              }));
+    }
+
+    /*
+     * It's unlikely that any operations would fail by throwing an exception, but let's check them
+     * just to be safe.
+     *
+     * The real purpose of this test is to produce a TSAN failure if MapIteratorCache is unsafe for
+     * reads from multiple threads -- unsafe, in fact, even in the absence of a concurrent write.
+     * The specific problem we had was unsafe reads of lastEntryReturnedBySomeIterator. (To fix the
+     * problem, we've since marked that field as volatile.)
+     *
+     * When MapIteratorCache is used from Immutable* classes, the TSAN failure doesn't indicate a
+     * real problem: The Entry objects are ImmutableMap entries, whose fields are all final and thus
+     * safe to read even when the Entry object is unsafely published. But with a mutable graph, the
+     * Entry object is likely to have a non-final value field, which is not safe to read when
+     * unsafely published. (The Entry object might even be newly created by each iterator.next()
+     * call, so we can't assume that writes to the Entry have been safely published by some other
+     * synchronization actions.)
+     *
+     * All that said: I haven't actually managed to make this particular test produce a TSAN error
+     * for the field accesses in MapIteratorCache. This teset *has* found other TSAN errors,
+     * including in MapRetrievalCache, so I'm not sure why this one is different. I did at least
+     * confirm that my change to MapIteratorCache fixes the TSAN error in the (larger) test it was
+     * originally reported in.
+     */
+    for (Future<?> future : futures.build()) {
+      future.get();
+    }
+    executor.shutdown();
+  }
 }
diff --git a/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java
new file mode 100644
index 0000000..c50a7da
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java
@@ -0,0 +1,481 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Set;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing directed {@link Graph} implementations defined in this package.
+ */
+public abstract class AbstractStandardDirectedGraphTest extends AbstractGraphTest {
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<Integer> nodes = graph.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<Integer> predecessors = graph.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> successors = graph.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(successors).containsExactlyElementsIn(graph.successors(N1));
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
+    try {
+      incidentEdges.add(EndpointPair.ordered(N1, N2));
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
+    }
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.predecessors(N2)).containsExactly(N1);
+    // Edge direction handled correctly
+    assertThat(graph.predecessors(N1)).isEmpty();
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.successors(N1)).containsExactly(N2);
+    // Edge direction handled correctly
+    assertThat(graph.successors(N2)).isEmpty();
+  }
+
+  @Test
+  public void incidentEdges_oneEdge() {
+    putEdge(N1, N2);
+    EndpointPair<Integer> expectedEndpoints = EndpointPair.ordered(N1, N2);
+    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
+    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.inDegree(N2)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(graph.inDegree(N1)).isEqualTo(0);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.outDegree(N1)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(graph.outDegree(N2)).isEqualTo(0);
+  }
+
+  @Test
+  public void hasEdgeConnecting_correct() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
+  }
+
+  @Test
+  public void hasEdgeConnecting_backwards() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isFalse();
+  }
+
+  @Test
+  public void hasEdgeConnecting_mismatch() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isFalse();
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isFalse();
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    putEdge(N1, N2);
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1);
+    putEdge(N4, N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1, N4);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.successors(N1)).containsExactly(N1);
+    putEdge(N1, N2);
+    assertThat(graph.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.ordered(N1, N1));
+    putEdge(N1, N2);
+    assertThat(graph.incidentEdges(N1))
+        .containsExactly(EndpointPair.ordered(N1, N1), EndpointPair.ordered(N1, N2));
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.degree(N1)).isEqualTo(2);
+    putEdge(N1, N2);
+    assertThat(graph.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.inDegree(N1)).isEqualTo(1);
+    putEdge(N4, N1);
+    assertThat(graph.inDegree(N1)).isEqualTo(2);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.outDegree(N1)).isEqualTo(1);
+    putEdge(N1, N2);
+    assertThat(graph.outDegree(N1)).isEqualTo(2);
+  }
+
+  // Stable order tests
+
+  // Note: Stable order means that the ordering doesn't change between iterations and versions.
+  // Ideally, the ordering in test should never be updated.
+  @Test
+  public void stableIncidentEdgeOrder_edges_returnsInStableOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.edges())
+        .containsExactly(
+            EndpointPair.ordered(2, 1),
+            EndpointPair.ordered(1, 4),
+            EndpointPair.ordered(1, 3),
+            EndpointPair.ordered(1, 2),
+            EndpointPair.ordered(3, 1),
+            EndpointPair.ordered(5, 1))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_adjacentNodes_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3, 5).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_predecessors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.predecessors(1)).containsExactly(2, 5, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_successors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.successors(1)).containsExactly(4, 3, 2).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateStarShapedGraph();
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.ordered(2, 1),
+            EndpointPair.ordered(1, 4),
+            EndpointPair.ordered(1, 3),
+            EndpointPair.ordered(5, 1),
+            EndpointPair.ordered(1, 2),
+            EndpointPair.ordered(3, 1))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_withSelfLoop_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(2, 1);
+    putEdge(1, 1);
+    putEdge(1, 3);
+    putEdge(1, 2);
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.ordered(2, 1),
+            EndpointPair.ordered(1, 1),
+            EndpointPair.ordered(1, 3),
+            EndpointPair.ordered(1, 2))
+        .inOrder();
+  }
+
+  /**
+   * Populates the graph with nodes and edges in a star shape with node `1` in the middle.
+   *
+   * <p>Note that the edges are added in a shuffled order to properly test the effect of the
+   * insertion order.
+   */
+  private void populateStarShapedGraph() {
+    putEdge(2, 1);
+    putEdge(1, 4);
+    putEdge(1, 3);
+    putEdge(5, 1);
+    putEdge(1, 2);
+    putEdge(3, 1);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void putEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isTrue();
+  }
+
+  @Test
+  public void putEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isTrue();
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isFalse();
+  }
+
+  @Test
+  public void putEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
+    try {
+      graphAsMutableGraph.putEdge(endpoints);
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  /**
+   * Tests that the method {@code putEdge} will silently add the missing nodes to the graph, then
+   * add the edge connecting them. We are not using the proxy methods here as we want to test {@code
+   * putEdge} when the end-points are not elements of the graph.
+   */
+  @Test
+  public void putEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    graphAsMutableGraph.addNode(N1);
+    assertTrue(graphAsMutableGraph.putEdge(N1, N5));
+    assertTrue(graphAsMutableGraph.putEdge(N4, N1));
+    assertTrue(graphAsMutableGraph.putEdge(N2, N3));
+    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
+    assertThat(graph.successors(N1)).containsExactly(N5);
+    assertThat(graph.successors(N2)).containsExactly(N3);
+    assertThat(graph.successors(N3)).isEmpty();
+    assertThat(graph.successors(N4)).containsExactly(N1);
+    assertThat(graph.successors(N5)).isEmpty();
+  }
+
+  @Test
+  public void putEdge_doesntAllowSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isFalse();
+
+    try {
+      graphAsMutableGraph.putEdge(N1, N1);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  @Test
+  public void putEdge_allowsSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isTrue();
+    assertThat(graph.successors(N1)).containsExactly(N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1);
+  }
+
+  @Test
+  public void putEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    graphAsMutableGraph.putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isFalse();
+  }
+
+  @Test
+  public void removeEdge_antiparallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+    putEdge(N2, N1);
+
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isTrue();
+    assertThat(graph.successors(N1)).isEmpty();
+    assertThat(graph.predecessors(N1)).containsExactly(N2);
+    assertThat(graph.edges()).hasSize(1);
+
+    assertThat(graphAsMutableGraph.removeEdge(N2, N1)).isTrue();
+    assertThat(graph.successors(N1)).isEmpty();
+    assertThat(graph.predecessors(N1)).isEmpty();
+    assertThat(graph.edges()).isEmpty();
+  }
+
+  @Test
+  public void removeEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
+    try {
+      graphAsMutableGraph.removeEdge(endpoints);
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
+    assertThat(graph.nodes()).isEmpty();
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeEdge(N1, N1)).isTrue();
+    assertThat(graph.nodes()).containsExactly(N1);
+    assertThat(graph.successors(N1)).isEmpty();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/AbstractStandardDirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/AbstractStandardDirectedNetworkTest.java
new file mode 100644
index 0000000..39d82ee
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/AbstractStandardDirectedNetworkTest.java
@@ -0,0 +1,716 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.graph.GraphConstants.ENDPOINTS_MISMATCH;
+import static com.google.common.graph.TestUtil.assertEdgeNotInGraphErrorMessage;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.ImmutableSet;
+import java.util.Collections;
+import java.util.Optional;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing directed {@link Network} implementations defined in this package.
+ */
+public abstract class AbstractStandardDirectedNetworkTest extends AbstractNetworkTest {
+
+  @After
+  public void validateSourceAndTarget() {
+    for (Integer node : network.nodes()) {
+      for (String inEdge : network.inEdges(node)) {
+        EndpointPair<Integer> endpointPair = network.incidentNodes(inEdge);
+        assertThat(endpointPair.source()).isEqualTo(endpointPair.adjacentNode(node));
+        assertThat(endpointPair.target()).isEqualTo(node);
+      }
+
+      for (String outEdge : network.outEdges(node)) {
+        EndpointPair<Integer> endpointPair = network.incidentNodes(outEdge);
+        assertThat(endpointPair.source()).isEqualTo(node);
+        assertThat(endpointPair.target()).isEqualTo(endpointPair.adjacentNode(node));
+      }
+
+      for (Integer adjacentNode : network.adjacentNodes(node)) {
+        Set<String> edges = network.edgesConnecting(node, adjacentNode);
+        Set<String> antiParallelEdges = network.edgesConnecting(adjacentNode, node);
+        assertThat(node.equals(adjacentNode) || Collections.disjoint(edges, antiParallelEdges))
+            .isTrue();
+      }
+    }
+  }
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<Integer> nodes = network.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void edges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<String> edges = network.edges();
+    try {
+      edges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edges()).containsExactlyElementsIn(edges);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<String> incidentEdges = network.incidentEdges(N1);
+    try {
+      incidentEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  public void adjacentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    Set<String> adjacentEdges = network.adjacentEdges(E12);
+    try {
+      adjacentEdges.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N2, N3, E23);
+      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void edgesConnecting_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    addNode(N2);
+    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
+    try {
+      edgesConnecting.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
+    }
+  }
+
+  @Override
+  @Test
+  public void inEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<String> inEdges = network.inEdges(N2);
+    try {
+      inEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void outEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<String> outEdges = network.outEdges(N1);
+    try {
+      outEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<Integer> predecessors = network.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> successors = network.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(successors).containsExactlyElementsIn(network.successors(N1));
+    }
+  }
+
+  @Test
+  public void edges_containsOrderMismatch() {
+    addEdge(N1, N2, E12);
+    EndpointPair<Integer> endpointsN1N2 = EndpointPair.unordered(N1, N2);
+    EndpointPair<Integer> endpointsN2N1 = EndpointPair.unordered(N2, N1);
+    assertThat(network.asGraph().edges()).doesNotContain(endpointsN1N2);
+    assertThat(network.asGraph().edges()).doesNotContain(endpointsN2N1);
+  }
+
+  @Test
+  public void edgesConnecting_orderMismatch() {
+    addEdge(N1, N2, E12);
+    try {
+      Set<String> unused = network.edgesConnecting(EndpointPair.unordered(N1, N2));
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void edgeConnecting_orderMismatch() {
+    addEdge(N1, N2, E12);
+    try {
+      Optional<String> unused = network.edgeConnecting(EndpointPair.unordered(N1, N2));
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void edgeConnectingOrNull_orderMismatch() {
+    addEdge(N1, N2, E12);
+    try {
+      String unused = network.edgeConnectingOrNull(EndpointPair.unordered(N1, N2));
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentNodes_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
+    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
+  }
+
+  @Test
+  public void edgesConnecting_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    // Passed nodes should be in the correct edge direction, first is the
+    // source node and the second is the target node
+    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
+  }
+
+  @Test
+  public void inEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inEdges(N2)).containsExactly(E12);
+    // Edge direction handled correctly
+    assertThat(network.inEdges(N1)).isEmpty();
+  }
+
+  @Test
+  public void outEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outEdges(N1)).containsExactly(E12);
+    // Edge direction handled correctly
+    assertThat(network.outEdges(N2)).isEmpty();
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.predecessors(N2)).containsExactly(N1);
+    // Edge direction handled correctly
+    assertThat(network.predecessors(N1)).isEmpty();
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.successors(N1)).containsExactly(N2);
+    // Edge direction handled correctly
+    assertThat(network.successors(N2)).isEmpty();
+  }
+
+  @Test
+  public void source_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
+  }
+
+  @Test
+  public void source_edgeNotInGraph() {
+    try {
+      network.incidentNodes(EDGE_NOT_IN_GRAPH).source();
+      fail(ERROR_EDGE_NOT_IN_GRAPH);
+    } catch (IllegalArgumentException e) {
+      assertEdgeNotInGraphErrorMessage(e);
+    }
+  }
+
+  @Test
+  public void target_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
+  }
+
+  @Test
+  public void target_edgeNotInGraph() {
+    try {
+      network.incidentNodes(EDGE_NOT_IN_GRAPH).target();
+      fail(ERROR_EDGE_NOT_IN_GRAPH);
+    } catch (IllegalArgumentException e) {
+      assertEdgeNotInGraphErrorMessage(e);
+    }
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inDegree(N2)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(network.inDegree(N1)).isEqualTo(0);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(1);
+    // Edge direction handled correctly
+    assertThat(network.outDegree(N2)).isEqualTo(0);
+  }
+
+  @Test
+  public void edges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edges()).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentEdges(N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
+    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void adjacentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
+  }
+
+  @Test
+  public void edgesConnecting_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void inEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inEdges(N1)).containsExactly(E11);
+    addEdge(N4, N1, E41);
+    assertThat(network.inEdges(N1)).containsExactly(E11, E41);
+  }
+
+  @Test
+  public void outEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outEdges(N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.predecessors(N1)).containsExactly(N1);
+    addEdge(N4, N1, E41);
+    assertThat(network.predecessors(N1)).containsExactly(N1, N4);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.successors(N1)).containsExactly(N1);
+    addEdge(N1, N2, E12);
+    assertThat(network.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void source_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
+  }
+
+  @Test
+  public void target_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.degree(N1)).isEqualTo(2);
+    addEdge(N1, N2, E12);
+    assertThat(network.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inDegree(N1)).isEqualTo(1);
+    addEdge(N4, N1, E41);
+    assertThat(network.inDegree(N1)).isEqualTo(2);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outDegree(N1)).isEqualTo(1);
+    addEdge(N1, N2, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(2);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void addEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isTrue();
+    assertThat(network.edges()).contains(E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    // Direction of the added edge is correctly handled
+    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    try {
+      // Edge between totally different nodes
+      networkAsMutableNetwork.addEdge(N4, N5, E12);
+      fail(ERROR_ADDED_EXISTING_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
+    }
+    try {
+      // Edge between same nodes but in reverse direction
+      addEdge(N2, N1, E12);
+      fail(ERROR_ADDED_EXISTING_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
+      fail(ERROR_ADDED_PARALLEL_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12_A));
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
+  }
+
+  @Test
+  public void addEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    EndpointPair<Integer> endpoints = EndpointPair.unordered(N1, N2);
+    try {
+      networkAsMutableNetwork.addEdge(endpoints, E12);
+      fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH);
+    }
+  }
+
+  @Test
+  public void addEdge_selfLoop_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isFalse();
+
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E11);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  /**
+   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
+   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
+   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
+   * elements of the graph.
+   */
+  @Test
+  public void addEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    networkAsMutableNetwork.addNode(N1);
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N5, E15));
+    assertTrue(networkAsMutableNetwork.addEdge(N4, N1, E41));
+    assertTrue(networkAsMutableNetwork.addEdge(N2, N3, E23));
+    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3);
+    assertThat(network.edges()).containsExactly(E15, E41, E23);
+    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
+    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
+    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
+    // Direction of the added edge is correctly handled
+    assertThat(network.edgesConnecting(N3, N2)).isEmpty();
+  }
+
+  @Test
+  public void addEdge_selfLoop_allowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isTrue();
+    assertThat(network.edges()).contains(E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, E11);
+      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    try {
+      networkAsMutableNetwork.addEdge(N2, N2, E11);
+      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E12);
+      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
+      fail("Adding a parallel self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11_A));
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeNode(N1)).isTrue();
+    assertThat(network.nodes()).isEmpty();
+    assertThat(network.edges()).doesNotContain(E11);
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeEdge(E11)).isTrue();
+    assertThat(network.edges()).doesNotContain(E11);
+    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java
new file mode 100644
index 0000000..a483f42
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java
@@ -0,0 +1,443 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.common.testing.EqualsTester;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing undirected {@link Graph} implementations defined in this package.
+ */
+public abstract class AbstractStandardUndirectedGraphTest extends AbstractGraphTest {
+
+  @After
+  public void validateUndirectedEdges() {
+    for (Integer node : graph.nodes()) {
+      new EqualsTester()
+          .addEqualityGroup(
+              graph.predecessors(node), graph.successors(node), graph.adjacentNodes(node))
+          .testEquals();
+    }
+  }
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    Set<Integer> nodes = graph.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N2);
+    Set<Integer> predecessors = graph.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<Integer> successors = graph.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(graph.successors(N1)).containsExactlyElementsIn(successors);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addNode(N1);
+    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
+    try {
+      incidentEdges.add(EndpointPair.unordered(N1, N2));
+      fail(ERROR_MODIFIABLE_SET);
+    } catch (UnsupportedOperationException e) {
+      putEdge(N1, N2);
+      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
+    }
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.predecessors(N2)).containsExactly(N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N2);
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.successors(N1)).containsExactly(N2);
+    assertThat(graph.successors(N2)).containsExactly(N1);
+  }
+
+  @Test
+  public void incidentEdges_oneEdge() {
+    putEdge(N1, N2);
+    EndpointPair<Integer> expectedEndpoints = EndpointPair.unordered(N1, N2);
+    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
+    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.inDegree(N2)).isEqualTo(1);
+    assertThat(graph.inDegree(N1)).isEqualTo(1);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    putEdge(N1, N2);
+    assertThat(graph.outDegree(N1)).isEqualTo(1);
+    assertThat(graph.outDegree(N2)).isEqualTo(1);
+  }
+
+  @Test
+  public void hasEdgeConnecting_correct() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isTrue();
+    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isTrue();
+  }
+
+  @Test
+  public void hasEdgeConnecting_mismatch() {
+    putEdge(N1, N2);
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
+    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isTrue();
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    putEdge(N1, N2);
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.predecessors(N1)).containsExactly(N1);
+    putEdge(N1, N2);
+    assertThat(graph.predecessors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.successors(N1)).containsExactly(N1);
+    putEdge(N2, N1);
+    assertThat(graph.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.unordered(N1, N1));
+    putEdge(N1, N2);
+    assertThat(graph.incidentEdges(N1))
+        .containsExactly(EndpointPair.unordered(N1, N1), EndpointPair.unordered(N1, N2));
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.degree(N1)).isEqualTo(2);
+    putEdge(N1, N2);
+    assertThat(graph.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.inDegree(N1)).isEqualTo(2);
+    putEdge(N1, N2);
+    assertThat(graph.inDegree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graph.outDegree(N1)).isEqualTo(2);
+    putEdge(N2, N1);
+    assertThat(graph.outDegree(N1)).isEqualTo(3);
+  }
+
+  // Stable order tests
+
+  // Note: Stable order means that the ordering doesn't change between iterations and versions.
+  // Ideally, the ordering in test should never be updated.
+  @Test
+  public void stableIncidentEdgeOrder_edges_returnsInStableOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.edges())
+        .containsExactly(
+            EndpointPair.unordered(1, 2),
+            EndpointPair.unordered(1, 4),
+            EndpointPair.unordered(1, 3),
+            EndpointPair.unordered(4, 5))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_adjacentNodes_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_predecessors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_successors_returnsInConnectingEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.adjacentNodes(1)).containsExactly(2, 4, 3).inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+
+    populateTShapedGraph();
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.unordered(1, 2),
+            EndpointPair.unordered(1, 4),
+            EndpointPair.unordered(1, 3))
+        .inOrder();
+  }
+
+  @Test
+  public void stableIncidentEdgeOrder_incidentEdges_withSelfLoop_returnsInEdgeInsertionOrder() {
+    assume().that(graph.incidentEdgeOrder().type()).isEqualTo(ElementOrder.Type.STABLE);
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(2, 1);
+    putEdge(1, 1);
+    putEdge(1, 3);
+
+    assertThat(graph.incidentEdges(1))
+        .containsExactly(
+            EndpointPair.unordered(2, 1),
+            EndpointPair.unordered(1, 1),
+            EndpointPair.unordered(1, 3))
+        .inOrder();
+  }
+
+  /**
+   * Populates the graph with nodes and edges in a star shape with node `1` in the middle.
+   *
+   * <p>Note that the edges are added in a shuffled order to properly test the effect of the
+   * insertion order.
+   */
+  private void populateTShapedGraph() {
+    putEdge(2, 1);
+    putEdge(1, 4);
+    putEdge(1, 3);
+    putEdge(1, 2); // Duplicate
+    putEdge(4, 5);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void putEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N2)).isTrue();
+  }
+
+  @Test
+  public void putEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+
+    assertThat(graphAsMutableGraph.putEdge(N2, N1)).isFalse();
+  }
+
+  /**
+   * Tests that the method {@code putEdge} will silently add the missing nodes to the graph, then
+   * add the edge connecting them. We are not using the proxy methods here as we want to test {@code
+   * putEdge} when the end-points are not elements of the graph.
+   */
+  @Test
+  public void putEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    graphAsMutableGraph.addNode(N1);
+    assertTrue(graphAsMutableGraph.putEdge(N1, N5));
+    assertTrue(graphAsMutableGraph.putEdge(N4, N1));
+    assertTrue(graphAsMutableGraph.putEdge(N2, N3));
+    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N4, N5);
+    assertThat(graph.adjacentNodes(N2)).containsExactly(N3);
+    assertThat(graph.adjacentNodes(N3)).containsExactly(N2);
+    assertThat(graph.adjacentNodes(N4)).containsExactly(N1);
+    assertThat(graph.adjacentNodes(N5)).containsExactly(N1);
+  }
+
+  @Test
+  public void putEdge_doesntAllowSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isFalse();
+
+    try {
+      putEdge(N1, N1);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  @Test
+  public void putEdge_allowsSelfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isTrue();
+    assertThat(graph.adjacentNodes(N1)).containsExactly(N1);
+  }
+
+  @Test
+  public void putEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.putEdge(N1, N1)).isFalse();
+  }
+
+  @Test
+  public void removeEdge_antiparallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+
+    putEdge(N1, N2);
+    putEdge(N2, N1); // no-op
+
+    assertThat(graphAsMutableGraph.removeEdge(N1, N2)).isTrue();
+    assertThat(graph.adjacentNodes(N1)).isEmpty();
+    assertThat(graph.edges()).isEmpty();
+    assertThat(graphAsMutableGraph.removeEdge(N2, N1)).isFalse();
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeNode(N1)).isTrue();
+    assertThat(graph.nodes()).isEmpty();
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(graph.allowsSelfLoops()).isTrue();
+
+    putEdge(N1, N1);
+    assertThat(graphAsMutableGraph.removeEdge(N1, N1)).isTrue();
+    assertThat(graph.nodes()).containsExactly(N1);
+    assertThat(graph.adjacentNodes(N1)).isEmpty();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedNetworkTest.java
new file mode 100644
index 0000000..7939ad8
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedNetworkTest.java
@@ -0,0 +1,610 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.testing.EqualsTester;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * Abstract base class for testing undirected {@link Network} implementations defined in this
+ * package.
+ */
+public abstract class AbstractStandardUndirectedNetworkTest extends AbstractNetworkTest {
+  private static final EndpointPair<Integer> ENDPOINTS_N1N2 = EndpointPair.ordered(N1, N2);
+  private static final EndpointPair<Integer> ENDPOINTS_N2N1 = EndpointPair.ordered(N2, N1);
+
+  @After
+  public void validateUndirectedEdges() {
+    for (Integer node : network.nodes()) {
+      new EqualsTester()
+          .addEqualityGroup(
+              network.inEdges(node), network.outEdges(node), network.incidentEdges(node))
+          .testEquals();
+      new EqualsTester()
+          .addEqualityGroup(
+              network.predecessors(node), network.successors(node), network.adjacentNodes(node))
+          .testEquals();
+
+      for (Integer adjacentNode : network.adjacentNodes(node)) {
+        assertThat(network.edgesConnecting(node, adjacentNode))
+            .containsExactlyElementsIn(network.edgesConnecting(adjacentNode, node));
+      }
+    }
+  }
+
+  @Override
+  @Test
+  public void nodes_checkReturnedSetMutability() {
+    Set<Integer> nodes = network.nodes();
+    try {
+      nodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addNode(N1);
+      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
+    }
+  }
+
+  @Override
+  @Test
+  public void edges_checkReturnedSetMutability() {
+    Set<String> edges = network.edges();
+    try {
+      edges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edges()).containsExactlyElementsIn(edges);
+    }
+  }
+
+  @Override
+  @Test
+  public void incidentEdges_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<String> incidentEdges = network.incidentEdges(N1);
+    try {
+      incidentEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void adjacentNodes_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
+    try {
+      adjacentNodes.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
+    }
+  }
+
+  @Override
+  public void adjacentEdges_checkReturnedSetMutability() {
+    addEdge(N1, N2, E12);
+    Set<String> adjacentEdges = network.adjacentEdges(E12);
+    try {
+      adjacentEdges.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N2, N3, E23);
+      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void edgesConnecting_checkReturnedSetMutability() {
+    addNode(N1);
+    addNode(N2);
+    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
+    try {
+      edgesConnecting.add(E23);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
+    }
+  }
+
+  @Override
+  @Test
+  public void inEdges_checkReturnedSetMutability() {
+    addNode(N2);
+    Set<String> inEdges = network.inEdges(N2);
+    try {
+      inEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void outEdges_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<String> outEdges = network.outEdges(N1);
+    try {
+      outEdges.add(E12);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
+    }
+  }
+
+  @Override
+  @Test
+  public void predecessors_checkReturnedSetMutability() {
+    addNode(N2);
+    Set<Integer> predecessors = network.predecessors(N2);
+    try {
+      predecessors.add(N1);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
+    }
+  }
+
+  @Override
+  @Test
+  public void successors_checkReturnedSetMutability() {
+    addNode(N1);
+    Set<Integer> successors = network.successors(N1);
+    try {
+      successors.add(N2);
+      fail(ERROR_MODIFIABLE_COLLECTION);
+    } catch (UnsupportedOperationException e) {
+      addEdge(N1, N2, E12);
+      assertThat(network.successors(N1)).containsExactlyElementsIn(successors);
+    }
+  }
+
+  @Test
+  public void edges_containsOrderMismatch() {
+    addEdge(N1, N2, E12);
+    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N2N1);
+    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N1N2);
+  }
+
+  @Test
+  public void edgesConnecting_orderMismatch() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(ENDPOINTS_N2N1)).containsExactly(E12);
+    assertThat(network.edgesConnecting(ENDPOINTS_N1N2)).containsExactly(E12);
+  }
+
+  @Test
+  public void edgeConnecting_orderMismatch() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgeConnecting(ENDPOINTS_N2N1)).hasValue(E12);
+    assertThat(network.edgeConnecting(ENDPOINTS_N1N2)).hasValue(E12);
+  }
+
+  @Test
+  public void edgeConnectingOrNull_orderMismatch() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N2N1)).isEqualTo(E12);
+    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N1N2)).isEqualTo(E12);
+  }
+
+  @Test
+  public void edgesConnecting_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void inEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inEdges(N2)).containsExactly(E12);
+    assertThat(network.inEdges(N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void outEdges_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outEdges(N2)).containsExactly(E12);
+    assertThat(network.outEdges(N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void predecessors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.predecessors(N2)).containsExactly(N1);
+    assertThat(network.predecessors(N1)).containsExactly(N2);
+  }
+
+  @Test
+  public void successors_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.successors(N1)).containsExactly(N2);
+    assertThat(network.successors(N2)).containsExactly(N1);
+  }
+
+  @Test
+  public void inDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.inDegree(N2)).isEqualTo(1);
+    assertThat(network.inDegree(N1)).isEqualTo(1);
+  }
+
+  @Test
+  public void outDegree_oneEdge() {
+    addEdge(N1, N2, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(1);
+    assertThat(network.outDegree(N2)).isEqualTo(1);
+  }
+
+  @Test
+  public void edges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edges()).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentEdges(N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void incidentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.incidentNodes(E11).nodeU()).isEqualTo(N1);
+    assertThat(network.incidentNodes(E11).nodeV()).isEqualTo(N1);
+  }
+
+  @Test
+  public void adjacentNodes_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void adjacentEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
+  }
+
+  @Test
+  public void edgesConnecting_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void inEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inEdges(N1)).containsExactly(E11);
+    addEdge(N1, N2, E12);
+    assertThat(network.inEdges(N1)).containsExactly(E11, E12);
+  }
+
+  @Test
+  public void outEdges_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outEdges(N1)).containsExactly(E11);
+    addEdge(N2, N1, E12);
+    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
+  }
+
+  @Test
+  public void predecessors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.predecessors(N1)).containsExactly(N1);
+    addEdge(N1, N2, E12);
+    assertThat(network.predecessors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void successors_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.successors(N1)).containsExactly(N1);
+    addEdge(N2, N1, E12);
+    assertThat(network.successors(N1)).containsExactly(N1, N2);
+  }
+
+  @Test
+  public void degree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.degree(N1)).isEqualTo(2);
+    addEdge(N1, N2, E12);
+    assertThat(network.degree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void inDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.inDegree(N1)).isEqualTo(2);
+    addEdge(N1, N2, E12);
+    assertThat(network.inDegree(N1)).isEqualTo(3);
+  }
+
+  @Test
+  public void outDegree_selfLoop() {
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(network.outDegree(N1)).isEqualTo(2);
+    addEdge(N2, N1, E12);
+    assertThat(network.outDegree(N1)).isEqualTo(3);
+  }
+
+  // Element Mutation
+
+  @Test
+  public void addEdge_existingNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    // Adding nodes initially for safety (insulating from possible future
+    // modifications to proxy methods)
+    addNode(N1);
+    addNode(N2);
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isTrue();
+    assertThat(network.edges()).contains(E12);
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
+    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isTrue();
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N2, E12)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+    assertThat(networkAsMutableNetwork.addEdge(N2, N1, E12)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes() {
+    assume().that(graphIsMutable()).isTrue();
+
+    addEdge(N1, N2, E12);
+    try {
+      // Edge between totally different nodes
+      networkAsMutableNetwork.addEdge(N4, N5, E12);
+      fail(ERROR_ADDED_EXISTING_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
+      fail(ERROR_ADDED_PARALLEL_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+    try {
+      networkAsMutableNetwork.addEdge(N2, N1, EDGE_NOT_IN_GRAPH);
+      fail(ERROR_ADDED_PARALLEL_EDGE);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12));
+    assertTrue(networkAsMutableNetwork.addEdge(N2, N1, E21));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N2, E12_A));
+    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
+  }
+
+  @Test
+  public void addEdge_orderMismatch() {
+    assume().that(graphIsMutable()).isTrue();
+
+    EndpointPair<Integer> endpoints = EndpointPair.ordered(N1, N2);
+    assertThat(networkAsMutableNetwork.addEdge(endpoints, E12)).isTrue();
+  }
+
+  @Test
+  public void addEdge_selfLoop_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isFalse();
+
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E11);
+      fail(ERROR_ADDED_SELF_LOOP);
+    } catch (IllegalArgumentException e) {
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
+    }
+  }
+
+  /**
+   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
+   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
+   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
+   * elements of the graph.
+   */
+  @Test
+  public void addEdge_nodesNotInGraph() {
+    assume().that(graphIsMutable()).isTrue();
+
+    networkAsMutableNetwork.addNode(N1);
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N5, E15));
+    assertTrue(networkAsMutableNetwork.addEdge(N4, N1, E41));
+    assertTrue(networkAsMutableNetwork.addEdge(N2, N3, E23));
+    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3);
+    assertThat(network.edges()).containsExactly(E15, E41, E23);
+    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
+    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
+    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
+    assertThat(network.edgesConnecting(N3, N2)).containsExactly(E23);
+  }
+
+  @Test
+  public void addEdge_selfLoop() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isTrue();
+    assertThat(network.edges()).contains(E11);
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
+  }
+
+  @Test
+  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
+    assertThat(networkAsMutableNetwork.addEdge(N1, N1, E11)).isFalse();
+    assertThat(network.edges()).containsExactlyElementsIn(edges);
+  }
+
+  @Test
+  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N2, E11);
+      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    try {
+      networkAsMutableNetwork.addEdge(N2, N2, E11);
+      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+    addEdge(N1, N2, E12);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, E12);
+      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_notAllowed() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isFalse();
+
+    addEdge(N1, N1, E11);
+    try {
+      networkAsMutableNetwork.addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
+      fail("Adding a parallel self-loop edge succeeded");
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
+    }
+  }
+
+  @Test
+  public void addEdge_parallelSelfLoopEdge_allowsParallelEdges() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+    assume().that(network.allowsParallelEdges()).isTrue();
+
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11));
+    assertTrue(networkAsMutableNetwork.addEdge(N1, N1, E11_A));
+    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
+  }
+
+  @Test
+  public void removeNode_existingNodeWithSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addNode(N1);
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeNode(N1)).isTrue();
+    assertThat(network.nodes()).isEmpty();
+    assertThat(network.edges()).doesNotContain(E11);
+  }
+
+  @Test
+  public void removeEdge_existingSelfLoopEdge() {
+    assume().that(graphIsMutable()).isTrue();
+    assume().that(network.allowsSelfLoops()).isTrue();
+
+    addEdge(N1, N1, E11);
+    assertThat(networkAsMutableNetwork.removeEdge(E11)).isTrue();
+    assertThat(network.edges()).doesNotContain(E11);
+    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/AbstractUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractUndirectedGraphTest.java
deleted file mode 100644
index 4996a6a..0000000
--- a/guava-tests/test/com/google/common/graph/AbstractUndirectedGraphTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Abstract base class for testing undirected implementations of the {@link Graph} interface.
- *
- * <p>This class is responsible for testing that an undirected implementation of {@link Graph} is
- * correctly handling undirected edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be undirected are found in superclasses.
- */
-public abstract class AbstractUndirectedGraphTest extends AbstractGraphTest {
-
-  @After
-  public void validateUndirectedEdges() {
-    for (Integer node : graph.nodes()) {
-      new EqualsTester()
-          .addEqualityGroup(
-              graph.predecessors(node), graph.successors(node), graph.adjacentNodes(node))
-          .testEquals();
-    }
-  }
-
-  @Test
-  public void predecessors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.predecessors(N2)).containsExactly(N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N2);
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.successors(N1)).containsExactly(N2);
-    assertThat(graph.successors(N2)).containsExactly(N1);
-  }
-
-  @Test
-  public void incidentEdges_oneEdge() {
-    putEdge(N1, N2);
-    EndpointPair<Integer> expectedEndpoints = EndpointPair.unordered(N1, N2);
-    assertThat(graph.incidentEdges(N1)).containsExactly(expectedEndpoints);
-    assertThat(graph.incidentEdges(N2)).containsExactly(expectedEndpoints);
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.inDegree(N2)).isEqualTo(1);
-    assertThat(graph.inDegree(N1)).isEqualTo(1);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    putEdge(N1, N2);
-    assertThat(graph.outDegree(N1)).isEqualTo(1);
-    assertThat(graph.outDegree(N2)).isEqualTo(1);
-  }
-
-  @Test
-  public void hasEdgeConnecting_correct() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N1, N2))).isTrue();
-    assertThat(graph.hasEdgeConnecting(EndpointPair.unordered(N2, N1))).isTrue();
-  }
-
-  @Test
-  public void hasEdgeConnecting_mismatch() {
-    putEdge(N1, N2);
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N1, N2))).isTrue();
-    assertThat(graph.hasEdgeConnecting(EndpointPair.ordered(N2, N1))).isTrue();
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(putEdge(N1, N2)).isTrue();
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenSameNodes() {
-    putEdge(N1, N2);
-    assertThat(putEdge(N2, N1)).isFalse();
-  }
-
-  @Test
-  public void removeEdge_antiparallelEdges() {
-    putEdge(N1, N2);
-    putEdge(N2, N1); // no-op
-
-    assertThat(graph.removeEdge(N1, N2)).isTrue();
-    assertThat(graph.adjacentNodes(N1)).isEmpty();
-    assertThat(graph.edges()).isEmpty();
-    assertThat(graph.removeEdge(N2, N1)).isFalse();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/AbstractUndirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/AbstractUndirectedNetworkTest.java
deleted file mode 100644
index dba1680..0000000
--- a/guava-tests/test/com/google/common/graph/AbstractUndirectedNetworkTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.testing.EqualsTester;
-import org.junit.After;
-import org.junit.Test;
-
-/**
- * Abstract base class for testing undirected implementations of the {@link Network} interface.
- *
- * <p>This class is responsible for testing that an undirected implementation of {@link Network} is
- * correctly handling undirected edges. Implementation-dependent test cases are left to subclasses.
- * Test cases that do not require the graph to be undirected are found in superclasses.
- */
-public abstract class AbstractUndirectedNetworkTest extends AbstractNetworkTest {
-  private static final EndpointPair<Integer> ENDPOINTS_N1N2 = EndpointPair.ordered(N1, N2);
-  private static final EndpointPair<Integer> ENDPOINTS_N2N1 = EndpointPair.ordered(N2, N1);
-
-  @After
-  public void validateUndirectedEdges() {
-    for (Integer node : network.nodes()) {
-      new EqualsTester()
-          .addEqualityGroup(
-              network.inEdges(node), network.outEdges(node), network.incidentEdges(node))
-          .testEquals();
-      new EqualsTester()
-          .addEqualityGroup(
-              network.predecessors(node), network.successors(node), network.adjacentNodes(node))
-          .testEquals();
-
-      for (Integer adjacentNode : network.adjacentNodes(node)) {
-        assertThat(network.edgesConnecting(node, adjacentNode))
-            .containsExactlyElementsIn(network.edgesConnecting(adjacentNode, node));
-      }
-    }
-  }
-
-  @Test
-  public void edges_containsOrderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N2N1);
-    assertThat(network.asGraph().edges()).contains(ENDPOINTS_N1N2);
-  }
-
-  @Test
-  public void edgesConnecting_orderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(ENDPOINTS_N2N1)).containsExactly(E12);
-    assertThat(network.edgesConnecting(ENDPOINTS_N1N2)).containsExactly(E12);
-  }
-
-  @Test
-  public void edgeConnecting_orderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgeConnecting(ENDPOINTS_N2N1)).hasValue(E12);
-    assertThat(network.edgeConnecting(ENDPOINTS_N1N2)).hasValue(E12);
-  }
-
-  @Test
-  public void edgeConnectingOrNull_orderMismatch() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N2N1)).isEqualTo(E12);
-    assertThat(network.edgeConnectingOrNull(ENDPOINTS_N1N2)).isEqualTo(E12);
-  }
-
-  @Test
-  public void edgesConnecting_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void inEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inEdges(N2)).containsExactly(E12);
-    assertThat(network.inEdges(N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void outEdges_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outEdges(N2)).containsExactly(E12);
-    assertThat(network.outEdges(N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void predecessors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.predecessors(N2)).containsExactly(N1);
-    assertThat(network.predecessors(N1)).containsExactly(N2);
-  }
-
-  @Test
-  public void successors_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.successors(N1)).containsExactly(N2);
-    assertThat(network.successors(N2)).containsExactly(N1);
-  }
-
-  @Test
-  public void inDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.inDegree(N2)).isEqualTo(1);
-    assertThat(network.inDegree(N1)).isEqualTo(1);
-  }
-
-  @Test
-  public void outDegree_oneEdge() {
-    addEdge(N1, N2, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(1);
-    assertThat(network.outDegree(N2)).isEqualTo(1);
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_existingNodes() {
-    // Adding nodes initially for safety (insulating from possible future
-    // modifications to proxy methods)
-    addNode(N1);
-    addNode(N2);
-    assertThat(addEdge(N1, N2, E12)).isTrue();
-    assertThat(network.edges()).contains(E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenSameNodes() {
-    assertThat(addEdge(N1, N2, E12)).isTrue();
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N2, E12)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-    assertThat(addEdge(N2, N1, E12)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes() {
-    addEdge(N1, N2, E12);
-    try {
-      // Edge between totally different nodes
-      addEdge(N4, N5, E12);
-      fail(ERROR_ADDED_EXISTING_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N2, EDGE_NOT_IN_GRAPH);
-      fail(ERROR_ADDED_PARALLEL_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-    try {
-      addEdge(N2, N1, EDGE_NOT_IN_GRAPH);
-      fail(ERROR_ADDED_PARALLEL_EDGE);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_orderMismatch() {
-    EndpointPair<Integer> endpoints = EndpointPair.ordered(N1, N2);
-    assertThat(addEdge(endpoints, E12)).isTrue();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/ConfigurableDirectedGraphTest.java
deleted file mode 100644
index ed998eb..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableDirectedGraphTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for a directed {@link ConfigurableMutableGraph} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableDirectedGraphTest extends ConfigurableSimpleDirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.directed().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    putEdge(N1, N1);
-    putEdge(N1, N2);
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1);
-    putEdge(N4, N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1, N4);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.successors(N1)).containsExactly(N1);
-    putEdge(N1, N2);
-    assertThat(graph.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.ordered(N1, N1));
-    putEdge(N1, N2);
-    assertThat(graph.incidentEdges(N1))
-        .containsExactly(EndpointPair.ordered(N1, N1), EndpointPair.ordered(N1, N2));
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.degree(N1)).isEqualTo(2);
-    putEdge(N1, N2);
-    assertThat(graph.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.inDegree(N1)).isEqualTo(1);
-    putEdge(N4, N1);
-    assertThat(graph.inDegree(N1)).isEqualTo(2);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.outDegree(N1)).isEqualTo(1);
-    putEdge(N1, N2);
-    assertThat(graph.outDegree(N1)).isEqualTo(2);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(putEdge(N1, N1)).isTrue();
-    assertThat(graph.successors(N1)).containsExactly(N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    putEdge(N1, N1);
-    assertThat(putEdge(N1, N1)).isFalse();
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    putEdge(N1, N1);
-    assertThat(graph.removeNode(N1)).isTrue();
-    assertThat(graph.nodes()).isEmpty();
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    putEdge(N1, N1);
-    assertThat(graph.removeEdge(N1, N1)).isTrue();
-    assertThat(graph.nodes()).containsExactly(N1);
-    assertThat(graph.successors(N1)).isEmpty();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableDirectedMultiNetworkTest.java b/guava-tests/test/com/google/common/graph/ConfigurableDirectedMultiNetworkTest.java
deleted file mode 100644
index 3a49e2d..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableDirectedMultiNetworkTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for a directed {@link ConfigurableMutableNetwork} allowing parallel edges and self-loops.
- */
-@RunWith(JUnit4.class)
-public class ConfigurableDirectedMultiNetworkTest extends ConfigurableDirectedNetworkTest {
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.directed().allowsParallelEdges(true).allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentEdges_parallelEdges() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    addEdge(N1, N2, E12_B);
-    addEdge(N3, N4, E34);
-    assertThat(network.adjacentEdges(E12)).containsExactly(E12_A, E12_B);
-  }
-
-  @Test
-  public void edgesConnecting_parallelEdges() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
-    // Passed nodes should be in the correct edge direction, first is the
-    // source node and the second is the target node
-    assertThat(network.edgesConnecting(N2, N1)).isEmpty();
-  }
-
-  @Test
-  public void edgesConnecting_parallelSelfLoopEdges() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelEdge() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Test
-  public void removeEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    assertTrue(network.removeEdge(E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-  }
-
-  @Test
-  public void removeEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N1, E11_A);
-    addEdge(N1, N2, E12);
-    assertTrue(network.removeEdge(E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertTrue(network.removeEdge(E11));
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableDirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/ConfigurableDirectedNetworkTest.java
deleted file mode 100644
index 671b1e8..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableDirectedNetworkTest.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for a directed {@link ConfigurableMutableNetwork} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableDirectedNetworkTest extends ConfigurableSimpleDirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.directed().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void edges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edges()).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentEdges(N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
-    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void adjacentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
-  }
-
-  @Test
-  public void edgesConnecting_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void inEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inEdges(N1)).containsExactly(E11);
-    addEdge(N4, N1, E41);
-    assertThat(network.inEdges(N1)).containsExactly(E11, E41);
-  }
-
-  @Test
-  public void outEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outEdges(N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.predecessors(N1)).containsExactly(N1);
-    addEdge(N4, N1, E41);
-    assertThat(network.predecessors(N1)).containsExactly(N1, N4);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.successors(N1)).containsExactly(N1);
-    addEdge(N1, N2, E12);
-    assertThat(network.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void source_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).source()).isEqualTo(N1);
-  }
-
-  @Test
-  public void target_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).target()).isEqualTo(N1);
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.degree(N1)).isEqualTo(2);
-    addEdge(N1, N2, E12);
-    assertThat(network.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inDegree(N1)).isEqualTo(1);
-    addEdge(N4, N1, E41);
-    assertThat(network.inDegree(N1)).isEqualTo(2);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outDegree(N1)).isEqualTo(1);
-    addEdge(N1, N2, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(2);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(addEdge(N1, N1, E11)).isTrue();
-    assertThat(network.edges()).contains(E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    addEdge(N1, N1, E11);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N1, E11)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N2, E11);
-      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    try {
-      addEdge(N2, N2, E11);
-      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N1, E12);
-      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
-      fail("Adding a parallel self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    addEdge(N1, N1, E11);
-    assertThat(network.removeNode(N1)).isTrue();
-    assertThat(network.nodes()).isEmpty();
-    assertThat(network.edges()).doesNotContain(E11);
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    assertThat(network.removeEdge(E11)).isTrue();
-    assertThat(network.edges()).doesNotContain(E11);
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedGraphTest.java
deleted file mode 100644
index 888cf9a..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedGraphTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for a directed {@link ConfigurableMutableGraph}, creating a simple directed graph
- * (self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleDirectedGraphTest extends AbstractDirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.directed().allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = graph.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = graph.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = graph.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(successors).containsExactlyElementsIn(graph.successors(N1));
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
-    try {
-      incidentEdges.add(EndpointPair.ordered(N1, N2));
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      putEdge(N1, N1);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    graph.addNode(N1);
-    assertTrue(graph.putEdge(N1, N5));
-    assertTrue(graph.putEdge(N4, N1));
-    assertTrue(graph.putEdge(N2, N3));
-    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(graph.successors(N1)).containsExactly(N5);
-    assertThat(graph.successors(N2)).containsExactly(N3);
-    assertThat(graph.successors(N3)).isEmpty();
-    assertThat(graph.successors(N4)).containsExactly(N1);
-    assertThat(graph.successors(N5)).isEmpty();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedNetworkTest.java
deleted file mode 100644
index a8645b4..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableSimpleDirectedNetworkTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for a directed {@link ConfigurableMutableNetwork}, creating a simple directed graph
- * (parallel and self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleDirectedNetworkTest extends AbstractDirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.directed().allowsParallelEdges(false).allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = network.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void edges_checkReturnedSetMutability() {
-    Set<String> edges = network.edges();
-    try {
-      edges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edges()).containsExactlyElementsIn(edges);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> incidentEdges = network.incidentEdges(N1);
-    try {
-      incidentEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  public void adjacentEdges_checkReturnedSetMutability() {
-    addEdge(N1, N2, E12);
-    Set<String> adjacentEdges = network.adjacentEdges(E12);
-    try {
-      adjacentEdges.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N2, N3, E23);
-      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void edgesConnecting_checkReturnedSetMutability() {
-    addNode(N1);
-    addNode(N2);
-    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
-    try {
-      edgesConnecting.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
-    }
-  }
-
-  @Override
-  @Test
-  public void inEdges_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<String> inEdges = network.inEdges(N2);
-    try {
-      inEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void outEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> outEdges = network.outEdges(N1);
-    try {
-      outEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = network.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = network.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(successors).containsExactlyElementsIn(network.successors(N1));
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      addEdge(N1, N1, E11);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    network.addNode(N1);
-    assertTrue(network.addEdge(N1, N5, E15));
-    assertTrue(network.addEdge(N4, N1, E41));
-    assertTrue(network.addEdge(N2, N3, E23));
-    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(network.edges()).containsExactly(E15, E41, E23).inOrder();
-    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
-    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
-    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
-    // Direction of the added edge is correctly handled
-    assertThat(network.edgesConnecting(N3, N2)).isEmpty();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedGraphTest.java
deleted file mode 100644
index 97693d1..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedGraphTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for an undirected {@link ConfigurableMutableGraph}, creating a simple undirected graph
- * (self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleUndirectedGraphTest extends AbstractUndirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.undirected().allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = graph.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(graph.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = graph.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = graph.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = graph.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(graph.successors(N1)).containsExactlyElementsIn(successors);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<EndpointPair<Integer>> incidentEdges = graph.incidentEdges(N1);
-    try {
-      incidentEdges.add(EndpointPair.unordered(N1, N2));
-      fail(ERROR_MODIFIABLE_SET);
-    } catch (UnsupportedOperationException e) {
-      putEdge(N1, N2);
-      assertThat(incidentEdges).containsExactlyElementsIn(graph.incidentEdges(N1));
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      putEdge(N1, N1);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    graph.addNode(N1);
-    assertTrue(graph.putEdge(N1, N5));
-    assertTrue(graph.putEdge(N4, N1));
-    assertTrue(graph.putEdge(N2, N3));
-    assertThat(graph.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N4, N5);
-    assertThat(graph.adjacentNodes(N2)).containsExactly(N3);
-    assertThat(graph.adjacentNodes(N3)).containsExactly(N2);
-    assertThat(graph.adjacentNodes(N4)).containsExactly(N1);
-    assertThat(graph.adjacentNodes(N5)).containsExactly(N1);
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedNetworkTest.java
deleted file mode 100644
index d1c4411..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableSimpleUndirectedNetworkTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.Set;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for an undirected {@link ConfigurableMutableNetwork}, creating a simple undirected graph
- * (parallel and self-loop edges are not allowed).
- */
-@RunWith(JUnit4.class)
-public class ConfigurableSimpleUndirectedNetworkTest extends AbstractUndirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.undirected().allowsParallelEdges(false).allowsSelfLoops(false).build();
-  }
-
-  @Override
-  @Test
-  public void nodes_checkReturnedSetMutability() {
-    Set<Integer> nodes = network.nodes();
-    try {
-      nodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addNode(N1);
-      assertThat(network.nodes()).containsExactlyElementsIn(nodes);
-    }
-  }
-
-  @Override
-  @Test
-  public void edges_checkReturnedSetMutability() {
-    Set<String> edges = network.edges();
-    try {
-      edges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edges()).containsExactlyElementsIn(edges);
-    }
-  }
-
-  @Override
-  @Test
-  public void incidentEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> incidentEdges = network.incidentEdges(N1);
-    try {
-      incidentEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.incidentEdges(N1)).containsExactlyElementsIn(incidentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void adjacentNodes_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> adjacentNodes = network.adjacentNodes(N1);
-    try {
-      adjacentNodes.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.adjacentNodes(N1)).containsExactlyElementsIn(adjacentNodes);
-    }
-  }
-
-  @Override
-  public void adjacentEdges_checkReturnedSetMutability() {
-    addEdge(N1, N2, E12);
-    Set<String> adjacentEdges = network.adjacentEdges(E12);
-    try {
-      adjacentEdges.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N2, N3, E23);
-      assertThat(network.adjacentEdges(E12)).containsExactlyElementsIn(adjacentEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void edgesConnecting_checkReturnedSetMutability() {
-    addNode(N1);
-    addNode(N2);
-    Set<String> edgesConnecting = network.edgesConnecting(N1, N2);
-    try {
-      edgesConnecting.add(E23);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.edgesConnecting(N1, N2)).containsExactlyElementsIn(edgesConnecting);
-    }
-  }
-
-  @Override
-  @Test
-  public void inEdges_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<String> inEdges = network.inEdges(N2);
-    try {
-      inEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.inEdges(N2)).containsExactlyElementsIn(inEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void outEdges_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<String> outEdges = network.outEdges(N1);
-    try {
-      outEdges.add(E12);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.outEdges(N1)).containsExactlyElementsIn(outEdges);
-    }
-  }
-
-  @Override
-  @Test
-  public void predecessors_checkReturnedSetMutability() {
-    addNode(N2);
-    Set<Integer> predecessors = network.predecessors(N2);
-    try {
-      predecessors.add(N1);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.predecessors(N2)).containsExactlyElementsIn(predecessors);
-    }
-  }
-
-  @Override
-  @Test
-  public void successors_checkReturnedSetMutability() {
-    addNode(N1);
-    Set<Integer> successors = network.successors(N1);
-    try {
-      successors.add(N2);
-      fail(ERROR_MODIFIABLE_COLLECTION);
-    } catch (UnsupportedOperationException e) {
-      addEdge(N1, N2, E12);
-      assertThat(network.successors(N1)).containsExactlyElementsIn(successors);
-    }
-  }
-
-  // Element Mutation
-
-  @Test
-  public void addEdge_selfLoop() {
-    try {
-      addEdge(N1, N1, E11);
-      fail(ERROR_ADDED_SELF_LOOP);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
-    }
-  }
-
-  /**
-   * This test checks an implementation dependent feature. It tests that the method {@code addEdge}
-   * will silently add the missing nodes to the graph, then add the edge connecting them. We are not
-   * using the proxy methods here as we want to test {@code addEdge} when the end-points are not
-   * elements of the graph.
-   */
-  @Test
-  public void addEdge_nodesNotInGraph() {
-    network.addNode(N1);
-    assertTrue(network.addEdge(N1, N5, E15));
-    assertTrue(network.addEdge(N4, N1, E41));
-    assertTrue(network.addEdge(N2, N3, E23));
-    assertThat(network.nodes()).containsExactly(N1, N5, N4, N2, N3).inOrder();
-    assertThat(network.edges()).containsExactly(E15, E41, E23).inOrder();
-    assertThat(network.edgesConnecting(N1, N5)).containsExactly(E15);
-    assertThat(network.edgesConnecting(N4, N1)).containsExactly(E41);
-    assertThat(network.edgesConnecting(N2, N3)).containsExactly(E23);
-    assertThat(network.edgesConnecting(N3, N2)).containsExactly(E23);
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/ConfigurableUndirectedGraphTest.java
deleted file mode 100644
index 3bdfd74..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableUndirectedGraphTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for an undirected {@link ConfigurableMutableGraph} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableUndirectedGraphTest extends ConfigurableSimpleUndirectedGraphTest {
-
-  @Override
-  public MutableGraph<Integer> createGraph() {
-    return GraphBuilder.undirected().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    putEdge(N1, N1);
-    putEdge(N1, N2);
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.predecessors(N1)).containsExactly(N1);
-    putEdge(N1, N2);
-    assertThat(graph.predecessors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.successors(N1)).containsExactly(N1);
-    putEdge(N2, N1);
-    assertThat(graph.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.incidentEdges(N1)).containsExactly(EndpointPair.unordered(N1, N1));
-    putEdge(N1, N2);
-    assertThat(graph.incidentEdges(N1))
-        .containsExactly(EndpointPair.unordered(N1, N1), EndpointPair.unordered(N1, N2));
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.degree(N1)).isEqualTo(2);
-    putEdge(N1, N2);
-    assertThat(graph.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.inDegree(N1)).isEqualTo(2);
-    putEdge(N1, N2);
-    assertThat(graph.inDegree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    putEdge(N1, N1);
-    assertThat(graph.outDegree(N1)).isEqualTo(2);
-    putEdge(N2, N1);
-    assertThat(graph.outDegree(N1)).isEqualTo(3);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(putEdge(N1, N1)).isTrue();
-    assertThat(graph.adjacentNodes(N1)).containsExactly(N1);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    putEdge(N1, N1);
-    assertThat(putEdge(N1, N1)).isFalse();
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    putEdge(N1, N1);
-    assertThat(graph.removeNode(N1)).isTrue();
-    assertThat(graph.nodes()).isEmpty();
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    putEdge(N1, N1);
-    assertThat(graph.removeEdge(N1, N1)).isTrue();
-    assertThat(graph.nodes()).containsExactly(N1);
-    assertThat(graph.adjacentNodes(N1)).isEmpty();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableUndirectedMultiNetworkTest.java b/guava-tests/test/com/google/common/graph/ConfigurableUndirectedMultiNetworkTest.java
deleted file mode 100644
index d239e22..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableUndirectedMultiNetworkTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for an undirected {@link ConfigurableMutableNetwork} allowing parallel edges and
- * self-loops.
- */
-@RunWith(JUnit4.class)
-public class ConfigurableUndirectedMultiNetworkTest extends ConfigurableUndirectedNetworkTest {
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.undirected().allowsParallelEdges(true).allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void adjacentEdges_parallelEdges() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    addEdge(N1, N2, E12_B);
-    addEdge(N3, N4, E34);
-    assertThat(network.adjacentEdges(E12)).containsExactly(E12_A, E12_B);
-  }
-
-  @Test
-  public void edgesConnecting_parallelEdges() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertTrue(addEdge(N2, N1, E21));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12, E12_A, E21);
-  }
-
-  @Test
-  public void edgesConnecting_parallelSelfLoopEdges() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelEdge() {
-    assertTrue(addEdge(N1, N2, E12));
-    assertTrue(addEdge(N1, N2, E12_A));
-    assertTrue(addEdge(N2, N1, E21));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E12_A, E21);
-  }
-
-  @Override
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    assertTrue(addEdge(N1, N1, E11));
-    assertTrue(addEdge(N1, N1, E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11, E11_A);
-  }
-
-  @Test
-  public void removeEdge_parallelEdge() {
-    addEdge(N1, N2, E12);
-    addEdge(N1, N2, E12_A);
-    addEdge(N2, N1, E21);
-    assertTrue(network.removeEdge(E12_A));
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12, E21);
-  }
-
-  @Test
-  public void removeEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N1, E11_A);
-    addEdge(N1, N2, E12);
-    assertTrue(network.removeEdge(E11_A));
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertTrue(network.removeEdge(E11));
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ConfigurableUndirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/ConfigurableUndirectedNetworkTest.java
deleted file mode 100644
index 28cd3e5..0000000
--- a/guava-tests/test/com/google/common/graph/ConfigurableUndirectedNetworkTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableSet;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for an undirected {@link ConfigurableMutableNetwork} allowing self-loops. */
-@RunWith(JUnit4.class)
-public class ConfigurableUndirectedNetworkTest extends ConfigurableSimpleUndirectedNetworkTest {
-
-  @Override
-  public MutableNetwork<Integer, String> createGraph() {
-    return NetworkBuilder.undirected().allowsSelfLoops(true).build();
-  }
-
-  @Test
-  public void edges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edges()).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentEdges(N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void incidentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.incidentNodes(E11).nodeU()).isEqualTo(N1);
-    assertThat(network.incidentNodes(E11).nodeV()).isEqualTo(N1);
-  }
-
-  @Test
-  public void adjacentNodes_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentNodes(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void adjacentEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.adjacentEdges(E11)).containsExactly(E12);
-  }
-
-  @Test
-  public void edgesConnecting_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void inEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inEdges(N1)).containsExactly(E11);
-    addEdge(N1, N2, E12);
-    assertThat(network.inEdges(N1)).containsExactly(E11, E12);
-  }
-
-  @Test
-  public void outEdges_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outEdges(N1)).containsExactly(E11);
-    addEdge(N2, N1, E12);
-    assertThat(network.outEdges(N1)).containsExactly(E11, E12);
-  }
-
-  @Test
-  public void predecessors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.predecessors(N1)).containsExactly(N1);
-    addEdge(N1, N2, E12);
-    assertThat(network.predecessors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void successors_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.successors(N1)).containsExactly(N1);
-    addEdge(N2, N1, E12);
-    assertThat(network.successors(N1)).containsExactly(N1, N2);
-  }
-
-  @Test
-  public void degree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.degree(N1)).isEqualTo(2);
-    addEdge(N1, N2, E12);
-    assertThat(network.degree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void inDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.inDegree(N1)).isEqualTo(2);
-    addEdge(N1, N2, E12);
-    assertThat(network.inDegree(N1)).isEqualTo(3);
-  }
-
-  @Test
-  public void outDegree_selfLoop() {
-    addEdge(N1, N1, E11);
-    assertThat(network.outDegree(N1)).isEqualTo(2);
-    addEdge(N2, N1, E12);
-    assertThat(network.outDegree(N1)).isEqualTo(3);
-  }
-
-  @Override
-  @Test
-  public void addEdge_selfLoop() {
-    assertThat(addEdge(N1, N1, E11)).isTrue();
-    assertThat(network.edges()).contains(E11);
-    assertThat(network.edgesConnecting(N1, N1)).containsExactly(E11);
-  }
-
-  @Test
-  public void addEdge_existingSelfLoopEdgeBetweenSameNodes() {
-    addEdge(N1, N1, E11);
-    ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
-    assertThat(addEdge(N1, N1, E11)).isFalse();
-    assertThat(network.edges()).containsExactlyElementsIn(edges);
-  }
-
-  @Test
-  public void addEdge_existingEdgeBetweenDifferentNodes_selfLoops() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N2, E11);
-      fail("Reusing an existing self-loop edge to connect different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    try {
-      addEdge(N2, N2, E11);
-      fail("Reusing an existing self-loop edge to make a different self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-    addEdge(N1, N2, E12);
-    try {
-      addEdge(N1, N1, E12);
-      fail("Reusing an existing edge to add a self-loop edge between different nodes succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_REUSE_EDGE);
-    }
-  }
-
-  @Test
-  public void addEdge_parallelSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    try {
-      addEdge(N1, N1, EDGE_NOT_IN_GRAPH);
-      fail("Adding a parallel self-loop edge succeeded");
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_PARALLEL_EDGE);
-    }
-  }
-
-  @Test
-  public void removeNode_existingNodeWithSelfLoopEdge() {
-    addNode(N1);
-    addEdge(N1, N1, E11);
-    assertThat(network.removeNode(N1)).isTrue();
-    assertThat(network.nodes()).isEmpty();
-    assertThat(network.edges()).doesNotContain(E11);
-  }
-
-  @Test
-  public void removeEdge_existingSelfLoopEdge() {
-    addEdge(N1, N1, E11);
-    assertThat(network.removeEdge(E11)).isTrue();
-    assertThat(network.edges()).doesNotContain(E11);
-    assertThat(network.edgesConnecting(N1, N1)).isEmpty();
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/GraphsTest.java b/guava-tests/test/com/google/common/graph/GraphsTest.java
index 4178d08..305df17 100644
--- a/guava-tests/test/com/google/common/graph/GraphsTest.java
+++ b/guava-tests/test/com/google/common/graph/GraphsTest.java
@@ -206,7 +206,7 @@
     MutableGraph<Integer> undirectedGraph = GraphBuilder.undirected().build();
     undirectedGraph.putEdge(N1, N2);
 
-    assertThat(transpose(undirectedGraph)).isSameAs(undirectedGraph);
+    assertThat(transpose(undirectedGraph)).isSameInstanceAs(undirectedGraph);
   }
 
   @Test
@@ -227,12 +227,12 @@
 
     Graph<Integer> transpose = transpose(directedGraph);
     assertThat(transpose).isEqualTo(expectedTranspose);
-    assertThat(transpose(transpose)).isSameAs(directedGraph);
+    assertThat(transpose(transpose)).isSameInstanceAs(directedGraph);
     AbstractGraphTest.validateGraph(transpose);
 
     for (Integer node : directedGraph.nodes()) {
-      assertThat(directedGraph.inDegree(node)).isSameAs(transpose.outDegree(node));
-      assertThat(directedGraph.outDegree(node)).isSameAs(transpose.inDegree(node));
+      assertThat(directedGraph.inDegree(node)).isSameInstanceAs(transpose.outDegree(node));
+      assertThat(directedGraph.outDegree(node)).isSameInstanceAs(transpose.inDegree(node));
     }
 
     assertThat(transpose.successors(N1)).doesNotContain(N2);
@@ -247,7 +247,7 @@
     MutableValueGraph<Integer, String> undirectedGraph = ValueGraphBuilder.undirected().build();
     undirectedGraph.putEdgeValue(N1, N2, E12);
 
-    assertThat(transpose(undirectedGraph)).isSameAs(undirectedGraph);
+    assertThat(transpose(undirectedGraph)).isSameInstanceAs(undirectedGraph);
   }
 
   @Test
@@ -270,13 +270,13 @@
 
     ValueGraph<Integer, String> transpose = transpose(directedGraph);
     assertThat(transpose).isEqualTo(expectedTranspose);
-    assertThat(transpose(transpose)).isSameAs(directedGraph);
+    assertThat(transpose(transpose)).isSameInstanceAs(directedGraph);
     AbstractGraphTest.validateGraph(transpose.asGraph());
 
     assertThat(transpose.edgeValueOrDefault(N1, N2, null)).isNull();
     for (Integer node : directedGraph.nodes()) {
-      assertThat(directedGraph.inDegree(node)).isSameAs(transpose.outDegree(node));
-      assertThat(directedGraph.outDegree(node)).isSameAs(transpose.inDegree(node));
+      assertThat(directedGraph.inDegree(node)).isSameInstanceAs(transpose.outDegree(node));
+      assertThat(directedGraph.outDegree(node)).isSameInstanceAs(transpose.inDegree(node));
     }
 
     directedGraph.putEdgeValue(N2, N1, E21);
@@ -290,7 +290,7 @@
     MutableNetwork<Integer, String> undirectedGraph = NetworkBuilder.undirected().build();
     undirectedGraph.addEdge(N1, N2, E12);
 
-    assertThat(transpose(undirectedGraph)).isSameAs(undirectedGraph);
+    assertThat(transpose(undirectedGraph)).isSameInstanceAs(undirectedGraph);
   }
 
   @Test
@@ -315,7 +315,7 @@
 
     Network<Integer, String> transpose = transpose(directedGraph);
     assertThat(transpose).isEqualTo(expectedTranspose);
-    assertThat(transpose(transpose)).isSameAs(directedGraph);
+    assertThat(transpose(transpose)).isSameInstanceAs(directedGraph);
     AbstractNetworkTest.validateNetwork(transpose);
 
     assertThat(transpose.edgesConnecting(N1, N2)).isEmpty();
@@ -323,8 +323,8 @@
     assertThat(transpose.edgeConnectingOrNull(N1, N2)).isNull();
 
     for (Integer node : directedGraph.nodes()) {
-      assertThat(directedGraph.inDegree(node)).isSameAs(transpose.outDegree(node));
-      assertThat(directedGraph.outDegree(node)).isSameAs(transpose.inDegree(node));
+      assertThat(directedGraph.inDegree(node)).isSameInstanceAs(transpose.outDegree(node));
+      assertThat(directedGraph.outDegree(node)).isSameInstanceAs(transpose.inDegree(node));
     }
 
     directedGraph.addEdge(N2, N1, E21);
@@ -488,7 +488,7 @@
       directedGraph.addEdge(N1, N1, E11);
       fail(ERROR_ADDED_SELF_LOOP);
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
     }
   }
 
@@ -520,7 +520,7 @@
       undirectedGraph.addEdge(N1, N1, E11);
       fail(ERROR_ADDED_SELF_LOOP);
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(ERROR_SELF_LOOP);
+      assertThat(e).hasMessageThat().contains(ERROR_SELF_LOOP);
     }
   }
 
diff --git a/guava-tests/test/com/google/common/graph/ImmutableGraphTest.java b/guava-tests/test/com/google/common/graph/ImmutableGraphTest.java
deleted file mode 100644
index 1a60836..0000000
--- a/guava-tests/test/com/google/common/graph/ImmutableGraphTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for {@link ImmutableGraph} and {@link ImmutableValueGraph} . */
-@RunWith(JUnit4.class)
-public class ImmutableGraphTest {
-
-  @Test
-  public void immutableGraph() {
-    MutableGraph<String> mutableGraph = GraphBuilder.directed().build();
-    mutableGraph.addNode("A");
-    ImmutableGraph<String> immutableGraph = ImmutableGraph.copyOf(mutableGraph);
-
-    assertThat(immutableGraph).isNotInstanceOf(MutableValueGraph.class);
-    assertThat(immutableGraph).isEqualTo(mutableGraph);
-
-    mutableGraph.addNode("B");
-    assertThat(immutableGraph).isNotEqualTo(mutableGraph);
-  }
-
-  @Test
-  public void immutableValueGraph() {
-    MutableValueGraph<String, Integer> mutableValueGraph = ValueGraphBuilder.directed().build();
-    mutableValueGraph.addNode("A");
-    ImmutableValueGraph<String, Integer> immutableValueGraph =
-        ImmutableValueGraph.copyOf(mutableValueGraph);
-
-    assertThat(immutableValueGraph.asGraph()).isInstanceOf(ImmutableGraph.class);
-    assertThat(immutableValueGraph).isNotInstanceOf(MutableValueGraph.class);
-    assertThat(immutableValueGraph).isEqualTo(mutableValueGraph);
-
-    mutableValueGraph.addNode("B");
-    assertThat(immutableValueGraph).isNotEqualTo(mutableValueGraph);
-  }
-
-  @Test
-  public void copyOfImmutableGraph_optimized() {
-    Graph<String> graph1 = ImmutableGraph.copyOf(GraphBuilder.directed().<String>build());
-    Graph<String> graph2 = ImmutableGraph.copyOf(graph1);
-
-    assertThat(graph2).isSameAs(graph1);
-  }
-
-  @Test
-  public void copyOfImmutableValueGraph_optimized() {
-    ValueGraph<String, Integer> graph1 =
-        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
-    ValueGraph<String, Integer> graph2 = ImmutableValueGraph.copyOf(graph1);
-
-    assertThat(graph2).isSameAs(graph1);
-  }
-}
diff --git a/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java b/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java
index e138656..5de3cf7 100644
--- a/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java
+++ b/guava-tests/test/com/google/common/graph/ImmutableNetworkTest.java
@@ -46,7 +46,7 @@
         ImmutableNetwork.copyOf(NetworkBuilder.directed().<String, String>build());
     Network<String, String> network2 = ImmutableNetwork.copyOf(network1);
 
-    assertThat(network2).isSameAs(network1);
+    assertThat(network2).isSameInstanceAs(network1);
   }
 
   @Test
@@ -74,4 +74,74 @@
     assertThat(network.edgesConnecting("A", "B")).containsExactly("AB");
     assertThat(network.edgesConnecting("B", "A")).containsExactly("AB");
   }
+
+  @Test
+  public void immutableNetworkBuilder_appliesNetworkBuilderConfig() {
+    ImmutableNetwork<String, Integer> emptyNetwork =
+        NetworkBuilder.directed()
+            .allowsSelfLoops(true)
+            .nodeOrder(ElementOrder.<String>natural())
+            .<String, Integer>immutable()
+            .build();
+
+    assertThat(emptyNetwork.isDirected()).isTrue();
+    assertThat(emptyNetwork.allowsSelfLoops()).isTrue();
+    assertThat(emptyNetwork.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  /**
+   * Tests that the ImmutableNetwork.Builder doesn't change when the creating NetworkBuilder
+   * changes.
+   */
+  @Test
+  @SuppressWarnings("CheckReturnValue")
+  public void immutableNetworkBuilder_copiesNetworkBuilder() {
+    NetworkBuilder<String, Object> networkBuilder =
+        NetworkBuilder.directed()
+            .allowsSelfLoops(true)
+            .<String>nodeOrder(ElementOrder.<String>natural());
+    ImmutableNetwork.Builder<String, Integer> immutableNetworkBuilder =
+        networkBuilder.<String, Integer>immutable();
+
+    // Update NetworkBuilder, but this shouldn't impact immutableNetworkBuilder
+    networkBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
+
+    ImmutableNetwork<String, Integer> emptyNetwork = immutableNetworkBuilder.build();
+
+    assertThat(emptyNetwork.isDirected()).isTrue();
+    assertThat(emptyNetwork.allowsSelfLoops()).isTrue();
+    assertThat(emptyNetwork.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  @Test
+  public void immutableNetworkBuilder_addNode() {
+    ImmutableNetwork<String, Integer> network =
+        NetworkBuilder.directed().<String, Integer>immutable().addNode("A").build();
+
+    assertThat(network.nodes()).containsExactly("A");
+    assertThat(network.edges()).isEmpty();
+  }
+
+  @Test
+  public void immutableNetworkBuilder_putEdgeFromNodes() {
+    ImmutableNetwork<String, Integer> network =
+        NetworkBuilder.directed().<String, Integer>immutable().addEdge("A", "B", 10).build();
+
+    assertThat(network.nodes()).containsExactly("A", "B");
+    assertThat(network.edges()).containsExactly(10);
+    assertThat(network.incidentNodes(10)).isEqualTo(EndpointPair.ordered("A", "B"));
+  }
+
+  @Test
+  public void immutableNetworkBuilder_putEdgeFromEndpointPair() {
+    ImmutableNetwork<String, Integer> network =
+        NetworkBuilder.directed()
+            .<String, Integer>immutable()
+            .addEdge(EndpointPair.ordered("A", "B"), 10)
+            .build();
+
+    assertThat(network.nodes()).containsExactly("A", "B");
+    assertThat(network.edges()).containsExactly(10);
+    assertThat(network.incidentNodes(10)).isEqualTo(EndpointPair.ordered("A", "B"));
+  }
 }
diff --git a/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java b/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java
new file mode 100644
index 0000000..8e5e67f
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 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.graph;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link ImmutableValueGraph} . */
+@RunWith(JUnit4.class)
+public class ImmutableValueGraphTest {
+
+  @Test
+  public void immutableValueGraph() {
+    MutableValueGraph<String, Integer> mutableValueGraph = ValueGraphBuilder.directed().build();
+    mutableValueGraph.addNode("A");
+    ImmutableValueGraph<String, Integer> immutableValueGraph =
+        ImmutableValueGraph.copyOf(mutableValueGraph);
+
+    assertThat(immutableValueGraph.asGraph()).isInstanceOf(ImmutableGraph.class);
+    assertThat(immutableValueGraph).isNotInstanceOf(MutableValueGraph.class);
+    assertThat(immutableValueGraph).isEqualTo(mutableValueGraph);
+
+    mutableValueGraph.addNode("B");
+    assertThat(immutableValueGraph).isNotEqualTo(mutableValueGraph);
+  }
+
+  @Test
+  public void copyOfImmutableValueGraph_optimized() {
+    ValueGraph<String, Integer> graph1 =
+        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
+    ValueGraph<String, Integer> graph2 = ImmutableValueGraph.copyOf(graph1);
+
+    assertThat(graph2).isSameInstanceAs(graph1);
+  }
+
+  @Test
+  public void incidentEdgeOrder_stable() {
+    ImmutableValueGraph<String, Integer> immutableValueGraph =
+        ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().<String, Integer>build());
+
+    assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void incidentEdgeOrder_fromUnorderedGraph_stable() {
+    ImmutableValueGraph<String, Integer> immutableValueGraph =
+        ImmutableValueGraph.copyOf(
+            ValueGraphBuilder.directed()
+                .incidentEdgeOrder(ElementOrder.unordered())
+                .<String, Integer>build());
+
+    assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_appliesGraphBuilderConfig() {
+    ImmutableValueGraph<String, Integer> emptyGraph =
+        ValueGraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .nodeOrder(ElementOrder.<String>natural())
+            .<String, Integer>immutable()
+            .build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  /**
+   * Tests that the ImmutableValueGraph.Builder doesn't change when the creating ValueGraphBuilder
+   * changes.
+   */
+  @Test
+  @SuppressWarnings("CheckReturnValue")
+  public void immutableValueGraphBuilder_copiesGraphBuilder() {
+    ValueGraphBuilder<String, Object> graphBuilder =
+        ValueGraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .<String>nodeOrder(ElementOrder.<String>natural());
+    ImmutableValueGraph.Builder<String, Integer> immutableValueGraphBuilder =
+        graphBuilder.<String, Integer>immutable();
+
+    // Update ValueGraphBuilder, but this shouldn't impact immutableValueGraphBuilder
+    graphBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
+
+    ImmutableValueGraph<String, Integer> emptyGraph = immutableValueGraphBuilder.build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_addNode() {
+    ImmutableValueGraph<String, Integer> graph =
+        ValueGraphBuilder.directed().<String, Integer>immutable().addNode("A").build();
+
+    assertThat(graph.nodes()).containsExactly("A");
+    assertThat(graph.edges()).isEmpty();
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_putEdgeFromNodes() {
+    ImmutableValueGraph<String, Integer> graph =
+        ValueGraphBuilder.directed()
+            .<String, Integer>immutable()
+            .putEdgeValue("A", "B", 10)
+            .build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+    assertThat(graph.edgeValueOrDefault("A", "B", null)).isEqualTo(10);
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_putEdgeFromEndpointPair() {
+    ImmutableValueGraph<String, Integer> graph =
+        ValueGraphBuilder.directed()
+            .<String, Integer>immutable()
+            .putEdgeValue(EndpointPair.ordered("A", "B"), 10)
+            .build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+    assertThat(graph.edgeValueOrDefault("A", "B", null)).isEqualTo(10);
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_incidentEdges_preservesIncidentEdgesOrder() {
+    ImmutableValueGraph<Integer, String> graph =
+        ValueGraphBuilder.directed()
+            .<Integer, String>immutable()
+            .putEdgeValue(2, 1, "2-1")
+            .putEdgeValue(2, 3, "2-3")
+            .putEdgeValue(1, 2, "1-2")
+            .build();
+
+    assertThat(graph.incidentEdges(2))
+        .containsExactly(
+            EndpointPair.ordered(2, 1), EndpointPair.ordered(2, 3), EndpointPair.ordered(1, 2))
+        .inOrder();
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_incidentEdgeOrder_stable() {
+    ImmutableValueGraph<Integer, String> graph =
+        ValueGraphBuilder.directed().<Integer, String>immutable().build();
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void immutableValueGraphBuilder_fromUnorderedBuilder_incidentEdgeOrder_stable() {
+    ImmutableValueGraph<Integer, String> graph =
+        ValueGraphBuilder.directed()
+            .incidentEdgeOrder(ElementOrder.unordered())
+            .<Integer, String>immutable()
+            .build();
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/MapCacheTest.java b/guava-tests/test/com/google/common/graph/MapCacheTest.java
index 564032a..f66b19b 100644
--- a/guava-tests/test/com/google/common/graph/MapCacheTest.java
+++ b/guava-tests/test/com/google/common/graph/MapCacheTest.java
@@ -83,7 +83,7 @@
   public void testRemoveEqualKeyWithDifferentReference() {
     String fooReference1 = new String("foo");
     String fooReference2 = new String("foo");
-    assertThat(fooReference1).isNotSameAs(fooReference2);
+    assertThat(fooReference1).isNotSameInstanceAs(fooReference2);
 
     assertThat(mapCache.put(fooReference1, "bar")).isNull();
     assertThat(mapCache.get(fooReference1)).isEqualTo("bar"); // ensure first reference is cached
diff --git a/guava-tests/test/com/google/common/graph/PackageSanityTests.java b/guava-tests/test/com/google/common/graph/PackageSanityTests.java
index 2022952..f1526c2 100644
--- a/guava-tests/test/com/google/common/graph/PackageSanityTests.java
+++ b/guava-tests/test/com/google/common/graph/PackageSanityTests.java
@@ -35,16 +35,20 @@
   private static final AbstractGraphBuilder<?> GRAPH_BUILDER_B =
       ValueGraphBuilder.directed().allowsSelfLoops(true).expectedNodeCount(16);
 
-  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_A = graphWithNode("A");
-  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_B = graphWithNode("B");
+  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_A =
+      GraphBuilder.directed().<String>immutable().addNode("A").build();
+  private static final ImmutableGraph<String> IMMUTABLE_GRAPH_B =
+      GraphBuilder.directed().<String>immutable().addNode("B").build();
 
   private static final NetworkBuilder<?, ?> NETWORK_BUILDER_A =
       NetworkBuilder.directed().allowsParallelEdges(true).expectedNodeCount(10);
   private static final NetworkBuilder<?, ?> NETWORK_BUILDER_B =
       NetworkBuilder.directed().allowsSelfLoops(true).expectedNodeCount(16);
 
-  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_A = networkWithNode("A");
-  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_B = networkWithNode("B");
+  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_A =
+      NetworkBuilder.directed().<String, String>immutable().addNode("A").build();
+  private static final ImmutableNetwork<String, String> IMMUTABLE_NETWORK_B =
+      NetworkBuilder.directed().<String, String>immutable().addNode("B").build();
 
   public PackageSanityTests() {
     setDistinctValues(AbstractGraphBuilder.class, GRAPH_BUILDER_A, GRAPH_BUILDER_B);
@@ -66,16 +70,4 @@
           .contains(ERROR_ELEMENT_NOT_IN_GRAPH);
     }
   }
-
-  private static <N> ImmutableGraph<N> graphWithNode(N node) {
-    MutableGraph<N> graph = GraphBuilder.directed().build();
-    graph.addNode(node);
-    return ImmutableGraph.copyOf(graph);
-  }
-
-  private static <N> ImmutableNetwork<N, N> networkWithNode(N node) {
-    MutableNetwork<N, N> network = NetworkBuilder.directed().build();
-    network.addNode(node);
-    return ImmutableNetwork.copyOf(network);
-  }
 }
diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java
new file mode 100644
index 0000000..d89baa0
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardImmutableDirectedGraphTest extends AbstractStandardDirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(new Object[][] {{false}, {true}});
+  }
+
+  private final boolean allowsSelfLoops;
+  private ImmutableGraph.Builder<Integer> graphBuilder;
+
+  public StandardImmutableDirectedGraphTest(boolean allowsSelfLoops) {
+    this.allowsSelfLoops = allowsSelfLoops;
+  }
+
+  @Override
+  public Graph<Integer> createGraph() {
+    graphBuilder = GraphBuilder.directed().allowsSelfLoops(allowsSelfLoops).immutable();
+    return graphBuilder.build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphBuilder.addNode(n);
+    graph = graphBuilder.build();
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphBuilder.putEdge(n1, n2);
+    graph = graphBuilder.build();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableDirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableDirectedNetworkTest.java
new file mode 100644
index 0000000..b237ff9
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardImmutableDirectedNetworkTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.collect.Ordering;
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link ImmutableNetwork}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public class StandardImmutableDirectedNetworkTest extends AbstractStandardDirectedNetworkTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, allowsParallelEdges={1}, nodeOrder={2}, edgeOrder={3}")
+  public static Collection<Object[]> parameters() {
+    ElementOrder<?> naturalElementOrder = ElementOrder.sorted(Ordering.natural());
+
+    return Arrays.asList(
+        new Object[][] {
+          {false, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {true, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {false, false, naturalElementOrder, naturalElementOrder},
+          {true, true, ElementOrder.insertion(), ElementOrder.insertion()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final boolean allowsParallelEdges;
+  private final ElementOrder<Integer> nodeOrder;
+  private final ElementOrder<String> edgeOrder;
+
+  private ImmutableNetwork.Builder<Integer, String> networkBuilder;
+
+  public StandardImmutableDirectedNetworkTest(
+      boolean allowsSelfLoops,
+      boolean allowsParallelEdges,
+      ElementOrder<Integer> nodeOrder,
+      ElementOrder<String> edgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.allowsParallelEdges = allowsParallelEdges;
+    this.nodeOrder = nodeOrder;
+    this.edgeOrder = edgeOrder;
+  }
+
+  @Override
+  Network<Integer, String> createGraph() {
+    networkBuilder =
+        NetworkBuilder.directed()
+            .allowsSelfLoops(allowsSelfLoops)
+            .allowsParallelEdges(allowsParallelEdges)
+            .nodeOrder(nodeOrder)
+            .edgeOrder(edgeOrder)
+            .immutable();
+
+    return networkBuilder.build();
+  }
+
+  @Override
+  void addNode(Integer n) {
+    networkBuilder.addNode(n);
+    network = networkBuilder.build();
+  }
+
+  @Override
+  void addEdge(Integer n1, Integer n2, String e) {
+    networkBuilder.addEdge(n1, n2, e);
+    network = networkBuilder.build();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java
new file mode 100644
index 0000000..47cd6a0
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link ImmutableGraph} and {@link ImmutableGraph.Builder} that are not ready covered by
+ * {@link StandardImmutableDirectedGraphTest}.
+ */
+@RunWith(JUnit4.class)
+public class StandardImmutableGraphAdditionalTest {
+
+  @Test
+  public void immutableGraph() {
+    MutableGraph<String> mutableGraph = GraphBuilder.directed().build();
+    mutableGraph.addNode("A");
+    ImmutableGraph<String> immutableGraph = ImmutableGraph.copyOf(mutableGraph);
+
+    assertThat(immutableGraph).isNotInstanceOf(MutableValueGraph.class);
+    assertThat(immutableGraph).isEqualTo(mutableGraph);
+
+    mutableGraph.addNode("B");
+    assertThat(immutableGraph).isNotEqualTo(mutableGraph);
+  }
+
+  @Test
+  public void copyOfImmutableGraph_optimized() {
+    Graph<String> graph1 = ImmutableGraph.copyOf(GraphBuilder.directed().<String>build());
+    Graph<String> graph2 = ImmutableGraph.copyOf(graph1);
+
+    assertThat(graph2).isSameInstanceAs(graph1);
+  }
+
+  @Test
+  public void immutableGraphBuilder_appliesGraphBuilderConfig() {
+    ImmutableGraph<String> emptyGraph =
+        GraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .nodeOrder(ElementOrder.<String>natural())
+            .immutable()
+            .build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  /**
+   * Tests that the ImmutableGraph.Builder doesn't change when the creating GraphBuilder changes.
+   */
+  @Test
+  @SuppressWarnings("CheckReturnValue")
+  public void immutableGraphBuilder_copiesGraphBuilder() {
+    GraphBuilder<String> graphBuilder =
+        GraphBuilder.directed()
+            .allowsSelfLoops(true)
+            .<String>nodeOrder(ElementOrder.<String>natural());
+    ImmutableGraph.Builder<String> immutableGraphBuilder = graphBuilder.immutable();
+
+    // Update GraphBuilder, but this shouldn't impact immutableGraphBuilder
+    graphBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
+
+    ImmutableGraph<String> emptyGraph = immutableGraphBuilder.build();
+
+    assertThat(emptyGraph.isDirected()).isTrue();
+    assertThat(emptyGraph.allowsSelfLoops()).isTrue();
+    assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
+  }
+
+  @Test
+  public void copyOf_incidentEdgeOrder() {
+    ImmutableGraph<Object> graph = ImmutableGraph.copyOf(GraphBuilder.undirected().build());
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void copyOf_fromUnorderedGraph_incidentEdgeOrder() {
+    ImmutableGraph<Object> graph =
+        ImmutableGraph.copyOf(
+            GraphBuilder.undirected().incidentEdgeOrder(ElementOrder.unordered()).build());
+
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
+  public void immutableGraphBuilder_addNode() {
+    ImmutableGraph<String> graph = GraphBuilder.directed().<String>immutable().addNode("A").build();
+
+    assertThat(graph.nodes()).containsExactly("A");
+    assertThat(graph.edges()).isEmpty();
+  }
+
+  @Test
+  public void immutableGraphBuilder_putEdgeFromNodes() {
+    ImmutableGraph<String> graph =
+        GraphBuilder.directed().<String>immutable().putEdge("A", "B").build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+  }
+
+  @Test
+  public void immutableGraphBuilder_putEdgeFromEndpointPair() {
+    ImmutableGraph<String> graph =
+        GraphBuilder.directed().<String>immutable().putEdge(EndpointPair.ordered("A", "B")).build();
+
+    assertThat(graph.nodes()).containsExactly("A", "B");
+    assertThat(graph.edges()).containsExactly(EndpointPair.ordered("A", "B"));
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java
new file mode 100644
index 0000000..7f580a6
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for an undirected {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardImmutableUndirectedGraphTest
+    extends AbstractStandardUndirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(new Object[][] {{false}, {true}});
+  }
+
+  private final boolean allowsSelfLoops;
+  private ImmutableGraph.Builder<Integer> graphBuilder;
+
+  public StandardImmutableUndirectedGraphTest(boolean allowsSelfLoops) {
+    this.allowsSelfLoops = allowsSelfLoops;
+  }
+
+  @Override
+  public Graph<Integer> createGraph() {
+    graphBuilder = GraphBuilder.undirected().allowsSelfLoops(allowsSelfLoops).immutable();
+    return graphBuilder.build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphBuilder.addNode(n);
+    graph = graphBuilder.build();
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphBuilder.putEdge(n1, n2);
+    graph = graphBuilder.build();
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardMutableDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/StandardMutableDirectedGraphTest.java
new file mode 100644
index 0000000..191010e
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardMutableDirectedGraphTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardMutableDirectedGraphTest extends AbstractStandardDirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(
+        new Object[][] {
+          {false, ElementOrder.unordered()},
+          {true, ElementOrder.unordered()},
+          {false, ElementOrder.stable()},
+          {true, ElementOrder.stable()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final ElementOrder<Integer> incidentEdgeOrder;
+
+  public StandardMutableDirectedGraphTest(
+      boolean allowsSelfLoops, ElementOrder<Integer> incidentEdgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.incidentEdgeOrder = incidentEdgeOrder;
+  }
+
+  @Override
+  public MutableGraph<Integer> createGraph() {
+    return GraphBuilder.directed()
+        .allowsSelfLoops(allowsSelfLoops)
+        .incidentEdgeOrder(incidentEdgeOrder)
+        .build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphAsMutableGraph.addNode(n);
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphAsMutableGraph.putEdge(n1, n2);
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardMutableDirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/StandardMutableDirectedNetworkTest.java
new file mode 100644
index 0000000..fb8be1d
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardMutableDirectedNetworkTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.collect.Ordering;
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for a directed {@link StandardMutableNetwork} allowing self-loops. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public class StandardMutableDirectedNetworkTest extends AbstractStandardDirectedNetworkTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, allowsParallelEdges={1}, nodeOrder={2}, edgeOrder={3}")
+  public static Collection<Object[]> parameters() {
+    ElementOrder<?> naturalElementOrder = ElementOrder.sorted(Ordering.natural());
+
+    return Arrays.asList(
+        new Object[][] {
+          {false, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {true, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {false, false, naturalElementOrder, naturalElementOrder},
+          {true, true, ElementOrder.insertion(), ElementOrder.insertion()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final boolean allowsParallelEdges;
+  private final ElementOrder<Integer> nodeOrder;
+  private final ElementOrder<String> edgeOrder;
+
+  public StandardMutableDirectedNetworkTest(
+      boolean allowsSelfLoops,
+      boolean allowsParallelEdges,
+      ElementOrder<Integer> nodeOrder,
+      ElementOrder<String> edgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.allowsParallelEdges = allowsParallelEdges;
+    this.nodeOrder = nodeOrder;
+    this.edgeOrder = edgeOrder;
+  }
+
+  @Override
+  MutableNetwork<Integer, String> createGraph() {
+    return NetworkBuilder.directed()
+        .allowsSelfLoops(allowsSelfLoops)
+        .allowsParallelEdges(allowsParallelEdges)
+        .nodeOrder(nodeOrder)
+        .edgeOrder(edgeOrder)
+        .build();
+  }
+
+  @Override
+  void addNode(Integer n) {
+    networkAsMutableNetwork.addNode(n);
+  }
+
+  @Override
+  void addEdge(Integer n1, Integer n2, String e) {
+    networkAsMutableNetwork.addEdge(n1, n2, e);
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardMutableUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/StandardMutableUndirectedGraphTest.java
new file mode 100644
index 0000000..aa0372a
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardMutableUndirectedGraphTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 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 java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for an undirected {@link StandardMutableGraph}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public class StandardMutableUndirectedGraphTest extends AbstractStandardUndirectedGraphTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}")
+  public static Collection<Object[]> parameters() {
+    return Arrays.asList(
+        new Object[][] {
+          {false, ElementOrder.unordered()},
+          {true, ElementOrder.unordered()},
+          {false, ElementOrder.stable()},
+          {true, ElementOrder.stable()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final ElementOrder<Integer> incidentEdgeOrder;
+
+  public StandardMutableUndirectedGraphTest(
+      boolean allowsSelfLoops, ElementOrder<Integer> incidentEdgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.incidentEdgeOrder = incidentEdgeOrder;
+  }
+
+  @Override
+  public MutableGraph<Integer> createGraph() {
+    return GraphBuilder.undirected()
+        .allowsSelfLoops(allowsSelfLoops)
+        .incidentEdgeOrder(incidentEdgeOrder)
+        .build();
+  }
+
+  @Override
+  final void addNode(Integer n) {
+    graphAsMutableGraph.addNode(n);
+  }
+
+  @Override
+  final void putEdge(Integer n1, Integer n2) {
+    graphAsMutableGraph.putEdge(n1, n2);
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/StandardMutableUndirectedNetworkTest.java b/guava-tests/test/com/google/common/graph/StandardMutableUndirectedNetworkTest.java
new file mode 100644
index 0000000..c021b5d
--- /dev/null
+++ b/guava-tests/test/com/google/common/graph/StandardMutableUndirectedNetworkTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2014 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 com.google.common.collect.Ordering;
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** Tests for an undirected {@link StandardMutableNetwork}. */
+@AndroidIncompatible
+@RunWith(Parameterized.class)
+public final class StandardMutableUndirectedNetworkTest
+    extends AbstractStandardUndirectedNetworkTest {
+
+  @Parameters(name = "allowsSelfLoops={0}, allowsParallelEdges={1}, nodeOrder={2}, edgeOrder={3}")
+  public static Collection<Object[]> parameters() {
+    ElementOrder<?> naturalElementOrder = ElementOrder.sorted(Ordering.natural());
+
+    return Arrays.asList(
+        new Object[][] {
+          {false, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {true, false, ElementOrder.insertion(), ElementOrder.insertion()},
+          {false, false, naturalElementOrder, naturalElementOrder},
+          {true, true, ElementOrder.insertion(), ElementOrder.insertion()},
+        });
+  }
+
+  private final boolean allowsSelfLoops;
+  private final boolean allowsParallelEdges;
+  private final ElementOrder<Integer> nodeOrder;
+  private final ElementOrder<String> edgeOrder;
+
+  public StandardMutableUndirectedNetworkTest(
+      boolean allowsSelfLoops,
+      boolean allowsParallelEdges,
+      ElementOrder<Integer> nodeOrder,
+      ElementOrder<String> edgeOrder) {
+    this.allowsSelfLoops = allowsSelfLoops;
+    this.allowsParallelEdges = allowsParallelEdges;
+    this.nodeOrder = nodeOrder;
+    this.edgeOrder = edgeOrder;
+  }
+
+  @Override
+  MutableNetwork<Integer, String> createGraph() {
+    return NetworkBuilder.undirected()
+        .allowsSelfLoops(allowsSelfLoops)
+        .allowsParallelEdges(allowsParallelEdges)
+        .nodeOrder(nodeOrder)
+        .edgeOrder(edgeOrder)
+        .build();
+  }
+
+  @Override
+  void addNode(Integer n) {
+    networkAsMutableNetwork.addNode(n);
+  }
+
+  @Override
+  void addEdge(Integer n1, Integer n2, String e) {
+    networkAsMutableNetwork.addEdge(n1, n2, e);
+  }
+}
diff --git a/guava-tests/test/com/google/common/graph/TraverserTest.java b/guava-tests/test/com/google/common/graph/TraverserTest.java
index f1db943..d4c8cf7 100644
--- a/guava-tests/test/com/google/common/graph/TraverserTest.java
+++ b/guava-tests/test/com/google/common/graph/TraverserTest.java
@@ -185,6 +185,13 @@
   }
 
   @Test
+  public void forGraph_breadthFirst_infinite() {
+    Iterable<Integer> result =
+        Traverser.forGraph(fixedSuccessors(Iterables.cycle(1, 2, 3))).breadthFirst(0);
+    assertThat(Iterables.limit(result, 4)).containsExactly(0, 1, 2, 3).inOrder();
+  }
+
+  @Test
   public void forGraph_breadthFirst_diamond() {
     Traverser<Character> traverser = Traverser.forGraph(DIAMOND_GRAPH);
     assertEqualCharNodes(traverser.breadthFirst('a'), "abcd");
@@ -374,6 +381,13 @@
   }
 
   @Test
+  public void forGraph_depthFirstPreOrder_infinite() {
+    Iterable<Integer> result =
+        Traverser.forGraph(fixedSuccessors(Iterables.cycle(1, 2, 3))).depthFirstPreOrder(0);
+    assertThat(Iterables.limit(result, 3)).containsExactly(0, 1, 2).inOrder();
+  }
+
+  @Test
   public void forGraph_depthFirstPreOrder_diamond() {
     Traverser<Character> traverser = Traverser.forGraph(DIAMOND_GRAPH);
     assertEqualCharNodes(traverser.depthFirstPreOrder('a'), "abdc");
@@ -519,11 +533,11 @@
     Iterable<Character> result = Traverser.forGraph(graph).depthFirstPreOrder('a');
 
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b');
 
     // Iterate again to see if calculation is done again
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b', 'd', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b');
   }
 
   @Test
@@ -532,11 +546,11 @@
     Iterable<Character> result = Traverser.forGraph(graph).depthFirstPreOrder(charactersOf("ac"));
 
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b', 'c', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'b', 'c');
 
     // Iterate again to see if calculation is done again
     assertEqualCharNodes(Iterables.limit(result, 2), "ab");
-    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b', 'c', 'd', 'd');
+    assertThat(graph.requestedNodes).containsExactly('a', 'a', 'a', 'b', 'b', 'c');
   }
 
   @Test
@@ -785,6 +799,13 @@
   }
 
   @Test
+  public void forTree_breadthFirst_infinite() {
+    Iterable<Integer> result =
+        Traverser.forTree(fixedSuccessors(Iterables.cycle(1, 2, 3))).breadthFirst(0);
+    assertThat(Iterables.limit(result, 8)).containsExactly(0, 1, 2, 3, 1, 2, 3, 1).inOrder();
+  }
+
+  @Test
   public void forTree_breadthFirst_tree() throws Exception {
     Traverser<Character> traverser = Traverser.forTree(TREE);
 
@@ -913,6 +934,13 @@
   }
 
   @Test
+  public void forTree_depthFirstPreOrder_infinite() {
+    Iterable<Integer> result =
+        Traverser.forTree(fixedSuccessors(Iterables.cycle(1, 2, 3))).depthFirstPreOrder(0);
+    assertThat(Iterables.limit(result, 3)).containsExactly(0, 1, 1).inOrder();
+  }
+
+  @Test
   public void forTree_depthFirstPreOrderIterable_tree() throws Exception {
     Traverser<Character> traverser = Traverser.forTree(TREE);
 
@@ -1022,11 +1050,11 @@
     Iterable<Character> result = Traverser.forGraph(graph).depthFirstPreOrder('h');
 
     assertEqualCharNodes(Iterables.limit(result, 2), "hd");
-    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'd', 'a');
+    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'd');
 
     // Iterate again to see if calculation is done again
     assertEqualCharNodes(Iterables.limit(result, 2), "hd");
-    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'h', 'd', 'd', 'a', 'a');
+    assertThat(graph.requestedNodes).containsExactly('h', 'h', 'h', 'd', 'd');
   }
 
   @Test
@@ -1238,4 +1266,13 @@
       return delegate.successors(node);
     }
   }
+
+  private static <N> SuccessorsFunction<N> fixedSuccessors(final Iterable<N> successors) {
+    return new SuccessorsFunction<N>() {
+      @Override
+      public Iterable<N> successors(N n) {
+        return successors;
+      }
+    };
+  }
 }
diff --git a/guava-tests/test/com/google/common/graph/ValueGraphTest.java b/guava-tests/test/com/google/common/graph/ValueGraphTest.java
index 69470a8..edc2631 100644
--- a/guava-tests/test/com/google/common/graph/ValueGraphTest.java
+++ b/guava-tests/test/com/google/common/graph/ValueGraphTest.java
@@ -20,15 +20,22 @@
 import static com.google.common.graph.TestUtil.assertStronglyEquivalent;
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth8.assertThat;
+import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.junit.Assert.fail;
 
+import com.google.common.collect.ImmutableList;
 import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
 import org.junit.After;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/** Tests for {@link ConfigurableMutableValueGraph} and related functionality. */
+/** Tests for {@link StandardMutableValueGraph} and related functionality. */
 // TODO(user): Expand coverage and move to proper test suite.
 @RunWith(JUnit4.class)
 public final class ValueGraphTest {
@@ -46,6 +53,7 @@
     assertThat(graph.nodes()).isEqualTo(asGraph.nodes());
     assertThat(graph.edges()).isEqualTo(asGraph.edges());
     assertThat(graph.nodeOrder()).isEqualTo(asGraph.nodeOrder());
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(asGraph.incidentEdgeOrder());
     assertThat(graph.isDirected()).isEqualTo(asGraph.isDirected());
     assertThat(graph.allowsSelfLoops()).isEqualTo(asGraph.allowsSelfLoops());
 
@@ -116,6 +124,18 @@
   }
 
   @Test
+  public void incidentEdgeOrder_unordered() {
+    graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.unordered()).build();
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.unordered());
+  }
+
+  @Test
+  public void incidentEdgeOrder_stable() {
+    graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.stable()).build();
+    assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable());
+  }
+
+  @Test
   public void hasEdgeConnecting_directed_correct() {
     graph = ValueGraphBuilder.directed().build();
     graph.putEdgeValue(1, 2, "A");
@@ -390,4 +410,72 @@
     otherGraph.putEdgeValue(1, 2, "valueB");
     assertThat(graph).isNotEqualTo(otherGraph); // values differ
   }
+
+  @Test
+  public void incidentEdges_stableIncidentEdgeOrder_preservesIncidentEdgesOrder_directed() {
+    graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.stable()).build();
+    graph.putEdgeValue(2, 1, "2-1");
+    graph.putEdgeValue(2, 3, "2-3");
+    graph.putEdgeValue(1, 2, "1-2");
+
+    assertThat(graph.incidentEdges(2))
+        .containsExactly(
+            EndpointPair.ordered(2, 1), EndpointPair.ordered(2, 3), EndpointPair.ordered(1, 2))
+        .inOrder();
+  }
+
+  @Test
+  public void incidentEdges_stableIncidentEdgeOrder_preservesIncidentEdgesOrder_undirected() {
+    graph = ValueGraphBuilder.undirected().incidentEdgeOrder(ElementOrder.stable()).build();
+    graph.putEdgeValue(2, 3, "2-3");
+    graph.putEdgeValue(2, 1, "2-1");
+    graph.putEdgeValue(2, 4, "2-4");
+    graph.putEdgeValue(1, 2, "1-2"); // Duplicate nodes, different value
+
+    assertThat(graph.incidentEdges(2))
+        .containsExactly(
+            EndpointPair.unordered(2, 3),
+            EndpointPair.unordered(1, 2),
+            EndpointPair.unordered(2, 4))
+        .inOrder();
+  }
+
+  @Test
+  public void concurrentIteration() throws Exception {
+    graph = ValueGraphBuilder.directed().build();
+    graph.putEdgeValue(1, 2, "A");
+    graph.putEdgeValue(3, 4, "B");
+    graph.putEdgeValue(5, 6, "C");
+
+    int threadCount = 20;
+    ExecutorService executor = newFixedThreadPool(threadCount);
+    final CyclicBarrier barrier = new CyclicBarrier(threadCount);
+    ImmutableList.Builder<Future<?>> futures = ImmutableList.builder();
+    for (int i = 0; i < threadCount; i++) {
+      futures.add(
+          executor.submit(
+              new Callable<Object>() {
+                @Override
+                public Object call() throws Exception {
+                  barrier.await();
+                  Integer first = graph.nodes().iterator().next();
+                  for (Integer node : graph.nodes()) {
+                    Set<Integer> unused = graph.successors(node);
+                  }
+                  /*
+                   * Also look up an earlier node so that, if the graph is using MapRetrievalCache,
+                   * we read one of the fields declared in that class.
+                   */
+                  Set<Integer> unused = graph.successors(first);
+                  return null;
+                }
+              }));
+    }
+
+    // For more about this test, see the equivalent in AbstractNetworkTest.
+    for (Future<?> future : futures.build()) {
+      future.get();
+    }
+    executor.shutdown();
+  }
 }
diff --git a/guava-tests/test/com/google/common/hash/BloomFilterTest.java b/guava-tests/test/com/google/common/hash/BloomFilterTest.java
index 74160c6..7c21044 100644
--- a/guava-tests/test/com/google/common/hash/BloomFilterTest.java
+++ b/guava-tests/test/com/google/common/hash/BloomFilterTest.java
@@ -305,7 +305,7 @@
   public void testLargeNumberOfInsertions() {
     // We use horrible FPPs here to keep Java from OOM'ing
     BloomFilter<String> unused =
-        BloomFilter.create(Funnels.unencodedCharsFunnel(), Integer.MAX_VALUE / 2, 0.29);
+        BloomFilter.create(Funnels.unencodedCharsFunnel(), Integer.MAX_VALUE / 2, 0.30);
     unused = BloomFilter.create(Funnels.unencodedCharsFunnel(), 45L * Integer.MAX_VALUE, 0.99);
   }
 
diff --git a/guava-tests/test/com/google/common/hash/FunnelsTest.java b/guava-tests/test/com/google/common/hash/FunnelsTest.java
index 922bc5d..6b0c758 100644
--- a/guava-tests/test/com/google/common/hash/FunnelsTest.java
+++ b/guava-tests/test/com/google/common/hash/FunnelsTest.java
@@ -93,7 +93,7 @@
   }
 
   public void testSequential() {
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({"unchecked", "DoNotMock"})
     Funnel<Object> elementFunnel = mock(Funnel.class);
     PrimitiveSink primitiveSink = mock(PrimitiveSink.class);
     Funnel<Iterable<?>> sequential = Funnels.sequentialFunnel(elementFunnel);
diff --git a/guava-tests/test/com/google/common/hash/HashTestUtils.java b/guava-tests/test/com/google/common/hash/HashTestUtils.java
index f2b8971..8dfbdb0 100644
--- a/guava-tests/test/com/google/common/hash/HashTestUtils.java
+++ b/guava-tests/test/com/google/common/hash/HashTestUtils.java
@@ -509,9 +509,9 @@
     rng.nextBytes(bytes);
     ByteBuffer littleEndian = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN);
     ByteBuffer bigEndian = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN);
-    assertEquals(hashFunction.hashBytes(littleEndian), hashFunction.hashBytes(littleEndian));
+    assertEquals(hashFunction.hashBytes(littleEndian), hashFunction.hashBytes(bigEndian));
     assertEquals(ByteOrder.LITTLE_ENDIAN, littleEndian.order());
-    assertEquals(ByteOrder.BIG_ENDIAN, littleEndian.order());
+    assertEquals(ByteOrder.BIG_ENDIAN, bigEndian.order());
   }
 
   static void assertHasherByteBufferPreservesByteOrder(HashFunction hashFunction) {
@@ -522,9 +522,9 @@
     ByteBuffer bigEndian = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN);
     assertEquals(
         hashFunction.newHasher().putBytes(littleEndian).hash(),
-        hashFunction.newHasher().putBytes(littleEndian).hash());
+        hashFunction.newHasher().putBytes(bigEndian).hash());
     assertEquals(ByteOrder.LITTLE_ENDIAN, littleEndian.order());
-    assertEquals(ByteOrder.BIG_ENDIAN, littleEndian.order());
+    assertEquals(ByteOrder.BIG_ENDIAN, bigEndian.order());
   }
 
   static void assertHashBytesThrowsCorrectExceptions(HashFunction hashFunction) {
diff --git a/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java b/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java
index 58ed689..05351d9 100644
--- a/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java
+++ b/guava-tests/test/com/google/common/hash/HashingInputStreamTest.java
@@ -35,6 +35,7 @@
   private static final byte[] testBytes = new byte[] {'y', 'a', 'm', 's'};
   private ByteArrayInputStream buffer;
 
+  @SuppressWarnings("DoNotMock")
   @Override
   protected void setUp() throws Exception {
     super.setUp();
diff --git a/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java b/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java
index fd8f340..55e8fbf 100644
--- a/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java
+++ b/guava-tests/test/com/google/common/hash/HashingOutputStreamTest.java
@@ -33,6 +33,7 @@
   private HashFunction hashFunction;
   private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
 
+  @SuppressWarnings("DoNotMock")
   @Override
   protected void setUp() throws Exception {
     super.setUp();
diff --git a/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java b/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java
index c76ec76..ded4447 100644
--- a/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java
+++ b/guava-tests/test/com/google/common/hash/SipHashFunctionTest.java
@@ -34,7 +34,7 @@
   private static final HashFunction SIP_WITHOUT_KEY = Hashing.sipHash24();
 
   // These constants were originally ported from https://www.131002.net/siphash/siphash24.c. See:
-  // https://github.com/nahi/siphash-java-inline/blob/master/src/test/java/SipHashInlineTest.java
+  // https://github.com/nahi/siphash-java-inline/blob/master/src/test/java/org/jruby/util/SipHashInlineTest.java
   private static final long[] EXPECTED =
       new long[] {
         0x726fdb47dd0e0e31L,
diff --git a/guava-tests/test/com/google/common/io/BaseEncodingTest.java b/guava-tests/test/com/google/common/io/BaseEncodingTest.java
index d92bb0e..06659ab 100644
--- a/guava-tests/test/com/google/common/io/BaseEncodingTest.java
+++ b/guava-tests/test/com/google/common/io/BaseEncodingTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.io.BaseEncoding.base32;
 import static com.google.common.io.BaseEncoding.base32Hex;
 import static com.google.common.io.BaseEncoding.base64;
+import static com.google.common.io.BaseEncoding.base64Url;
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtCompatible;
@@ -31,6 +32,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import junit.framework.TestCase;
@@ -190,6 +192,16 @@
     testEncodesWithOffset(base64(), "foobar", 4, 0, "");
   }
 
+  public void testBase64Url() {
+    testDecodesByBytes(base64Url(), "_zzz", new byte[] {-1, 60, -13});
+    testDecodesByBytes(base64Url(), "-zzz", new byte[] {-5, 60, -13});
+  }
+
+  public void testBase64UrlInvalidDecodings() {
+    assertFailsToDecode(base64Url(), "+zzz", "Unrecognized character: +");
+    assertFailsToDecode(base64Url(), "/zzz", "Unrecognized character: /");
+  }
+
   public void testBase32() {
     // The following test vectors are specified in RFC 4648 itself
     testEncodingWithCasing(base32(), "", "");
@@ -383,29 +395,86 @@
     assertThat(encoding.decode(encoded)).isEqualTo(decoded.getBytes(UTF_8));
   }
 
+  private static void testDecodesByBytes(BaseEncoding encoding, String encoded, byte[] decoded) {
+    assertTrue(encoding.canDecode(encoded));
+    assertThat(encoding.decode(encoded)).isEqualTo(decoded);
+  }
+
   private static void assertFailsToDecode(BaseEncoding encoding, String cannotDecode) {
     assertFailsToDecode(encoding, cannotDecode, null);
   }
 
   private static void assertFailsToDecode(
       BaseEncoding encoding, String cannotDecode, @Nullable String expectedMessage) {
-    assertFalse(encoding.canDecode(cannotDecode));
-    try {
-      encoding.decode(cannotDecode);
-      fail("Expected IllegalArgumentException");
-    } catch (IllegalArgumentException expected) {
-      if (expectedMessage != null) {
-        assertThat(expected).hasCauseThat().hasMessageThat().isEqualTo(expectedMessage);
-      }
+    // We use this somewhat weird pattern with an enum for each assertion we want to make as a way
+    // of dealing with the fact that one of the assertions is @GwtIncompatible but we don't want to
+    // have to have duplicate @GwtIncompatible test methods just to make that assertion.
+    for (AssertFailsToDecodeStrategy strategy : AssertFailsToDecodeStrategy.values()) {
+      strategy.assertFailsToDecode(encoding, cannotDecode, expectedMessage);
     }
-    try {
-      encoding.decodeChecked(cannotDecode);
-      fail("Expected DecodingException");
-    } catch (DecodingException expected) {
-      if (expectedMessage != null) {
-        assertThat(expected).hasMessageThat().isEqualTo(expectedMessage);
+  }
+
+  enum AssertFailsToDecodeStrategy {
+    @GwtIncompatible // decodingStream(Reader)
+    DECODING_STREAM {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @Nullable String expectedMessage) {
+        // Regression test for case where DecodingException was swallowed by default implementation
+        // of
+        // InputStream.read(byte[], int, int)
+        // See https://github.com/google/guava/issues/3542
+        Reader reader = new StringReader(cannotDecode);
+        InputStream decodingStream = encoding.decodingStream(reader);
+        try {
+          ByteStreams.exhaust(decodingStream);
+          fail("Expected DecodingException");
+        } catch (DecodingException expected) {
+          // Don't assert on the expectedMessage; the messages for exceptions thrown from the
+          // decoding stream may differ from the messages for the decode methods.
+        } catch (IOException e) {
+          fail("Expected DecodingException but got: " + e);
+        }
       }
-    }
+    },
+    CAN_DECODE {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @Nullable String expectedMessage) {
+        assertFalse(encoding.canDecode(cannotDecode));
+      }
+    },
+    DECODE {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @Nullable String expectedMessage) {
+        try {
+          encoding.decode(cannotDecode);
+          fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException expected) {
+          if (expectedMessage != null) {
+            assertThat(expected).hasCauseThat().hasMessageThat().isEqualTo(expectedMessage);
+          }
+        }
+      }
+    },
+    DECODE_CHECKED {
+      @Override
+      void assertFailsToDecode(
+          BaseEncoding encoding, String cannotDecode, @Nullable String expectedMessage) {
+        try {
+          encoding.decodeChecked(cannotDecode);
+          fail("Expected DecodingException");
+        } catch (DecodingException expected) {
+          if (expectedMessage != null) {
+            assertThat(expected).hasMessageThat().isEqualTo(expectedMessage);
+          }
+        }
+      }
+    };
+
+    abstract void assertFailsToDecode(
+        BaseEncoding encoding, String cannotDecode, @Nullable String expectedMessage);
   }
 
   @GwtIncompatible // Reader/Writer
diff --git a/guava-tests/test/com/google/common/io/ByteSourceTest.java b/guava-tests/test/com/google/common/io/ByteSourceTest.java
index 0f5b3d9..f0ba829 100644
--- a/guava-tests/test/com/google/common/io/ByteSourceTest.java
+++ b/guava-tests/test/com/google/common/io/ByteSourceTest.java
@@ -454,6 +454,10 @@
     }
   }
 
+  public void testSlice_returnEmptySource() {
+    assertEquals(ByteSource.empty(), source.slice(0, 3).slice(4, 3));
+  }
+
   private static int getAndResetRecords(TestLogHandler logHandler) {
     int records = logHandler.getStoredLogRecords().size();
     logHandler.clear();
diff --git a/guava-tests/test/com/google/common/io/ByteStreamsTest.java b/guava-tests/test/com/google/common/io/ByteStreamsTest.java
index 981238a..f715303 100644
--- a/guava-tests/test/com/google/common/io/ByteStreamsTest.java
+++ b/guava-tests/test/com/google/common/io/ByteStreamsTest.java
@@ -48,7 +48,7 @@
 
     ReadableByteChannel inChannel = Channels.newChannel(new ByteArrayInputStream(expected));
     ByteStreams.copy(inChannel, outChannel);
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   public void testCopyFileChannel() throws IOException {
@@ -57,24 +57,18 @@
     WritableByteChannel outChannel = Channels.newChannel(out);
 
     File testFile = createTempFile();
-    FileOutputStream fos = new FileOutputStream(testFile);
     byte[] dummyData = newPreFilledByteArray(chunkSize);
-    try {
+    try (FileOutputStream fos = new FileOutputStream(testFile)) {
       for (int i = 0; i < 500; i++) {
         fos.write(dummyData);
       }
-    } finally {
-      fos.close();
     }
-    ReadableByteChannel inChannel = new RandomAccessFile(testFile, "r").getChannel();
-    try {
+    try (ReadableByteChannel inChannel = new RandomAccessFile(testFile, "r").getChannel()) {
       ByteStreams.copy(inChannel, outChannel);
-    } finally {
-      inChannel.close();
     }
     byte[] actual = out.toByteArray();
     for (int i = 0; i < 500 * chunkSize; i += chunkSize) {
-      assertEquals(dummyData, Arrays.copyOfRange(actual, i, i + chunkSize));
+      assertThat(Arrays.copyOfRange(actual, i, i + chunkSize)).isEqualTo(dummyData);
     }
   }
 
@@ -84,56 +78,56 @@
     try {
       ByteStreams.readFully(newTestStream(10), null, 0, 10);
       fail("expected exception");
-    } catch (NullPointerException e) {
+    } catch (NullPointerException expected) {
     }
 
     try {
       ByteStreams.readFully(null, b, 0, 10);
       fail("expected exception");
-    } catch (NullPointerException e) {
+    } catch (NullPointerException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, -1, 10);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, 0, -1);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, 0, -1);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(10), b, 2, 10);
       fail("expected exception");
-    } catch (IndexOutOfBoundsException e) {
+    } catch (IndexOutOfBoundsException expected) {
     }
 
     try {
       ByteStreams.readFully(newTestStream(5), b, 0, 10);
       fail("expected exception");
-    } catch (EOFException e) {
+    } catch (EOFException expected) {
     }
 
     Arrays.fill(b, (byte) 0);
     ByteStreams.readFully(newTestStream(10), b, 0, 0);
-    assertEquals(new byte[10], b);
+    assertThat(b).isEqualTo(new byte[10]);
 
     Arrays.fill(b, (byte) 0);
     ByteStreams.readFully(newTestStream(10), b, 0, 10);
-    assertEquals(newPreFilledByteArray(10), b);
+    assertThat(b).isEqualTo(newPreFilledByteArray(10));
 
     Arrays.fill(b, (byte) 0);
     ByteStreams.readFully(newTestStream(10), b, 0, 5);
-    assertEquals(new byte[] {0, 1, 2, 3, 4, 0, 0, 0, 0, 0}, b);
+    assertThat(b).isEqualTo(new byte[] {0, 1, 2, 3, 4, 0, 0, 0, 0, 0});
   }
 
   public void testSkipFully() throws IOException {
@@ -146,7 +140,7 @@
     try {
       skipHelper(101, 0, new ByteArrayInputStream(bytes));
       fail("expected exception");
-    } catch (EOFException e) {
+    } catch (EOFException expected) {
     }
   }
 
@@ -183,7 +177,7 @@
     ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
     byte[] actual = new byte[bytes.length];
     in.readFully(actual);
-    assertEquals(bytes, actual);
+    assertThat(actual).isEqualTo(bytes);
   }
 
   public void testNewDataInput_readFullyAndThenSome() {
@@ -268,27 +262,27 @@
 
   public void testNewDataInput_readByte() {
     ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
-    for (int i = 0; i < bytes.length; i++) {
-      assertEquals(bytes[i], in.readByte());
+    for (byte aByte : bytes) {
+      assertEquals(aByte, in.readByte());
     }
     try {
       in.readByte();
       fail("expected exception");
-    } catch (IllegalStateException ex) {
-      assertThat(ex).hasCauseThat().isInstanceOf(EOFException.class);
+    } catch (IllegalStateException expected) {
+      assertThat(expected).hasCauseThat().isInstanceOf(EOFException.class);
     }
   }
 
   public void testNewDataInput_readUnsignedByte() {
     ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
-    for (int i = 0; i < bytes.length; i++) {
-      assertEquals(bytes[i], in.readUnsignedByte());
+    for (byte aByte : bytes) {
+      assertEquals(aByte, in.readUnsignedByte());
     }
     try {
       in.readUnsignedByte();
       fail("expected exception");
-    } catch (IllegalStateException ex) {
-      assertThat(ex).hasCauseThat().isInstanceOf(EOFException.class);
+    } catch (IllegalStateException expected) {
+      assertThat(expected).hasCauseThat().isInstanceOf(EOFException.class);
     }
   }
 
@@ -323,40 +317,40 @@
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeInt(0x12345678);
     out.writeInt(0x76543210);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_sized() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput(4);
     out.writeInt(0x12345678);
     out.writeInt(0x76543210);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeLong() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeLong(0x1234567876543210L);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeByteArray() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.write(bytes);
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeByte() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.write(0x12);
     out.writeByte(0x34);
-    assertEquals(new byte[] {0x12, 0x34}, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(new byte[] {0x12, 0x34});
   }
 
   public void testNewDataOutput_writeByteOffset() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.write(bytes, 4, 2);
     byte[] expected = {bytes[4], bytes[5]};
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   public void testNewDataOutput_writeBoolean() {
@@ -364,13 +358,13 @@
     out.writeBoolean(true);
     out.writeBoolean(false);
     byte[] expected = {(byte) 1, (byte) 0};
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   public void testNewDataOutput_writeChar() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeChar('a');
-    assertEquals(new byte[] {0, 97}, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(new byte[] {0, 97});
   }
 
   // Hardcoded because of Android problems. See testUtf16Expected.
@@ -382,14 +376,14 @@
     out.writeChars("r\u00C9sum\u00C9");
     // need to remove byte order mark before comparing
     byte[] expected = Arrays.copyOfRange(utf16ExpectedWithBom, 2, 14);
-    assertEquals(expected, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
   @AndroidIncompatible // https://code.google.com/p/android/issues/detail?id=196848
   public void testUtf16Expected() {
     byte[] hardcodedExpected = utf16ExpectedWithBom;
     byte[] computedExpected = "r\u00C9sum\u00C9".getBytes(Charsets.UTF_16);
-    assertEquals(hardcodedExpected, computedExpected);
+    assertThat(computedExpected).isEqualTo(hardcodedExpected);
   }
 
   public void testNewDataOutput_writeUTF() {
@@ -400,26 +394,26 @@
     // writeUTF writes the length of the string in 2 bytes
     assertEquals(0, actual[0]);
     assertEquals(expected.length, actual[1]);
-    assertEquals(expected, Arrays.copyOfRange(actual, 2, actual.length));
+    assertThat(Arrays.copyOfRange(actual, 2, actual.length)).isEqualTo(expected);
   }
 
   public void testNewDataOutput_writeShort() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeShort(0x1234);
-    assertEquals(new byte[] {0x12, 0x34}, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(new byte[] {0x12, 0x34});
   }
 
   public void testNewDataOutput_writeDouble() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeDouble(Double.longBitsToDouble(0x1234567876543210L));
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_writeFloat() {
     ByteArrayDataOutput out = ByteStreams.newDataOutput();
     out.writeFloat(Float.intBitsToFloat(0x12345678));
     out.writeFloat(Float.intBitsToFloat(0x76543210));
-    assertEquals(bytes, out.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(bytes);
   }
 
   public void testNewDataOutput_BAOS() {
@@ -427,7 +421,7 @@
     ByteArrayDataOutput out = ByteStreams.newDataOutput(baos);
     out.writeInt(0x12345678);
     assertEquals(4, baos.size());
-    assertEquals(new byte[] {0x12, 0x34, 0x56, 0x78}, baos.toByteArray());
+    assertThat(baos.toByteArray()).isEqualTo(new byte[] {0x12, 0x34, 0x56, 0x78});
   }
 
   private static final byte[] PRE_FILLED_100 = newPreFilledByteArray(100);
@@ -435,13 +429,13 @@
   public void testToByteArray() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_emptyStream() throws IOException {
     InputStream in = newTestStream(0);
     byte[] b = ByteStreams.toByteArray(in);
-    assertEquals(new byte[0], b);
+    assertThat(b).isEqualTo(new byte[0]);
   }
 
   public void testToByteArray_largeStream() throws IOException {
@@ -449,44 +443,44 @@
     byte[] expected = newPreFilledByteArray(10000000);
     InputStream in = new ByteArrayInputStream(expected);
     byte[] b = ByteStreams.toByteArray(in);
-    assertEquals(expected, b);
+    assertThat(b).isEqualTo(expected);
   }
 
   public void testToByteArray_withSize_givenCorrectSize() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 100);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSmallerSize() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 80);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenLargerSize() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 120);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSizeZero() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 0);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSizeOneSmallerThanActual() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     // this results in toByteArrayInternal being called when the stream is actually exhausted
     byte[] b = ByteStreams.toByteArray(in, 99);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testToByteArray_withSize_givenSizeTwoSmallerThanActual() throws IOException {
     InputStream in = new ByteArrayInputStream(PRE_FILLED_100);
     byte[] b = ByteStreams.toByteArray(in, 98);
-    assertEquals(PRE_FILLED_100, b);
+    assertThat(b).isEqualTo(PRE_FILLED_100);
   }
 
   public void testExhaust() throws IOException {
@@ -508,7 +502,7 @@
   private static class SlowSkipper extends FilterInputStream {
     private final long max;
 
-    public SlowSkipper(InputStream in, long max) {
+    SlowSkipper(InputStream in, long max) {
       super(in);
       this.max = max;
     }
@@ -521,15 +515,15 @@
 
   public void testReadBytes() throws IOException {
     final byte[] array = newPreFilledByteArray(1000);
-    assertEquals(
-        array, ByteStreams.readBytes(new ByteArrayInputStream(array), new TestByteProcessor()));
+    assertThat(ByteStreams.readBytes(new ByteArrayInputStream(array), new TestByteProcessor()))
+        .isEqualTo(array);
   }
 
-  private class TestByteProcessor implements ByteProcessor<byte[]> {
+  private static class TestByteProcessor implements ByteProcessor<byte[]> {
     private final ByteArrayOutputStream out = new ByteArrayOutputStream();
 
     @Override
-    public boolean processBytes(byte[] buf, int off, int len) throws IOException {
+    public boolean processBytes(byte[] buf, int off, int len) {
       out.write(buf, off, len);
       return true;
     }
@@ -549,7 +543,8 @@
             new ByteProcessor<Integer>() {
               @Override
               public boolean processBytes(byte[] buf, int off, int len) {
-                assertEquals(copyOfRange(buf, off, off + len), newPreFilledByteArray(8192));
+                assertThat(newPreFilledByteArray(8192))
+                    .isEqualTo(Arrays.copyOfRange(buf, off, off + len));
                 return false;
               }
 
@@ -676,17 +671,4 @@
       return false;
     }
   }
-
-  private static byte[] copyOfRange(byte[] in, int from, int to) {
-    byte[] out = new byte[to - from];
-    for (int i = 0; i < to - from; i++) {
-      out[i] = in[from + i];
-    }
-    return out;
-  }
-
-  // TODO(cpovirk): Inline this.
-  private static void assertEquals(byte[] expected, byte[] actual) {
-    assertThat(actual).isEqualTo(expected);
-  }
 }
diff --git a/guava-tests/test/com/google/common/io/CharStreamsTest.java b/guava-tests/test/com/google/common/io/CharStreamsTest.java
index 3007f09..9b2c24e 100644
--- a/guava-tests/test/com/google/common/io/CharStreamsTest.java
+++ b/guava-tests/test/com/google/common/io/CharStreamsTest.java
@@ -267,6 +267,21 @@
     String test = "Test string for NullWriter";
     nullWriter.write(test);
     nullWriter.write(test, 2, 10);
+    nullWriter.append(null);
+    nullWriter.append(null, 0, 4);
+
+    try {
+      nullWriter.append(null, -1, 4);
+      fail();
+    } catch (IndexOutOfBoundsException expected) {
+    }
+
+    try {
+      nullWriter.append(null, 0, 5);
+      fail();
+    } catch (IndexOutOfBoundsException expected) {
+    }
+
     // nothing really to assert?
     assertSame(CharStreams.nullWriter(), CharStreams.nullWriter());
   }
diff --git a/guava-tests/test/com/google/common/math/BigDecimalMathTest.java b/guava-tests/test/com/google/common/math/BigDecimalMathTest.java
new file mode 100644
index 0000000..ff86fd5
--- /dev/null
+++ b/guava-tests/test/com/google/common/math/BigDecimalMathTest.java
@@ -0,0 +1,270 @@
+/*
+ * 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.math;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static java.math.RoundingMode.CEILING;
+import static java.math.RoundingMode.DOWN;
+import static java.math.RoundingMode.FLOOR;
+import static java.math.RoundingMode.HALF_DOWN;
+import static java.math.RoundingMode.HALF_EVEN;
+import static java.math.RoundingMode.HALF_UP;
+import static java.math.RoundingMode.UNNECESSARY;
+import static java.math.RoundingMode.UP;
+import static java.math.RoundingMode.values;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
+import junit.framework.TestCase;
+
+@GwtIncompatible
+public class BigDecimalMathTest extends TestCase {
+  private static final class RoundToDoubleTester {
+    private final BigDecimal input;
+    private final Map<RoundingMode, Double> expectedValues = new EnumMap<>(RoundingMode.class);
+    private boolean unnecessaryShouldThrow = false;
+
+    RoundToDoubleTester(BigDecimal input) {
+      this.input = input;
+    }
+
+    RoundToDoubleTester setExpectation(double expectedValue, RoundingMode... modes) {
+      for (RoundingMode mode : modes) {
+        Double previous = expectedValues.put(mode, expectedValue);
+        if (previous != null) {
+          throw new AssertionError();
+        }
+      }
+      return this;
+    }
+
+    public RoundToDoubleTester roundUnnecessaryShouldThrow() {
+      unnecessaryShouldThrow = true;
+      return this;
+    }
+
+    public void test() {
+      assertThat(expectedValues.keySet())
+          .containsAtLeastElementsIn(EnumSet.complementOf(EnumSet.of(UNNECESSARY)));
+      for (Map.Entry<RoundingMode, Double> entry : expectedValues.entrySet()) {
+        RoundingMode mode = entry.getKey();
+        Double expectation = entry.getValue();
+        assertWithMessage("roundToDouble(" + input + ", " + mode + ")")
+            .that(BigDecimalMath.roundToDouble(input, mode))
+            .isEqualTo(expectation);
+      }
+
+      if (!expectedValues.containsKey(UNNECESSARY)) {
+        assertWithMessage("Expected roundUnnecessaryShouldThrow call")
+            .that(unnecessaryShouldThrow)
+            .isTrue();
+        try {
+          BigDecimalMath.roundToDouble(input, UNNECESSARY);
+          fail("Expected ArithmeticException for roundToDouble(" + input + ", UNNECESSARY)");
+        } catch (ArithmeticException expected) {
+          // expected
+        }
+      }
+    }
+  }
+
+  public void testRoundToDouble_zero() {
+    new RoundToDoubleTester(BigDecimal.ZERO).setExpectation(0.0, values()).test();
+  }
+
+  public void testRoundToDouble_oneThird() {
+    new RoundToDoubleTester(
+            BigDecimal.ONE.divide(BigDecimal.valueOf(3), new MathContext(50, HALF_EVEN)))
+        .roundUnnecessaryShouldThrow()
+        .setExpectation(0.33333333333333337, UP, CEILING)
+        .setExpectation(0.3333333333333333, HALF_EVEN, FLOOR, DOWN, HALF_UP, HALF_DOWN)
+        .test();
+  }
+
+  public void testRoundToDouble_halfMinDouble() {
+    BigDecimal minDouble = new BigDecimal(Double.MIN_VALUE);
+    BigDecimal halfMinDouble = minDouble.divide(BigDecimal.valueOf(2));
+    new RoundToDoubleTester(halfMinDouble)
+        .roundUnnecessaryShouldThrow()
+        .setExpectation(Double.MIN_VALUE, UP, CEILING, HALF_UP)
+        .setExpectation(0.0, HALF_EVEN, FLOOR, DOWN, HALF_DOWN)
+        .test();
+  }
+
+  public void testRoundToDouble_halfNegativeMinDouble() {
+    BigDecimal minDouble = new BigDecimal(-Double.MIN_VALUE);
+    BigDecimal halfMinDouble = minDouble.divide(BigDecimal.valueOf(2));
+    new RoundToDoubleTester(halfMinDouble)
+        .roundUnnecessaryShouldThrow()
+        .setExpectation(-Double.MIN_VALUE, UP, FLOOR, HALF_UP)
+        .setExpectation(-0.0, HALF_EVEN, CEILING, DOWN, HALF_DOWN)
+        .test();
+  }
+
+  public void testRoundToDouble_smallPositive() {
+    new RoundToDoubleTester(BigDecimal.valueOf(16)).setExpectation(16.0, values()).test();
+  }
+
+  public void testRoundToDouble_maxPreciselyRepresentable() {
+    new RoundToDoubleTester(BigDecimal.valueOf(1L << 53))
+        .setExpectation(Math.pow(2, 53), values())
+        .test();
+  }
+
+  public void testRoundToDouble_maxPreciselyRepresentablePlusOne() {
+    double twoToThe53 = Math.pow(2, 53);
+    // the representable doubles are 2^53 and 2^53 + 2.
+    // 2^53+1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 53) + 1))
+        .setExpectation(twoToThe53, DOWN, FLOOR, HALF_DOWN, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe53), CEILING, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusOne() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+1 is less than halfway between, so HALF_DOWN and HALF_UP will both go down.
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 54) + 1))
+        .setExpectation(twoToThe54, DOWN, FLOOR, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusOneHalf() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+1 is less than halfway between, so HALF_DOWN and HALF_UP will both go down.
+    new RoundToDoubleTester(BigDecimal.valueOf(1L << 54).add(new BigDecimal(0.5)))
+        .setExpectation(twoToThe54, DOWN, FLOOR, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusThree() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+3 is more than halfway between, so HALF_DOWN and HALF_UP will both go up.
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 54) + 3))
+        .setExpectation(twoToThe54, DOWN, FLOOR)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_twoToThe54PlusFour() {
+    new RoundToDoubleTester(BigDecimal.valueOf((1L << 54) + 4))
+        .setExpectation(Math.pow(2, 54) + 4, values())
+        .test();
+  }
+
+  public void testRoundToDouble_maxDouble() {
+    BigDecimal maxDoubleAsBD = new BigDecimal(Double.MAX_VALUE);
+    new RoundToDoubleTester(maxDoubleAsBD).setExpectation(Double.MAX_VALUE, values()).test();
+  }
+
+  public void testRoundToDouble_maxDoublePlusOne() {
+    BigDecimal maxDoubleAsBD = new BigDecimal(Double.MAX_VALUE).add(BigDecimal.ONE);
+    new RoundToDoubleTester(maxDoubleAsBD)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_wayTooBig() {
+    BigDecimal bi = BigDecimal.valueOf(2).pow(2 * Double.MAX_EXPONENT);
+    new RoundToDoubleTester(bi)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_smallNegative() {
+    new RoundToDoubleTester(BigDecimal.valueOf(-16)).setExpectation(-16.0, values()).test();
+  }
+
+  public void testRoundToDouble_minPreciselyRepresentable() {
+    new RoundToDoubleTester(BigDecimal.valueOf(-1L << 53))
+        .setExpectation(-Math.pow(2, 53), values())
+        .test();
+  }
+
+  public void testRoundToDouble_minPreciselyRepresentableMinusOne() {
+    // the representable doubles are -2^53 and -2^53 - 2.
+    // -2^53-1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 53) - 1))
+        .setExpectation(-Math.pow(2, 53), DOWN, CEILING, HALF_DOWN, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 53)), FLOOR, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeTwoToThe54MinusOne() {
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 54) - 1))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeTwoToThe54MinusThree() {
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 54) - 3))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING)
+        .setExpectation(
+            DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeTwoToThe54MinusFour() {
+    new RoundToDoubleTester(BigDecimal.valueOf((-1L << 54) - 4))
+        .setExpectation(-Math.pow(2, 54) - 4, values())
+        .test();
+  }
+
+  public void testRoundToDouble_minDouble() {
+    BigDecimal minDoubleAsBD = new BigDecimal(-Double.MAX_VALUE);
+    new RoundToDoubleTester(minDoubleAsBD).setExpectation(-Double.MAX_VALUE, values()).test();
+  }
+
+  public void testRoundToDouble_minDoubleMinusOne() {
+    BigDecimal minDoubleAsBD = new BigDecimal(-Double.MAX_VALUE).subtract(BigDecimal.ONE);
+    new RoundToDoubleTester(minDoubleAsBD)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  public void testRoundToDouble_negativeWayTooBig() {
+    BigDecimal bi = BigDecimal.valueOf(2).pow(2 * Double.MAX_EXPONENT).negate();
+    new RoundToDoubleTester(bi)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+}
diff --git a/guava-tests/test/com/google/common/math/BigIntegerMathTest.java b/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
index 33f3bcf..8a9b4fc 100644
--- a/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
+++ b/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
@@ -22,6 +22,8 @@
 import static com.google.common.math.MathTesting.NEGATIVE_BIGINTEGER_CANDIDATES;
 import static com.google.common.math.MathTesting.NONZERO_BIGINTEGER_CANDIDATES;
 import static com.google.common.math.MathTesting.POSITIVE_BIGINTEGER_CANDIDATES;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.math.BigInteger.ONE;
 import static java.math.BigInteger.TEN;
 import static java.math.BigInteger.ZERO;
@@ -33,6 +35,7 @@
 import static java.math.RoundingMode.HALF_UP;
 import static java.math.RoundingMode.UNNECESSARY;
 import static java.math.RoundingMode.UP;
+import static java.math.RoundingMode.values;
 import static java.util.Arrays.asList;
 
 import com.google.common.annotations.GwtCompatible;
@@ -41,6 +44,9 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.Map;
 import junit.framework.TestCase;
 
 /**
@@ -542,6 +548,219 @@
     }
   }
 
+  @GwtIncompatible
+  private static final class RoundToDoubleTester {
+    private final BigInteger input;
+    private final Map<RoundingMode, Double> expectedValues = new EnumMap<>(RoundingMode.class);
+    private boolean unnecessaryShouldThrow = false;
+
+    RoundToDoubleTester(BigInteger input) {
+      this.input = input;
+    }
+
+    RoundToDoubleTester setExpectation(double expectedValue, RoundingMode... modes) {
+      for (RoundingMode mode : modes) {
+        Double previous = expectedValues.put(mode, expectedValue);
+        if (previous != null) {
+          throw new AssertionError();
+        }
+      }
+      return this;
+    }
+
+    public RoundToDoubleTester roundUnnecessaryShouldThrow() {
+      unnecessaryShouldThrow = true;
+      return this;
+    }
+
+    public void test() {
+      assertThat(expectedValues.keySet())
+          .containsAtLeastElementsIn(EnumSet.complementOf(EnumSet.of(UNNECESSARY)));
+      for (Map.Entry<RoundingMode, Double> entry : expectedValues.entrySet()) {
+        RoundingMode mode = entry.getKey();
+        Double expectation = entry.getValue();
+        assertWithMessage("roundToDouble(" + input + ", " + mode + ")")
+            .that(BigIntegerMath.roundToDouble(input, mode))
+            .isEqualTo(expectation);
+      }
+
+      if (!expectedValues.containsKey(UNNECESSARY)) {
+        assertWithMessage("Expected roundUnnecessaryShouldThrow call")
+            .that(unnecessaryShouldThrow)
+            .isTrue();
+        try {
+          BigIntegerMath.roundToDouble(input, UNNECESSARY);
+          fail("Expected ArithmeticException for roundToDouble(" + input + ", UNNECESSARY)");
+        } catch (ArithmeticException expected) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_Zero() {
+    new RoundToDoubleTester(BigInteger.ZERO).setExpectation(0.0, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_smallPositive() {
+    new RoundToDoubleTester(BigInteger.valueOf(16)).setExpectation(16.0, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxPreciselyRepresentable() {
+    new RoundToDoubleTester(BigInteger.valueOf(1L << 53))
+        .setExpectation(Math.pow(2, 53), values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxPreciselyRepresentablePlusOne() {
+    double twoToThe53 = Math.pow(2, 53);
+    // the representable doubles are 2^53 and 2^53 + 2.
+    // 2^53+1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 53) + 1))
+        .setExpectation(twoToThe53, DOWN, FLOOR, HALF_DOWN, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe53), CEILING, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_twoToThe54PlusOne() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+1 is less than halfway between, so HALF_DOWN and HALF_UP will both go down.
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 54) + 1))
+        .setExpectation(twoToThe54, DOWN, FLOOR, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_twoToThe54PlusThree() {
+    double twoToThe54 = Math.pow(2, 54);
+    // the representable doubles are 2^54 and 2^54 + 4
+    // 2^54+3 is more than halfway between, so HALF_DOWN and HALF_UP will both go up.
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 54) + 3))
+        .setExpectation(twoToThe54, DOWN, FLOOR)
+        .setExpectation(Math.nextUp(twoToThe54), CEILING, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_twoToThe54PlusFour() {
+    new RoundToDoubleTester(BigInteger.valueOf((1L << 54) + 4))
+        .setExpectation(Math.pow(2, 54) + 4, values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxDouble() {
+    BigInteger maxDoubleAsBI = DoubleMath.roundToBigInteger(Double.MAX_VALUE, UNNECESSARY);
+    new RoundToDoubleTester(maxDoubleAsBI).setExpectation(Double.MAX_VALUE, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_maxDoublePlusOne() {
+    BigInteger maxDoubleAsBI =
+        DoubleMath.roundToBigInteger(Double.MAX_VALUE, UNNECESSARY).add(BigInteger.ONE);
+    new RoundToDoubleTester(maxDoubleAsBI)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_wayTooBig() {
+    BigInteger bi = BigInteger.ONE.shiftLeft(2 * Double.MAX_EXPONENT);
+    new RoundToDoubleTester(bi)
+        .setExpectation(Double.MAX_VALUE, DOWN, FLOOR, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.POSITIVE_INFINITY, UP, CEILING)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_smallNegative() {
+    new RoundToDoubleTester(BigInteger.valueOf(-16)).setExpectation(-16.0, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minPreciselyRepresentable() {
+    new RoundToDoubleTester(BigInteger.valueOf(-1L << 53))
+        .setExpectation(-Math.pow(2, 53), values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minPreciselyRepresentableMinusOne() {
+    // the representable doubles are -2^53 and -2^53 - 2.
+    // -2^53-1 is halfway between, so HALF_UP will go up and HALF_DOWN will go down.
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 53) - 1))
+        .setExpectation(-Math.pow(2, 53), DOWN, CEILING, HALF_DOWN, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 53)), FLOOR, UP, HALF_UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeTwoToThe54MinusOne() {
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 54) - 1))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .setExpectation(DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeTwoToThe54MinusThree() {
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 54) - 3))
+        .setExpectation(-Math.pow(2, 54), DOWN, CEILING)
+        .setExpectation(
+            DoubleUtils.nextDown(-Math.pow(2, 54)), FLOOR, UP, HALF_DOWN, HALF_UP, HALF_EVEN)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeTwoToThe54MinusFour() {
+    new RoundToDoubleTester(BigInteger.valueOf((-1L << 54) - 4))
+        .setExpectation(-Math.pow(2, 54) - 4, values())
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minDouble() {
+    BigInteger minDoubleAsBI = DoubleMath.roundToBigInteger(-Double.MAX_VALUE, UNNECESSARY);
+    new RoundToDoubleTester(minDoubleAsBI).setExpectation(-Double.MAX_VALUE, values()).test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_minDoubleMinusOne() {
+    BigInteger minDoubleAsBI =
+        DoubleMath.roundToBigInteger(-Double.MAX_VALUE, UNNECESSARY).subtract(BigInteger.ONE);
+    new RoundToDoubleTester(minDoubleAsBI)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
+  @GwtIncompatible
+  public void testRoundToDouble_negativeWayTooBig() {
+    BigInteger bi = BigInteger.ONE.shiftLeft(2 * Double.MAX_EXPONENT).negate();
+    new RoundToDoubleTester(bi)
+        .setExpectation(-Double.MAX_VALUE, DOWN, CEILING, HALF_EVEN, HALF_UP, HALF_DOWN)
+        .setExpectation(Double.NEGATIVE_INFINITY, UP, FLOOR)
+        .roundUnnecessaryShouldThrow()
+        .test();
+  }
+
   @GwtIncompatible // NullPointerTester
   public void testNullPointers() {
     NullPointerTester tester = new NullPointerTester();
diff --git a/guava-tests/test/com/google/common/math/LongMathTest.java b/guava-tests/test/com/google/common/math/LongMathTest.java
index 1387e00..2284668 100644
--- a/guava-tests/test/com/google/common/math/LongMathTest.java
+++ b/guava-tests/test/com/google/common/math/LongMathTest.java
@@ -25,7 +25,8 @@
 import static com.google.common.math.MathTesting.NONZERO_LONG_CANDIDATES;
 import static com.google.common.math.MathTesting.POSITIVE_INTEGER_CANDIDATES;
 import static com.google.common.math.MathTesting.POSITIVE_LONG_CANDIDATES;
-import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.math.BigInteger.valueOf;
 import static java.math.RoundingMode.FLOOR;
 import static java.math.RoundingMode.UNNECESSARY;
@@ -36,6 +37,7 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.util.EnumSet;
 import java.util.Random;
 import junit.framework.TestCase;
 
@@ -949,7 +951,76 @@
     }
   }
 
+  private static final long[] roundToDoubleTestCandidates = {
+    0,
+    16,
+    1L << 53,
+    (1L << 53) + 1,
+    (1L << 53) + 2,
+    (1L << 53) + 3,
+    (1L << 53) + 4,
+    1L << 54,
+    (1L << 54) + 1,
+    (1L << 54) + 2,
+    (1L << 54) + 3,
+    (1L << 54) + 4,
+    0x7ffffffffffffe00L, // halfway between 2^63 and next-lower double
+    0x7ffffffffffffe01L, // above + 1
+    0x7ffffffffffffdffL, // above - 1
+    Long.MAX_VALUE - (1L << 11) + 1,
+    Long.MAX_VALUE - 2,
+    Long.MAX_VALUE - 1,
+    Long.MAX_VALUE,
+    -16,
+    -1L << 53,
+    -(1L << 53) - 1,
+    -(1L << 53) - 2,
+    -(1L << 53) - 3,
+    -(1L << 53) - 4,
+    -1L << 54,
+    -(1L << 54) - 1,
+    -(1L << 54) - 2,
+    -(1L << 54) - 3,
+    -(1L << 54) - 4,
+    Long.MIN_VALUE + 2,
+    Long.MIN_VALUE + 1,
+    Long.MIN_VALUE
+  };
+
+  @GwtIncompatible
+  public void testRoundToDoubleAgainstBigInteger() {
+    for (RoundingMode roundingMode : EnumSet.complementOf(EnumSet.of(UNNECESSARY))) {
+      for (long candidate : roundToDoubleTestCandidates) {
+        assertThat(LongMath.roundToDouble(candidate, roundingMode))
+            .isEqualTo(BigIntegerMath.roundToDouble(BigInteger.valueOf(candidate), roundingMode));
+      }
+    }
+  }
+
+  @GwtIncompatible
+  public void testRoundToDoubleAgainstBigIntegerUnnecessary() {
+    for (long candidate : roundToDoubleTestCandidates) {
+      Double expectedDouble = null;
+      try {
+        expectedDouble = BigIntegerMath.roundToDouble(BigInteger.valueOf(candidate), UNNECESSARY);
+      } catch (ArithmeticException expected) {
+        // do nothing
+      }
+
+      if (expectedDouble != null) {
+        assertThat(LongMath.roundToDouble(candidate, UNNECESSARY)).isEqualTo(expectedDouble);
+      } else {
+        try {
+          LongMath.roundToDouble(candidate, UNNECESSARY);
+          fail("Expected ArithmeticException on roundToDouble(" + candidate + ", UNNECESSARY)");
+        } catch (ArithmeticException expected) {
+          // success
+        }
+      }
+    }
+  }
+
   private static void failFormat(String template, Object... args) {
-    assert_().fail(template, args);
+    assertWithMessage(template, args).fail();
   }
 }
diff --git a/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java b/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java
index 0a21790..34f82e9 100644
--- a/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java
+++ b/guava-tests/test/com/google/common/math/PairedStatsAccumulatorTest.java
@@ -43,6 +43,7 @@
 import static com.google.common.math.StatsTesting.createFilledPairedStatsAccumulator;
 import static com.google.common.math.StatsTesting.createPartitionedFilledPairedStatsAccumulator;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.math.StatsTesting.ManyValues;
 import java.util.Collections;
@@ -210,17 +211,17 @@
       double populationCovarianceByAddAllPartitionedPairedStats =
           accumulatorByAddAllPartitionedPairedStats.populationCovariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationCovariance).named("population covariance of " + values).isNaN();
-        assertThat(populationCovarianceByAddAllPartitionedPairedStats)
-            .named("population covariance by addAll(PairedStats) of " + values)
+        assertWithMessage("population covariance of " + values).that(populationCovariance).isNaN();
+        assertWithMessage("population covariance by addAll(PairedStats) of " + values)
+            .that(populationCovarianceByAddAllPartitionedPairedStats)
             .isNaN();
       } else {
-        assertThat(populationCovariance)
-            .named("population covariance of " + values)
+        assertWithMessage("population covariance of " + values)
+            .that(populationCovariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_PRODUCTS_OF_DELTAS / MANY_VALUES_COUNT);
-        assertThat(populationCovarianceByAddAllPartitionedPairedStats)
-            .named("population covariance by addAll(PairedStats) of " + values)
+        assertWithMessage("population covariance by addAll(PairedStats) of " + values)
+            .that(populationCovarianceByAddAllPartitionedPairedStats)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_PRODUCTS_OF_DELTAS / MANY_VALUES_COUNT);
       }
@@ -340,22 +341,22 @@
       double pearsonsCorrelationCoefficientByAddAllPartitionedPairedStats =
           accumulatorByAddAllPartitionedPairedStats.pearsonsCorrelationCoefficient();
       if (values.hasAnyNonFinite()) {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isNaN();
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+        assertWithMessage("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isNaN();
       } else {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isWithin(ALLOWED_ERROR)
             .of(
                 accumulator.populationCovariance()
                     / (accumulator.xStats().populationStandardDeviation()
                         * accumulator.yStats().populationStandardDeviation()));
-        assertThat(pearsonsCorrelationCoefficientByAddAllPartitionedPairedStats)
-            .named("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+        assertWithMessage("Pearson's correlation coefficient by addAll(PairedStats) of " + values)
+            .that(pearsonsCorrelationCoefficientByAddAllPartitionedPairedStats)
             .isWithin(ALLOWED_ERROR)
             .of(
                 accumulatorByAddAllPartitionedPairedStats.populationCovariance()
diff --git a/guava-tests/test/com/google/common/math/PairedStatsTest.java b/guava-tests/test/com/google/common/math/PairedStatsTest.java
index f427ae6..7dd9e94 100644
--- a/guava-tests/test/com/google/common/math/PairedStatsTest.java
+++ b/guava-tests/test/com/google/common/math/PairedStatsTest.java
@@ -47,6 +47,7 @@
 import static com.google.common.math.StatsTesting.assertVerticalLinearTransformation;
 import static com.google.common.math.StatsTesting.createPairedStatsOf;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.math.StatsTesting.ManyValues;
@@ -104,10 +105,10 @@
       PairedStats stats = createPairedStatsOf(values.asIterable(), OTHER_MANY_VALUES);
       double populationCovariance = stats.populationCovariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationCovariance).named("population covariance of " + values).isNaN();
+        assertWithMessage("population covariance of " + values).that(populationCovariance).isNaN();
       } else {
-        assertThat(populationCovariance)
-            .named("population covariance of " + values)
+        assertWithMessage("population covariance of " + values)
+            .that(populationCovariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_PRODUCTS_OF_DELTAS / MANY_VALUES_COUNT);
       }
@@ -169,12 +170,12 @@
       PairedStats stats = createPairedStatsOf(MANY_VALUES, values.asIterable());
       double pearsonsCorrelationCoefficient = stats.pearsonsCorrelationCoefficient();
       if (values.hasAnyNonFinite()) {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isNaN();
       } else {
-        assertThat(pearsonsCorrelationCoefficient)
-            .named("Pearson's correlation coefficient of " + values)
+        assertWithMessage("Pearson's correlation coefficient of " + values)
+            .that(pearsonsCorrelationCoefficient)
             .isWithin(ALLOWED_ERROR)
             .of(
                 stats.populationCovariance()
diff --git a/guava-tests/test/com/google/common/math/QuantilesTest.java b/guava-tests/test/com/google/common/math/QuantilesTest.java
index eb5d111..a9b7872 100644
--- a/guava-tests/test/com/google/common/math/QuantilesTest.java
+++ b/guava-tests/test/com/google/common/math/QuantilesTest.java
@@ -20,6 +20,7 @@
 import static com.google.common.math.Quantiles.percentiles;
 import static com.google.common.math.Quantiles.quartiles;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.Double.NEGATIVE_INFINITY;
 import static java.lang.Double.NaN;
 import static java.lang.Double.POSITIVE_INFINITY;
@@ -35,6 +36,7 @@
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
 import com.google.common.truth.Correspondence;
+import com.google.common.truth.Correspondence.BinaryPredicate;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -87,20 +89,17 @@
    * each other or identical non-finite values.
    */
   private static final Correspondence<Double, Double> QUANTILE_CORRESPONDENCE =
-      new Correspondence<Double, Double>() {
-
-        @Override
-        public boolean compare(@Nullable Double actual, @Nullable Double expected) {
-          // Test for equality to allow non-finite values to match; otherwise, use the finite test.
-          return actual.equals(expected)
-              || FINITE_QUANTILE_CORRESPONDENCE.compare(actual, expected);
-        }
-
-        @Override
-        public String toString() {
-          return "is identical to or " + FINITE_QUANTILE_CORRESPONDENCE;
-        }
-      };
+      Correspondence.from(
+          new BinaryPredicate<Double, Double>() {
+            @Override
+            public boolean apply(@Nullable Double actual, @Nullable Double expected) {
+              // Test for equality to allow non-finite values to match; otherwise, use the finite
+              // test.
+              return actual.equals(expected)
+                  || FINITE_QUANTILE_CORRESPONDENCE.compare(actual, expected);
+            }
+          },
+          "is identical to or " + FINITE_QUANTILE_CORRESPONDENCE);
 
   // 1. Tests on a hardcoded dataset for chains starting with median(), quartiles(), and scale(10):
 
@@ -291,6 +290,18 @@
             8, SIXTEEN_SQUARES_DECILE_8);
   }
 
+  public void testScale_indexes_varargs_compute_indexOrderIsMaintained() {
+    assertThat(Quantiles.scale(10).indexes(0, 10, 5, 1, 8, 1).compute(SIXTEEN_SQUARES_INTEGERS))
+        .comparingValuesUsing(QUANTILE_CORRESPONDENCE)
+        .containsExactly(
+            0, SIXTEEN_SQUARES_MIN,
+            10, SIXTEEN_SQUARES_MAX,
+            5, SIXTEEN_SQUARES_MEDIAN,
+            1, SIXTEEN_SQUARES_DECILE_1,
+            8, SIXTEEN_SQUARES_DECILE_8)
+        .inOrder();
+  }
+
   public void testScale_indexes_varargs_compute_doubleVarargs() {
     double[] dataset = Doubles.toArray(SIXTEEN_SQUARES_DOUBLES);
     assertThat(Quantiles.scale(10).indexes(0, 10, 5, 1, 8, 1).compute(dataset))
@@ -509,8 +520,8 @@
 
   public void testPercentiles_index_compute_doubleCollection() {
     for (int index = 0; index <= 100; index++) {
-      assertThat(percentiles().index(index).compute(PSEUDORANDOM_DATASET))
-          .named("quantile at index " + index)
+      assertWithMessage("quantile at index " + index)
+          .that(percentiles().index(index).compute(PSEUDORANDOM_DATASET))
           .isWithin(ALLOWED_ERROR)
           .of(expectedLargeDatasetPercentile(index));
     }
@@ -521,8 +532,8 @@
     // Assert that the computation gives the correct result for all possible percentiles.
     for (int index = 0; index <= 100; index++) {
       double[] dataset = Doubles.toArray(PSEUDORANDOM_DATASET);
-      assertThat(percentiles().index(index).computeInPlace(dataset))
-          .named("quantile at index " + index)
+      assertWithMessage("quantile at index " + index)
+          .that(percentiles().index(index).computeInPlace(dataset))
           .isWithin(ALLOWED_ERROR)
           .of(expectedLargeDatasetPercentile(index));
     }
@@ -745,4 +756,13 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  public void testScale_indexes_indexes_computeInPlace_empty() {
+    int[] emptyIndexes = {};
+    try {
+      Quantiles.ScaleAndIndexes unused = Quantiles.scale(10).indexes(emptyIndexes);
+      fail("Expected IllegalArgumentException");
+    } catch (IllegalArgumentException expected) {
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java b/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java
index a38c803..2dba5fb 100644
--- a/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java
+++ b/guava-tests/test/com/google/common/math/StatsAccumulatorTest.java
@@ -36,6 +36,11 @@
 import static com.google.common.math.StatsTesting.MANY_VALUES_MEAN;
 import static com.google.common.math.StatsTesting.MANY_VALUES_MIN;
 import static com.google.common.math.StatsTesting.MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_COUNT;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_MAX;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_MEAN;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_MIN;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_POPULATION_VARIANCE;
 import static com.google.common.math.StatsTesting.ONE_VALUE;
 import static com.google.common.math.StatsTesting.OTHER_ONE_VALUE;
 import static com.google.common.math.StatsTesting.TWO_VALUES;
@@ -43,7 +48,10 @@
 import static com.google.common.math.StatsTesting.TWO_VALUES_MEAN;
 import static com.google.common.math.StatsTesting.TWO_VALUES_MIN;
 import static com.google.common.math.StatsTesting.TWO_VALUES_SUM_OF_SQUARES_OF_DELTAS;
+import static com.google.common.math.StatsTesting.megaPrimitiveDoubleStreamPart1;
+import static com.google.common.math.StatsTesting.megaPrimitiveDoubleStreamPart2;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.Math.sqrt;
 
 import com.google.common.collect.ImmutableList;
@@ -75,6 +83,7 @@
   private StatsAccumulator manyValuesAccumulatorByRepeatedAdd;
   private StatsAccumulator manyValuesAccumulatorByAddAndAddAll;
   private StatsAccumulator manyValuesAccumulatorByAddAllStats;
+  private StatsAccumulator manyValuesAccumulatorByAddAllStatsAccumulator;
   private StatsAccumulator integerManyValuesAccumulatorByAddAllIterable;
   private StatsAccumulator longManyValuesAccumulatorByAddAllIterator;
   private StatsAccumulator longManyValuesAccumulatorByAddAllVarargs;
@@ -129,6 +138,12 @@
     manyValuesAccumulatorByAddAllStats.addAll(
         Stats.of(MANY_VALUES.subList(MANY_VALUES.size() / 2, MANY_VALUES.size())));
 
+    manyValuesAccumulatorByAddAllStatsAccumulator = new StatsAccumulator();
+    manyValuesAccumulatorByAddAllStatsAccumulator.addAll(
+        statsAccumulatorOf(MANY_VALUES.subList(0, MANY_VALUES.size() / 2)));
+    manyValuesAccumulatorByAddAllStatsAccumulator.addAll(
+        statsAccumulatorOf(MANY_VALUES.subList(MANY_VALUES.size() / 2, MANY_VALUES.size())));
+
     integerManyValuesAccumulatorByAddAllIterable = new StatsAccumulator();
     integerManyValuesAccumulatorByAddAllIterable.addAll(INTEGER_MANY_VALUES);
 
@@ -139,6 +154,12 @@
     longManyValuesAccumulatorByAddAllVarargs.addAll(Longs.toArray(LONG_MANY_VALUES));
   }
 
+  private static StatsAccumulator statsAccumulatorOf(Iterable<? extends Number> values) {
+    StatsAccumulator accumulator = new StatsAccumulator();
+    accumulator.addAll(values);
+    return accumulator;
+  }
+
   public void testCount() {
     assertThat(emptyAccumulator.count()).isEqualTo(0);
     assertThat(emptyAccumulatorByAddAllEmptyIterable.count()).isEqualTo(0);
@@ -153,6 +174,7 @@
     assertThat(manyValuesAccumulatorByRepeatedAdd.count()).isEqualTo(MANY_VALUES_COUNT);
     assertThat(manyValuesAccumulatorByAddAndAddAll.count()).isEqualTo(MANY_VALUES_COUNT);
     assertThat(manyValuesAccumulatorByAddAllStats.count()).isEqualTo(MANY_VALUES_COUNT);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.count()).isEqualTo(MANY_VALUES_COUNT);
     assertThat(integerManyValuesAccumulatorByAddAllIterable.count())
         .isEqualTo(StatsTesting.INTEGER_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllIterator.count())
@@ -212,6 +234,9 @@
     assertThat(manyValuesAccumulatorByAddAllStats.mean())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_MEAN);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.mean())
+        .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_MEAN);
     // For datasets of many double values created from an iterable, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -224,37 +249,40 @@
       double mean = accumulator.mean();
       double meanByAddAllStats = accumulatorByAddAllStats.mean();
       if (values.hasAnyNaN()) {
-        assertThat(mean).named("mean of " + values).isNaN();
-        assertThat(meanByAddAllStats).named("mean by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
+        assertWithMessage("mean by addAll(Stats) of " + values).that(meanByAddAllStats).isNaN();
       } else if (values.hasAnyPositiveInfinity() && values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNaN();
-        assertThat(meanByAddAllStats).named("mean by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
+        assertWithMessage("mean by addAll(Stats) of " + values).that(meanByAddAllStats).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(mean).named("mean of " + values).isPositiveInfinity();
-        assertThat(meanByAddAllStats)
-            .named("mean by addAll(Stats) of " + values)
+        assertWithMessage("mean of " + values).that(mean).isPositiveInfinity();
+        assertWithMessage("mean by addAll(Stats) of " + values)
+            .that(meanByAddAllStats)
             .isPositiveInfinity();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNegativeInfinity();
-        assertThat(meanByAddAllStats)
-            .named("mean by addAll(Stats) of " + values)
+        assertWithMessage("mean of " + values).that(mean).isNegativeInfinity();
+        assertWithMessage("mean by addAll(Stats) of " + values)
+            .that(meanByAddAllStats)
             .isNegativeInfinity();
       } else {
-        assertThat(mean).named("mean of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
-        assertThat(meanByAddAllStats)
-            .named("mean by addAll(Stats) of " + values)
+        assertWithMessage("mean of " + values)
+            .that(mean)
+            .isWithin(ALLOWED_ERROR)
+            .of(MANY_VALUES_MEAN);
+        assertWithMessage("mean by addAll(Stats) of " + values)
+            .that(meanByAddAllStats)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_MEAN);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(longManyValuesAccumulatorByAddAllIterator.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
     assertThat(longManyValuesAccumulatorByAddAllVarargs.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
   }
 
@@ -286,14 +314,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.sum())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_MEAN * MANY_VALUES_COUNT);
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.sum())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.sum())
         .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_MEAN * MANY_VALUES_COUNT);
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.sum())
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN * INTEGER_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllIterator.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllVarargs.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
   }
 
@@ -339,6 +370,9 @@
     assertThat(manyValuesAccumulatorByAddAllStats.populationVariance())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.populationVariance())
+        .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
     // For datasets of many double values created from an iterator, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -351,29 +385,29 @@
       double populationVariance = accumulator.populationVariance();
       double populationVarianceByAddAllStats = accumulatorByAddAllStats.populationVariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationVariance).named("population variance of " + values).isNaN();
-        assertThat(populationVarianceByAddAllStats)
-            .named("population variance by addAll(Stats) of " + values)
+        assertWithMessage("population variance of " + values).that(populationVariance).isNaN();
+        assertWithMessage("population variance by addAll(Stats) of " + values)
+            .that(populationVarianceByAddAllStats)
             .isNaN();
       } else {
-        assertThat(populationVariance)
-            .named("population variance of " + values)
+        assertWithMessage("population variance of " + values)
+            .that(populationVariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
-        assertThat(populationVarianceByAddAllStats)
-            .named("population variance by addAll(Stats) of " + values)
+        assertWithMessage("population variance by addAll(Stats) of " + values)
+            .that(populationVarianceByAddAllStats)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllIterator.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
     assertThat(longManyValuesAccumulatorByAddAllVarargs.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
   }
 
@@ -421,14 +455,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.populationStandardDeviation())
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT));
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.populationStandardDeviation())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.populationStandardDeviation())
         .isWithin(ALLOWED_ERROR)
+        .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT));
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.populationStandardDeviation())
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT));
     assertThat(longManyValuesAccumulatorByAddAllIterator.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
     assertThat(longManyValuesAccumulatorByAddAllVarargs.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
   }
 
@@ -482,14 +519,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.sampleVariance())
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1));
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleVariance())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.sampleVariance())
         .isWithin(ALLOWED_ERROR)
+        .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1));
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleVariance())
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1));
     assertThat(longManyValuesAccumulatorByAddAllIterator.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
     assertThat(longManyValuesAccumulatorByAddAllVarargs.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
   }
 
@@ -543,14 +583,17 @@
     assertThat(manyValuesAccumulatorByAddAllStats.sampleStandardDeviation())
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1)));
-    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleStandardDeviation())
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.sampleStandardDeviation())
         .isWithin(ALLOWED_ERROR)
+        .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1)));
+    assertThat(integerManyValuesAccumulatorByAddAllIterable.sampleStandardDeviation())
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1)));
     assertThat(longManyValuesAccumulatorByAddAllIterator.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
     assertThat(longManyValuesAccumulatorByAddAllVarargs.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
   }
 
@@ -570,28 +613,17 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(oneValueAccumulator.max()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(oneValueAccumulatorByAddAllEmptyStats.max()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(twoValuesAccumulator.max()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MAX);
-    assertThat(twoValuesAccumulatorByAddAllStats.max()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllIterable.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllIterator.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllVarargs.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByRepeatedAdd.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAndAddAll.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
-    assertThat(manyValuesAccumulatorByAddAllStats.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MAX);
+    assertThat(oneValueAccumulator.max()).isEqualTo(ONE_VALUE);
+    assertThat(oneValueAccumulatorByAddAllEmptyStats.max()).isEqualTo(ONE_VALUE);
+    assertThat(twoValuesAccumulator.max()).isEqualTo(TWO_VALUES_MAX);
+    assertThat(twoValuesAccumulatorByAddAllStats.max()).isEqualTo(TWO_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllIterable.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllIterator.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllVarargs.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByRepeatedAdd.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAndAddAll.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllStats.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.max()).isEqualTo(MANY_VALUES_MAX);
     // For datasets of many double values created from an array, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -604,30 +636,24 @@
       double max = accumulator.max();
       double maxByAddAllStats = accumulatorByAddAllStats.max();
       if (values.hasAnyNaN()) {
-        assertThat(max).named("max of " + values).isNaN();
-        assertThat(maxByAddAllStats).named("max by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("max of " + values).that(max).isNaN();
+        assertWithMessage("max by addAll(Stats) of " + values).that(maxByAddAllStats).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(max).named("max of " + values).isPositiveInfinity();
-        assertThat(maxByAddAllStats)
-            .named("max by addAll(Stats) of " + values)
+        assertWithMessage("max of " + values).that(max).isPositiveInfinity();
+        assertWithMessage("max by addAll(Stats) of " + values)
+            .that(maxByAddAllStats)
             .isPositiveInfinity();
       } else {
-        assertThat(max).named("max of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
-        assertThat(maxByAddAllStats)
-            .named("max by addAll(Stats) of " + values)
-            .isWithin(ALLOWED_ERROR)
-            .of(MANY_VALUES_MAX);
+        assertWithMessage("max of " + values).that(max).isEqualTo(MANY_VALUES_MAX);
+        assertWithMessage("max by addAll(Stats) of " + values)
+            .that(maxByAddAllStats)
+            .isEqualTo(MANY_VALUES_MAX);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MAX);
-    assertThat(longManyValuesAccumulatorByAddAllIterator.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
-    assertThat(longManyValuesAccumulatorByAddAllVarargs.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
+        .isEqualTo(INTEGER_MANY_VALUES_MAX);
+    assertThat(longManyValuesAccumulatorByAddAllIterator.max()).isEqualTo(LONG_MANY_VALUES_MAX);
+    assertThat(longManyValuesAccumulatorByAddAllVarargs.max()).isEqualTo(LONG_MANY_VALUES_MAX);
   }
 
   public void testMin() {
@@ -646,28 +672,17 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(oneValueAccumulator.min()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(oneValueAccumulatorByAddAllEmptyStats.min()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
-    assertThat(twoValuesAccumulator.min()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MIN);
-    assertThat(twoValuesAccumulatorByAddAllStats.min()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllIterable.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllIterator.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllVarargs.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByRepeatedAdd.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAndAddAll.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
-    assertThat(manyValuesAccumulatorByAddAllStats.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(MANY_VALUES_MIN);
+    assertThat(oneValueAccumulator.min()).isEqualTo(ONE_VALUE);
+    assertThat(oneValueAccumulatorByAddAllEmptyStats.min()).isEqualTo(ONE_VALUE);
+    assertThat(twoValuesAccumulator.min()).isEqualTo(TWO_VALUES_MIN);
+    assertThat(twoValuesAccumulatorByAddAllStats.min()).isEqualTo(TWO_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllIterable.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllIterator.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllVarargs.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByRepeatedAdd.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAndAddAll.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllStats.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(manyValuesAccumulatorByAddAllStatsAccumulator.min()).isEqualTo(MANY_VALUES_MIN);
     // For datasets of many double values created by adding elements individually, we test many
     // combinations of finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -680,29 +695,62 @@
       double min = accumulator.min();
       double minByAddAllStats = accumulatorByAddAllStats.min();
       if (values.hasAnyNaN()) {
-        assertThat(min).named("min of " + values).isNaN();
-        assertThat(minByAddAllStats).named("min by addAll(Stats) of " + values).isNaN();
+        assertWithMessage("min of " + values).that(min).isNaN();
+        assertWithMessage("min by addAll(Stats) of " + values).that(minByAddAllStats).isNaN();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(min).named("min of " + values).isNegativeInfinity();
-        assertThat(minByAddAllStats)
-            .named("min by addAll(Stats) of " + values)
+        assertWithMessage("min of " + values).that(min).isNegativeInfinity();
+        assertWithMessage("min by addAll(Stats) of " + values)
+            .that(minByAddAllStats)
             .isNegativeInfinity();
       } else {
-        assertThat(min).named("min of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
-        assertThat(minByAddAllStats)
-            .named("min by addAll(Stats) of " + values)
-            .isWithin(ALLOWED_ERROR)
-            .of(MANY_VALUES_MIN);
+        assertWithMessage("min of " + values).that(min).isEqualTo(MANY_VALUES_MIN);
+        assertWithMessage("min by addAll(Stats) of " + values)
+            .that(minByAddAllStats)
+            .isEqualTo(MANY_VALUES_MIN);
       }
     }
     assertThat(integerManyValuesAccumulatorByAddAllIterable.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MIN);
-    assertThat(longManyValuesAccumulatorByAddAllIterator.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
-    assertThat(longManyValuesAccumulatorByAddAllVarargs.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
+        .isEqualTo(INTEGER_MANY_VALUES_MIN);
+    assertThat(longManyValuesAccumulatorByAddAllIterator.min()).isEqualTo(LONG_MANY_VALUES_MIN);
+    assertThat(longManyValuesAccumulatorByAddAllVarargs.min()).isEqualTo(LONG_MANY_VALUES_MIN);
+  }
+
+  public void testAddAllPrimitiveDoubleStream() {
+    StatsAccumulator accumulator = new StatsAccumulator();
+    accumulator.addAll(megaPrimitiveDoubleStreamPart1());
+    accumulator.addAll(megaPrimitiveDoubleStreamPart2());
+    assertThat(accumulator.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(accumulator.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(accumulator.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(accumulator.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(accumulator.max()).isEqualTo(MEGA_STREAM_MAX);
+  }
+
+  public void testAddAllPrimitiveIntStream() {
+    StatsAccumulator accumulator = new StatsAccumulator();
+    accumulator.addAll(megaPrimitiveDoubleStreamPart1().mapToInt(x -> (int) x));
+    accumulator.addAll(megaPrimitiveDoubleStreamPart2().mapToInt(x -> (int) x));
+    assertThat(accumulator.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(accumulator.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(accumulator.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(accumulator.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(accumulator.max()).isEqualTo(MEGA_STREAM_MAX);
+  }
+
+  public void testAddAllPrimitiveLongStream() {
+    StatsAccumulator accumulator = new StatsAccumulator();
+    accumulator.addAll(megaPrimitiveDoubleStreamPart1().mapToLong(x -> (long) x));
+    accumulator.addAll(megaPrimitiveDoubleStreamPart2().mapToLong(x -> (long) x));
+    assertThat(accumulator.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(accumulator.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(accumulator.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(accumulator.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(accumulator.max()).isEqualTo(MEGA_STREAM_MAX);
   }
 }
diff --git a/guava-tests/test/com/google/common/math/StatsTest.java b/guava-tests/test/com/google/common/math/StatsTest.java
index fdca9e3..9112ef3 100644
--- a/guava-tests/test/com/google/common/math/StatsTest.java
+++ b/guava-tests/test/com/google/common/math/StatsTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.math;
 
+import static com.google.common.math.Stats.toStats;
 import static com.google.common.math.StatsTesting.ALLOWED_ERROR;
 import static com.google.common.math.StatsTesting.ALL_MANY_VALUES;
 import static com.google.common.math.StatsTesting.ALL_STATS;
@@ -55,6 +56,11 @@
 import static com.google.common.math.StatsTesting.MANY_VALUES_STATS_SNAPSHOT;
 import static com.google.common.math.StatsTesting.MANY_VALUES_STATS_VARARGS;
 import static com.google.common.math.StatsTesting.MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_COUNT;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_MAX;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_MEAN;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_MIN;
+import static com.google.common.math.StatsTesting.MEGA_STREAM_POPULATION_VARIANCE;
 import static com.google.common.math.StatsTesting.ONE_VALUE;
 import static com.google.common.math.StatsTesting.ONE_VALUE_STATS;
 import static com.google.common.math.StatsTesting.TWO_VALUES;
@@ -63,7 +69,9 @@
 import static com.google.common.math.StatsTesting.TWO_VALUES_MIN;
 import static com.google.common.math.StatsTesting.TWO_VALUES_STATS;
 import static com.google.common.math.StatsTesting.TWO_VALUES_SUM_OF_SQUARES_OF_DELTAS;
+import static com.google.common.math.StatsTesting.megaPrimitiveDoubleStream;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.lang.Double.NEGATIVE_INFINITY;
 import static java.lang.Double.NaN;
 import static java.lang.Double.POSITIVE_INFINITY;
@@ -76,6 +84,7 @@
 import com.google.common.primitives.Longs;
 import com.google.common.testing.EqualsTester;
 import com.google.common.testing.SerializableTester;
+import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.DoubleSummaryStatistics;
@@ -125,15 +134,18 @@
     for (ManyValues values : ALL_MANY_VALUES) {
       double mean = Stats.of(values.asArray()).mean();
       if (values.hasAnyNaN()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity() && values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(mean).named("mean of " + values).isPositiveInfinity();
+        assertWithMessage("mean of " + values).that(mean).isPositiveInfinity();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNegativeInfinity();
+        assertWithMessage("mean of " + values).that(mean).isNegativeInfinity();
       } else {
-        assertThat(mean).named("mean of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
+        assertWithMessage("mean of " + values)
+            .that(mean)
+            .isWithin(ALLOWED_ERROR)
+            .of(MANY_VALUES_MEAN);
       }
     }
     assertThat(MANY_VALUES_STATS_ITERABLE.mean()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
@@ -143,19 +155,19 @@
         .isWithin(ALLOWED_ERROR * Double.MAX_VALUE)
         .of(LARGE_VALUES_MEAN);
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(LARGE_INTEGER_VALUES_STATS.mean())
         .isWithin(ALLOWED_ERROR * Integer.MAX_VALUE)
         .of(LARGE_INTEGER_VALUES_MEAN);
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.mean())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
     assertThat(LARGE_LONG_VALUES_STATS.mean())
         .isWithin(ALLOWED_ERROR * Long.MAX_VALUE)
@@ -180,16 +192,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_MEAN * MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN * INTEGER_MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN * INTEGER_MANY_VALUES_COUNT);
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.sum())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN * LONG_MANY_VALUES_COUNT);
   }
 
@@ -219,10 +231,10 @@
     for (ManyValues values : ALL_MANY_VALUES) {
       double populationVariance = Stats.of(values.asIterable()).populationVariance();
       if (values.hasAnyNonFinite()) {
-        assertThat(populationVariance).named("population variance of " + values).isNaN();
+        assertWithMessage("population variance of " + values).that(populationVariance).isNaN();
       } else {
-        assertThat(populationVariance)
-            .named("population variance of " + values)
+        assertWithMessage("population variance of " + values)
+            .that(populationVariance)
             .isWithin(ALLOWED_ERROR)
             .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
       }
@@ -234,19 +246,19 @@
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT);
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT);
     assertThat(LARGE_INTEGER_VALUES_STATS.populationVariance())
         .isWithin(ALLOWED_ERROR * Integer.MAX_VALUE * Integer.MAX_VALUE)
         .of(LARGE_INTEGER_VALUES_POPULATION_VARIANCE);
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.populationVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT);
     assertThat(LARGE_LONG_VALUES_STATS.populationVariance())
         .isWithin(ALLOWED_ERROR * Long.MAX_VALUE * Long.MAX_VALUE)
@@ -281,16 +293,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / MANY_VALUES_COUNT));
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT));
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / INTEGER_MANY_VALUES_COUNT));
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.populationStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / LONG_MANY_VALUES_COUNT));
   }
 
@@ -326,16 +338,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1));
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1));
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1));
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.sampleVariance())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS)
         .of(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1));
   }
 
@@ -371,16 +383,16 @@
         .isWithin(ALLOWED_ERROR)
         .of(sqrt(MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (MANY_VALUES_COUNT - 1)));
     assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1)));
     assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(INTEGER_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (INTEGER_MANY_VALUES_COUNT - 1)));
     assertThat(LONG_MANY_VALUES_STATS_ITERATOR.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
     assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.sampleStandardDeviation())
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS))
         .of(sqrt(LONG_MANY_VALUES_SUM_OF_SQUARES_OF_DELTAS / (LONG_MANY_VALUES_COUNT - 1)));
   }
 
@@ -395,38 +407,30 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(ONE_VALUE_STATS.max()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
+    assertThat(ONE_VALUE_STATS.max()).isEqualTo(ONE_VALUE);
     assertThat(Stats.of(POSITIVE_INFINITY).max()).isPositiveInfinity();
     assertThat(Stats.of(NEGATIVE_INFINITY).max()).isNegativeInfinity();
     assertThat(Stats.of(NaN).max()).isNaN();
-    assertThat(TWO_VALUES_STATS.max()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MAX);
-    assertThat(MANY_VALUES_STATS_VARARGS.max()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
-    assertThat(MANY_VALUES_STATS_ITERABLE.max()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
+    assertThat(TWO_VALUES_STATS.max()).isEqualTo(TWO_VALUES_MAX);
+    assertThat(MANY_VALUES_STATS_VARARGS.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(MANY_VALUES_STATS_ITERABLE.max()).isEqualTo(MANY_VALUES_MAX);
     // For datasets of many double values created from an iterator, we test many combinations of
     // finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
       double max = Stats.of(values.asIterable().iterator()).max();
       if (values.hasAnyNaN()) {
-        assertThat(max).named("max of " + values).isNaN();
+        assertWithMessage("max of " + values).that(max).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(max).named("max of " + values).isPositiveInfinity();
+        assertWithMessage("max of " + values).that(max).isPositiveInfinity();
       } else {
-        assertThat(max).named("max of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
+        assertWithMessage("max of " + values).that(max).isEqualTo(MANY_VALUES_MAX);
       }
     }
-    assertThat(MANY_VALUES_STATS_SNAPSHOT.max()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MAX);
-    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MAX);
-    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MAX);
-    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
-    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.max())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MAX);
+    assertThat(MANY_VALUES_STATS_SNAPSHOT.max()).isEqualTo(MANY_VALUES_MAX);
+    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.max()).isEqualTo(INTEGER_MANY_VALUES_MAX);
+    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.max()).isEqualTo(INTEGER_MANY_VALUES_MAX);
+    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.max()).isEqualTo(LONG_MANY_VALUES_MAX);
+    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.max()).isEqualTo(LONG_MANY_VALUES_MAX);
   }
 
   public void testMin() {
@@ -440,14 +444,14 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(ONE_VALUE_STATS.min()).isWithin(ALLOWED_ERROR).of(ONE_VALUE);
+    assertThat(ONE_VALUE_STATS.min()).isEqualTo(ONE_VALUE);
     assertThat(Stats.of(POSITIVE_INFINITY).min()).isPositiveInfinity();
     assertThat(Stats.of(NEGATIVE_INFINITY).min()).isNegativeInfinity();
     assertThat(Stats.of(NaN).min()).isNaN();
-    assertThat(TWO_VALUES_STATS.min()).isWithin(ALLOWED_ERROR).of(TWO_VALUES_MIN);
-    assertThat(MANY_VALUES_STATS_VARARGS.min()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
-    assertThat(MANY_VALUES_STATS_ITERABLE.min()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
-    assertThat(MANY_VALUES_STATS_ITERATOR.min()).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
+    assertThat(TWO_VALUES_STATS.min()).isEqualTo(TWO_VALUES_MIN);
+    assertThat(MANY_VALUES_STATS_VARARGS.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(MANY_VALUES_STATS_ITERABLE.min()).isEqualTo(MANY_VALUES_MIN);
+    assertThat(MANY_VALUES_STATS_ITERATOR.min()).isEqualTo(MANY_VALUES_MIN);
     // For datasets of many double values created from an accumulator snapshot, we test many
     // combinations of finite and non-finite values:
     for (ManyValues values : ALL_MANY_VALUES) {
@@ -455,25 +459,72 @@
       accumulator.addAll(values.asIterable());
       double min = accumulator.snapshot().min();
       if (values.hasAnyNaN()) {
-        assertThat(min).named("min of " + values).isNaN();
+        assertWithMessage("min of " + values).that(min).isNaN();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(min).named("min of " + values).isNegativeInfinity();
+        assertWithMessage("min of " + values).that(min).isNegativeInfinity();
       } else {
-        assertThat(min).named("min of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MIN);
+        assertWithMessage("min of " + values).that(min).isEqualTo(MANY_VALUES_MIN);
       }
     }
-    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MIN);
-    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(INTEGER_MANY_VALUES_MIN);
-    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
-    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.min())
-        .isWithin(ALLOWED_ERROR)
-        .of(LONG_MANY_VALUES_MIN);
+    assertThat(INTEGER_MANY_VALUES_STATS_VARARGS.min()).isEqualTo(INTEGER_MANY_VALUES_MIN);
+    assertThat(INTEGER_MANY_VALUES_STATS_ITERABLE.min()).isEqualTo(INTEGER_MANY_VALUES_MIN);
+    assertThat(LONG_MANY_VALUES_STATS_ITERATOR.min()).isEqualTo(LONG_MANY_VALUES_MIN);
+    assertThat(LONG_MANY_VALUES_STATS_SNAPSHOT.min()).isEqualTo(LONG_MANY_VALUES_MIN);
+  }
+
+  public void testOfPrimitiveDoubleStream() {
+    Stats stats = Stats.of(megaPrimitiveDoubleStream());
+    assertThat(stats.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(stats.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(stats.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(stats.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(stats.max()).isEqualTo(MEGA_STREAM_MAX);
+  }
+
+  public void testOfPrimitiveIntStream() {
+    Stats stats = Stats.of(megaPrimitiveDoubleStream().mapToInt(x -> (int) x));
+    assertThat(stats.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(stats.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(stats.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(stats.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(stats.max()).isEqualTo(MEGA_STREAM_MAX);
+  }
+
+  public void testOfPrimitiveLongStream() {
+    Stats stats = Stats.of(megaPrimitiveDoubleStream().mapToLong(x -> (long) x));
+    assertThat(stats.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(stats.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(stats.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(stats.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(stats.max()).isEqualTo(MEGA_STREAM_MAX);
+  }
+
+  public void testBoxedDoubleStreamToStats() {
+    Stats stats = megaPrimitiveDoubleStream().boxed().collect(toStats());
+    assertThat(stats.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(stats.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(stats.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(stats.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(stats.max()).isEqualTo(MEGA_STREAM_MAX);
+  }
+
+  public void testBoxedBigDecimalStreamToStats() {
+    Stats stats = megaPrimitiveDoubleStream().mapToObj(BigDecimal::valueOf).collect(toStats());
+    assertThat(stats.count()).isEqualTo(MEGA_STREAM_COUNT);
+    assertThat(stats.mean()).isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT).of(MEGA_STREAM_MEAN);
+    assertThat(stats.populationVariance())
+        .isWithin(ALLOWED_ERROR * MEGA_STREAM_COUNT)
+        .of(MEGA_STREAM_POPULATION_VARIANCE);
+    assertThat(stats.min()).isEqualTo(MEGA_STREAM_MIN);
+    assertThat(stats.max()).isEqualTo(MEGA_STREAM_MAX);
   }
 
   public void testEqualsAndHashCode() {
@@ -539,28 +590,33 @@
     for (ManyValues values : ALL_MANY_VALUES) {
       double mean = Stats.meanOf(values.asArray());
       if (values.hasAnyNaN()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity() && values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNaN();
+        assertWithMessage("mean of " + values).that(mean).isNaN();
       } else if (values.hasAnyPositiveInfinity()) {
-        assertThat(mean).named("mean of " + values).isPositiveInfinity();
+        assertWithMessage("mean of " + values).that(mean).isPositiveInfinity();
       } else if (values.hasAnyNegativeInfinity()) {
-        assertThat(mean).named("mean of " + values).isNegativeInfinity();
+        assertWithMessage("mean of " + values).that(mean).isNegativeInfinity();
       } else {
-        assertThat(mean).named("mean of " + values).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
+        assertWithMessage("mean of " + values)
+            .that(mean)
+            .isWithin(ALLOWED_ERROR)
+            .of(MANY_VALUES_MEAN);
       }
     }
     assertThat(Stats.meanOf(MANY_VALUES)).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(MANY_VALUES.iterator())).isWithin(ALLOWED_ERROR).of(MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(INTEGER_MANY_VALUES))
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(Ints.toArray(INTEGER_MANY_VALUES)))
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * INTEGER_MANY_VALUES_MEAN)
         .of(INTEGER_MANY_VALUES_MEAN);
-    assertThat(Stats.meanOf(LONG_MANY_VALUES)).isWithin(ALLOWED_ERROR).of(LONG_MANY_VALUES_MEAN);
+    assertThat(Stats.meanOf(LONG_MANY_VALUES))
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
+        .of(LONG_MANY_VALUES_MEAN);
     assertThat(Stats.meanOf(Longs.toArray(LONG_MANY_VALUES)))
-        .isWithin(ALLOWED_ERROR)
+        .isWithin(ALLOWED_ERROR * LONG_MANY_VALUES_MEAN)
         .of(LONG_MANY_VALUES_MEAN);
   }
 
diff --git a/guava-tests/test/com/google/common/math/StatsTesting.java b/guava-tests/test/com/google/common/math/StatsTesting.java
index b0aa362..261cdd4 100644
--- a/guava-tests/test/com/google/common/math/StatsTesting.java
+++ b/guava-tests/test/com/google/common/math/StatsTesting.java
@@ -31,6 +31,7 @@
 import com.google.common.primitives.Ints;
 import java.math.BigInteger;
 import java.util.List;
+import java.util.stream.DoubleStream;
 
 /**
  * Inputs, expected outputs, and helper methods for tests of {@link StatsAccumulator}, {@link
@@ -211,6 +212,34 @@
           .divide(BigInteger.valueOf(16L))
           .doubleValue();
 
+  /**
+   * Returns a stream of a million primitive doubles. The stream is parallel, which should cause
+   * {@code collect} calls to run in multi-threaded mode, so testing the combiner as well as the
+   * supplier and accumulator.
+   */
+  static DoubleStream megaPrimitiveDoubleStream() {
+    return DoubleStream.iterate(0.0, x -> x + 1.0).limit(MEGA_STREAM_COUNT).parallel();
+  }
+
+  /** Returns a stream containing half the values from {@link #megaPrimitiveDoubleStream}. */
+  static DoubleStream megaPrimitiveDoubleStreamPart1() {
+    return DoubleStream.iterate(0.0, x -> x + 2.0).limit(MEGA_STREAM_COUNT / 2).parallel();
+  }
+
+  /**
+   * Returns a stream containing the values from {@link #megaPrimitiveDoubleStream} not in {@link
+   * #megaPrimitiveDoubleStreamPart1()}.
+   */
+  static DoubleStream megaPrimitiveDoubleStreamPart2() {
+    return DoubleStream.iterate(999_999.0, x -> x - 2.0).limit(MEGA_STREAM_COUNT / 2).parallel();
+  }
+
+  static final long MEGA_STREAM_COUNT = 1_000_000;
+  static final double MEGA_STREAM_MEAN = 999_999.0 / 2;
+  static final double MEGA_STREAM_POPULATION_VARIANCE = 999_999.0 * 1_000_001.0 / 12;
+  static final double MEGA_STREAM_MIN = 0.0;
+  static final double MEGA_STREAM_MAX = 999_999.0;
+
   // Stats instances:
 
   static final Stats EMPTY_STATS_VARARGS = Stats.of();
@@ -222,7 +251,7 @@
   static final Stats MANY_VALUES_STATS_VARARGS = Stats.of(1.1, -44.44, 33.33, 555.555, -2.2);
   static final Stats MANY_VALUES_STATS_ITERABLE = Stats.of(MANY_VALUES);
   static final Stats MANY_VALUES_STATS_ITERATOR = Stats.of(MANY_VALUES.iterator());
-  static final Stats MANY_VALUES_STATS_SNAPSHOT;
+  static final Stats MANY_VALUES_STATS_SNAPSHOT = buildManyValuesStatsSnapshot();
   static final Stats LARGE_VALUES_STATS = Stats.of(LARGE_VALUES);
   static final Stats OTHER_MANY_VALUES_STATS = Stats.of(OTHER_MANY_VALUES);
   static final Stats INTEGER_MANY_VALUES_STATS_VARARGS =
@@ -230,20 +259,21 @@
   static final Stats INTEGER_MANY_VALUES_STATS_ITERABLE = Stats.of(INTEGER_MANY_VALUES);
   static final Stats LARGE_INTEGER_VALUES_STATS = Stats.of(LARGE_INTEGER_VALUES);
   static final Stats LONG_MANY_VALUES_STATS_ITERATOR = Stats.of(LONG_MANY_VALUES.iterator());
-  static final Stats LONG_MANY_VALUES_STATS_SNAPSHOT;
+  static final Stats LONG_MANY_VALUES_STATS_SNAPSHOT = buildLongManyValuesStatsSnapshot();
   static final Stats LARGE_LONG_VALUES_STATS = Stats.of(LARGE_LONG_VALUES);
 
-  static {
+  private static Stats buildManyValuesStatsSnapshot() {
     StatsAccumulator accumulator = new StatsAccumulator();
     accumulator.addAll(MANY_VALUES);
-    MANY_VALUES_STATS_SNAPSHOT = accumulator.snapshot();
+    Stats stats = accumulator.snapshot();
     accumulator.add(999.999); // should do nothing to the snapshot
+    return stats;
   }
 
-  static {
+  private static Stats buildLongManyValuesStatsSnapshot() {
     StatsAccumulator accumulator = new StatsAccumulator();
     accumulator.addAll(LONG_MANY_VALUES);
-    LONG_MANY_VALUES_STATS_SNAPSHOT = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
   static final ImmutableList<Stats> ALL_STATS =
@@ -275,42 +305,43 @@
       createPairedStatsOf(ImmutableList.of(ONE_VALUE), ImmutableList.of(OTHER_ONE_VALUE));
   static final PairedStats TWO_VALUES_PAIRED_STATS =
       createPairedStatsOf(TWO_VALUES, OTHER_TWO_VALUES);
-  static final PairedStats MANY_VALUES_PAIRED_STATS;
+  static final PairedStats MANY_VALUES_PAIRED_STATS = buildManyValuesPairedStats();
   static final PairedStats DUPLICATE_MANY_VALUES_PAIRED_STATS =
       createPairedStatsOf(MANY_VALUES, OTHER_MANY_VALUES);
-  static final PairedStats HORIZONTAL_VALUES_PAIRED_STATS;
-  static final PairedStats VERTICAL_VALUES_PAIRED_STATS;
-  static final PairedStats CONSTANT_VALUES_PAIRED_STATS;
+  static final PairedStats HORIZONTAL_VALUES_PAIRED_STATS = buildHorizontalValuesPairedStats();
+  static final PairedStats VERTICAL_VALUES_PAIRED_STATS = buildVerticalValuesPairedStats();
+  static final PairedStats CONSTANT_VALUES_PAIRED_STATS = buildConstantValuesPairedStats();
 
-  static {
+  private static PairedStats buildManyValuesPairedStats() {
     PairedStatsAccumulator accumulator =
         createFilledPairedStatsAccumulator(MANY_VALUES, OTHER_MANY_VALUES);
-    MANY_VALUES_PAIRED_STATS = accumulator.snapshot();
+    PairedStats stats = accumulator.snapshot();
     accumulator.add(99.99, 9999.9999); // should do nothing to the snapshot
+    return stats;
   }
 
-  static {
+  private static PairedStats buildHorizontalValuesPairedStats() {
     PairedStatsAccumulator accumulator = new PairedStatsAccumulator();
     for (double x : MANY_VALUES) {
       accumulator.add(x, OTHER_ONE_VALUE);
     }
-    HORIZONTAL_VALUES_PAIRED_STATS = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
-  static {
+  private static PairedStats buildVerticalValuesPairedStats() {
     PairedStatsAccumulator accumulator = new PairedStatsAccumulator();
     for (double y : OTHER_MANY_VALUES) {
       accumulator.add(ONE_VALUE, y);
     }
-    VERTICAL_VALUES_PAIRED_STATS = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
-  static {
+  private static PairedStats buildConstantValuesPairedStats() {
     PairedStatsAccumulator accumulator = new PairedStatsAccumulator();
     for (int i = 0; i < MANY_VALUES_COUNT; ++i) {
       accumulator.add(ONE_VALUE, OTHER_ONE_VALUE);
     }
-    CONSTANT_VALUES_PAIRED_STATS = accumulator.snapshot();
+    return accumulator.snapshot();
   }
 
   static final ImmutableList<PairedStats> ALL_PAIRED_STATS =
@@ -387,8 +418,8 @@
         .of(x1 + xDelta);
     assertThat(transformation.slope()).isWithin(ALLOWED_ERROR).of(yDelta / xDelta);
     assertThat(transformation.inverse().slope()).isWithin(ALLOWED_ERROR).of(xDelta / yDelta);
-    assertThat(transformation.inverse()).isSameAs(transformation.inverse());
-    assertThat(transformation.inverse().inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation.inverse());
+    assertThat(transformation.inverse().inverse()).isSameInstanceAs(transformation);
   }
 
   /**
@@ -415,8 +446,8 @@
       fail("Expected IllegalStateException");
     } catch (IllegalStateException expected) {
     }
-    assertThat(transformation.inverse()).isSameAs(transformation.inverse());
-    assertThat(transformation.inverse().inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation.inverse());
+    assertThat(transformation.inverse().inverse()).isSameInstanceAs(transformation);
   }
 
   /**
@@ -443,8 +474,8 @@
     } catch (IllegalStateException expected) {
     }
     assertThat(transformation.inverse().slope()).isWithin(ALLOWED_ERROR).of(0.0);
-    assertThat(transformation.inverse()).isSameAs(transformation.inverse());
-    assertThat(transformation.inverse().inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation.inverse());
+    assertThat(transformation.inverse().inverse()).isSameInstanceAs(transformation);
   }
 
   /**
@@ -456,7 +487,7 @@
     assertThat(transformation.isVertical()).isFalse();
     assertThat(transformation.slope()).isNaN();
     assertThat(transformation.transform(0.0)).isNaN();
-    assertThat(transformation.inverse()).isSameAs(transformation);
+    assertThat(transformation.inverse()).isSameInstanceAs(transformation);
   }
 
   /**
diff --git a/guava-tests/test/com/google/common/net/HttpHeadersTest.java b/guava-tests/test/com/google/common/net/HttpHeadersTest.java
index 65e6fdb..9927e6b 100644
--- a/guava-tests/test/com/google/common/net/HttpHeadersTest.java
+++ b/guava-tests/test/com/google/common/net/HttpHeadersTest.java
@@ -36,18 +36,22 @@
   public void testConstantNameMatchesString() throws Exception {
     // Special case some of the weird HTTP Header names...
     ImmutableBiMap<String, String> specialCases =
-        ImmutableBiMap.of(
-            "ETAG",
-            "ETag",
-            "SOURCE_MAP",
-            "SourceMap",
-            "X_WEBKIT_CSP",
-            "X-WebKit-CSP",
-            "X_WEBKIT_CSP_REPORT_ONLY",
-            "X-WebKit-CSP-Report-Only");
+        ImmutableBiMap.<String, String>builder()
+            .put("CDN_LOOP", "CDN-Loop")
+            .put("ETAG", "ETag")
+            .put("SOURCE_MAP", "SourceMap")
+            .put("SEC_WEBSOCKET_ACCEPT", "Sec-WebSocket-Accept")
+            .put("SEC_WEBSOCKET_EXTENSIONS", "Sec-WebSocket-Extensions")
+            .put("SEC_WEBSOCKET_KEY", "Sec-WebSocket-Key")
+            .put("SEC_WEBSOCKET_PROTOCOL", "Sec-WebSocket-Protocol")
+            .put("SEC_WEBSOCKET_VERSION", "Sec-WebSocket-Version")
+            .put("X_WEBKIT_CSP", "X-WebKit-CSP")
+            .put("X_WEBKIT_CSP_REPORT_ONLY", "X-WebKit-CSP-Report-Only")
+            .build();
     ImmutableSet<String> uppercaseAcronyms =
         ImmutableSet.of(
-            "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "TE", "UID", "URL", "WWW", "XSS");
+            "CH", "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "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 62c7bd0..ed3aa27 100644
--- a/guava-tests/test/com/google/common/net/InetAddressesTest.java
+++ b/guava-tests/test/com/google/common/net/InetAddressesTest.java
@@ -18,7 +18,9 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.common.testing.NullPointerTester;
+import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
@@ -39,77 +41,80 @@
   }
 
   public void testForStringBogusInput() {
-    String[] bogusInputs = {
-      "",
-      "016.016.016.016",
-      "016.016.016",
-      "016.016",
-      "016",
-      "000.000.000.000",
-      "000",
-      "0x0a.0x0a.0x0a.0x0a",
-      "0x0a.0x0a.0x0a",
-      "0x0a.0x0a",
-      "0x0a",
-      "42.42.42.42.42",
-      "42.42.42",
-      "42.42",
-      "42",
-      "42..42.42",
-      "42..42.42.42",
-      "42.42.42.42.",
-      "42.42.42.42...",
-      ".42.42.42.42",
-      "...42.42.42.42",
-      "42.42.42.-0",
-      "42.42.42.+0",
-      ".",
-      "...",
-      "bogus",
-      "bogus.com",
-      "192.168.0.1.com",
-      "12345.67899.-54321.-98765",
-      "257.0.0.0",
-      "42.42.42.-42",
-      "3ffe::1.net",
-      "3ffe::1::1",
-      "1::2::3::4:5",
-      "::7:6:5:4:3:2:", // should end with ":0"
-      ":6:5:4:3:2:1::", // should begin with "0:"
-      "2001::db:::1",
-      "FEDC:9878",
-      "+1.+2.+3.4",
-      "1.2.3.4e0",
-      "::7:6:5:4:3:2:1:0", // too many parts
-      "7:6:5:4:3:2:1:0::", // too many parts
-      "9:8:7:6:5:4:3::2:1", // too many parts
-      "0:1:2:3::4:5:6:7", // :: must remove at least one 0.
-      "3ffe:0:0:0:0:0:0:0:1", // too many parts (9 instead of 8)
-      "3ffe::10000", // hextet exceeds 16 bits
-      "3ffe::goog",
-      "3ffe::-0",
-      "3ffe::+0",
-      "3ffe::-1",
-      ":",
-      ":::",
-      "::1.2.3",
-      "::1.2.3.4.5",
-      "::1.2.3.4:",
-      "1.2.3.4::",
-      "2001:db8::1:",
-      ":2001:db8::1",
-      ":1:2:3:4:5:6:7",
-      "1:2:3:4:5:6:7:",
-      ":1:2:3:4:5:6:"
-    };
+    ImmutableSet<String> bogusInputs =
+        ImmutableSet.of(
+            "",
+            "016.016.016.016",
+            "016.016.016",
+            "016.016",
+            "016",
+            "000.000.000.000",
+            "000",
+            "0x0a.0x0a.0x0a.0x0a",
+            "0x0a.0x0a.0x0a",
+            "0x0a.0x0a",
+            "0x0a",
+            "42.42.42.42.42",
+            "42.42.42",
+            "42.42",
+            "42",
+            "42..42.42",
+            "42..42.42.42",
+            "42.42.42.42.",
+            "42.42.42.42...",
+            ".42.42.42.42",
+            ".42.42.42",
+            "...42.42.42.42",
+            "42.42.42.-0",
+            "42.42.42.+0",
+            ".",
+            "...",
+            "bogus",
+            "bogus.com",
+            "192.168.0.1.com",
+            "12345.67899.-54321.-98765",
+            "257.0.0.0",
+            "42.42.42.-42",
+            "42.42.42.ab",
+            "3ffe::1.net",
+            "3ffe::1::1",
+            "1::2::3::4:5",
+            "::7:6:5:4:3:2:", // should end with ":0"
+            ":6:5:4:3:2:1::", // should begin with "0:"
+            "2001::db:::1",
+            "FEDC:9878",
+            "+1.+2.+3.4",
+            "1.2.3.4e0",
+            "6:5:4:3:2:1:0", // too few parts
+            "::7:6:5:4:3:2:1:0", // too many parts
+            "7:6:5:4:3:2:1:0::", // too many parts
+            "9:8:7:6:5:4:3::2:1", // too many parts
+            "0:1:2:3::4:5:6:7", // :: must remove at least one 0.
+            "3ffe:0:0:0:0:0:0:0:1", // too many parts (9 instead of 8)
+            "3ffe::10000", // hextet exceeds 16 bits
+            "3ffe::goog",
+            "3ffe::-0",
+            "3ffe::+0",
+            "3ffe::-1",
+            ":",
+            ":::",
+            "::1.2.3",
+            "::1.2.3.4.5",
+            "::1.2.3.4:",
+            "1.2.3.4::",
+            "2001:db8::1:",
+            ":2001:db8::1",
+            ":1:2:3:4:5:6:7",
+            "1:2:3:4:5:6:7:",
+            ":1:2:3:4:5:6:");
 
-    for (int i = 0; i < bogusInputs.length; i++) {
+    for (String bogusInput : bogusInputs) {
       try {
-        InetAddresses.forString(bogusInputs[i]);
-        fail("IllegalArgumentException expected for '" + bogusInputs[i] + "'");
+        InetAddresses.forString(bogusInput);
+        fail("IllegalArgumentException expected for '" + bogusInput + "'");
       } catch (IllegalArgumentException expected) {
       }
-      assertFalse(InetAddresses.isInetAddress(bogusInputs[i]));
+      assertFalse(InetAddresses.isInetAddress(bogusInput));
     }
   }
 
@@ -124,40 +129,35 @@
 
   public void testForStringIPv4Input() throws UnknownHostException {
     String ipStr = "192.168.0.1";
-    InetAddress ipv4Addr = null;
     // Shouldn't hit DNS, because it's an IP string literal.
-    ipv4Addr = InetAddress.getByName(ipStr);
+    InetAddress ipv4Addr = InetAddress.getByName(ipStr);
     assertEquals(ipv4Addr, InetAddresses.forString(ipStr));
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
   public void testForStringIPv6Input() throws UnknownHostException {
     String ipStr = "3ffe::1";
-    InetAddress ipv6Addr = null;
     // Shouldn't hit DNS, because it's an IP string literal.
-    ipv6Addr = InetAddress.getByName(ipStr);
+    InetAddress ipv6Addr = InetAddress.getByName(ipStr);
     assertEquals(ipv6Addr, InetAddresses.forString(ipStr));
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
   public void testForStringIPv6EightColons() throws UnknownHostException {
-    String[] eightColons = {
-      "::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::",
-    };
+    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::");
 
-    for (int i = 0; i < eightColons.length; i++) {
-      InetAddress ipv6Addr = null;
+    for (String ipString : eightColons) {
       // Shouldn't hit DNS, because it's an IP string literal.
-      ipv6Addr = InetAddress.getByName(eightColons[i]);
-      assertEquals(ipv6Addr, InetAddresses.forString(eightColons[i]));
-      assertTrue(InetAddresses.isInetAddress(eightColons[i]));
+      InetAddress ipv6Addr = InetAddress.getByName(ipString);
+      assertEquals(ipv6Addr, InetAddresses.forString(ipString));
+      assertTrue(InetAddresses.isInetAddress(ipString));
     }
   }
 
   public void testConvertDottedQuadToHex() throws UnknownHostException {
-    String[] ipStrings = {
-      "7::0.128.0.127", "7::0.128.0.128", "7::128.128.0.127", "7::0.128.128.127"
-    };
+    ImmutableSet<String> ipStrings =
+        ImmutableSet.of("7::0.128.0.127", "7::0.128.0.128", "7::128.128.0.127", "7::0.128.128.127");
 
     for (String ipString : ipStrings) {
       // Shouldn't hit DNS, because it's an IP string literal.
@@ -167,6 +167,58 @@
     }
   }
 
+  // see https://github.com/google/guava/issues/2587
+  private static final ImmutableSet<String> SCOPE_IDS =
+      ImmutableSet.of("eno1", "en1", "eth0", "X", "1", "2", "14", "20");
+
+  public void testIPv4AddressWithScopeId() {
+    ImmutableSet<String> ipStrings = ImmutableSet.of("1.2.3.4", "192.168.0.1");
+    for (String ipString : ipStrings) {
+      for (String scopeId : SCOPE_IDS) {
+        String withScopeId = ipString + "%" + scopeId;
+        assertFalse(
+            "InetAddresses.isInetAddress(" + withScopeId + ") should be false but was true",
+            InetAddresses.isInetAddress(withScopeId));
+      }
+    }
+  }
+
+  public void testDottedQuadAddressWithScopeId() {
+    ImmutableSet<String> ipStrings =
+        ImmutableSet.of("7::0.128.0.127", "7::0.128.0.128", "7::128.128.0.127", "7::0.128.128.127");
+    for (String ipString : ipStrings) {
+      for (String scopeId : SCOPE_IDS) {
+        String withScopeId = ipString + "%" + scopeId;
+        assertFalse(
+            "InetAddresses.isInetAddress(" + withScopeId + ") should be false but was true",
+            InetAddresses.isInetAddress(withScopeId));
+      }
+    }
+  }
+
+  public void testIPv6AddressWithScopeId() {
+    ImmutableSet<String> ipStrings =
+        ImmutableSet.of(
+            "0:0:0:0:0:0:0:1",
+            "fe80::a",
+            "fe80::1",
+            "fe80::2",
+            "fe80::42",
+            "fe80::3dd0:7f8e:57b7:34d5",
+            "fe80::71a3:2b00:ddd3:753f",
+            "fe80::8b2:d61e:e5c:b333",
+            "fe80::b059:65f4:e877:c40");
+    for (String ipString : ipStrings) {
+      for (String scopeId : SCOPE_IDS) {
+        String withScopeId = ipString + "%" + scopeId;
+        assertTrue(
+            "InetAddresses.isInetAddress(" + withScopeId + ") should be true but was false",
+            InetAddresses.isInetAddress(withScopeId));
+        assertEquals(InetAddresses.forString(withScopeId), InetAddresses.forString(ipString));
+      }
+    }
+  }
+
   public void testToAddrStringIPv4() {
     // Don't need to test IPv4 much; it just calls getHostAddress().
     assertEquals("1.2.3.4", InetAddresses.toAddrString(InetAddresses.forString("1.2.3.4")));
@@ -315,34 +367,30 @@
   }
 
   public void testCompatIPv4Addresses() {
-    String[] nonCompatAddresses = {
-      "3ffe::1", "::", "::1",
-    };
+    ImmutableSet<String> nonCompatAddresses = ImmutableSet.of("3ffe::1", "::", "::1");
 
-    for (int i = 0; i < nonCompatAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(nonCompatAddresses[i]);
+    for (String nonCompatAddress : nonCompatAddresses) {
+      InetAddress ip = InetAddresses.forString(nonCompatAddress);
       assertFalse(InetAddresses.isCompatIPv4Address((Inet6Address) ip));
       try {
         InetAddresses.getCompatIPv4Address((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + nonCompatAddresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + nonCompatAddress + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
 
-    String[] validCompatAddresses = {
-      "::1.2.3.4", "::102:304",
-    };
+    ImmutableSet<String> validCompatAddresses = ImmutableSet.of("::1.2.3.4", "::102:304");
     String compatStr = "1.2.3.4";
     InetAddress compat = InetAddresses.forString(compatStr);
 
-    for (int i = 0; i < validCompatAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(validCompatAddresses[i]);
-      assertTrue("checking '" + validCompatAddresses[i] + "'", ip instanceof Inet6Address);
+    for (String validCompatAddress : validCompatAddresses) {
+      InetAddress ip = InetAddresses.forString(validCompatAddress);
+      assertTrue("checking '" + validCompatAddress + "'", ip instanceof Inet6Address);
       assertTrue(
-          "checking '" + validCompatAddresses[i] + "'",
+          "checking '" + validCompatAddress + "'",
           InetAddresses.isCompatIPv4Address((Inet6Address) ip));
       assertEquals(
-          "checking '" + validCompatAddresses[i] + "'",
+          "checking '" + validCompatAddress + "'",
           compat,
           InetAddresses.getCompatIPv4Address((Inet6Address) ip));
     }
@@ -389,16 +437,14 @@
   }
 
   public void test6to4Addresses() {
-    String[] non6to4Addresses = {
-      "::1.2.3.4", "3ffe::1", "::", "::1",
-    };
+    ImmutableSet<String> non6to4Addresses = ImmutableSet.of("::1.2.3.4", "3ffe::1", "::", "::1");
 
-    for (int i = 0; i < non6to4Addresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(non6to4Addresses[i]);
+    for (String non6to4Address : non6to4Addresses) {
+      InetAddress ip = InetAddresses.forString(non6to4Address);
       assertFalse(InetAddresses.is6to4Address((Inet6Address) ip));
       try {
         InetAddresses.get6to4IPv4Address((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + non6to4Addresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + non6to4Address + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
@@ -413,16 +459,14 @@
   }
 
   public void testTeredoAddresses() {
-    String[] nonTeredoAddresses = {
-      "::1.2.3.4", "3ffe::1", "::", "::1",
-    };
+    ImmutableSet<String> nonTeredoAddresses = ImmutableSet.of("::1.2.3.4", "3ffe::1", "::", "::1");
 
-    for (int i = 0; i < nonTeredoAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(nonTeredoAddresses[i]);
+    for (String nonTeredoAddress : nonTeredoAddresses) {
+      InetAddress ip = InetAddresses.forString(nonTeredoAddress);
       assertFalse(InetAddresses.isTeredoAddress((Inet6Address) ip));
       try {
         InetAddresses.getTeredoInfo((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + nonTeredoAddresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + nonTeredoAddress + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
@@ -457,37 +501,39 @@
 
   public void testIsatapAddresses() {
     InetAddress ipv4 = InetAddresses.forString("1.2.3.4");
-    String[] validIsatapAddresses = {
-      "2001:db8::5efe:102:304",
-      "2001:db8::100:5efe:102:304", // Private Multicast? Not likely.
-      "2001:db8::200:5efe:102:304",
-      "2001:db8::300:5efe:102:304" // Public Multicast? Also unlikely.
-    };
-    String[] nonIsatapAddresses = {
-      "::1.2.3.4",
-      "3ffe::1",
-      "::",
-      "::1",
-      "2001:db8::0040:5efe:102:304",
-      "2001:db8::5ffe:102:304",
-      "2001:db8::5eff:102:304",
-      "2001:0:102:203:200:5efe:506:708", // Teredo address; not ISATAP
-    };
+    ImmutableSet<String> validIsatapAddresses =
+        ImmutableSet.of(
+            "2001:db8::5efe:102:304",
+            "2001:db8::100:5efe:102:304", // Private Multicast? Not likely.
+            "2001:db8::200:5efe:102:304",
+            "2001:db8::300:5efe:102:304" // Public Multicast? Also unlikely.
+            );
+    ImmutableSet<String> nonIsatapAddresses =
+        ImmutableSet.of(
+            "::1.2.3.4",
+            "3ffe::1",
+            "::",
+            "::1",
+            "2001:db8::0040:5efe:102:304",
+            "2001:db8::5ffe:102:304",
+            "2001:db8::5eff:102:304",
+            "2001:0:102:203:200:5efe:506:708" // Teredo address; not ISATAP
+            );
 
-    for (int i = 0; i < validIsatapAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(validIsatapAddresses[i]);
+    for (String validIsatapAddress : validIsatapAddresses) {
+      InetAddress ip = InetAddresses.forString(validIsatapAddress);
       assertTrue(InetAddresses.isIsatapAddress((Inet6Address) ip));
       assertEquals(
-          "checking '" + validIsatapAddresses[i] + "'",
+          "checking '" + validIsatapAddress + "'",
           ipv4,
           InetAddresses.getIsatapIPv4Address((Inet6Address) ip));
     }
-    for (int i = 0; i < nonIsatapAddresses.length; i++) {
-      InetAddress ip = InetAddresses.forString(nonIsatapAddresses[i]);
+    for (String nonIsatapAddress : nonIsatapAddresses) {
+      InetAddress ip = InetAddresses.forString(nonIsatapAddress);
       assertFalse(InetAddresses.isIsatapAddress((Inet6Address) ip));
       try {
         InetAddresses.getIsatapIPv4Address((Inet6Address) ip);
-        fail("IllegalArgumentException expected for '" + nonIsatapAddresses[i] + "'");
+        fail("IllegalArgumentException expected for '" + nonIsatapAddress + "'");
       } catch (IllegalArgumentException expected) {
       }
     }
@@ -525,75 +571,77 @@
 
   public void testGetCoercedIPv4Address() {
     // Check that a coerced IPv4 address is unaltered.
-    InetAddress localHost4 = InetAddresses.forString("127.0.0.1");
-    assertEquals(localHost4, InetAddresses.getCoercedIPv4Address(localHost4));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("127.0.0.1")))
+        .isEqualTo(InetAddresses.forString("127.0.0.1"));
 
     // ::1 special case
-    assertEquals(localHost4, InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1")))
+        .isEqualTo(InetAddresses.forString("127.0.0.1"));
 
     // :: special case
-    assertEquals(
-        InetAddresses.forString("0.0.0.0"),
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::")))
+        .isEqualTo(InetAddresses.forString("0.0.0.0"));
 
     // test compat address (should be hashed)
-    assertTrue(
-        InetAddresses.forString("1.2.3.4")
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1.2.3.4")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("::1.2.3.4")))
+        .isNotEqualTo(InetAddresses.forString("1.2.3.4"));
 
     // test 6to4 address (should be hashed)
-    assertTrue(
-        InetAddresses.forString("1.2.3.4")
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")))
+        .isNotEqualTo(InetAddresses.forString("1.2.3.4"));
 
     // 2 6to4 addresses differing in the embedded IPv4 address should
     // hash to the different values.
-    assertTrue(
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1"))
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0506:0708::1")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")))
+        .isNotEqualTo(
+            InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0506:0708::1")));
 
     // 2 6to4 addresses NOT differing in the embedded IPv4 address should
     // hash to the same value.
-    assertTrue(
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1"))
-            != InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::2")));
+    assertThat(InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::1")))
+        .isEqualTo(
+            InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2002:0102:0304::2")));
 
     // test Teredo address (should be hashed)
-    assertTrue(
-        InetAddresses.forString("192.0.2.45")
-            != InetAddresses.getCoercedIPv4Address(
-                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")));
+    assertThat(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")))
+        .isNotEqualTo(InetAddresses.forString("192.0.2.45"));
 
-    // 2 Teredo addresses differing in the embedded IPv4 address should
-    // hash to the different values.
-    assertTrue(
-        InetAddresses.getCoercedIPv4Address(
-                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2"))
-            != InetAddresses.getCoercedIPv4Address(
-                InetAddresses.forString("2001:0000:4136:e379:8000:63bf:3fff:fdd2")));
+    // 2 Teredo addresses differing in their embedded IPv4 addresses should hash to different
+    // values.
+    assertThat(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")))
+        .isNotEqualTo(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd3")));
 
-    // 2 Teredo addresses NOT differing in the embedded IPv4 address should
-    // hash to the same value.
-    assertEquals(
-        InetAddresses.getCoercedIPv4Address(
-            InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")),
-        InetAddresses.getCoercedIPv4Address(
-            InetAddresses.forString("2001:0000:4136:e378:9000:63bf:3fff:fdd2")));
+    // 2 Teredo addresses NOT differing in the their embedded IPv4 addresses should hash to the same
+    // value.
+    assertThat(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:4136:e378:8000:63bf:3fff:fdd2")))
+        .isEqualTo(
+            InetAddresses.getCoercedIPv4Address(
+                InetAddresses.forString("2001:0000:5136:f378:9000:73bf:3fff:fdd2")));
 
     // Test that an address hashes in to the 224.0.0.0/3 number-space.
-    InetAddress coerced =
-        InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2001:4860::1"));
-    assertTrue(0xe0000000 <= InetAddresses.coerceToInteger(coerced));
-    assertTrue(InetAddresses.coerceToInteger(coerced) <= 0xfffffffe);
+    int coercedInt =
+        InetAddresses.coerceToInteger(
+            InetAddresses.getCoercedIPv4Address(InetAddresses.forString("2001:4860::1")));
+    assertThat(coercedInt).isAtLeast(0xe0000000);
+    assertThat(coercedInt).isAtMost(0xfffffffe);
   }
 
-  public void testToInteger() {
-    InetAddress ipv4Addr = InetAddresses.forString("127.0.0.1");
-    assertEquals(0x7f000001, InetAddresses.coerceToInteger(ipv4Addr));
+  public void testCoerceToInteger() {
+    assertThat(InetAddresses.coerceToInteger(InetAddresses.forString("127.0.0.1")))
+        .isEqualTo(0x7f000001);
   }
 
   public void testFromInteger() {
-    assertEquals(InetAddresses.fromInteger(0x7f000001), InetAddresses.forString("127.0.0.1"));
+    assertThat(InetAddresses.fromInteger(0x7f000001))
+        .isEqualTo(InetAddresses.forString("127.0.0.1"));
   }
 
   public void testFromLittleEndianByteArray() throws UnknownHostException {
@@ -722,4 +770,80 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  public void testFromIpv4BigIntegerThrowsLessThanZero() {
+    try {
+      InetAddresses.fromIPv4BigInteger(BigInteger.valueOf(-1L));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals("BigInteger must be greater than or equal to 0", expected.getMessage());
+    }
+  }
+
+  public void testFromIpv6BigIntegerThrowsLessThanZero() {
+    try {
+      InetAddresses.fromIPv6BigInteger(BigInteger.valueOf(-1L));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals("BigInteger must be greater than or equal to 0", expected.getMessage());
+    }
+  }
+
+  public void testFromIpv4BigIntegerValid() {
+    checkBigIntegerConversion("0.0.0.0", BigInteger.ZERO);
+    checkBigIntegerConversion("0.0.0.1", BigInteger.ONE);
+    checkBigIntegerConversion("127.255.255.255", BigInteger.valueOf(Integer.MAX_VALUE));
+    checkBigIntegerConversion(
+        "255.255.255.254", BigInteger.valueOf(Integer.MAX_VALUE).multiply(BigInteger.valueOf(2)));
+    checkBigIntegerConversion(
+        "255.255.255.255", BigInteger.ONE.shiftLeft(32).subtract(BigInteger.ONE));
+  }
+
+  public void testFromIpv6BigIntegerValid() {
+    checkBigIntegerConversion("::", BigInteger.ZERO);
+    checkBigIntegerConversion("::1", BigInteger.ONE);
+    checkBigIntegerConversion("::7fff:ffff", BigInteger.valueOf(Integer.MAX_VALUE));
+    checkBigIntegerConversion("::7fff:ffff:ffff:ffff", BigInteger.valueOf(Long.MAX_VALUE));
+    checkBigIntegerConversion(
+        "::ffff:ffff:ffff:ffff", BigInteger.ONE.shiftLeft(64).subtract(BigInteger.ONE));
+    checkBigIntegerConversion(
+        "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
+        BigInteger.ONE.shiftLeft(128).subtract(BigInteger.ONE));
+  }
+
+  public void testFromIpv4BigIntegerInputTooLarge() {
+    try {
+      InetAddresses.fromIPv4BigInteger(BigInteger.ONE.shiftLeft(32).add(BigInteger.ONE));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals(
+          "BigInteger cannot be converted to InetAddress because it has more than 4 bytes:"
+              + " 4294967297",
+          expected.getMessage());
+    }
+  }
+
+  public void testFromIpv6BigIntegerInputTooLarge() {
+    try {
+      InetAddresses.fromIPv6BigInteger(BigInteger.ONE.shiftLeft(128).add(BigInteger.ONE));
+      fail();
+    } catch (IllegalArgumentException expected) {
+      assertEquals(
+          "BigInteger cannot be converted to InetAddress because it has more than 16 bytes:"
+              + " 340282366920938463463374607431768211457",
+          expected.getMessage());
+    }
+  }
+
+  /** Checks that the IP converts to the big integer and the big integer converts to the IP. */
+  private static void checkBigIntegerConversion(String ip, BigInteger bigIntegerIp) {
+    InetAddress address = InetAddresses.forString(ip);
+    boolean isIpv6 = address instanceof Inet6Address;
+    assertEquals(bigIntegerIp, InetAddresses.toBigInteger(address));
+    assertEquals(
+        address,
+        isIpv6
+            ? InetAddresses.fromIPv6BigInteger(bigIntegerIp)
+            : InetAddresses.fromIPv4BigInteger(bigIntegerIp));
+  }
 }
diff --git a/guava-tests/test/com/google/common/net/InternetDomainNameTest.java b/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
index 126076e..09602b7 100644
--- a/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
+++ b/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
@@ -63,6 +63,8 @@
           "f_a",
           "foo.net.us\uFF61ocm",
           "woo.com.",
+          "8server.shop",
+          "123.cn",
           "a" + DELTA + "b.com",
           ALMOST_TOO_MANY_LEVELS,
           ALMOST_TOO_LONG);
diff --git a/guava-tests/test/com/google/common/net/MediaTypeTest.java b/guava-tests/test/com/google/common/net/MediaTypeTest.java
index 7dfa9b8..cec3cdd 100644
--- a/guava-tests/test/com/google/common/net/MediaTypeTest.java
+++ b/guava-tests/test/com/google/common/net/MediaTypeTest.java
@@ -148,6 +148,38 @@
     }
   }
 
+  public void testCreate_nonAsciiType() {
+    try {
+      MediaType.create("…", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testCreate_nonAsciiSubtype() {
+    try {
+      MediaType.create("a", "…");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testCreate_emptyType() {
+    try {
+      MediaType.create("", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testCreate_emptySubtype() {
+    try {
+      MediaType.create("a", "");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testCreateApplicationType() {
     MediaType newType = MediaType.createApplicationType("yams");
     assertEquals("application", newType.type());
@@ -160,6 +192,12 @@
     assertEquals("yams", newType.subtype());
   }
 
+  public void testCreateFontType() {
+    MediaType newType = MediaType.createFontType("yams");
+    assertEquals("font", newType.type());
+    assertEquals("yams", newType.subtype());
+  }
+
   public void testCreateImageType() {
     MediaType newType = MediaType.createImageType("yams");
     assertEquals("image", newType.type());
@@ -225,6 +263,26 @@
     }
   }
 
+  public void testWithParameters_nonAsciiParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    ImmutableListMultimap<String, String> parameters = ImmutableListMultimap.of("…", "a");
+    try {
+      mediaType.withParameters(parameters);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParameters_nonAsciiParameterValue() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    ImmutableListMultimap<String, String> parameters = ImmutableListMultimap.of("a", "…");
+    try {
+      mediaType.withParameters(parameters);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testWithParameter() {
     assertEquals(
         MediaType.parse("text/plain; a=1"), MediaType.parse("text/plain").withParameter("a", "1"));
@@ -248,6 +306,33 @@
     }
   }
 
+  public void testWithParameter_nonAsciiParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameter("…", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParameter_nonAsciiParameterValue() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameter("a", "…");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParameter_emptyParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameter("", "a");
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testWithParametersIterable() {
     assertEquals(
         MediaType.parse("text/plain"),
@@ -275,6 +360,24 @@
     }
   }
 
+  public void testWithParametersIterable_nonAsciiParameter() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameters("…", ImmutableSet.of("a"));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  public void testWithParametersIterable_nonAsciiParameterValue() {
+    MediaType mediaType = MediaType.parse("text/plain");
+    try {
+      mediaType.withParameters("a", ImmutableSet.of("…"));
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
   public void testWithParametersIterable_nullValue() {
     MediaType mediaType = MediaType.parse("text/plain");
     try {
@@ -507,10 +610,13 @@
   public void testToString() {
     assertEquals("text/plain", MediaType.create("text", "plain").toString());
     assertEquals(
-        "text/plain; something=\"cr@zy\"; something-else=\"crazy with spaces\"",
+        "text/plain; something=\"cr@zy\"; something-else=\"crazy with spaces\";"
+            + " and-another-thing=\"\"; normal-thing=foo",
         MediaType.create("text", "plain")
             .withParameter("something", "cr@zy")
             .withParameter("something-else", "crazy with spaces")
+            .withParameter("and-another-thing", "")
+            .withParameter("normal-thing", "foo")
             .toString());
   }
 }
diff --git a/guava-tests/test/com/google/common/primitives/DoublesTest.java b/guava-tests/test/com/google/common/primitives/DoublesTest.java
index 293fdb1..871b84c 100644
--- a/guava-tests/test/com/google/common/primitives/DoublesTest.java
+++ b/guava-tests/test/com/google/common/primitives/DoublesTest.java
@@ -194,6 +194,7 @@
     assertEquals(-1, Doubles.lastIndexOf(new double[] {NaN, 5.0}, NaN));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Doubles.max();
@@ -216,6 +217,7 @@
     assertTrue(Double.isNaN(Doubles.max(VALUES)));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Doubles.min();
diff --git a/guava-tests/test/com/google/common/primitives/FloatsTest.java b/guava-tests/test/com/google/common/primitives/FloatsTest.java
index 7eb0c5b..fd59ad4 100644
--- a/guava-tests/test/com/google/common/primitives/FloatsTest.java
+++ b/guava-tests/test/com/google/common/primitives/FloatsTest.java
@@ -186,6 +186,7 @@
     assertEquals(-1, Floats.lastIndexOf(new float[] {NaN, 5f}, NaN));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Floats.max();
@@ -207,6 +208,7 @@
     assertTrue(Float.isNaN(Floats.max(VALUES)));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Floats.min();
diff --git a/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java b/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java
index 1ed74f3..82bc49f 100644
--- a/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java
+++ b/guava-tests/test/com/google/common/primitives/ImmutableDoubleArrayTest.java
@@ -91,7 +91,8 @@
      * We don't guarantee the same-as property, so we aren't obligated to test it. However, it's
      * useful in testing - when two things are the same then one can't have bugs the other doesn't.
      */
-    assertThat(ImmutableDoubleArray.copyOf(new double[0])).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(new double[0]))
+        .isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_array_nonempty() {
@@ -103,7 +104,7 @@
 
   public void testCopyOf_iterable_notCollection_empty() {
     Iterable<Double> iterable = iterable(Collections.<Double>emptySet());
-    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_iterable_notCollection_nonempty() {
@@ -115,7 +116,7 @@
 
   public void testCopyOf_iterable_collection_empty() {
     Iterable<Double> iterable = Collections.emptySet();
-    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_iterable_collection_nonempty() {
@@ -127,7 +128,7 @@
 
   public void testCopyOf_collection_empty() {
     Collection<Double> iterable = Collections.emptySet();
-    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(ImmutableDoubleArray.copyOf(iterable)).isSameInstanceAs(ImmutableDoubleArray.of());
   }
 
   public void testCopyOf_collection_nonempty() {
@@ -139,7 +140,7 @@
 
   public void testCopyOf_stream() {
     assertThat(ImmutableDoubleArray.copyOf(DoubleStream.empty()))
-        .isSameAs(ImmutableDoubleArray.of());
+        .isSameInstanceAs(ImmutableDoubleArray.of());
     assertThat(ImmutableDoubleArray.copyOf(DoubleStream.of(0, 1, 3)).asList())
         .containsExactly(0.0, 1.0, 3.0)
         .inOrder();
@@ -367,9 +368,9 @@
     ImmutableDoubleArray iia1 = ImmutableDoubleArray.of(5);
     ImmutableDoubleArray iia3 = ImmutableDoubleArray.of(5, 25, 125);
 
-    assertThat(iia0.subArray(0, 0)).isSameAs(ImmutableDoubleArray.of());
-    assertThat(iia1.subArray(0, 0)).isSameAs(ImmutableDoubleArray.of());
-    assertThat(iia1.subArray(1, 1)).isSameAs(ImmutableDoubleArray.of());
+    assertThat(iia0.subArray(0, 0)).isSameInstanceAs(ImmutableDoubleArray.of());
+    assertThat(iia1.subArray(0, 0)).isSameInstanceAs(ImmutableDoubleArray.of());
+    assertThat(iia1.subArray(1, 1)).isSameInstanceAs(ImmutableDoubleArray.of());
     assertThat(iia1.subArray(0, 1).asList()).containsExactly(5.0);
     assertThat(iia3.subArray(0, 2).asList()).containsExactly(5.0, 25.0).inOrder();
     assertThat(iia3.subArray(1, 3).asList()).containsExactly(25.0, 125.0).inOrder();
@@ -436,9 +437,9 @@
 
   @GwtIncompatible // SerializableTester
   public void testSerialization() {
-    assertThat(reserialize(ImmutableDoubleArray.of())).isSameAs(ImmutableDoubleArray.of());
+    assertThat(reserialize(ImmutableDoubleArray.of())).isSameInstanceAs(ImmutableDoubleArray.of());
     assertThat(reserialize(ImmutableDoubleArray.of(0, 1).subArray(1, 1)))
-        .isSameAs(ImmutableDoubleArray.of());
+        .isSameInstanceAs(ImmutableDoubleArray.of());
 
     ImmutableDoubleArray iia = ImmutableDoubleArray.of(0, 1, 3, 6).subArray(1, 3);
     ImmutableDoubleArray iia2 = reserialize(iia);
@@ -448,14 +449,14 @@
 
   private static void assertActuallyTrims(ImmutableDoubleArray iia) {
     ImmutableDoubleArray trimmed = iia.trimmed();
-    assertThat(trimmed).isNotSameAs(iia);
+    assertThat(trimmed).isNotSameInstanceAs(iia);
 
     // Yes, this is apparently how you check array equality in Truth
     assertThat(trimmed.toArray()).isEqualTo(iia.toArray());
   }
 
   private static void assertDoesntActuallyTrim(ImmutableDoubleArray iia) {
-    assertThat(iia.trimmed()).isSameAs(iia);
+    assertThat(iia.trimmed()).isSameInstanceAs(iia);
   }
 
   @GwtIncompatible // suite
diff --git a/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java b/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java
index c902b2c..6a9eead 100644
--- a/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java
+++ b/guava-tests/test/com/google/common/primitives/ImmutableIntArrayTest.java
@@ -89,7 +89,7 @@
      * We don't guarantee the same-as property, so we aren't obligated to test it. However, it's
      * useful in testing - when two things are the same then one can't have bugs the other doesn't.
      */
-    assertThat(ImmutableIntArray.copyOf(new int[0])).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(new int[0])).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_array_nonempty() {
@@ -101,7 +101,7 @@
 
   public void testCopyOf_iterable_notCollection_empty() {
     Iterable<Integer> iterable = iterable(Collections.<Integer>emptySet());
-    assertThat(ImmutableIntArray.copyOf(iterable)).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(iterable)).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_iterable_notCollection_nonempty() {
@@ -113,7 +113,7 @@
 
   public void testCopyOf_iterable_collection_empty() {
     Iterable<Integer> iterable = Collections.emptySet();
-    assertThat(ImmutableIntArray.copyOf(iterable)).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(iterable)).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_iterable_collection_nonempty() {
@@ -125,7 +125,7 @@
 
   public void testCopyOf_collection_empty() {
     Collection<Integer> iterable = Collections.emptySet();
-    assertThat(ImmutableIntArray.copyOf(iterable)).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(iterable)).isSameInstanceAs(ImmutableIntArray.of());
   }
 
   public void testCopyOf_collection_nonempty() {
@@ -136,7 +136,8 @@
   }
 
   public void testCopyOf_stream() {
-    assertThat(ImmutableIntArray.copyOf(IntStream.empty())).isSameAs(ImmutableIntArray.of());
+    assertThat(ImmutableIntArray.copyOf(IntStream.empty()))
+        .isSameInstanceAs(ImmutableIntArray.of());
     assertThat(ImmutableIntArray.copyOf(IntStream.of(0, 1, 3)).asList())
         .containsExactly(0, 1, 3)
         .inOrder();
@@ -352,9 +353,9 @@
     ImmutableIntArray iia1 = ImmutableIntArray.of(5);
     ImmutableIntArray iia3 = ImmutableIntArray.of(5, 25, 125);
 
-    assertThat(iia0.subArray(0, 0)).isSameAs(ImmutableIntArray.of());
-    assertThat(iia1.subArray(0, 0)).isSameAs(ImmutableIntArray.of());
-    assertThat(iia1.subArray(1, 1)).isSameAs(ImmutableIntArray.of());
+    assertThat(iia0.subArray(0, 0)).isSameInstanceAs(ImmutableIntArray.of());
+    assertThat(iia1.subArray(0, 0)).isSameInstanceAs(ImmutableIntArray.of());
+    assertThat(iia1.subArray(1, 1)).isSameInstanceAs(ImmutableIntArray.of());
     assertThat(iia1.subArray(0, 1).asList()).containsExactly(5);
     assertThat(iia3.subArray(0, 2).asList()).containsExactly(5, 25).inOrder();
     assertThat(iia3.subArray(1, 3).asList()).containsExactly(25, 125).inOrder();
@@ -421,9 +422,9 @@
 
   @GwtIncompatible // SerializableTester
   public void testSerialization() {
-    assertThat(reserialize(ImmutableIntArray.of())).isSameAs(ImmutableIntArray.of());
+    assertThat(reserialize(ImmutableIntArray.of())).isSameInstanceAs(ImmutableIntArray.of());
     assertThat(reserialize(ImmutableIntArray.of(0, 1).subArray(1, 1)))
-        .isSameAs(ImmutableIntArray.of());
+        .isSameInstanceAs(ImmutableIntArray.of());
 
     ImmutableIntArray iia = ImmutableIntArray.of(0, 1, 3, 6).subArray(1, 3);
     ImmutableIntArray iia2 = reserialize(iia);
@@ -433,14 +434,14 @@
 
   private static void assertActuallyTrims(ImmutableIntArray iia) {
     ImmutableIntArray trimmed = iia.trimmed();
-    assertThat(trimmed).isNotSameAs(iia);
+    assertThat(trimmed).isNotSameInstanceAs(iia);
 
     // Yes, this is apparently how you check array equality in Truth
     assertThat(trimmed.toArray()).isEqualTo(iia.toArray());
   }
 
   private static void assertDoesntActuallyTrim(ImmutableIntArray iia) {
-    assertThat(iia.trimmed()).isSameAs(iia);
+    assertThat(iia.trimmed()).isSameInstanceAs(iia);
   }
 
   @GwtIncompatible // suite
diff --git a/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java b/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java
index e5c6157..e4621fc 100644
--- a/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java
+++ b/guava-tests/test/com/google/common/primitives/ImmutableLongArrayTest.java
@@ -91,7 +91,7 @@
      * We don't guarantee the same-as property, so we aren't obligated to test it. However, it's
      * useful in testing - when two things are the same then one can't have bugs the other doesn't.
      */
-    assertThat(ImmutableLongArray.copyOf(new long[0])).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(new long[0])).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_array_nonempty() {
@@ -103,7 +103,7 @@
 
   public void testCopyOf_iterable_notCollection_empty() {
     Iterable<Long> iterable = iterable(Collections.<Long>emptySet());
-    assertThat(ImmutableLongArray.copyOf(iterable)).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(iterable)).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_iterable_notCollection_nonempty() {
@@ -115,7 +115,7 @@
 
   public void testCopyOf_iterable_collection_empty() {
     Iterable<Long> iterable = Collections.emptySet();
-    assertThat(ImmutableLongArray.copyOf(iterable)).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(iterable)).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_iterable_collection_nonempty() {
@@ -127,7 +127,7 @@
 
   public void testCopyOf_collection_empty() {
     Collection<Long> iterable = Collections.emptySet();
-    assertThat(ImmutableLongArray.copyOf(iterable)).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(iterable)).isSameInstanceAs(ImmutableLongArray.of());
   }
 
   public void testCopyOf_collection_nonempty() {
@@ -138,7 +138,8 @@
   }
 
   public void testCopyOf_stream() {
-    assertThat(ImmutableLongArray.copyOf(LongStream.empty())).isSameAs(ImmutableLongArray.of());
+    assertThat(ImmutableLongArray.copyOf(LongStream.empty()))
+        .isSameInstanceAs(ImmutableLongArray.of());
     assertThat(ImmutableLongArray.copyOf(LongStream.of(0, 1, 3)).asList())
         .containsExactly(0L, 1L, 3L)
         .inOrder();
@@ -355,9 +356,9 @@
     ImmutableLongArray iia1 = ImmutableLongArray.of(5);
     ImmutableLongArray iia3 = ImmutableLongArray.of(5, 25, 125);
 
-    assertThat(iia0.subArray(0, 0)).isSameAs(ImmutableLongArray.of());
-    assertThat(iia1.subArray(0, 0)).isSameAs(ImmutableLongArray.of());
-    assertThat(iia1.subArray(1, 1)).isSameAs(ImmutableLongArray.of());
+    assertThat(iia0.subArray(0, 0)).isSameInstanceAs(ImmutableLongArray.of());
+    assertThat(iia1.subArray(0, 0)).isSameInstanceAs(ImmutableLongArray.of());
+    assertThat(iia1.subArray(1, 1)).isSameInstanceAs(ImmutableLongArray.of());
     assertThat(iia1.subArray(0, 1).asList()).containsExactly(5L);
     assertThat(iia3.subArray(0, 2).asList()).containsExactly(5L, 25L).inOrder();
     assertThat(iia3.subArray(1, 3).asList()).containsExactly(25L, 125L).inOrder();
@@ -424,9 +425,9 @@
 
   @GwtIncompatible // SerializableTester
   public void testSerialization() {
-    assertThat(reserialize(ImmutableLongArray.of())).isSameAs(ImmutableLongArray.of());
+    assertThat(reserialize(ImmutableLongArray.of())).isSameInstanceAs(ImmutableLongArray.of());
     assertThat(reserialize(ImmutableLongArray.of(0, 1).subArray(1, 1)))
-        .isSameAs(ImmutableLongArray.of());
+        .isSameInstanceAs(ImmutableLongArray.of());
 
     ImmutableLongArray iia = ImmutableLongArray.of(0, 1, 3, 6).subArray(1, 3);
     ImmutableLongArray iia2 = reserialize(iia);
@@ -436,14 +437,14 @@
 
   private static void assertActuallyTrims(ImmutableLongArray iia) {
     ImmutableLongArray trimmed = iia.trimmed();
-    assertThat(trimmed).isNotSameAs(iia);
+    assertThat(trimmed).isNotSameInstanceAs(iia);
 
     // Yes, this is apparently how you check array equality in Truth
     assertThat(trimmed.toArray()).isEqualTo(iia.toArray());
   }
 
   private static void assertDoesntActuallyTrim(ImmutableLongArray iia) {
-    assertThat(iia.trimmed()).isSameAs(iia);
+    assertThat(iia.trimmed()).isSameInstanceAs(iia);
   }
 
   @GwtIncompatible // suite
diff --git a/guava-tests/test/com/google/common/primitives/IntsTest.java b/guava-tests/test/com/google/common/primitives/IntsTest.java
index 4487897..7215422 100644
--- a/guava-tests/test/com/google/common/primitives/IntsTest.java
+++ b/guava-tests/test/com/google/common/primitives/IntsTest.java
@@ -155,6 +155,7 @@
     assertEquals(3, Ints.lastIndexOf(new int[] {(int) 2, (int) 3, (int) 2, (int) 3}, (int) 3));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Ints.max();
@@ -169,6 +170,7 @@
     assertEquals((int) 9, Ints.max((int) 8, (int) 6, (int) 7, (int) 5, (int) 3, (int) 0, (int) 9));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Ints.min();
diff --git a/guava-tests/test/com/google/common/primitives/ShortsTest.java b/guava-tests/test/com/google/common/primitives/ShortsTest.java
index bc4d951..0816c69 100644
--- a/guava-tests/test/com/google/common/primitives/ShortsTest.java
+++ b/guava-tests/test/com/google/common/primitives/ShortsTest.java
@@ -175,6 +175,7 @@
         3, Shorts.lastIndexOf(new short[] {(short) 2, (short) 3, (short) 2, (short) 3}, (short) 3));
   }
 
+  @GwtIncompatible
   public void testMax_noArgs() {
     try {
       Shorts.max();
@@ -191,6 +192,7 @@
         Shorts.max((short) 8, (short) 6, (short) 7, (short) 5, (short) 3, (short) 0, (short) 9));
   }
 
+  @GwtIncompatible
   public void testMin_noArgs() {
     try {
       Shorts.min();
diff --git a/guava-tests/test/com/google/common/reflect/ClassPathTest.java b/guava-tests/test/com/google/common/reflect/ClassPathTest.java
index 67e0c8f..1d21002 100644
--- a/guava-tests/test/com/google/common/reflect/ClassPathTest.java
+++ b/guava-tests/test/com/google/common/reflect/ClassPathTest.java
@@ -44,17 +44,14 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
-import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.Permission;
 import java.security.PermissionCollection;
-import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
@@ -66,15 +63,16 @@
 /** Functional tests of {@link ClassPath}. */
 public class ClassPathTest extends TestCase {
   private static final Logger log = Logger.getLogger(ClassPathTest.class.getName());
+  private static final File FILE = new File(".");
 
   public void testEquals() {
     new EqualsTester()
         .addEqualityGroup(classInfo(ClassPathTest.class), classInfo(ClassPathTest.class))
         .addEqualityGroup(classInfo(Test.class), classInfo(Test.class, getClass().getClassLoader()))
         .addEqualityGroup(
-            new ResourceInfo("a/b/c.txt", getClass().getClassLoader()),
-            new ResourceInfo("a/b/c.txt", getClass().getClassLoader()))
-        .addEqualityGroup(new ResourceInfo("x.txt", getClass().getClassLoader()))
+            new ResourceInfo(FILE, "a/b/c.txt", getClass().getClassLoader()),
+            new ResourceInfo(FILE, "a/b/c.txt", getClass().getClassLoader()))
+        .addEqualityGroup(new ResourceInfo(FILE, "x.txt", getClass().getClassLoader()))
         .testEquals();
   }
 
@@ -228,10 +226,10 @@
 
       assertEquals(
           ImmutableSet.of(
-              new ResourceInfo("left/some.txt", loader),
-              new ResourceInfo("left/sibling/another.txt", loader),
-              new ResourceInfo("right/another.txt", loader),
-              new ResourceInfo("right/sibling/some.txt", loader)),
+              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());
     } finally {
       deleteRecursivelyOrLog(root);
@@ -255,7 +253,8 @@
       ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
       scanner.scan(root.toFile(), loader);
 
-      assertEquals(ImmutableSet.of(new ResourceInfo("some.txt", loader)), scanner.getResources());
+      assertEquals(
+          ImmutableSet.of(new ResourceInfo(FILE, "some.txt", loader)), scanner.getResources());
     } finally {
       deleteRecursivelyOrLog(root);
     }
@@ -405,19 +404,20 @@
 
   public void testGetSimpleName() {
     ClassLoader classLoader = getClass().getClassLoader();
-    assertEquals("Foo", new ClassInfo("Foo.class", classLoader).getSimpleName());
-    assertEquals("Foo", new ClassInfo("a/b/Foo.class", classLoader).getSimpleName());
-    assertEquals("Foo", new ClassInfo("a/b/Bar$Foo.class", classLoader).getSimpleName());
-    assertEquals("", new ClassInfo("a/b/Bar$1.class", classLoader).getSimpleName());
-    assertEquals("Foo", new ClassInfo("a/b/Bar$Foo.class", classLoader).getSimpleName());
-    assertEquals("", new ClassInfo("a/b/Bar$1.class", classLoader).getSimpleName());
-    assertEquals("Local", new ClassInfo("a/b/Bar$1Local.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "Foo.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "a/b/Foo.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "a/b/Bar$Foo.class", classLoader).getSimpleName());
+    assertEquals("", new ClassInfo(FILE, "a/b/Bar$1.class", classLoader).getSimpleName());
+    assertEquals("Foo", new ClassInfo(FILE, "a/b/Bar$Foo.class", classLoader).getSimpleName());
+    assertEquals("", new ClassInfo(FILE, "a/b/Bar$1.class", classLoader).getSimpleName());
+    assertEquals("Local", new ClassInfo(FILE, "a/b/Bar$1Local.class", classLoader).getSimpleName());
   }
 
   public void testGetPackageName() {
-    assertEquals("", new ClassInfo("Foo.class", getClass().getClassLoader()).getPackageName());
     assertEquals(
-        "a.b", new ClassInfo("a/b/Foo.class", getClass().getClassLoader()).getPackageName());
+        "", new ClassInfo(FILE, "Foo.class", getClass().getClassLoader()).getPackageName());
+    assertEquals(
+        "a.b", new ClassInfo(FILE, "a/b/Foo.class", getClass().getClassLoader()).getPackageName());
   }
 
   // Test that ResourceInfo.urls() returns identical content to ClassLoader.getResources()
@@ -530,7 +530,7 @@
   private static ResourceInfo resourceInfo(Class<?> cls) {
     String resource = cls.getName().replace('.', '/') + ".class";
     ClassLoader loader = cls.getClassLoader();
-    return ResourceInfo.of(resource, loader);
+    return ResourceInfo.of(FILE, resource, loader);
   }
 
   private static ClassInfo classInfo(Class<?> cls) {
@@ -539,7 +539,7 @@
 
   private static ClassInfo classInfo(Class<?> cls, ClassLoader classLoader) {
     String resource = cls.getName().replace('.', '/') + ".class";
-    return new ClassInfo(resource, classLoader);
+    return new ClassInfo(FILE, resource, classLoader);
   }
 
   private static Manifest manifestClasspath(String classpath) throws IOException {
@@ -584,20 +584,8 @@
     final Set<String> resources = new HashSet<>();
 
     @Override
-    protected void scanDirectory(ClassLoader loader, File root) throws IOException {
-      URI base = root.toURI();
-      for (File entry : Files.fileTraverser().depthFirstPreOrder(root)) {
-        String resourceName = new File(base.relativize(entry.toURI()).getPath()).getPath();
-        resources.add(resourceName);
-      }
-    }
-
-    @Override
-    protected void scanJarFile(ClassLoader loader, JarFile file) throws IOException {
-      Enumeration<JarEntry> entries = file.entries();
-      while (entries.hasMoreElements()) {
-        resources.add(entries.nextElement().getName());
-      }
+    protected void scanResource(ResourceInfo resource) throws IOException {
+      resources.add(resource.getResourceName());
     }
   }
 
@@ -623,13 +611,13 @@
     }
 
     @Override
-    protected void scanJarFile(ClassLoader loader, JarFile file) throws IOException {
+    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
       this.found = new File(file.getName());
       throw new StopScanningException();
     }
 
     @Override
-    protected void scanDirectory(ClassLoader loader, File root) {}
+    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 {}
diff --git a/guava-tests/test/com/google/common/reflect/SubtypeTester.java b/guava-tests/test/com/google/common/reflect/SubtypeTester.java
index dcf9626..3eec668 100644
--- a/guava-tests/test/com/google/common/reflect/SubtypeTester.java
+++ b/guava-tests/test/com/google/common/reflect/SubtypeTester.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.errorprone.annotations.RequiredModifiers;
 import java.lang.annotation.ElementType;
@@ -84,11 +85,11 @@
     Type returnType = method.getGenericReturnType();
     Type paramType = getOnlyParameterType();
     TestSubtype spec = method.getAnnotation(TestSubtype.class);
-    assertThat(TypeToken.of(paramType).isSubtypeOf(returnType))
-        .named("%s is subtype of %s", paramType, returnType)
+    assertWithMessage("%s is subtype of %s", paramType, returnType)
+        .that(TypeToken.of(paramType).isSubtypeOf(returnType))
         .isTrue();
-    assertThat(TypeToken.of(returnType).isSupertypeOf(paramType))
-        .named("%s is supertype of %s", returnType, paramType)
+    assertWithMessage("%s is supertype of %s", returnType, paramType)
+        .that(TypeToken.of(returnType).isSupertypeOf(paramType))
         .isTrue();
     if (!spec.suppressGetSubtype()) {
       assertThat(getSubtype(returnType, TypeToken.of(paramType).getRawType())).isEqualTo(paramType);
@@ -108,11 +109,11 @@
     Type returnType = method.getGenericReturnType();
     Type paramType = getOnlyParameterType();
     TestSubtype spec = method.getAnnotation(TestSubtype.class);
-    assertThat(TypeToken.of(paramType).isSubtypeOf(returnType))
-        .named("%s is subtype of %s", paramType, returnType)
+    assertWithMessage("%s is subtype of %s", paramType, returnType)
+        .that(TypeToken.of(paramType).isSubtypeOf(returnType))
         .isFalse();
-    assertThat(TypeToken.of(returnType).isSupertypeOf(paramType))
-        .named("%s is supertype of %s", returnType, paramType)
+    assertWithMessage("%s is supertype of %s", returnType, paramType)
+        .that(TypeToken.of(returnType).isSupertypeOf(paramType))
         .isFalse();
     if (!spec.suppressGetSubtype()) {
       try {
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
index c7474f2..f49b962 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractAbstractFutureTest.java
@@ -462,14 +462,14 @@
       getDone(future);
       fail();
     } catch (ExecutionException e) {
-      assertThat(e.getCause()).isSameAs(expectedException);
+      assertThat(e.getCause()).isSameInstanceAs(expectedException);
     }
 
     try {
       getDoneFromTimeoutOverload(future);
       fail();
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(expectedException);
+      assertThat(e).hasCauseThat().isSameInstanceAs(expectedException);
     }
   }
 
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 d075f80..77d04ff 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
@@ -39,7 +39,7 @@
  * </ul>
  *
  * To force selection of our fallback strategies we load {@link AbstractFuture} (and all of {@code
- * com.google.common.util.concurrent} in degenerate class loaders which make certain platform
+ * com.google.common.util.concurrent}) in degenerate class loaders which make certain platform
  * classes unavailable. Then we construct a test suite so we can run the normal AbstractFutureTest
  * test methods in these degenerate classloaders.
  */
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java
new file mode 100644
index 0000000..e88e7e8
--- /dev/null
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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.util.concurrent;
+
+import java.net.URLClassLoader;
+import java.security.Permission;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.PropertyPermission;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.concurrent.GuardedBy;
+import junit.framework.TestCase;
+
+/** Tests for {@link AbstractFuture} using an innocuous thread. */
+
+public class AbstractFutureInnocuousThreadTest extends TestCase {
+  private ClassLoader oldClassLoader;
+  private URLClassLoader classReloader;
+  private Class<?> settableFutureClass;
+  private SecurityManager oldSecurityManager;
+
+  @Override
+  protected void setUp() throws Exception {
+    // Load the "normal" copy of SettableFuture and related classes.
+    SettableFuture<?> unused = SettableFuture.create();
+    // Hack to load AbstractFuture et. al. in a new classloader so that it tries to re-read the
+    // cancellation-cause system property. This allows us to test what happens if reading the
+    // property is forbidden and then continue running tests normally in one jvm without resorting
+    // to even crazier hacks to reset static final boolean fields.
+    final String concurrentPackage = SettableFuture.class.getPackage().getName();
+    classReloader =
+        new URLClassLoader(ClassPathUtil.getClassPathUrls()) {
+          @GuardedBy("loadedClasses")
+          final Map<String, Class<?>> loadedClasses = new HashMap<>();
+
+          @Override
+          public Class<?> loadClass(String name) throws ClassNotFoundException {
+            if (name.startsWith(concurrentPackage)
+                // Use other classloader for ListenableFuture, so that the objects can interact
+                && !ListenableFuture.class.getName().equals(name)) {
+              synchronized (loadedClasses) {
+                Class<?> toReturn = loadedClasses.get(name);
+                if (toReturn == null) {
+                  toReturn = super.findClass(name);
+                  loadedClasses.put(name, toReturn);
+                }
+                return toReturn;
+              }
+            }
+            return super.loadClass(name);
+          }
+        };
+    oldClassLoader = Thread.currentThread().getContextClassLoader();
+    Thread.currentThread().setContextClassLoader(classReloader);
+
+    oldSecurityManager = System.getSecurityManager();
+    /*
+     * TODO(cpovirk): Why couldn't I get this to work with PermissionCollection and implies(), as
+     * used by ClassPathTest?
+     */
+    final PropertyPermission readSystemProperty =
+        new PropertyPermission("guava.concurrent.generate_cancellation_cause", "read");
+    SecurityManager disallowPropertySecurityManager =
+        new SecurityManager() {
+          @Override
+          public void checkPermission(Permission p) {
+            if (readSystemProperty.equals(p)) {
+              throw new SecurityException("Disallowed: " + p);
+            }
+          }
+        };
+    System.setSecurityManager(disallowPropertySecurityManager);
+
+    settableFutureClass = classReloader.loadClass(SettableFuture.class.getName());
+
+    /*
+     * We must keep the SecurityManager installed during the test body: It affects what kind of
+     * threads ForkJoinPool.commonPool() creates.
+     */
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    System.setSecurityManager(oldSecurityManager);
+    classReloader.close();
+    Thread.currentThread().setContextClassLoader(oldClassLoader);
+  }
+
+  public void testAbstractFutureInitializationWithInnocuousThread_doesNotThrow() throws Exception {
+    CountDownLatch latch = new CountDownLatch(1);
+    // Setting a security manager causes the common ForkJoinPool to use InnocuousThreads with no
+    // permissions.
+    // submit()/join() causes this thread to execute the task instead, so we use a CountDownLatch as
+    // a barrier to synchronize.
+    // TODO(cpovirk): If some other test already initialized commonPool(), this won't work :(
+    // Maybe we should just run this test in its own VM.
+    ForkJoinPool.commonPool()
+        .execute(
+            () -> {
+              try {
+                settableFutureClass.getMethod("create").invoke(null);
+                latch.countDown();
+              } catch (Exception e) {
+                throw new RuntimeException(e);
+              }
+            });
+    // In the failure case, await() will timeout.
+    assertTrue(latch.await(2, TimeUnit.SECONDS));
+  }
+
+  // TODO(cpovirk): Write a similar test that doesn't use ForkJoinPool (to run under Android)?
+}
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 368e2d4..3c210ce 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
@@ -19,11 +19,13 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Range;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -78,8 +80,8 @@
     // Ensure we get a unique execution exception on each get
     assertNotSame(ee1, ee2);
 
-    assertThat(ee1).hasCauseThat().isSameAs(failure);
-    assertThat(ee2).hasCauseThat().isSameAs(failure);
+    assertThat(ee1).hasCauseThat().isSameInstanceAs(failure);
+    assertThat(ee2).hasCauseThat().isSameInstanceAs(failure);
 
     checkStackTrace(ee1);
     checkStackTrace(ee2);
@@ -155,7 +157,7 @@
       normalFuture.get();
       fail();
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(exception);
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
     }
   }
 
@@ -212,6 +214,44 @@
     assertThat(SettableFuture.create().toString()).isNotEqualTo(SettableFuture.create().toString());
   }
 
+  public void testToString_oom() throws Exception {
+    SettableFuture<Object> future = SettableFuture.create();
+    future.set(
+        new Object() {
+          @Override
+          public String toString() {
+            throw new OutOfMemoryError();
+          }
+
+          @Override
+          public int hashCode() {
+            throw new OutOfMemoryError();
+          }
+        });
+
+    String unused = future.toString();
+
+    SettableFuture<Object> future2 = SettableFuture.create();
+
+    // A more organic OOM from a toString implementation
+    Object object =
+        new Object() {
+          @Override
+          public String toString() {
+            return new String(new char[50_000]);
+          }
+        };
+    List<Object> list = Collections.singletonList(object);
+    for (int i = 0; i < 10; i++) {
+      Object[] array = new Object[500];
+      Arrays.fill(array, list);
+      list = Arrays.asList(array);
+    }
+    future2.set(list);
+
+    unused = future.toString();
+  }
+
   public void testToString_notDone() throws Exception {
     AbstractFuture<Object> testFuture =
         new AbstractFuture<Object>() {
@@ -232,6 +272,20 @@
     }
   }
 
+  public void testToString_completesDuringToString() throws Exception {
+    AbstractFuture<Object> testFuture =
+        new AbstractFuture<Object>() {
+          @Override
+          public String pendingToString() {
+            // Complete ourselves during the toString calculation
+            this.set(true);
+            return "cause=[Because this test isn't done]";
+          }
+        };
+    assertThat(testFuture.toString())
+        .matches("[^\\[]+\\[status=SUCCESS, result=\\[java.lang.Boolean@\\w+\\]\\]");
+  }
+
   /**
    * This test attempts to cause a future to wait for longer than it was requested to from a timed
    * get() call. As measurements of time are prone to flakiness, it tries to assert based on ranges
@@ -290,11 +344,11 @@
     testFuture3.setFuture(testFuture2);
     assertThat(testFuture3.toString())
         .matches(
-            "[^\\[]+\\[status=PENDING, info=\\[setFuture="
-                + "\\[[^\\[]+\\[status=PENDING, info=\\[cause=\\[Someday...\\]\\]\\]\\]\\]\\]");
+            "[^\\[]+\\[status=PENDING, setFuture=\\[[^\\[]+\\[status=PENDING,"
+                + " info=\\[cause=\\[Someday...]]]]]");
     testFuture2.set("result string");
     assertThat(testFuture3.toString())
-        .matches("[^\\[]+\\[status=SUCCESS, result=\\[result string\\]\\]");
+        .matches("[^\\[]+\\[status=SUCCESS, result=\\[java.lang.String@\\w+\\]\\]");
   }
 
   public void testToString_cancelled() throws Exception {
@@ -381,7 +435,7 @@
     final ExecutorService executor = Executors.newFixedThreadPool(barrier.getParties());
     final AtomicReference<AbstractFuture<String>> currentFuture = Atomics.newReference();
     final AtomicInteger numSuccessfulSetCalls = new AtomicInteger();
-    Callable<Void> completeSucessFullyRunnable =
+    Callable<Void> completeSuccessfullyRunnable =
         new Callable<Void>() {
           @Override
           public Void call() {
@@ -416,7 +470,7 @@
             return null;
           }
         };
-    Callable<Void> setFutureCompleteSucessFullyRunnable =
+    Callable<Void> setFutureCompleteSuccessfullyRunnable =
         new Callable<Void>() {
           ListenableFuture<String> future = Futures.immediateFuture("setFuture");
 
@@ -497,10 +551,10 @@
           }
         };
     List<Callable<?>> allTasks = new ArrayList<>();
-    allTasks.add(completeSucessFullyRunnable);
+    allTasks.add(completeSuccessfullyRunnable);
     allTasks.add(completeExceptionallyRunnable);
     allTasks.add(cancelRunnable);
-    allTasks.add(setFutureCompleteSucessFullyRunnable);
+    allTasks.add(setFutureCompleteSuccessfullyRunnable);
     allTasks.add(setFutureCompleteExceptionallyRunnable);
     allTasks.add(setFutureCancelRunnable);
     for (int k = 0; k < 50; k++) {
@@ -563,24 +617,24 @@
     final ExecutorService executor = Executors.newFixedThreadPool(barrier.getParties());
     final AtomicReference<AbstractFuture<String>> currentFuture = Atomics.newReference();
     final AtomicReference<AbstractFuture<String>> setFutureFuture = Atomics.newReference();
-    final AtomicBoolean setFutureSetSucess = new AtomicBoolean();
-    final AtomicBoolean setFutureCompletionSucess = new AtomicBoolean();
-    final AtomicBoolean cancellationSucess = new AtomicBoolean();
+    final AtomicBoolean setFutureSetSuccess = new AtomicBoolean();
+    final AtomicBoolean setFutureCompletionSuccess = new AtomicBoolean();
+    final AtomicBoolean cancellationSuccess = new AtomicBoolean();
     Runnable cancelRunnable =
         new Runnable() {
           @Override
           public void run() {
-            cancellationSucess.set(currentFuture.get().cancel(true));
+            cancellationSuccess.set(currentFuture.get().cancel(true));
             awaitUnchecked(barrier);
           }
         };
-    Runnable setFutureCompleteSucessFullyRunnable =
+    Runnable setFutureCompleteSuccessfullyRunnable =
         new Runnable() {
           @Override
           public void run() {
             AbstractFuture<String> future = setFutureFuture.get();
-            setFutureSetSucess.set(currentFuture.get().setFuture(future));
-            setFutureCompletionSucess.set(future.set("hello-async-world"));
+            setFutureSetSuccess.set(currentFuture.get().setFuture(future));
+            setFutureCompletionSuccess.set(future.set("hello-async-world"));
             awaitUnchecked(barrier);
           }
         };
@@ -626,7 +680,7 @@
         };
     List<Runnable> allTasks = new ArrayList<>();
     allTasks.add(cancelRunnable);
-    allTasks.add(setFutureCompleteSucessFullyRunnable);
+    allTasks.add(setFutureCompleteSuccessfullyRunnable);
     for (int k = 0; k < size; k++) {
       // For each listener we add a task that submits it to the executor directly for the blocking
       // get usecase and another task that adds it as a listener to the future to exercise both
@@ -659,12 +713,12 @@
       Object result = Iterables.getOnlyElement(finalResults);
       if (result == CancellationException.class) {
         assertTrue(future.isCancelled());
-        assertTrue(cancellationSucess.get());
+        assertTrue(cancellationSuccess.get());
         // cancellation can interleave in 3 ways
         // 1. prior to setFuture
         // 2. after setFuture before set() on the future assigned
         // 3. after setFuture and set() are called but before the listener completes.
-        if (!setFutureSetSucess.get() || !setFutureCompletionSucess.get()) {
+        if (!setFutureSetSuccess.get() || !setFutureCompletionSuccess.get()) {
           // If setFuture fails or set on the future fails then it must be because that future was
           // cancelled
           assertTrue(setFuture.isCancelled());
@@ -672,14 +726,14 @@
         }
       } else {
         // set on the future completed
-        assertFalse(cancellationSucess.get());
-        assertTrue(setFutureSetSucess.get());
-        assertTrue(setFutureCompletionSucess.get());
+        assertFalse(cancellationSuccess.get());
+        assertTrue(setFutureSetSuccess.get());
+        assertTrue(setFutureCompletionSuccess.get());
       }
       // reset for next iteration
-      setFutureSetSucess.set(false);
-      setFutureCompletionSucess.set(false);
-      cancellationSucess.set(false);
+      setFutureSetSuccess.set(false);
+      setFutureCompletionSuccess.set(false);
+      cancellationSuccess.set(false);
       finalResults.clear();
     }
     executor.shutdown();
@@ -696,17 +750,17 @@
     final ExecutorService executor = Executors.newFixedThreadPool(barrier.getParties());
     final AtomicReference<AbstractFuture<String>> currentFuture = Atomics.newReference();
     final AtomicBoolean setFutureSuccess = new AtomicBoolean();
-    final AtomicBoolean cancellationSucess = new AtomicBoolean();
+    final AtomicBoolean cancellationSuccess = new AtomicBoolean();
     Callable<Void> cancelRunnable =
         new Callable<Void>() {
           @Override
           public Void call() {
-            cancellationSucess.set(currentFuture.get().cancel(true));
+            cancellationSuccess.set(currentFuture.get().cancel(true));
             awaitUnchecked(barrier);
             return null;
           }
         };
-    Callable<Void> setFutureCompleteSucessFullyRunnable =
+    Callable<Void> setFutureCompleteSuccessfullyRunnable =
         new Callable<Void>() {
           final ListenableFuture<String> future = Futures.immediateFuture("hello");
 
@@ -736,7 +790,7 @@
         };
     List<Callable<?>> allTasks = new ArrayList<>();
     allTasks.add(cancelRunnable);
-    allTasks.add(setFutureCompleteSucessFullyRunnable);
+    allTasks.add(setFutureCompleteSuccessfullyRunnable);
     allTasks.add(Executors.callable(collectResultsRunnable));
     assertEquals(allTasks.size() + 1, barrier.getParties()); // sanity check
     for (int i = 0; i < 1000; i++) {
@@ -754,15 +808,15 @@
       Object result = Iterables.getOnlyElement(finalResults);
       if (result == CancellationException.class) {
         assertTrue(future.isCancelled());
-        assertTrue(cancellationSucess.get());
+        assertTrue(cancellationSuccess.get());
         assertFalse(setFutureSuccess.get());
       } else {
         assertTrue(setFutureSuccess.get());
-        assertFalse(cancellationSucess.get());
+        assertFalse(cancellationSuccess.get());
       }
       // reset for next iteration
       setFutureSuccess.set(false);
-      cancellationSucess.set(false);
+      cancellationSuccess.set(false);
       finalResults.clear();
     }
     executor.shutdown();
@@ -783,6 +837,23 @@
     assertTrue(orig.isDone());
   }
 
+  // Verify that StackOverflowError in a long chain of SetFuture doesn't cause the entire toString
+  // call to fail
+  @GwtIncompatible
+  @AndroidIncompatible
+  public void testSetFutureToString_stackOverflow() {
+    SettableFuture<String> orig = SettableFuture.create();
+    SettableFuture<String> prev = orig;
+    for (int i = 0; i < 100000; i++) {
+      SettableFuture<String> curr = SettableFuture.create();
+      prev.setFuture(curr);
+      prev = curr;
+    }
+    // orig represents the 'outermost' future
+    assertThat(orig.toString())
+        .contains("Exception thrown from implementation: class java.lang.StackOverflowError");
+  }
+
   public void testSetFuture_misbehavingFutureThrows() throws Exception {
     SettableFuture<String> future = SettableFuture.create();
     ListenableFuture<String> badFuture =
@@ -886,7 +957,7 @@
   public void testSetFutureSelf_toString() {
     SettableFuture<String> orig = SettableFuture.create();
     orig.setFuture(orig);
-    assertThat(orig.toString()).contains("[status=PENDING, info=[setFuture=[this future]]]");
+    assertThat(orig.toString()).contains("[status=PENDING, setFuture=[this future]]");
   }
 
   public void testSetSelf_toString() {
@@ -895,21 +966,33 @@
     assertThat(orig.toString()).contains("[status=SUCCESS, result=[this future]]");
   }
 
+  public void testSetFutureSelf_toStringException() {
+    SettableFuture<String> orig = SettableFuture.create();
+    orig.setFuture(
+        new AbstractFuture<String>() {
+          @Override
+          public String toString() {
+            throw new NullPointerException();
+          }
+        });
+    assertThat(orig.toString())
+        .contains(
+            "[status=PENDING, setFuture=[Exception thrown from implementation: class"
+                + " java.lang.NullPointerException]]");
+  }
+
   public void testSetIndirectSelf_toString() {
     final SettableFuture<Object> orig = SettableFuture.create();
     // unlike the above this indirection defeats the trivial cycle detection and causes a SOE
-    orig.set(
-        new Object() {
+    orig.setFuture(
+        new ForwardingListenableFuture<Object>() {
           @Override
-          public String toString() {
-            return orig.toString();
+          protected ListenableFuture<Object> delegate() {
+            return orig;
           }
         });
-    try {
-      orig.toString();
-      fail();
-    } catch (StackOverflowError expected) {
-    }
+    assertThat(orig.toString())
+        .contains("Exception thrown from implementation: class java.lang.StackOverflowError");
   }
 
   // Regression test for a case where we would fail to execute listeners immediately on done futures
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
index 74f5d7c..7cad8b0 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractIdleServiceTest.java
@@ -68,7 +68,7 @@
         service.startAsync().awaitRunning();
         fail();
       } catch (RuntimeException e) {
-        assertThat(e).hasCauseThat().isSameAs(exception);
+        assertThat(e).hasCauseThat().isSameInstanceAs(exception);
       }
       assertEquals(Service.State.FAILED, service.state());
     }
@@ -87,7 +87,7 @@
         service.stopAsync().awaitTerminated();
         fail();
       } catch (RuntimeException e) {
-        assertThat(e).hasCauseThat().isSameAs(exception);
+        assertThat(e).hasCauseThat().isSameInstanceAs(exception);
       }
       assertEquals(Service.State.FAILED, service.state());
     }
@@ -117,7 +117,7 @@
       service.startAsync().awaitRunning();
       fail();
     } catch (RuntimeException e) {
-      assertThat(e).hasCauseThat().isSameAs(exception);
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
     }
     assertEquals(1, service.startUpCalled);
     assertEquals(Service.State.FAILED, service.state());
@@ -164,7 +164,7 @@
       service.stopAsync().awaitTerminated();
       fail();
     } catch (RuntimeException e) {
-      assertThat(e).hasCauseThat().isSameAs(exception);
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
     }
     assertEquals(1, service.startUpCalled);
     assertEquals(1, service.shutDownCalled);
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 8e7cde9..16a4cd0 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
@@ -98,7 +98,7 @@
       fail();
     } catch (CancellationException expected) {
     }
-    // An execution exception holds a runtime exception (from throwables.propogate) that holds our
+    // An execution exception holds a runtime exception (from throwables.propagate) that holds our
     // original exception.
     assertEquals(service.runException, service.failureCause());
     assertEquals(Service.State.FAILED, service.state());
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 faac76e..5f42106 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
@@ -42,7 +42,7 @@
  */
 public class AbstractServiceTest extends TestCase {
 
-  private static final long LONG_TIMEOUT_MILLIS = 2500;
+  private static final long LONG_TIMEOUT_MILLIS = 10000;
   private Thread executionThread;
   private Throwable thrownByExecutionThread;
 
@@ -234,21 +234,21 @@
    */
   public void testManualServiceStopMultipleTimesWhileStarting() throws Exception {
     ManualSwitchedService service = new ManualSwitchedService();
-    final AtomicInteger stopppingCount = new AtomicInteger();
+    final AtomicInteger stoppingCount = new AtomicInteger();
     service.addListener(
         new Listener() {
           @Override
           public void stopping(State from) {
-            stopppingCount.incrementAndGet();
+            stoppingCount.incrementAndGet();
           }
         },
         directExecutor());
 
     service.startAsync();
     service.stopAsync();
-    assertEquals(1, stopppingCount.get());
+    assertEquals(1, stoppingCount.get());
     service.stopAsync();
-    assertEquals(1, stopppingCount.get());
+    assertEquals(1, stoppingCount.get());
   }
 
   public void testManualServiceStopWhileNew() throws Exception {
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
new file mode 100644
index 0000000..d905dcd
--- /dev/null
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2011 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.GwtIncompatible;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import junit.framework.TestCase;
+
+/**
+ * Basher test for {@link AtomicLongMap}.
+ *
+ * @author mike nonemacher
+ */
+@GwtIncompatible // threads
+
+public class AtomicLongMapBasherTest extends TestCase {
+  private final Random random = new Random(301);
+
+  public void testModify_basher() throws InterruptedException {
+    int nTasks = 3000;
+    int nThreads = 100;
+    final int getsPerTask = 1000;
+    final int deltaRange = 10000;
+    final String key = "key";
+
+    final AtomicLong sum = new AtomicLong();
+    final AtomicLongMap<String> map = AtomicLongMap.create();
+
+    ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
+    for (int i = 0; i < nTasks; i++) {
+      @SuppressWarnings("unused") // go/futurereturn-lsc
+      Future<?> possiblyIgnoredError =
+          threadPool.submit(
+              new Runnable() {
+                @Override
+                public void run() {
+                  int threadSum = 0;
+                  for (int j = 0; j < getsPerTask; j++) {
+                    long delta = random.nextInt(deltaRange);
+                    int behavior = random.nextInt(10);
+                    switch (behavior) {
+                      case 0:
+                        map.incrementAndGet(key);
+                        threadSum++;
+                        break;
+                      case 1:
+                        map.decrementAndGet(key);
+                        threadSum--;
+                        break;
+                      case 2:
+                        map.addAndGet(key, delta);
+                        threadSum += delta;
+                        break;
+                      case 3:
+                        map.getAndIncrement(key);
+                        threadSum++;
+                        break;
+                      case 4:
+                        map.getAndDecrement(key);
+                        threadSum--;
+                        break;
+                      case 5:
+                        map.getAndAdd(key, delta);
+                        threadSum += delta;
+                        break;
+                      case 6:
+                        long oldValue = map.put(key, delta);
+                        threadSum += delta - oldValue;
+                        break;
+                      case 7:
+                        oldValue = map.get(key);
+                        if (map.replace(key, oldValue, delta)) {
+                          threadSum += delta - oldValue;
+                        }
+                        break;
+                      case 8:
+                        oldValue = map.remove(key);
+                        threadSum -= oldValue;
+                        break;
+                      case 9:
+                        oldValue = map.get(key);
+                        if (map.remove(key, oldValue)) {
+                          threadSum -= oldValue;
+                        }
+                        break;
+                      default:
+                        throw new AssertionError();
+                    }
+                  }
+                  sum.addAndGet(threadSum);
+                }
+              });
+    }
+
+    threadPool.shutdown();
+    assertTrue(threadPool.awaitTermination(300, TimeUnit.SECONDS));
+
+    assertEquals(sum.get(), map.get(key));
+  }
+}
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
index 557bb15..587a4ec 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapTest.java
@@ -25,11 +25,6 @@
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 import junit.framework.TestCase;
 
 /**
@@ -42,7 +37,7 @@
   private static final int ITERATIONS = 100;
   private static final int MAX_ADDEND = 100;
 
-  private Random random = new Random(301);
+  private final Random random = new Random(301);
 
   @GwtIncompatible // NullPointerTester
   public void testNulls() {
@@ -578,87 +573,4 @@
     AtomicLongMap<String> reserialized = SerializableTester.reserialize(map);
     assertEquals(map.asMap(), reserialized.asMap());
   }
-
-  @GwtIncompatible // threads
-  public void testModify_basher() throws InterruptedException {
-    int nTasks = 3000;
-    int nThreads = 100;
-    final int getsPerTask = 1000;
-    final int deltaRange = 10000;
-    final String key = "key";
-
-    final AtomicLong sum = new AtomicLong();
-    final AtomicLongMap<String> map = AtomicLongMap.create();
-
-    ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
-    for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
-      Future<?> possiblyIgnoredError =
-          threadPool.submit(
-              new Runnable() {
-                @Override
-                public void run() {
-                  int threadSum = 0;
-                  for (int j = 0; j < getsPerTask; j++) {
-                    long delta = random.nextInt(deltaRange);
-                    int behavior = random.nextInt(10);
-                    switch (behavior) {
-                      case 0:
-                        map.incrementAndGet(key);
-                        threadSum++;
-                        break;
-                      case 1:
-                        map.decrementAndGet(key);
-                        threadSum--;
-                        break;
-                      case 2:
-                        map.addAndGet(key, delta);
-                        threadSum += delta;
-                        break;
-                      case 3:
-                        map.getAndIncrement(key);
-                        threadSum++;
-                        break;
-                      case 4:
-                        map.getAndDecrement(key);
-                        threadSum--;
-                        break;
-                      case 5:
-                        map.getAndAdd(key, delta);
-                        threadSum += delta;
-                        break;
-                      case 6:
-                        long oldValue = map.put(key, delta);
-                        threadSum += delta - oldValue;
-                        break;
-                      case 7:
-                        oldValue = map.get(key);
-                        if (map.replace(key, oldValue, delta)) {
-                          threadSum += delta - oldValue;
-                        }
-                        break;
-                      case 8:
-                        oldValue = map.remove(key);
-                        threadSum -= oldValue;
-                        break;
-                      case 9:
-                        oldValue = map.get(key);
-                        if (map.remove(key, oldValue)) {
-                          threadSum -= oldValue;
-                        }
-                        break;
-                      default:
-                        throw new AssertionError();
-                    }
-                  }
-                  sum.addAndGet(threadSum);
-                }
-              });
-    }
-
-    threadPool.shutdown();
-    assertTrue(threadPool.awaitTermination(300, TimeUnit.SECONDS));
-
-    assertEquals(sum.get(), map.get(key));
-  }
 }
diff --git a/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java b/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java
index c7cd617..5bc92dc 100644
--- a/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/CallablesTest.java
@@ -82,7 +82,7 @@
       future.get();
       fail("Expected exception to be thrown");
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(expected);
+      assertThat(e).hasCauseThat().isSameInstanceAs(expected);
     }
   }
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
new file mode 100644
index 0000000..58cf5bb
--- /dev/null
+++ b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
@@ -0,0 +1,1938 @@
+/*
+ * Copyright (C) 2017 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 com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Lists.asList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
+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.MoreExecutors.directExecutor;
+import static com.google.common.util.concurrent.MoreExecutors.shutdownAndAwaitTermination;
+import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
+import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+import static java.util.Arrays.asList;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
+import com.google.common.collect.ImmutableList;
+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.AsyncClosingFunction;
+import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
+import com.google.common.util.concurrent.ClosingFuture.ClosingFunction;
+import com.google.common.util.concurrent.ClosingFuture.Combiner;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.AsyncCombiningCallable;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.CombiningCallable;
+import com.google.common.util.concurrent.ClosingFuture.Combiner2.AsyncClosingFunction2;
+import com.google.common.util.concurrent.ClosingFuture.Combiner2.ClosingFunction2;
+import com.google.common.util.concurrent.ClosingFuture.Combiner3.ClosingFunction3;
+import com.google.common.util.concurrent.ClosingFuture.Combiner4.ClosingFunction4;
+import com.google.common.util.concurrent.ClosingFuture.Combiner5.ClosingFunction5;
+import com.google.common.util.concurrent.ClosingFuture.DeferredCloser;
+import com.google.common.util.concurrent.ClosingFuture.Peeker;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloser;
+import com.google.common.util.concurrent.ClosingFuture.ValueAndCloserConsumer;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
+import junit.framework.TestCase;
+import org.mockito.Mockito;
+
+/**
+ * Tests for {@link ClosingFuture}. Subclasses exercise either the {@link
+ * ClosingFuture#finishToFuture()} or {@link
+ * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)} paths to complete a
+ * {@link ClosingFuture} pipeline.
+ */
+public abstract class ClosingFutureTest extends TestCase {
+  // TODO(dpb): Use Expect once that supports JUnit 3, or we can use JUnit 4.
+  final List<AssertionError> failures = new ArrayList<>();
+  final StandardSubjectBuilder expect =
+      StandardSubjectBuilder.forCustomFailureStrategy(
+          new FailureStrategy() {
+            @Override
+            public void fail(AssertionError failure) {
+              failures.add(failure);
+            }
+          });
+
+  final ListeningExecutorService executor =
+      MoreExecutors.listeningDecorator(newSingleThreadExecutor());
+  final ExecutorService closingExecutor = newSingleThreadExecutor();
+
+  final TestCloseable closeable1 = new TestCloseable("closeable1");
+  final TestCloseable closeable2 = new TestCloseable("closeable2");
+  final TestCloseable closeable3 = new TestCloseable("closeable3");
+  final TestCloseable closeable4 = new TestCloseable("closeable4");
+
+  final Waiter waiter = new Waiter();
+  final CountDownLatch futureCancelled = new CountDownLatch(1);
+  final Exception exception = new Exception();
+  final Closeable mockCloseable = Mockito.mock(Closeable.class);
+
+  @Override
+  protected void tearDown() throws Exception {
+    assertNoExpectedFailures();
+    super.tearDown();
+  }
+
+  public void testFrom() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.from(executor.submit(Callables.returning(closeable1)))
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable1);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+  }
+
+  public void testFrom_failedInput() throws Exception {
+    assertFinallyFailsWithException(failedClosingFuture());
+  }
+
+  public void testFrom_cancelledInput() throws Exception {
+    assertBecomesCanceled(ClosingFuture.from(immediateCancelledFuture()));
+  }
+
+  public void testEventuallyClosing() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable1);
+                    assertStillOpen(closeable1);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testEventuallyClosing_failedInput() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.eventuallyClosing(
+            Futures.<Closeable>immediateFailedFuture(exception), closingExecutor));
+  }
+
+  public void testEventuallyClosing_cancelledInput() throws Exception {
+    assertBecomesCanceled(
+        ClosingFuture.eventuallyClosing(
+            Futures.<Closeable>immediateCancelledFuture(), closingExecutor));
+  }
+
+  public void testEventuallyClosing_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.eventuallyClosing(
+            executor.submit(
+                waiter.waitFor(
+                    new Callable<TestCloseable>() {
+                      @Override
+                      public TestCloseable call() throws InterruptedException {
+                        awaitUninterruptibly(futureCancelled);
+                        return closeable1;
+                      }
+                    })),
+            closingExecutor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the callable returns
+    assertStillOpen(closeable1);
+    waiter.awaitReturned();
+    assertClosed(closeable1);
+  }
+
+  public void testEventuallyClosing_throws() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.eventuallyClosing(
+            executor.submit(
+                new Callable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call() throws Exception {
+                    throw exception;
+                  }
+                }),
+            closingExecutor));
+  }
+
+  public void testSubmit() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+                new ClosingCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable3;
+                  }
+                },
+                executor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable3);
+                    assertStillOpen(closeable1, closeable2, closeable3);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testSubmit_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer) throws Exception {
+                    awaitUninterruptibly(futureCancelled);
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable3;
+                  }
+                }),
+            executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testSubmit_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Object>() {
+              @Override
+              public 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 =
+        ClosingFuture.submit(
+            new ClosingCallable<String>() {
+              @Override
+              public String call(DeferredCloser closer) throws Exception {
+                closer.eventuallyClose(autoCloseable, closingExecutor);
+                return "";
+              }
+            },
+            executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testStatusFuture() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<String>() {
+                  @Override
+                  public String call(DeferredCloser closer) throws Exception {
+                    return "value";
+                  }
+                }),
+            executor);
+    ListenableFuture<?> statusFuture = closingFuture.statusFuture();
+    waiter.awaitStarted();
+    assertThat(statusFuture.isDone()).isFalse();
+    waiter.awaitReturned();
+    assertThat(getUninterruptibly(statusFuture)).isNull();
+  }
+
+  public void testStatusFuture_failure() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<String>() {
+                  @Override
+                  public String call(DeferredCloser closer) throws Exception {
+                    throw exception;
+                  }
+                }),
+            executor);
+    ListenableFuture<?> statusFuture = closingFuture.statusFuture();
+    waiter.awaitStarted();
+    assertThat(statusFuture.isDone()).isFalse();
+    waiter.awaitReturned();
+    assertThatFutureFailsWithException(statusFuture);
+  }
+
+  public void testStatusFuture_cancelDoesNothing() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+            waiter.waitFor(
+                new ClosingCallable<String>() {
+                  @Override
+                  public String call(DeferredCloser closer) throws Exception {
+                    return "value";
+                  }
+                }),
+            executor);
+    ListenableFuture<?> statusFuture = closingFuture.statusFuture();
+    waiter.awaitStarted();
+    assertThat(statusFuture.isDone()).isFalse();
+    statusFuture.cancel(true);
+    assertThat(statusFuture.isCancelled()).isTrue();
+    waiter.awaitReturned();
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+  }
+
+  public void testCancel_caught() throws Exception {
+    ClosingFuture<String> step0 = ClosingFuture.from(immediateFuture("value 0"));
+    ClosingFuture<String> step1 =
+        step0.transform(
+            new ClosingFunction<String, String>() {
+              @Override
+              public String apply(DeferredCloser closer, String v) throws Exception {
+                closer.eventuallyClose(closeable1, closingExecutor);
+                return "value 1";
+              }
+            },
+            executor);
+    Waiter step2Waiter = new Waiter();
+    ClosingFuture<String> step2 =
+        step1.transform(
+            step2Waiter.waitFor(
+                new ClosingFunction<String, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, String v) throws Exception {
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return "value 2";
+                  }
+                }),
+            executor);
+    ClosingFuture<String> step3 =
+        step2.transform(
+            new ClosingFunction<String, String>() {
+              @Override
+              public String apply(DeferredCloser closer, String input) throws Exception {
+                closer.eventuallyClose(closeable3, closingExecutor);
+                return "value 3";
+              }
+            },
+            executor);
+    Waiter step4Waiter = new Waiter();
+    ClosingFuture<String> step4 =
+        step3.catching(
+            CancellationException.class,
+            step4Waiter.waitFor(
+                new ClosingFunction<CancellationException, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, CancellationException input)
+                      throws Exception {
+                    closer.eventuallyClose(closeable4, closingExecutor);
+                    return "value 4";
+                  }
+                }),
+            executor);
+
+    // Pause in step 2.
+    step2Waiter.awaitStarted();
+
+    // Everything should still be open.
+    assertStillOpen(closeable1, closeable2, closeable3, closeable4);
+
+    // Cancel step 3, resume step 2, and pause in step 4.
+    assertWithMessage("step3.cancel()").that(step3.cancel(false)).isTrue();
+    step2Waiter.awaitReturned();
+    step4Waiter.awaitStarted();
+
+    // Step 1 is not cancelled because it was done.
+    assertWithMessage("step1.statusFuture().isCancelled()")
+        .that(step1.statusFuture().isCancelled())
+        .isFalse();
+    // But its closeable is closed.
+    assertClosed(closeable1);
+
+    // Step 2 is cancelled because it wasn't complete.
+    assertWithMessage("step2.statusFuture().isCancelled()")
+        .that(step2.statusFuture().isCancelled())
+        .isTrue();
+    // Its closeable is closed.
+    assertClosed(closeable2);
+
+    // Step 3 was cancelled before it began
+    assertWithMessage("step3.statusFuture().isCancelled()")
+        .that(step3.statusFuture().isCancelled())
+        .isTrue();
+    // Its closeable is still open.
+    assertStillOpen(closeable3);
+
+    // Step 4 is not cancelled, because it caught the cancellation.
+    assertWithMessage("step4.statusFuture().isCancelled()")
+        .that(step4.statusFuture().isCancelled())
+        .isFalse();
+    // Its closeable isn't closed yet.
+    assertStillOpen(closeable4);
+
+    // Resume step 4 and complete.
+    step4Waiter.awaitReturned();
+    assertThat(getFinalValue(step4)).isEqualTo("value 4");
+
+    // Step 4's closeable is now closed.
+    assertClosed(closeable4);
+    // Step 3 still never ran, so its closeable should still be open.
+    assertStillOpen(closeable3);
+  }
+
+  public void testTransform() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transform(
+                new ClosingFunction<String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(DeferredCloser closer, String v) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable3;
+                  }
+                },
+                executor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable3);
+                    assertStillOpen(closeable1, closeable2, closeable3);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testTransform_cancelledPipeline() throws Exception {
+    String value = "value";
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.from(immediateFuture(value))
+            .transform(
+                new ClosingFunction<String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(DeferredCloser closer, String v) throws Exception {
+                    return closer.eventuallyClose(closeable1, closingExecutor);
+                  }
+                },
+                executor)
+            .transform(
+                waiter.waitFor(
+                    new ClosingFunction<TestCloseable, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(DeferredCloser closer, TestCloseable v)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        closer.eventuallyClose(closeable3, closingExecutor);
+                        return closeable4;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+    assertStillOpen(closeable4);
+  }
+
+  public void testTransform_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transform(
+                new ClosingFunction<String, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, String v) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testTransformAsync() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                new AsyncClosingFunction<String, TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> apply(DeferredCloser closer, String v)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return ClosingFuture.eventuallyClosing(
+                        immediateFuture(closeable3), closingExecutor);
+                  }
+                },
+                executor)
+            .transform(
+                new ClosingFunction<TestCloseable, String>() {
+                  @Override
+                  public String apply(DeferredCloser closer, TestCloseable v) throws Exception {
+                    assertThat(v).isSameInstanceAs(closeable3);
+                    assertStillOpen(closeable1, closeable2, closeable3);
+                    return "value";
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testTransformAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                waiter.waitFor(
+                    new AsyncClosingFunction<String, TestCloseable>() {
+                      @Override
+                      public ClosingFuture<TestCloseable> apply(DeferredCloser closer, String v)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return ClosingFuture.eventuallyClosing(
+                            immediateFuture(closeable3), closingExecutor);
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2, closeable3);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testTransformAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                new AsyncClosingFunction<String, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(DeferredCloser closer, String v)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testTransformAsync_failed() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.from(immediateFuture("value"))
+            .transformAsync(
+                new AsyncClosingFunction<String, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(DeferredCloser closer, String v)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return failedClosingFuture();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testTransformAsync_withoutCloser() throws Exception {
+    ClosingFuture<String> closingFuture =
+        ClosingFuture.submit(
+                new ClosingCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer) throws Exception {
+                    return closer.eventuallyClose(closeable1, closingExecutor);
+                  }
+                },
+                executor)
+            .transformAsync(
+                ClosingFuture.withoutCloser(
+                    new AsyncFunction<TestCloseable, String>() {
+                      @Override
+                      public ListenableFuture<String> apply(TestCloseable v) throws Exception {
+                        assertThat(v).isSameInstanceAs(closeable1);
+                        assertStillOpen(closeable1);
+                        return immediateFuture("value");
+                      }
+                    }),
+                executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo("value");
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllComplete_call() throws Exception {
+    final ClosingFuture<String> input1 = ClosingFuture.from(immediateFuture("value1"));
+    final ClosingFuture<Object> input2Failed = failedClosingFuture();
+    final ClosingFuture<String> nonInput = ClosingFuture.from(immediateFuture("value3"));
+    final AtomicReference<ClosingFuture.Peeker> capturedPeeker = new AtomicReference<>();
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(ImmutableList.of(input1, input2Failed))
+            .call(
+                new CombiningCallable<TestCloseable>() {
+                  @Override
+                  public TestCloseable call(DeferredCloser closer, Peeker peeker) throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    assertThat(peeker.getDone(input1)).isSameInstanceAs("value1");
+                    try {
+                      peeker.getDone(input2Failed);
+                      fail("Peeker.getDone() should fail for failed inputs");
+                    } catch (ExecutionException expected) {
+                    }
+                    try {
+                      peeker.getDone(nonInput);
+                      fail("Peeker should not be able to peek into non-input ClosingFuture.");
+                    } catch (IllegalArgumentException expected) {
+                    }
+                    capturedPeeker.set(peeker);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable2);
+    assertClosed(closeable1);
+    try {
+      capturedPeeker.get().getDone(input1);
+      fail("Peeker should not be able to peek except during call.");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testWhenAllComplete_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .call(
+                waiter.waitFor(
+                    new CombiningCallable<TestCloseable>() {
+                      @Override
+                      public TestCloseable call(DeferredCloser closer, Peeker peeker)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllComplete_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .call(
+                new CombiningCallable<Object>() {
+                  @Override
+                  public Object call(DeferredCloser closer, Peeker peeker) throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllComplete_callAsync() throws Exception {
+    final ClosingFuture<String> input1 = ClosingFuture.from(immediateFuture("value1"));
+    final ClosingFuture<Object> input2Failed = failedClosingFuture();
+    final ClosingFuture<String> nonInput = ClosingFuture.from(immediateFuture("value3"));
+    final AtomicReference<ClosingFuture.Peeker> capturedPeeker = new AtomicReference<>();
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(ImmutableList.of(input1, input2Failed))
+            .callAsync(
+                new AsyncCombiningCallable<TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> call(DeferredCloser closer, Peeker peeker)
+                      throws Exception {
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    assertThat(peeker.getDone(input1)).isSameInstanceAs("value1");
+                    try {
+                      peeker.getDone(input2Failed);
+                      fail("Peeker should fail for failed inputs");
+                    } catch (ExecutionException expected) {
+                    }
+                    try {
+                      peeker.getDone(nonInput);
+                      fail("Peeker should not be able to peek into non-input ClosingFuture.");
+                    } catch (IllegalArgumentException expected) {
+                    }
+                    capturedPeeker.set(peeker);
+                    return ClosingFuture.eventuallyClosing(
+                        immediateFuture(closeable2), closingExecutor);
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+    try {
+      capturedPeeker.get().getDone(input1);
+      fail("Peeker should not be able to peek except during call.");
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  public void testWhenAllComplete_callAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .callAsync(
+                waiter.waitFor(
+                    new AsyncCombiningCallable<TestCloseable>() {
+                      @Override
+                      public ClosingFuture<TestCloseable> call(DeferredCloser closer, Peeker peeker)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        return ClosingFuture.eventuallyClosing(
+                            immediateFuture(closeable3), closingExecutor);
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testWhenAllComplete_callAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllComplete(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture(closeable1)),
+                    ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor)))
+            .callAsync(
+                new AsyncCombiningCallable<Object>() {
+                  @Override
+                  public ClosingFuture<Object> call(DeferredCloser closer, Peeker peeker)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  // We don't need to test the happy case for SuccessfulCombiner.call(Async) because it's the same
+  // as Combiner.
+
+  public void testWhenAllSucceed_call_failedInput() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.whenAllSucceed(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture("value")), failedClosingFuture()))
+            .call(
+                new CombiningCallable<Object>() {
+                  @Override
+                  public Object call(DeferredCloser closer, Peeker peeker) throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor));
+  }
+
+  public void testWhenAllSucceed_callAsync_failedInput() throws Exception {
+    assertFinallyFailsWithException(
+        ClosingFuture.whenAllSucceed(
+                ImmutableList.of(
+                    ClosingFuture.from(immediateFuture("value")), failedClosingFuture()))
+            .callAsync(
+                new AsyncCombiningCallable<Object>() {
+                  @Override
+                  public ClosingFuture<Object> call(DeferredCloser closer, Peeker peeker)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor));
+  }
+
+  public void testWhenAllSucceed2_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value1")))
+            .call(
+                new ClosingFunction2<TestCloseable, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(DeferredCloser closer, TestCloseable v1, String v2)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value1");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed2_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture())
+            .call(
+                new ClosingFunction2<TestCloseable, Object, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, TestCloseable v1, Object v2)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed2_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction2<TestCloseable, TestCloseable, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer, TestCloseable v1, TestCloseable v2)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed2_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor))
+            .call(
+                new ClosingFunction2<TestCloseable, TestCloseable, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, TestCloseable v1, TestCloseable v2)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed2_callAsync() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value1")))
+            .callAsync(
+                new AsyncClosingFunction2<TestCloseable, String, TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> apply(
+                      DeferredCloser closer, TestCloseable v1, String v2) throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value1");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return ClosingFuture.eventuallyClosing(
+                        immediateFuture(closeable3), closingExecutor);
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable3);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed2_callAsync_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture())
+            .callAsync(
+                new AsyncClosingFunction2<TestCloseable, Object, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(
+                      DeferredCloser closer, TestCloseable v1, Object v2) throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed2_callAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)))
+            .callAsync(
+                waiter.waitFor(
+                    new AsyncClosingFunction2<TestCloseable, TestCloseable, TestCloseable>() {
+                      @Override
+                      public ClosingFuture<TestCloseable> apply(
+                          DeferredCloser closer, TestCloseable v1, TestCloseable v2)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return ClosingFuture.eventuallyClosing(
+                            immediateFuture(closeable3), closingExecutor);
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2, closeable3);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed2_callAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor))
+            .callAsync(
+                new AsyncClosingFunction2<TestCloseable, TestCloseable, Object>() {
+                  @Override
+                  public ClosingFuture<Object> apply(
+                      DeferredCloser closer, TestCloseable v1, TestCloseable v2) throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed3_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value2")),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                new ClosingFunction3<TestCloseable, String, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(
+                      DeferredCloser closer, TestCloseable v1, String v2, String v3)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value2");
+                    assertThat(v3).isEqualTo("value3");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed3_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture(),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                new ClosingFunction3<TestCloseable, Object, String, Object>() {
+                  @Override
+                  public Object apply(DeferredCloser closer, TestCloseable v1, Object v2, String v3)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed3_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction3<TestCloseable, TestCloseable, String, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer, TestCloseable v1, TestCloseable v2, String v3)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed3_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor),
+                ClosingFuture.from(immediateFuture("value3")))
+            .call(
+                new ClosingFunction3<TestCloseable, TestCloseable, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer, TestCloseable v1, TestCloseable v2, String v3)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed4_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value2")),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                new ClosingFunction4<TestCloseable, String, String, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(
+                      DeferredCloser closer, TestCloseable v1, String v2, String v3, String v4)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value2");
+                    assertThat(v3).isEqualTo("value3");
+                    assertThat(v4).isEqualTo("value4");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed4_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture(),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                new ClosingFunction4<TestCloseable, Object, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer, TestCloseable v1, Object v2, String v3, String v4)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed4_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction4<
+                        TestCloseable, TestCloseable, String, String, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer,
+                          TestCloseable v1,
+                          TestCloseable v2,
+                          String v3,
+                          String v4)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed4_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")))
+            .call(
+                new ClosingFunction4<TestCloseable, TestCloseable, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      TestCloseable v2,
+                      String v3,
+                      String v4)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testWhenAllSucceed5_call() throws ExecutionException, IOException {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                ClosingFuture.from(immediateFuture("value2")),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                new ClosingFunction5<
+                    TestCloseable, String, String, String, String, TestCloseable>() {
+                  @Override
+                  public TestCloseable apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      String v2,
+                      String v3,
+                      String v4,
+                      String v5)
+                      throws Exception {
+                    assertThat(v1).isEqualTo(closeable1);
+                    assertThat(v2).isEqualTo("value2");
+                    assertThat(v3).isEqualTo("value3");
+                    assertThat(v4).isEqualTo("value4");
+                    assertThat(v5).isEqualTo("value5");
+                    assertStillOpen(closeable1);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return closeable2;
+                  }
+                },
+                executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
+  public void testWhenAllSucceed5_call_failedInput() throws ExecutionException, IOException {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable1), closingExecutor),
+                failedClosingFuture(),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                new ClosingFunction5<TestCloseable, Object, String, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      Object v2,
+                      String v3,
+                      String v4,
+                      String v5)
+                      throws Exception {
+                    expect.fail();
+                    throw new AssertionError();
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+  }
+
+  public void testWhenAllSucceed5_call_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.from(immediateFuture(closeable2)),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                waiter.waitFor(
+                    new ClosingFunction5<
+                        TestCloseable, TestCloseable, String, String, String, TestCloseable>() {
+                      @Override
+                      public TestCloseable apply(
+                          DeferredCloser closer,
+                          TestCloseable v1,
+                          TestCloseable v2,
+                          String v3,
+                          String v4,
+                          String v5)
+                          throws Exception {
+                        awaitUninterruptibly(futureCancelled);
+                        closer.eventuallyClose(closeable1, closingExecutor);
+                        closer.eventuallyClose(closeable2, closingExecutor);
+                        return closeable3;
+                      }
+                    }),
+                executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    // not closed until the function returns
+    assertStillOpen(closeable1, closeable2);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2);
+    assertStillOpen(closeable3);
+  }
+
+  public void testWhenAllSucceed5_call_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.whenAllSucceed(
+                ClosingFuture.from(immediateFuture(closeable1)),
+                ClosingFuture.eventuallyClosing(immediateFuture(closeable2), closingExecutor),
+                ClosingFuture.from(immediateFuture("value3")),
+                ClosingFuture.from(immediateFuture("value4")),
+                ClosingFuture.from(immediateFuture("value5")))
+            .call(
+                new ClosingFunction5<
+                    TestCloseable, TestCloseable, String, String, String, Object>() {
+                  @Override
+                  public Object apply(
+                      DeferredCloser closer,
+                      TestCloseable v1,
+                      TestCloseable v2,
+                      String v3,
+                      String v4,
+                      String v5)
+                      throws Exception {
+                    closer.eventuallyClose(closeable3, closingExecutor);
+                    throw exception;
+                  }
+                },
+                executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertStillOpen(closeable1);
+    assertClosed(closeable2, closeable3);
+  }
+
+  public void testTransform_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.transform(
+            new ClosingFunction<String, String>() {
+              @Override
+              public String apply(DeferredCloser closer, String v) throws Exception {
+                return "value2";
+              }
+            },
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testTransformAsync_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.transformAsync(
+            new AsyncClosingFunction<String, String>() {
+              @Override
+              public ClosingFuture<String> apply(DeferredCloser closer, String v) throws Exception {
+                return ClosingFuture.from(immediateFuture("value2"));
+              }
+            },
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testCatching_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.catching(
+            Exception.class,
+            new ClosingFunction<Exception, String>() {
+              @Override
+              public String apply(DeferredCloser closer, Exception x) throws Exception {
+                return "value2";
+              }
+            },
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testCatchingAsync_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    ClosingFuture<String> unused =
+        closingFuture.catchingAsync(
+            Exception.class,
+            ClosingFuture.withoutCloser(
+                new AsyncFunction<Exception, String>() {
+                  @Override
+                  public ListenableFuture<String> apply(Exception x) throws Exception {
+                    return immediateFuture("value2");
+                  }
+                }),
+            executor);
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testWhenAllComplete_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    Combiner unused = ClosingFuture.whenAllComplete(asList(closingFuture));
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  public void testWhenAllSucceed_preventsFurtherOperations() {
+    ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+    Combiner unused = ClosingFuture.whenAllSucceed(asList(closingFuture));
+    assertDerivingThrowsIllegalStateException(closingFuture);
+    assertFinalStepThrowsIllegalStateException(closingFuture);
+  }
+
+  protected final void assertDerivingThrowsIllegalStateException(
+      ClosingFuture<String> closingFuture) {
+    try {
+      closingFuture.transform(
+          new ClosingFunction<String, String>() {
+            @Override
+            public String apply(DeferredCloser closer3, String v1) throws Exception {
+              return "value3";
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected5) {
+    }
+    try {
+      closingFuture.transformAsync(
+          new AsyncClosingFunction<String, String>() {
+            @Override
+            public ClosingFuture<String> apply(DeferredCloser closer2, String v) throws Exception {
+              return ClosingFuture.from(immediateFuture("value3"));
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected4) {
+    }
+    try {
+      closingFuture.catching(
+          Exception.class,
+          new ClosingFunction<Exception, String>() {
+            @Override
+            public String apply(DeferredCloser closer1, Exception x1) throws Exception {
+              return "value3";
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected3) {
+    }
+    try {
+      closingFuture.catchingAsync(
+          Exception.class,
+          new AsyncClosingFunction<Exception, String>() {
+            @Override
+            public ClosingFuture<String> apply(DeferredCloser closer, Exception x)
+                throws Exception {
+              return ClosingFuture.from(immediateFuture("value3"));
+            }
+          },
+          executor);
+      fail();
+    } catch (IllegalStateException expected2) {
+    }
+    try {
+      ClosingFuture.whenAllComplete(asList(closingFuture));
+      fail();
+    } catch (IllegalStateException expected1) {
+    }
+    try {
+      ClosingFuture.whenAllSucceed(asList(closingFuture));
+      fail();
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  /** Asserts that marking this step a final step throws {@link IllegalStateException}. */
+  protected void assertFinalStepThrowsIllegalStateException(ClosingFuture<?> closingFuture) {
+    try {
+      closingFuture.finishToFuture();
+      fail();
+    } catch (IllegalStateException expected) {
+    }
+    try {
+      closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), executor);
+      fail();
+    } catch (IllegalStateException expected) {
+    }
+  }
+
+  // Avoid infinite recursion if a closeable's close() method throws RejectedExecutionException and
+  // is closed using the direct executor.
+  public void testCloseThrowsRejectedExecutionException() throws Exception {
+    doThrow(new RejectedExecutionException()).when(mockCloseable).close();
+    ClosingFuture<Closeable> closingFuture =
+        ClosingFuture.submit(
+            new ClosingCallable<Closeable>() {
+              @Override
+              public Closeable call(DeferredCloser closer) throws Exception {
+                return closer.eventuallyClose(mockCloseable, directExecutor());
+              }
+            },
+            executor);
+    assertThat(getFinalValue(closingFuture)).isEqualTo(mockCloseable);
+    waitUntilClosed(closingFuture);
+    verify(mockCloseable, timeout(1000)).close();
+  }
+
+  /**
+   * Marks the given step final, waits for it to be finished, and returns the value.
+   *
+   * @throws ExecutionException if the step failed
+   * @throws CancellationException if the step was cancelled
+   */
+  abstract <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException;
+
+  /** Marks the given step final, cancels it, and waits for the cancellation to happen. */
+  abstract void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture);
+
+  /**
+   * Marks the given step final and waits for it to fail. Expects the failure exception to match
+   * {@link ClosingFutureTest#exception}.
+   */
+  abstract void assertFinallyFailsWithException(ClosingFuture<?> closingFuture);
+
+  /** Waits for the given step to be canceled. */
+  abstract void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException;
+
+  /** Waits for the given step's closeables to be closed. */
+  void waitUntilClosed(ClosingFuture<?> closingFuture) {
+    assertTrue(awaitUninterruptibly(closingFuture.whenClosedCountDown(), 1, SECONDS));
+  }
+
+  /** Tests for {@link ClosingFuture} that exercise {@link ClosingFuture#finishToFuture()}. */
+
+  public static class FinishToFutureTest extends ClosingFutureTest {
+
+    public void testFinishToFuture_throwsIfCalledTwice() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+      try {
+        FluentFuture<Closeable> unused2 = closingFuture.finishToFuture();
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testFinishToFuture_throwsAfterCallingFinishToValueAndCloser() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      closingFuture.finishToValueAndCloser(new NoOpValueAndCloserConsumer<>(), directExecutor());
+      try {
+        FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testFinishToFuture_preventsFurtherDerivation() {
+      ClosingFuture<String> closingFuture = ClosingFuture.from(immediateFuture("value1"));
+      FluentFuture<String> unused = closingFuture.finishToFuture();
+      assertDerivingThrowsIllegalStateException(closingFuture);
+    }
+
+    @Override
+    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+      return getUninterruptibly(closingFuture.finishToFuture());
+    }
+
+    @Override
+    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+      assertThatFutureFailsWithException(closingFuture.finishToFuture());
+    }
+
+    @Override
+    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+      assertThatFutureBecomesCancelled(closingFuture.finishToFuture());
+    }
+
+    @Override
+    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+      assertThat(closingFuture.finishToFuture().cancel(false)).isTrue();
+      waitUntilClosed(closingFuture);
+      futureCancelled.countDown();
+    }
+  }
+
+  /**
+   * Tests for {@link ClosingFuture} that exercise {@link
+   * ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)}.
+   */
+
+  public static class FinishToValueAndCloserTest extends ClosingFutureTest {
+
+    private final ExecutorService finishToValueAndCloserExecutor = newSingleThreadExecutor();
+    private volatile ValueAndCloser<?> valueAndCloser;
+
+    @Override
+    protected void tearDown() throws Exception {
+      super.tearDown();
+      assertWithMessage("finishToValueAndCloserExecutor was shut down")
+          .that(shutdownAndAwaitTermination(finishToValueAndCloserExecutor, 10, SECONDS))
+          .isTrue();
+    }
+
+    public void testFinishToValueAndCloser_throwsIfCalledTwice() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      closingFuture.finishToValueAndCloser(
+          new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+      try {
+        closingFuture.finishToValueAndCloser(
+            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testFinishToValueAndCloser_throwsAfterCallingFinishToFuture() throws Exception {
+      ClosingFuture<Closeable> closingFuture =
+          ClosingFuture.submit(
+              new ClosingCallable<Closeable>() {
+                @Override
+                public Closeable call(DeferredCloser closer) throws Exception {
+                  return closer.eventuallyClose(mockCloseable, executor);
+                }
+              },
+              executor);
+      FluentFuture<Closeable> unused = closingFuture.finishToFuture();
+      try {
+        closingFuture.finishToValueAndCloser(
+            new NoOpValueAndCloserConsumer<>(), finishToValueAndCloserExecutor);
+        fail("should have thrown");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    @Override
+    <T> T getFinalValue(ClosingFuture<T> closingFuture) throws ExecutionException {
+      return finishToValueAndCloser(closingFuture).get();
+    }
+
+    @Override
+    void assertFinallyFailsWithException(ClosingFuture<?> closingFuture) {
+      assertThatFutureFailsWithException(closingFuture.statusFuture());
+      ValueAndCloser<?> valueAndCloser = finishToValueAndCloser(closingFuture);
+      try {
+        valueAndCloser.get();
+        fail();
+      } catch (ExecutionException expected) {
+        assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+      }
+      valueAndCloser.closeAsync();
+    }
+
+    @Override
+    void assertBecomesCanceled(ClosingFuture<?> closingFuture) throws ExecutionException {
+      assertThatFutureBecomesCancelled(closingFuture.statusFuture());
+    }
+
+    @Override
+    void waitUntilClosed(ClosingFuture<?> closingFuture) {
+      if (valueAndCloser != null) {
+        valueAndCloser.closeAsync();
+      }
+      super.waitUntilClosed(closingFuture);
+    }
+
+    @Override
+    void cancelFinalStepAndWait(ClosingFuture<TestCloseable> closingFuture) {
+      assertThat(closingFuture.cancel(false)).isTrue();
+      ValueAndCloser<?> unused = finishToValueAndCloser(closingFuture);
+      waitUntilClosed(closingFuture);
+      futureCancelled.countDown();
+    }
+
+    private <V> ValueAndCloser<V> finishToValueAndCloser(ClosingFuture<V> closingFuture) {
+      final CountDownLatch valueAndCloserSet = new CountDownLatch(1);
+      closingFuture.finishToValueAndCloser(
+          new ValueAndCloserConsumer<V>() {
+            @Override
+            public void accept(ValueAndCloser<V> valueAndCloser) {
+              FinishToValueAndCloserTest.this.valueAndCloser = valueAndCloser;
+              valueAndCloserSet.countDown();
+            }
+          },
+          finishToValueAndCloserExecutor);
+      assertWithMessage("valueAndCloser was set")
+          .that(awaitUninterruptibly(valueAndCloserSet, 10, SECONDS))
+          .isTrue();
+      @SuppressWarnings("unchecked")
+      ValueAndCloser<V> valueAndCloserWithType = (ValueAndCloser<V>) valueAndCloser;
+      return valueAndCloserWithType;
+    }
+  }
+
+  void assertThatFutureFailsWithException(Future<?> future) {
+    try {
+      getUninterruptibly(future);
+      fail("Expected future to fail: " + future);
+    } catch (ExecutionException e) {
+      assertThat(e).hasCauseThat().isSameInstanceAs(exception);
+    }
+  }
+
+  private static void assertThatFutureBecomesCancelled(Future<?> future) throws ExecutionException {
+    try {
+      getUninterruptibly(future);
+      fail("Expected future to be canceled: " + future);
+    } catch (CancellationException expected) {
+    }
+  }
+
+  private static void assertStillOpen(TestCloseable closeable1, TestCloseable... moreCloseables)
+      throws IOException {
+    for (TestCloseable closeable : asList(closeable1, moreCloseables)) {
+      assertWithMessage("%s.stillOpen()", closeable).that(closeable.stillOpen()).isTrue();
+    }
+  }
+
+  static void assertClosed(TestCloseable closeable1, TestCloseable... moreCloseables)
+      throws IOException {
+    for (TestCloseable closeable : asList(closeable1, moreCloseables)) {
+      assertWithMessage("%s.isClosed()", closeable).that(closeable.awaitClosed()).isTrue();
+    }
+  }
+
+  private ClosingFuture<Object> failedClosingFuture() {
+    return ClosingFuture.from(immediateFailedFuture(exception));
+  }
+
+  private void assertNoExpectedFailures() {
+    assertWithMessage("executor was shut down")
+        .that(shutdownAndAwaitTermination(executor, 10, SECONDS))
+        .isTrue();
+    assertWithMessage("closingExecutor was shut down")
+        .that(shutdownAndAwaitTermination(closingExecutor, 10, SECONDS))
+        .isTrue();
+    if (!failures.isEmpty()) {
+      StringWriter message = new StringWriter();
+      PrintWriter writer = new PrintWriter(message);
+      writer.println("Expected no failures, but found:");
+      for (AssertionError failure : failures) {
+        failure.printStackTrace(writer);
+      }
+      failures.clear();
+      assertWithMessage(message.toString()).fail();
+    }
+  }
+
+  static final class TestCloseable implements Closeable {
+    private final CountDownLatch latch = new CountDownLatch(1);
+    private final String name;
+
+    TestCloseable(String name) {
+      this.name = name;
+    }
+
+    @Override
+    public void close() throws IOException {
+      latch.countDown();
+    }
+
+    boolean awaitClosed() {
+      return awaitUninterruptibly(latch, 10, SECONDS);
+    }
+
+    boolean stillOpen() {
+      return !awaitUninterruptibly(latch, 1, SECONDS);
+    }
+
+    @Override
+    public String toString() {
+      return name;
+    }
+  }
+
+  static final class Waiter {
+    private final CountDownLatch started = new CountDownLatch(1);
+    private final CountDownLatch canReturn = new CountDownLatch(1);
+    private final CountDownLatch returned = new CountDownLatch(1);
+    private Object proxy;
+
+    <V> Callable<V> waitFor(Callable<V> callable) {
+      return waitFor(callable, Callable.class);
+    }
+
+    <V> ClosingCallable<V> waitFor(ClosingCallable<V> closingCallable) {
+      return waitFor(closingCallable, ClosingCallable.class);
+    }
+
+    <T, U> ClosingFunction<T, U> waitFor(ClosingFunction<T, U> closingFunction) {
+      return waitFor(closingFunction, ClosingFunction.class);
+    }
+
+    <T, U> AsyncClosingFunction<T, U> waitFor(AsyncClosingFunction<T, U> asyncClosingFunction) {
+      return waitFor(asyncClosingFunction, AsyncClosingFunction.class);
+    }
+
+    <V> CombiningCallable<V> waitFor(CombiningCallable<V> combiningCallable) {
+      return waitFor(combiningCallable, CombiningCallable.class);
+    }
+
+    <V> AsyncCombiningCallable<V> waitFor(AsyncCombiningCallable<V> asyncCombiningCallable) {
+      return waitFor(asyncCombiningCallable, AsyncCombiningCallable.class);
+    }
+
+    <V1, V2, U> ClosingFunction2<V1, V2, U> waitFor(ClosingFunction2<V1, V2, U> closingFunction2) {
+      return waitFor(closingFunction2, ClosingFunction2.class);
+    }
+
+    <V1, V2, U> AsyncClosingFunction2<V1, V2, U> waitFor(
+        AsyncClosingFunction2<V1, V2, U> asyncClosingFunction2) {
+      return waitFor(asyncClosingFunction2, AsyncClosingFunction2.class);
+    }
+
+    <V1, V2, V3, U> ClosingFunction3<V1, V2, V3, U> waitFor(
+        ClosingFunction3<V1, V2, V3, U> closingFunction3) {
+      return waitFor(closingFunction3, ClosingFunction3.class);
+    }
+
+    <V1, V2, V3, V4, U> ClosingFunction4<V1, V2, V3, V4, U> waitFor(
+        ClosingFunction4<V1, V2, V3, V4, U> closingFunction4) {
+      return waitFor(closingFunction4, ClosingFunction4.class);
+    }
+
+    <V1, V2, V3, V4, V5, U> ClosingFunction5<V1, V2, V3, V4, V5, U> waitFor(
+        ClosingFunction5<V1, V2, V3, V4, V5, U> closingFunction5) {
+      return waitFor(closingFunction5, ClosingFunction5.class);
+    }
+
+    <T> T waitFor(final T delegate, final Class<T> type) {
+      checkState(proxy == null);
+      T proxyObject =
+          Reflection.newProxy(
+              type,
+              new InvocationHandler() {
+                @Override
+                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                  if (!method.getDeclaringClass().equals(type)) {
+                    return method.invoke(delegate, args);
+                  }
+                  checkState(started.getCount() == 1);
+                  started.countDown();
+                  try {
+                    return method.invoke(delegate, args);
+                  } catch (InvocationTargetException e) {
+                    throw e.getCause();
+                  } finally {
+                    awaitUninterruptibly(canReturn);
+                    returned.countDown();
+                  }
+                }
+              });
+      this.proxy = proxyObject;
+      return proxyObject;
+    }
+
+    void awaitStarted() {
+      assertTrue(awaitUninterruptibly(started, 10, SECONDS));
+    }
+
+    void awaitReturned() {
+      canReturn.countDown();
+      assertTrue(awaitUninterruptibly(returned, 10, SECONDS));
+    }
+  }
+
+  private static final class NoOpValueAndCloserConsumer<V> implements ValueAndCloserConsumer<V> {
+    @Override
+    public void accept(ValueAndCloser<V> valueAndCloser) {}
+  }
+}
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 6d67e9a..687f226 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
@@ -15,15 +15,27 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.Futures.allAsList;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.Function;
+import com.google.common.testing.GcFinalization;
+import com.google.common.testing.TestLogHandler;
+import com.google.j2objc.annotations.J2ObjCIncompatible;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
 import junit.framework.TestCase;
 
 /** Tests for {@link ExecutionSequencer} */
@@ -60,11 +72,6 @@
     assertThat(secondCallable.called).isTrue();
   }
 
-  public void testCancellationNotPropagatedIfAlreadyStarted() {
-    serializer.submitAsync(firstCallable, directExecutor()).cancel(true);
-    assertThat(firstFuture.isCancelled()).isFalse();
-  }
-
   public void testCancellationDoesNotViolateSerialization() {
     @SuppressWarnings({"unused", "nullness"})
     Future<?> possiblyIgnoredError = serializer.submitAsync(firstCallable, directExecutor());
@@ -140,8 +147,268 @@
     assertThat(getDone(future2)).isFalse();
   }
 
+  @GwtIncompatible
+  @J2ObjCIncompatible // gc
+  @AndroidIncompatible
+  public void testCancellationWithReferencedObject() throws Exception {
+    Object toBeGCed = new Object();
+    WeakReference<Object> ref = new WeakReference<>(toBeGCed);
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ListenableFuture<?> ignored =
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor());
+    serializer.submit(toStringCallable(toBeGCed), directExecutor()).cancel(true);
+    toBeGCed = null;
+    GcFinalization.awaitClear(ref);
+  }
+
+  private static Callable<String> toStringCallable(final Object object) {
+    return new Callable<String>() {
+      @Override
+      public String call() {
+        return object.toString();
+      }
+    };
+  }
+
+  public void testCancellationDuringReentrancy() throws Exception {
+    TestLogHandler logHandler = new TestLogHandler();
+    Logger.getLogger(AbstractFuture.class.getName()).addHandler(logHandler);
+
+    List<Future<?>> results = new ArrayList<>();
+    final Runnable[] manualExecutorTask = new Runnable[1];
+    Executor manualExecutor =
+        new Executor() {
+          @Override
+          public void execute(Runnable task) {
+            manualExecutorTask[0] = task;
+          }
+        };
+
+    results.add(serializer.submit(Callables.returning(null), manualExecutor));
+    final Future<?>[] thingToCancel = new Future<?>[1];
+    results.add(
+        serializer.submit(
+            new Callable<Void>() {
+              @Override
+              public Void call() {
+                thingToCancel[0].cancel(false);
+                return null;
+              }
+            },
+            directExecutor()));
+    thingToCancel[0] = serializer.submit(Callables.returning(null), directExecutor());
+    results.add(thingToCancel[0]);
+    // Enqueue more than enough tasks to force reentrancy.
+    for (int i = 0; i < 5; i++) {
+      results.add(serializer.submit(Callables.returning(null), directExecutor()));
+    }
+
+    manualExecutorTask[0].run();
+
+    for (Future<?> result : results) {
+      if (!result.isCancelled()) {
+        result.get(10, SECONDS);
+      }
+      // TODO(cpovirk): Verify that the cancelled futures are exactly ones that we expect.
+    }
+
+    assertThat(logHandler.getStoredLogRecords()).isEmpty();
+  }
+
+  public void testAvoidsStackOverflow_manySubmitted() throws Exception {
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ArrayList<ListenableFuture<Void>> results = new ArrayList<>(50_001);
+    results.add(
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor()));
+    for (int i = 0; i < 50_000; i++) {
+      results.add(serializer.submit(Callables.<Void>returning(null), directExecutor()));
+    }
+    settableFuture.set(null);
+    getDone(allAsList(results));
+  }
+
+  public void testAvoidsStackOverflow_manyCancelled() throws Exception {
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ListenableFuture<Void> unused =
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor());
+    for (int i = 0; i < 50_000; i++) {
+      serializer.submit(Callables.<Void>returning(null), directExecutor()).cancel(true);
+    }
+    ListenableFuture<Integer> stackDepthCheck =
+        serializer.submit(
+            new Callable<Integer>() {
+              @Override
+              public Integer call() {
+                return Thread.currentThread().getStackTrace().length;
+              }
+            },
+            directExecutor());
+    settableFuture.set(null);
+    assertThat(getDone(stackDepthCheck))
+        .isLessThan(Thread.currentThread().getStackTrace().length + 100);
+  }
+
+  public void testAvoidsStackOverflow_alternatingCancelledAndSubmitted() throws Exception {
+    final SettableFuture<Void> settableFuture = SettableFuture.create();
+    ListenableFuture<Void> unused =
+        serializer.submitAsync(
+            new AsyncCallable<Void>() {
+              @Override
+              public ListenableFuture<Void> call() {
+                return settableFuture;
+              }
+            },
+            directExecutor());
+    for (int i = 0; i < 25_000; i++) {
+      serializer.submit(Callables.<Void>returning(null), directExecutor()).cancel(true);
+      unused = serializer.submit(Callables.<Void>returning(null), directExecutor());
+    }
+    ListenableFuture<Integer> stackDepthCheck =
+        serializer.submit(
+            new Callable<Integer>() {
+              @Override
+              public Integer call() {
+                return Thread.currentThread().getStackTrace().length;
+              }
+            },
+            directExecutor());
+    settableFuture.set(null);
+    assertThat(getDone(stackDepthCheck))
+        .isLessThan(Thread.currentThread().getStackTrace().length + 100);
+  }
+
+  private static Function<Integer, Integer> add(final int delta) {
+    return new Function<Integer, Integer>() {
+      @Override
+      public Integer apply(Integer input) {
+        return input + delta;
+      }
+    };
+  }
+
+  private static AsyncCallable<Integer> asyncAdd(
+      final ListenableFuture<Integer> future, final int delta, final Executor executor) {
+    return new AsyncCallable<Integer>() {
+      @Override
+      public ListenableFuture<Integer> call() throws Exception {
+        return Futures.transform(future, add(delta), executor);
+      }
+    };
+  }
+
+  private static final class LongHolder {
+    long count;
+  }
+
+  private static final int ITERATION_COUNT = 50_000;
+  private static final int DIRECT_EXECUTIONS_PER_THREAD = 100;
+
+  @GwtIncompatible // threads
+
+  public void testAvoidsStackOverflow_multipleThreads() throws Exception {
+    final LongHolder holder = new LongHolder();
+    final ArrayList<ListenableFuture<Integer>> lengthChecks = new ArrayList<>();
+    final List<Integer> completeLengthChecks;
+    final int baseStackDepth;
+    ExecutorService service = Executors.newFixedThreadPool(5);
+    try {
+      // Avoid counting frames from the executor itself, or the ExecutionSequencer
+      baseStackDepth =
+          serializer
+              .submit(
+                  new Callable<Integer>() {
+                    @Override
+                    public Integer call() {
+                      return Thread.currentThread().getStackTrace().length;
+                    }
+                  },
+                  service)
+              .get();
+      final SettableFuture<Void> settableFuture = SettableFuture.create();
+      ListenableFuture<?> unused =
+          serializer.submitAsync(
+              new AsyncCallable<Void>() {
+                @Override
+                public ListenableFuture<Void> call() {
+                  return settableFuture;
+                }
+              },
+              directExecutor());
+      for (int i = 0; i < 50_000; i++) {
+        if (i % DIRECT_EXECUTIONS_PER_THREAD == 0) {
+          // after some number of iterations, switch threads
+          unused =
+              serializer.submit(
+                  new Callable<Void>() {
+                    @Override
+                    public Void call() {
+                      holder.count++;
+                      return null;
+                    }
+                  },
+                  service);
+        } else if (i % DIRECT_EXECUTIONS_PER_THREAD == DIRECT_EXECUTIONS_PER_THREAD - 1) {
+          // When at max depth, record stack trace depth
+          lengthChecks.add(
+              serializer.submit(
+                  new Callable<Integer>() {
+                    @Override
+                    public Integer call() {
+                      holder.count++;
+                      return Thread.currentThread().getStackTrace().length;
+                    }
+                  },
+                  directExecutor()));
+        } else {
+          // Otherwise, schedule a task on directExecutor
+          unused =
+              serializer.submit(
+                  new Callable<Void>() {
+                    @Override
+                    public Void call() {
+                      holder.count++;
+                      return null;
+                    }
+                  },
+                  directExecutor());
+        }
+      }
+      settableFuture.set(null);
+      completeLengthChecks = allAsList(lengthChecks).get();
+    } finally {
+      service.shutdown();
+    }
+    assertThat(holder.count).isEqualTo(ITERATION_COUNT);
+    for (int length : completeLengthChecks) {
+      // Verify that at max depth, less than one stack frame per submitted task was consumed
+      assertThat(length - baseStackDepth).isLessThan(DIRECT_EXECUTIONS_PER_THREAD / 2);
+    }
+  }
+
+  @SuppressWarnings("ObjectToString") // Intended behavior
   public void testToString() {
-    Future<?> first = serializer.submitAsync(firstCallable, directExecutor());
+    Future<?> unused = serializer.submitAsync(firstCallable, directExecutor());
     TestCallable secondCallable = new TestCallable(SettableFuture.<Void>create());
     Future<?> second = serializer.submitAsync(secondCallable, directExecutor());
     assertThat(secondCallable.called).isFalse();
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 6c66c46..ab53f53 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
@@ -41,7 +41,12 @@
 public class FluentFutureTest extends TestCase {
   public void testFromFluentFuture() {
     FluentFuture<String> f = FluentFuture.from(SettableFuture.<String>create());
-    assertThat(FluentFuture.from(f)).isSameAs(f);
+    assertThat(FluentFuture.from(f)).isSameInstanceAs(f);
+  }
+
+  public void testFromFluentFuturePassingAsNonFluent() {
+    ListenableFuture<String> f = FluentFuture.from(SettableFuture.<String>create());
+    assertThat(FluentFuture.from(f)).isSameInstanceAs(f);
   }
 
   public void testFromNonFluentFuture() throws Exception {
diff --git a/guava-tests/test/com/google/common/util/concurrent/ForwardingCheckedFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/ForwardingCheckedFutureTest.java
deleted file mode 100644
index 3c71997..0000000
--- a/guava-tests/test/com/google/common/util/concurrent/ForwardingCheckedFutureTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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 junit.framework.TestCase;
-
-/**
- * Test for {@link ForwardingCheckedFuture}
- *
- * @author Ben Yu
- */
-public class ForwardingCheckedFutureTest extends TestCase {
-  public void testForwarding() {
-    ForwardingObjectTester.testForwardingObject(ForwardingCheckedFuture.class);
-  }
-}
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 3c19478..2ec1736 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
@@ -160,7 +160,7 @@
       getChecked(FAILED_FUTURE_CHECKED_EXCEPTION, ExceptionWithGoodAndBadConstructor.class);
       fail();
     } catch (ExceptionWithGoodAndBadConstructor expected) {
-      assertThat(expected).hasCauseThat().isSameAs(CHECKED_EXCEPTION);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(CHECKED_EXCEPTION);
     }
   }
 
@@ -287,7 +287,7 @@
           TimeUnit.SECONDS);
       fail();
     } catch (ExceptionWithGoodAndBadConstructor expected) {
-      assertThat(expected).hasCauseThat().isSameAs(CHECKED_EXCEPTION);
+      assertThat(expected).hasCauseThat().isSameInstanceAs(CHECKED_EXCEPTION);
     }
   }
 
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 b0c2afa..9586a65 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
@@ -29,15 +29,14 @@
 import static com.google.common.util.concurrent.Futures.catchingAsync;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
-import static com.google.common.util.concurrent.Futures.immediateCheckedFuture;
-import static com.google.common.util.concurrent.Futures.immediateFailedCheckedFuture;
 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.Futures.immediateVoidFuture;
 import static com.google.common.util.concurrent.Futures.inCompletionOrder;
 import static com.google.common.util.concurrent.Futures.lazyTransform;
-import static com.google.common.util.concurrent.Futures.makeChecked;
 import static com.google.common.util.concurrent.Futures.nonCancellationPropagating;
 import static com.google.common.util.concurrent.Futures.scheduleAsync;
+import static com.google.common.util.concurrent.Futures.submit;
 import static com.google.common.util.concurrent.Futures.submitAsync;
 import static com.google.common.util.concurrent.Futures.successfulAsList;
 import static com.google.common.util.concurrent.Futures.transform;
@@ -49,7 +48,7 @@
 import static com.google.common.util.concurrent.TestPlatform.getDoneFromTimeoutOverload;
 import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
-import static java.lang.Thread.currentThread;
+import static com.google.common.util.concurrent.testing.TestingExecutors.noOpScheduledExecutor;
 import static java.util.Arrays.asList;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
@@ -140,6 +139,14 @@
     assertThat(future.toString()).contains("[status=SUCCESS, result=[" + DATA1 + "]]");
   }
 
+  public void testImmediateVoidFuture() throws Exception {
+    ListenableFuture<Void> voidFuture = immediateVoidFuture();
+
+    assertThat(getDone(voidFuture)).isNull();
+    assertThat(getDoneFromTimeoutOverload(voidFuture)).isNull();
+    assertThat(voidFuture.toString()).contains("[status=SUCCESS, result=[null]]");
+  }
+
   public void testImmediateFailedFuture() throws Exception {
     Exception exception = new Exception();
     ListenableFuture<String> future = immediateFailedFuture(exception);
@@ -232,49 +239,6 @@
 
   private static class MyException extends Exception {}
 
-  @GwtIncompatible // immediateCheckedFuture
-  public void testImmediateCheckedFuture() throws Exception {
-    CheckedFuture<String, MyException> future = immediateCheckedFuture(DATA1);
-    assertThat(future.toString()).endsWith("[status=SUCCESS, result=[" + DATA1 + "]]");
-
-    // Verify that the proper object is returned without waiting
-    assertSame(DATA1, future.get(0L, MILLISECONDS));
-    assertSame(DATA1, future.checkedGet(0L, MILLISECONDS));
-  }
-
-  @GwtIncompatible // immediateCheckedFuture
-  public void testMultipleImmediateCheckedFutures() throws Exception {
-    CheckedFuture<String, MyException> future1 = immediateCheckedFuture(DATA1);
-    CheckedFuture<String, MyException> future2 = immediateCheckedFuture(DATA2);
-
-    // Verify that the proper objects are returned without waiting
-    assertSame(DATA1, future1.get(0L, MILLISECONDS));
-    assertSame(DATA1, future1.checkedGet(0L, MILLISECONDS));
-    assertSame(DATA2, future2.get(0L, MILLISECONDS));
-    assertSame(DATA2, future2.checkedGet(0L, MILLISECONDS));
-  }
-
-  @GwtIncompatible // immediateFailedCheckedFuture
-  public void testImmediateFailedCheckedFuture() throws Exception {
-    MyException exception = new MyException();
-    CheckedFuture<String, MyException> future = immediateFailedCheckedFuture(exception);
-    assertThat(future.toString()).endsWith("[status=FAILURE, cause=[" + exception + "]]");
-
-    try {
-      future.get(0L, MILLISECONDS);
-      fail();
-    } catch (ExecutionException expected) {
-      assertSame(exception, expected.getCause());
-    }
-
-    try {
-      future.checkedGet(0L, MILLISECONDS);
-      fail();
-    } catch (MyException expected) {
-      assertSame(exception, expected);
-    }
-  }
-
   // Class hierarchy for generics sanity checks
   private static class Foo {}
 
@@ -844,26 +808,23 @@
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
     AsyncFunction<Object, Object> function =
-        new AsyncFunction<Object, Object>() {
-          @Override
-          public ListenableFuture<Object> apply(Object input) throws Exception {
-            functionCalled.countDown();
-            functionBlocking.await();
-            return immediateFuture(null);
-          }
-
-          @Override
-          public String toString() {
-            return "Called my toString";
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncFunction<Object, Object>() {
+              @Override
+              public ListenableFuture<Object> apply(Object input) throws Exception {
+                functionCalled.countDown();
+                functionBlocking.await();
+                return immediateFuture(null);
+              }
+            });
 
     ExecutorService executor = Executors.newSingleThreadExecutor();
     try {
       ListenableFuture<?> output =
           Futures.transformAsync(immediateFuture(null), function, executor);
       functionCalled.await();
-      assertThat(output.toString()).contains("Called my toString");
+      assertThat(output.toString()).contains(function.toString());
     } finally {
       functionBlocking.countDown();
       executor.shutdown();
@@ -995,7 +956,7 @@
             new AsyncFunction<Throwable, Integer>() {
               @Override
               public ListenableFuture<Integer> apply(Throwable t) throws Exception {
-                assertThat(t).isSameAs(raisedException);
+                assertThat(t).isSameInstanceAs(raisedException);
                 return immediateFuture(20);
               }
             });
@@ -1128,7 +1089,7 @@
             new AsyncFunction<Throwable, Integer>() {
               @Override
               public ListenableFuture<Integer> apply(Throwable t) throws Exception {
-                assertThat(t).isSameAs(raisedException);
+                assertThat(t).isSameInstanceAs(raisedException);
                 return secondary;
               }
             });
@@ -1216,19 +1177,16 @@
     final CountDownLatch functionCalled = new CountDownLatch(1);
     final CountDownLatch functionBlocking = new CountDownLatch(1);
     AsyncFunction<Object, Object> function =
-        new AsyncFunction<Object, Object>() {
-          @Override
-          public ListenableFuture<Object> apply(Object input) throws Exception {
-            functionCalled.countDown();
-            functionBlocking.await();
-            return immediateFuture(null);
-          }
-
-          @Override
-          public String toString() {
-            return "Called my toString";
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncFunction<Object, Object>() {
+              @Override
+              public ListenableFuture<Object> apply(Object input) throws Exception {
+                functionCalled.countDown();
+                functionBlocking.await();
+                return immediateFuture(null);
+              }
+            });
 
     ExecutorService executor = Executors.newSingleThreadExecutor();
     try {
@@ -1236,7 +1194,7 @@
           Futures.catchingAsync(
               immediateFailedFuture(new RuntimeException()), Throwable.class, function, executor);
       functionCalled.await();
-      assertThat(output.toString()).contains("Called my toString");
+      assertThat(output.toString()).contains(function.toString());
     } finally {
       functionBlocking.countDown();
       executor.shutdown();
@@ -1246,17 +1204,14 @@
   public void testCatchingAsync_futureToString() throws Exception {
     final SettableFuture<Object> toReturn = SettableFuture.create();
     AsyncFunction<Object, Object> function =
-        new AsyncFunction<Object, Object>() {
-          @Override
-          public ListenableFuture<Object> apply(Object input) throws Exception {
-            return toReturn;
-          }
-
-          @Override
-          public String toString() {
-            return "Called my toString";
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncFunction<Object, Object>() {
+              @Override
+              public ListenableFuture<Object> apply(Object input) throws Exception {
+                return toReturn;
+              }
+            });
 
     ListenableFuture<?> output =
         Futures.catchingAsync(
@@ -1284,7 +1239,7 @@
             new Function<Throwable, Integer>() {
               @Override
               public Integer apply(Throwable t) {
-                assertThat(t).isSameAs(raisedException);
+                assertThat(t).isSameInstanceAs(raisedException);
                 return 20;
               }
             });
@@ -1983,6 +1938,82 @@
     assertThat(Thread.interrupted()).isFalse();
   }
 
+  public void testSubmit_callable_returnsValue() throws Exception {
+    Callable<Integer> callable =
+        new Callable<Integer>() {
+          @Override
+          public Integer call() {
+            return 42;
+          }
+        };
+    ListenableFuture<Integer> future = submit(callable, directExecutor());
+    assertThat(future.isDone()).isTrue();
+    assertThat(getDone(future)).isEqualTo(42);
+  }
+
+  public void testSubmit_callable_throwsException() {
+    final Exception exception = new Exception("Exception for testing");
+    Callable<Integer> callable =
+        new Callable<Integer>() {
+          @Override
+          public Integer call() throws Exception {
+            throw exception;
+          }
+        };
+    ListenableFuture<Integer> future = submit(callable, directExecutor());
+    try {
+      getDone(future);
+      fail();
+    } catch (ExecutionException expected) {
+      assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+    }
+  }
+
+  public void testSubmit_runnable_completesAfterRun() throws Exception {
+    final List<Runnable> pendingRunnables = newArrayList();
+    final List<Runnable> executedRunnables = newArrayList();
+    Runnable runnable =
+        new Runnable() {
+          @Override
+          public void run() {
+            executedRunnables.add(this);
+          }
+        };
+    Executor executor =
+        new Executor() {
+          @Override
+          public void execute(Runnable runnable) {
+            pendingRunnables.add(runnable);
+          }
+        };
+    ListenableFuture<Void> future = submit(runnable, executor);
+    assertThat(future.isDone()).isFalse();
+    assertThat(executedRunnables).isEmpty();
+    assertThat(pendingRunnables).hasSize(1);
+    pendingRunnables.remove(0).run();
+    assertThat(future.isDone()).isTrue();
+    assertThat(executedRunnables).containsExactly(runnable);
+    assertThat(pendingRunnables).isEmpty();
+  }
+
+  public void testSubmit_runnable_throwsException() throws Exception {
+    final RuntimeException exception = new RuntimeException("Exception for testing");
+    Runnable runnable =
+        new Runnable() {
+          @Override
+          public void run() {
+            throw exception;
+          }
+        };
+    ListenableFuture<Void> future = submit(runnable, directExecutor());
+    try {
+      getDone(future);
+      fail();
+    } catch (ExecutionException expected) {
+      assertThat(expected).hasCauseThat().isSameInstanceAs(exception);
+    }
+  }
+
   @GwtIncompatible // threads
 
   public void testScheduleAsync_asyncCallable_error() throws InterruptedException {
@@ -2484,7 +2515,7 @@
       fail();
     } catch (CancellationException expected) {
       assertThat(getOnlyElement(aggregateFutureLogHandler.getStoredLogRecords()).getThrown())
-          .isSameAs(subsequentFailure);
+          .isSameInstanceAs(subsequentFailure);
     }
   }
 
@@ -2559,25 +2590,66 @@
     unused = whenAllComplete(asList(futures)).call(combiner, directExecutor());
   }
 
+  @GwtIncompatible // threads
+
   public void testWhenAllComplete_asyncResult() throws Exception {
-    final SettableFuture<Integer> futureInteger = SettableFuture.create();
-    final SettableFuture<Boolean> futureBoolean = SettableFuture.create();
+    SettableFuture<Integer> futureInteger = SettableFuture.create();
+    SettableFuture<Boolean> futureBoolean = SettableFuture.create();
+
+    final ExecutorService executor = newSingleThreadExecutor();
+    final CountDownLatch callableBlocking = new CountDownLatch(1);
+    final SettableFuture<String> resultOfCombiner = SettableFuture.create();
     AsyncCallable<String> combiner =
-        new AsyncCallable<String>() {
-          @Override
-          public ListenableFuture<String> call() throws Exception {
-            return immediateFuture(
-                createCombinedResult(getDone(futureInteger), getDone(futureBoolean)));
-          }
-        };
+        tagged(
+            "Called my toString",
+            new AsyncCallable<String>() {
+              @Override
+              public ListenableFuture<String> call() throws Exception {
+                // Make this executor terminate after this task so that the test can tell when
+                // futureResult has received resultOfCombiner.
+                executor.shutdown();
+                callableBlocking.await();
+                return resultOfCombiner;
+              }
+            });
 
     ListenableFuture<String> futureResult =
-        whenAllComplete(futureInteger, futureBoolean).callAsync(combiner, directExecutor());
+        whenAllComplete(futureInteger, futureBoolean).callAsync(combiner, executor);
+
+    // Waiting on backing futures
+    assertThat(futureResult.toString())
+        .matches(
+            "CombinedFuture@\\w+\\[status=PENDING,"
+                + " info=\\[futures=\\[SettableFuture@\\w+\\[status=PENDING],"
+                + " SettableFuture@\\w+\\[status=PENDING]]]]");
     Integer integerPartial = 1;
     futureInteger.set(integerPartial);
+    assertThat(futureResult.toString())
+        .matches(
+            "CombinedFuture@\\w+\\[status=PENDING,"
+                + " info=\\[futures=\\[SettableFuture@\\w+\\[status=SUCCESS,"
+                + " result=\\[java.lang.Integer@\\w+]], SettableFuture@\\w+\\[status=PENDING]]]]");
+
+    // Backing futures complete
     Boolean booleanPartial = true;
     futureBoolean.set(booleanPartial);
-    assertEquals(createCombinedResult(integerPartial, booleanPartial), getDone(futureResult));
+    // Once the backing futures are done there's a (brief) moment where we know nothing
+    assertThat(futureResult.toString()).matches("CombinedFuture@\\w+\\[status=PENDING]");
+    callableBlocking.countDown();
+    // Need to wait for resultFuture to be returned.
+    assertTrue(executor.awaitTermination(10, SECONDS));
+    // But once the async function has returned a future we can include that in the toString
+    assertThat(futureResult.toString())
+        .matches(
+            "CombinedFuture@\\w+\\[status=PENDING,"
+                + " setFuture=\\[SettableFuture@\\w+\\[status=PENDING]]]");
+
+    // Future complete
+    resultOfCombiner.set(createCombinedResult(getDone(futureInteger), getDone(futureBoolean)));
+    String expectedResult = createCombinedResult(integerPartial, booleanPartial);
+    assertEquals(expectedResult, futureResult.get());
+    assertThat(futureResult.toString())
+        .matches("CombinedFuture@\\w+\\[status=SUCCESS, result=\\[java.lang.String@\\w+]]");
   }
 
   public void testWhenAllComplete_asyncError() throws Exception {
@@ -2848,6 +2920,84 @@
     }
   }
 
+  @AndroidIncompatible
+  @GwtIncompatible
+  public void testWhenAllSucceed_releasesInputFuturesUponSubmission() throws Exception {
+    SettableFuture<Long> future1 = SettableFuture.create();
+    SettableFuture<Long> future2 = SettableFuture.create();
+    WeakReference<SettableFuture<Long>> future1Ref = new WeakReference<>(future1);
+    WeakReference<SettableFuture<Long>> future2Ref = new WeakReference<>(future2);
+
+    Callable<Long> combiner =
+        new Callable<Long>() {
+          @Override
+          public Long call() {
+            throw new AssertionError();
+          }
+        };
+
+    ListenableFuture<Long> unused =
+        whenAllSucceed(future1, future2).call(combiner, noOpScheduledExecutor());
+
+    future1.set(1L);
+    future1 = null;
+    future2.set(2L);
+    future2 = null;
+
+    /*
+     * Futures should be collected even if combiner never runs. This is kind of a silly test, since
+     * the combiner is almost certain to hold its own reference to the futures, and a real app would
+     * hold a reference to the executor and thus to the combiner. What we really care about is that
+     * the futures are released once the combiner is done running. But we happen to provide this
+     * earlier cleanup at the moment, so we're testing it.
+     */
+    GcFinalization.awaitClear(future1Ref);
+    GcFinalization.awaitClear(future2Ref);
+  }
+
+  @AndroidIncompatible
+  @GwtIncompatible
+  public void testWhenAllComplete_releasesInputFuturesUponCancellation() throws Exception {
+    SettableFuture<Long> future = SettableFuture.create();
+    WeakReference<SettableFuture<Long>> futureRef = new WeakReference<>(future);
+
+    Callable<Long> combiner =
+        new Callable<Long>() {
+          @Override
+          public Long call() {
+            throw new AssertionError();
+          }
+        };
+
+    ListenableFuture<Long> unused = whenAllComplete(future).call(combiner, noOpScheduledExecutor());
+
+    unused.cancel(false);
+    future = null;
+
+    // Future should be collected because whenAll*Complete* doesn't need to look at its result.
+    GcFinalization.awaitClear(futureRef);
+  }
+
+  @AndroidIncompatible
+  @GwtIncompatible
+  public void testWhenAllSucceed_releasesCallable() throws Exception {
+    AsyncCallable<Long> combiner =
+        new AsyncCallable<Long>() {
+          @Override
+          public ListenableFuture<Long> call() {
+            return SettableFuture.create();
+          }
+        };
+    WeakReference<AsyncCallable<Long>> combinerRef = new WeakReference<>(combiner);
+
+    ListenableFuture<Long> unused =
+        whenAllSucceed(immediateFuture(1L)).callAsync(combiner, directExecutor());
+
+    combiner = null;
+    // combiner should be collected even if the future it returns never completes.
+    GcFinalization.awaitClear(combinerRef);
+  }
+
   /*
    * TODO(cpovirk): maybe pass around TestFuture instances instead of
    * ListenableFuture instances
@@ -3117,7 +3267,7 @@
       throw failureWithCause(e, "Unexpected exception");
     } finally {
       executor.shutdownNow();
-      // TODO(cpovirk: assertTrue(awaitTerminationUninterruptibly(executor, 10, SECONDS));
+      // TODO(cpovirk): assertTrue(awaitTerminationUninterruptibly(executor, 10, SECONDS));
     }
   }
 
@@ -3481,6 +3631,24 @@
     assertThat(logged.get(0).getThrown()).isInstanceOf(MyError.class);
   }
 
+  public void testSuccessfulAsList_failureLoggedEvenAfterOutputCancelled() throws Exception {
+    ListenableFuture<String> input = new CancelPanickingFuture<>();
+    ListenableFuture<List<String>> output = successfulAsList(input);
+    output.cancel(false);
+
+    List<LogRecord> logged = aggregateFutureLogHandler.getStoredLogRecords();
+    assertThat(logged).hasSize(1);
+    assertThat(logged.get(0).getThrown()).hasMessageThat().isEqualTo("You can't fire me, I quit.");
+  }
+
+  private static final class CancelPanickingFuture<V> extends AbstractFuture<V> {
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+      setException(new Error("You can't fire me, I quit."));
+      return false;
+    }
+  }
+
   public void testNonCancellationPropagating_successful() throws Exception {
     SettableFuture<Foo> input = SettableFuture.create();
     ListenableFuture<Foo> wrapper = nonCancellationPropagating(input);
@@ -3536,233 +3704,6 @@
   }
 
   @GwtIncompatible // used only in GwtIncompatible tests
-  private static final Function<Exception, TestException> mapper =
-      new Function<Exception, TestException>() {
-        @Override
-        public TestException apply(Exception from) {
-          if (from instanceof ExecutionException) {
-            return new TestException(from.getCause());
-          } else {
-            assertTrue(
-                "got " + from.getClass(),
-                from instanceof InterruptedException || from instanceof CancellationException);
-            return new TestException(from);
-          }
-        }
-      };
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_mapsExecutionExceptions() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked = makeChecked(future, mapper);
-
-    future.setException(new IOException("checked"));
-
-    assertTrue(checked.isDone());
-    assertFalse(checked.isCancelled());
-
-    try {
-      checked.get();
-      fail();
-    } catch (ExecutionException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-
-    try {
-      checked.get(5, SECONDS);
-      fail();
-    } catch (ExecutionException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(IOException.class);
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_mapsInterruption() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked = makeChecked(future, mapper);
-
-    currentThread().interrupt();
-
-    try {
-      checked.get();
-      fail();
-    } catch (InterruptedException expected) {
-    }
-
-    currentThread().interrupt();
-
-    try {
-      checked.get(5, SECONDS);
-      fail();
-    } catch (InterruptedException expected) {
-    }
-
-    currentThread().interrupt();
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(InterruptedException.class);
-    }
-
-    currentThread().interrupt();
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(InterruptedException.class);
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_mapsCancellation() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked = makeChecked(future, mapper);
-
-    assertTrue(future.cancel(true)); // argument is ignored
-
-    try {
-      checked.get();
-      fail();
-    } catch (CancellationException expected) {
-    }
-
-    try {
-      checked.get(5, SECONDS);
-      fail();
-    } catch (CancellationException expected) {
-    }
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(CancellationException.class);
-    }
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (TestException expected) {
-      assertThat(expected.getCause()).isInstanceOf(CancellationException.class);
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-  public void testMakeChecked_propagatesFailedMappers() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    future.setException(new Exception("failed"));
-
-    try {
-      checked.checkedGet();
-      fail();
-    } catch (NullPointerException expected) {
-    }
-
-    try {
-      checked.checkedGet(5, SECONDS);
-      fail();
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  @GwtIncompatible // makeChecked
-
-  public void testMakeChecked_listenersRunOnceCompleted() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    ListenableFutureTester tester = new ListenableFutureTester(checked);
-    tester.setUp();
-    future.set(DATA1);
-    tester.testCompletedFuture(DATA1);
-    tester.tearDown();
-  }
-
-  @GwtIncompatible // makeChecked
-
-  public void testMakeChecked_listenersRunOnCancel() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    ListenableFutureTester tester = new ListenableFutureTester(checked);
-    tester.setUp();
-    future.cancel(true); // argument is ignored
-    tester.testCancelledFuture();
-    tester.tearDown();
-  }
-
-  @GwtIncompatible // makeChecked
-
-  public void testMakeChecked_listenersRunOnFailure() throws Exception {
-    SettableFuture<String> future = SettableFuture.create();
-
-    CheckedFuture<String, TestException> checked =
-        makeChecked(
-            future,
-            new Function<Exception, TestException>() {
-              @Override
-              public TestException apply(Exception from) {
-                throw new NullPointerException();
-              }
-            });
-
-    ListenableFutureTester tester = new ListenableFutureTester(checked);
-    tester.setUp();
-    future.setException(new Exception("failed"));
-    tester.testFailedFuture("failed");
-    tester.tearDown();
-  }
-
-  @GwtIncompatible // used only in GwtIncompatible tests
   private interface MapperFunction extends Function<Throwable, Exception> {}
 
   public void testCompletionOrder() throws Exception {
@@ -3974,6 +3915,10 @@
   // Simulate a timeout that fires before the call the SES.schedule returns but the future is
   // already completed.
 
+  // This test covers a bug where an Error thrown from a callback could cause the TimeoutFuture to
+  // never complete when timing out.  Notably, nothing would get logged since the Error would get
+  // stuck in the ScheduledFuture inside of TimeoutFuture and nothing ever calls get on it.
+
   private static final Executor REJECTING_EXECUTOR =
       new Executor() {
         @Override
@@ -3990,4 +3935,34 @@
       }
     };
   }
+
+  private static <I, O> AsyncFunction<I, O> tagged(
+      final String toString, final AsyncFunction<I, O> function) {
+    return new AsyncFunction<I, O>() {
+      @Override
+      public ListenableFuture<O> apply(I input) throws Exception {
+        return function.apply(input);
+      }
+
+      @Override
+      public String toString() {
+        return toString;
+      }
+    };
+  }
+
+  private static <V> AsyncCallable<V> tagged(
+      final String toString, final AsyncCallable<V> callable) {
+    return new AsyncCallable<V>() {
+      @Override
+      public ListenableFuture<V> call() throws Exception {
+        return callable.call();
+      }
+
+      @Override
+      public String toString() {
+        return toString;
+      }
+    };
+  }
 }
diff --git a/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
index 872197b..4e2c85e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/GeneratedMonitorTest.java
@@ -24,8 +24,11 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.time.Duration;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.FutureTask;
@@ -58,7 +61,7 @@
       }
     }
 
-    assertEquals(548, suite.testCount());
+    assertEquals(980, suite.testCount());
 
     return suite;
   }
@@ -186,14 +189,26 @@
     return parameterTypes.length >= 1 && parameterTypes[0] == Monitor.Guard.class;
   }
 
-  /** Determines whether the given method takes a time and unit as its last two parameters. */
+  /** Determines whether the given method is time-based. */
   private static boolean isTimed(Method method) {
+    return isLongTimeUnitBased(method) || isDurationBased(method);
+  }
+
+  /** Determines whether the given method takes a time and unit as its last two parameters. */
+  private static boolean isLongTimeUnitBased(Method method) {
     Class<?>[] parameterTypes = method.getParameterTypes();
     return parameterTypes.length >= 2
         && parameterTypes[parameterTypes.length - 2] == long.class
         && parameterTypes[parameterTypes.length - 1] == TimeUnit.class;
   }
 
+  /** Determines whether the given method takes a Duration as its last parameter. */
+  private static boolean isDurationBased(Method method) {
+    Class<?>[] parameterTypes = method.getParameterTypes();
+    return parameterTypes.length >= 1
+        && parameterTypes[parameterTypes.length - 1] == Duration.class;
+  }
+
   /** Determines whether the given method returns a boolean value. */
   private static boolean isBoolean(Method method) {
     return method.getReturnType() == boolean.class;
@@ -233,11 +248,21 @@
         assertFalse(desc, isTimed(method));
         break;
       case 1:
-        assertTrue(desc, isGuarded(method));
-        assertFalse(desc, isTimed(method));
+        if (isDurationBased(method)) {
+          assertFalse(desc, isGuarded(method));
+        } else {
+          assertTrue(desc, isGuarded(method));
+        }
+        // we can't make an assumption about isTimed() because now we have single-parameter methods
+        // that accept a java.time.Duration
+        assertFalse(desc, isLongTimeUnitBased(method));
         break;
       case 2:
-        assertFalse(desc, isGuarded(method));
+        if (isDurationBased(method)) {
+          assertTrue(desc, isGuarded(method));
+        } else {
+          assertFalse(desc, isGuarded(method));
+        }
         assertTrue(desc, isTimed(method));
         break;
       case 3:
@@ -619,21 +644,22 @@
   }
 
   private Outcome doCall() {
-    boolean guarded = isGuarded(method);
-    boolean timed = isTimed(method);
-    Object[] arguments = new Object[(guarded ? 1 : 0) + (timed ? 2 : 0)];
-    if (guarded) {
-      arguments[0] = guard;
+    List<Object> arguments = new ArrayList<>();
+    if (isGuarded(method)) {
+      arguments.add(guard);
     }
-    if (timed) {
-      arguments[arguments.length - 2] = timeout.millis;
-      arguments[arguments.length - 1] = TimeUnit.MILLISECONDS;
+    if (isLongTimeUnitBased(method)) {
+      arguments.add(timeout.millis);
+      arguments.add(TimeUnit.MILLISECONDS);
+    }
+    if (isDurationBased(method)) {
+      arguments.add(Duration.ofMillis(timeout.millis));
     }
     try {
       Object result;
       doingCallLatch.countDown();
       try {
-        result = method.invoke(monitor, arguments);
+        result = method.invoke(monitor, arguments.toArray());
       } finally {
         callCompletedLatch.countDown();
       }
@@ -718,8 +744,15 @@
         Monitor monitor1 = new Monitor(fair1);
         Monitor monitor2 = new Monitor(fair2);
         FlagGuard guard = new FlagGuard(monitor2);
-        Object[] arguments =
-            (timed ? new Object[] {guard, 0L, TimeUnit.MILLISECONDS} : new Object[] {guard});
+        List<Object> arguments = new ArrayList<>();
+        arguments.add(guard);
+        if (isDurationBased(method)) {
+          arguments.add(Duration.ZERO);
+        }
+        if (isLongTimeUnitBased(method)) {
+          arguments.add(0L);
+          arguments.add(TimeUnit.MILLISECONDS);
+        }
         boolean occupyMonitor = isWaitFor(method);
         if (occupyMonitor) {
           // If we don't already occupy the monitor, we'll get an IMSE regardless of the guard (see
@@ -727,7 +760,7 @@
           monitor1.enter();
         }
         try {
-          method.invoke(monitor1, arguments);
+          method.invoke(monitor1, arguments.toArray());
           fail("expected IllegalMonitorStateException");
         } catch (InvocationTargetException e) {
           assertEquals(IllegalMonitorStateException.class, e.getTargetException().getClass());
@@ -757,10 +790,17 @@
       protected void runTest() throws Throwable {
         Monitor monitor = new Monitor(fair);
         FlagGuard guard = new FlagGuard(monitor);
-        Object[] arguments =
-            (timed ? new Object[] {guard, 0L, TimeUnit.MILLISECONDS} : new Object[] {guard});
+        List<Object> arguments = new ArrayList<>();
+        arguments.add(guard);
+        if (isDurationBased(method)) {
+          arguments.add(Duration.ZERO);
+        }
+        if (isLongTimeUnitBased(method)) {
+          arguments.add(0L);
+          arguments.add(TimeUnit.MILLISECONDS);
+        }
         try {
-          method.invoke(monitor, arguments);
+          method.invoke(monitor, arguments.toArray());
           fail("expected IllegalMonitorStateException");
         } catch (InvocationTargetException e) {
           assertEquals(IllegalMonitorStateException.class, e.getTargetException().getClass());
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 1f1111b..741ff45 100644
--- a/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
@@ -233,6 +233,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/ListeningScheduledExecutorServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/ListeningScheduledExecutorServiceTest.java
new file mode 100644
index 0000000..d4275cb
--- /dev/null
+++ b/guava-tests/test/com/google/common/util/concurrent/ListeningScheduledExecutorServiceTest.java
@@ -0,0 +1,184 @@
+/*
+ * 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.util.concurrent;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.util.concurrent.ForwardingListenableFuture.SimpleForwardingListenableFuture;
+import java.time.Duration;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Delayed;
+import java.util.concurrent.TimeUnit;
+import junit.framework.TestCase;
+
+/** Tests for default methods of the interface. */
+public class ListeningScheduledExecutorServiceTest extends TestCase {
+
+  private Runnable recordedCommand;
+  private long recordedDelay;
+  private long recordedInterval;
+  private TimeUnit recordedTimeUnit;
+
+  private final ListeningScheduledExecutorService executorService = new FakeExecutorService();
+
+  public void testScheduleRunnable() throws Exception {
+    Runnable command = () -> {};
+
+    ListenableScheduledFuture<?> future = executorService.schedule(command, Duration.ofSeconds(12));
+
+    assertThat(future.get()).isEqualTo("schedule");
+    assertThat(recordedCommand).isSameInstanceAs(command);
+    assertThat(recordedTimeUnit).isEqualTo(TimeUnit.NANOSECONDS);
+    assertThat(Duration.ofNanos(recordedDelay)).isEqualTo(Duration.ofSeconds(12));
+  }
+
+  public void testScheduleCallable() throws Exception {
+    Callable<String> callable = () -> "hello";
+
+    ListenableScheduledFuture<String> future =
+        executorService.schedule(callable, Duration.ofMinutes(12));
+
+    assertThat(future.get()).isEqualTo("hello");
+    assertThat(recordedTimeUnit).isEqualTo(TimeUnit.NANOSECONDS);
+    assertThat(Duration.ofNanos(recordedDelay)).isEqualTo(Duration.ofMinutes(12));
+  }
+
+  public void testScheduleAtFixedRate() throws Exception {
+    Runnable command = () -> {};
+
+    ListenableScheduledFuture<?> future =
+        executorService.scheduleAtFixedRate(command, Duration.ofDays(2), Duration.ofHours(4));
+
+    assertThat(future.get()).isEqualTo("scheduleAtFixedRate");
+    assertThat(recordedCommand).isSameInstanceAs(command);
+    assertThat(recordedTimeUnit).isEqualTo(TimeUnit.NANOSECONDS);
+    assertThat(Duration.ofNanos(recordedDelay)).isEqualTo(Duration.ofDays(2));
+    assertThat(Duration.ofNanos(recordedInterval)).isEqualTo(Duration.ofHours(4));
+  }
+
+  public void testScheduleWithFixedDelay() throws Exception {
+    Runnable command = () -> {};
+
+    ListenableScheduledFuture<?> future =
+        executorService.scheduleWithFixedDelay(command, Duration.ofDays(8), Duration.ofHours(16));
+
+    assertThat(future.get()).isEqualTo("scheduleWithFixedDelay");
+    assertThat(recordedCommand).isSameInstanceAs(command);
+    assertThat(recordedTimeUnit).isEqualTo(TimeUnit.NANOSECONDS);
+    assertThat(Duration.ofNanos(recordedDelay)).isEqualTo(Duration.ofDays(8));
+    assertThat(Duration.ofNanos(recordedInterval)).isEqualTo(Duration.ofHours(16));
+  }
+
+  private class FakeExecutorService extends AbstractListeningExecutorService
+      implements ListeningScheduledExecutorService {
+    @Override
+    public ListenableScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
+      recordedCommand = command;
+      recordedDelay = delay;
+      recordedTimeUnit = unit;
+      return ImmediateScheduledFuture.of("schedule");
+    }
+
+    @Override
+    public <V> ListenableScheduledFuture<V> schedule(
+        Callable<V> callable, long delay, TimeUnit unit) {
+      recordedDelay = delay;
+      recordedTimeUnit = unit;
+      try {
+        return ImmediateScheduledFuture.of(callable.call());
+      } catch (Exception e) {
+        return ImmediateScheduledFuture.failed(e);
+      }
+    }
+
+    @Override
+    public ListenableScheduledFuture<?> scheduleAtFixedRate(
+        Runnable command, long initialDelay, long period, TimeUnit unit) {
+      recordedCommand = command;
+      recordedDelay = initialDelay;
+      recordedInterval = period;
+      recordedTimeUnit = unit;
+      return ImmediateScheduledFuture.of("scheduleAtFixedRate");
+    }
+
+    @Override
+    public ListenableScheduledFuture<?> scheduleWithFixedDelay(
+        Runnable command, long initialDelay, long delay, TimeUnit unit) {
+      recordedCommand = command;
+      recordedDelay = initialDelay;
+      recordedInterval = delay;
+      recordedTimeUnit = unit;
+      return ImmediateScheduledFuture.of("scheduleWithFixedDelay");
+    }
+
+    @Override
+    public void execute(Runnable runnable) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void shutdown() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<Runnable> shutdownNow() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isShutdown() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isTerminated() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean awaitTermination(long timeout, TimeUnit unit) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  private static class ImmediateScheduledFuture<V> extends SimpleForwardingListenableFuture<V>
+      implements ListenableScheduledFuture<V> {
+    static <V> ListenableScheduledFuture<V> of(V value) {
+      return new ImmediateScheduledFuture<>(Futures.immediateFuture(value));
+    }
+
+    static <V> ListenableScheduledFuture<V> failed(Throwable t) {
+      return new ImmediateScheduledFuture<>(Futures.immediateFailedFuture(t));
+    }
+
+    ImmediateScheduledFuture(ListenableFuture<V> delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public long getDelay(TimeUnit unit) {
+      return 0;
+    }
+
+    @Override
+    public int compareTo(Delayed other) {
+      return 0;
+    }
+  }
+}
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 2343845..08c8f19 100644
--- a/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
@@ -467,7 +467,7 @@
       future.get();
       fail("Expected ExecutionException");
     } catch (ExecutionException e) {
-      assertThat(e).hasCauseThat().isSameAs(expectedCause);
+      assertThat(e).hasCauseThat().isSameInstanceAs(expectedCause);
     }
   }
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/RateLimiterTest.java b/guava-tests/test/com/google/common/util/concurrent/RateLimiterTest.java
index 4071354..a6c0899 100644
--- a/guava-tests/test/com/google/common/util/concurrent/RateLimiterTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/RateLimiterTest.java
@@ -601,7 +601,7 @@
   }
 
   private static final ImmutableSet<String> NOT_WORKING_ON_MOCKS =
-      ImmutableSet.of("latestPermitAgeSec", "setRate", "getAvailablePermits");
+      ImmutableSet.of("latestPermitAgeSec", "latestPermitAge", "setRate", "getAvailablePermits");
 
   // We would use ArbitraryInstances, but it returns 0, invalid for many RateLimiter methods.
   private static final ImmutableClassToInstanceMap<Object> PARAMETER_VALUES =
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 4b1bd83..ff9e311 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
@@ -17,6 +17,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.MoreExecutors.newSequentialExecutor;
 import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
 
 import com.google.common.collect.ImmutableList;
@@ -188,7 +189,7 @@
     // Check that this thread has been marked as interrupted again now that the thread has been
     // returned by SequentialExecutor. Clear the bit while checking so that the test doesn't hose
     // JUnit or some other test case.
-    assertThat(Thread.currentThread().interrupted()).isTrue();
+    assertThat(Thread.interrupted()).isTrue();
   }
 
   public void testInterrupt_doesNotInterruptSubsequentTask() throws Exception {
@@ -215,7 +216,7 @@
     // Check that the interruption of a SequentialExecutor's task is restored to the thread once
     // it is yielded. Clear the bit while checking so that the test doesn't hose JUnit or some other
     // test case.
-    assertThat(Thread.currentThread().interrupted()).isTrue();
+    assertThat(Thread.interrupted()).isTrue();
   }
 
   public void testInterrupt_doesNotStopExecution() {
@@ -348,4 +349,40 @@
       assertThat(expected).hasCauseThat().isInstanceOf(RejectedExecutionException.class);
     }
   }
+
+  public void testToString() {
+    final Runnable[] currentTask = new Runnable[1];
+    final Executor delegate =
+        new Executor() {
+          @Override
+          public void execute(Runnable task) {
+            currentTask[0] = task;
+            task.run();
+            currentTask[0] = null;
+          }
+
+          @Override
+          public String toString() {
+            return "theDelegate";
+          }
+        };
+    Executor sequential1 = newSequentialExecutor(delegate);
+    Executor sequential2 = newSequentialExecutor(delegate);
+    assertThat(sequential1.toString()).contains("theDelegate");
+    assertThat(sequential1.toString()).isNotEqualTo(sequential2.toString());
+    final String[] whileRunningToString = new String[1];
+    sequential1.execute(
+        new Runnable() {
+          @Override
+          public void run() {
+            whileRunningToString[0] = "" + currentTask[0];
+          }
+
+          @Override
+          public String toString() {
+            return "my runnable's toString";
+          }
+        });
+    assertThat(whileRunningToString[0]).contains("my runnable's toString");
+  }
 }
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 0223b9a..fbc238e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
@@ -17,6 +17,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.Arrays.asList;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
@@ -171,7 +172,7 @@
     Service b = new NoOpService();
     ServiceManager manager = new ServiceManager(asList(a, b));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     assertState(manager, Service.State.NEW, a, b);
     assertFalse(manager.isHealthy());
     manager.startAsync().awaitHealthy();
@@ -195,7 +196,7 @@
     Service e = new NoOpService();
     ServiceManager manager = new ServiceManager(asList(a, b, c, d, e));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     assertState(manager, Service.State.NEW, a, b, c, d, e);
     try {
       manager.startAsync().awaitHealthy();
@@ -219,7 +220,7 @@
     Service b = new FailRunService();
     ServiceManager manager = new ServiceManager(asList(a, b));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     assertState(manager, Service.State.NEW, a, b);
     try {
       manager.startAsync().awaitHealthy();
@@ -242,7 +243,7 @@
     Service c = new NoOpService();
     ServiceManager manager = new ServiceManager(asList(a, b, c));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
 
     manager.startAsync().awaitHealthy();
     assertTrue(listener.healthyCalled);
@@ -292,7 +293,7 @@
     Service a = new FailStartService();
     ServiceManager manager = new ServiceManager(asList(a));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     try {
       manager.startAsync().awaitHealthy();
       fail();
@@ -309,7 +310,7 @@
     Service a = new FailStartService();
     ServiceManager manager = new ServiceManager(asList(a));
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     try {
       manager.startAsync().awaitHealthy();
       fail();
@@ -334,7 +335,8 @@
           public void failure(Service service) {
             manager.stopAsync();
           }
-        });
+        },
+        directExecutor());
     manager.startAsync();
     manager.awaitStopped(10, TimeUnit.MILLISECONDS);
   }
@@ -408,7 +410,7 @@
     logger.addHandler(logHandler);
     ServiceManager manager = new ServiceManager(Arrays.<Service>asList());
     RecordingListener listener = new RecordingListener();
-    manager.addListener(listener);
+    manager.addListener(listener, directExecutor());
     manager.startAsync().awaitHealthy();
     assertTrue(manager.isHealthy());
     assertTrue(listener.healthyCalled);
@@ -476,7 +478,8 @@
             // block until after the service manager is shutdown
             Uninterruptibles.awaitUninterruptibly(failLeave);
           }
-        });
+        },
+        directExecutor());
     manager.startAsync();
     afterStarted.countDown();
     // We do not call awaitHealthy because, due to races, that method may throw an exception.  But
@@ -608,7 +611,7 @@
       }
       ServiceManager manager = new ServiceManager(services);
       manager.startAsync().awaitHealthy();
-      manager.stopAsync().awaitStopped(1, TimeUnit.SECONDS);
+      manager.stopAsync().awaitStopped(10, TimeUnit.SECONDS);
     }
   }
 
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 6cabb08..105e8de 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
@@ -112,7 +112,7 @@
       future.get();
       fail("Expected ExecutionException");
     } catch (ExecutionException ee) {
-      assertThat(ee).hasCauseThat().isSameAs(e);
+      assertThat(ee).hasCauseThat().isSameInstanceAs(e);
     }
   }
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java b/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
index 26a44b7..04b824f 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SimpleTimeLimiterTest.java
@@ -38,7 +38,7 @@
 public class SimpleTimeLimiterTest extends TestCase {
 
   private static final long DELAY_MS = 50;
-  private static final long ENOUGH_MS = 500;
+  private static final long ENOUGH_MS = 10000;
   private static final long NOT_ENOUGH_MS = 5;
 
   private static final String GOOD_CALLABLE_RESULT = "good callable result";
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 6ec5620..47507cd 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
@@ -33,7 +33,7 @@
 import java.util.concurrent.TimeoutException;
 import junit.framework.TestCase;
 
-// TODO(azana/cpovirk): Should this be merged into UninterruptiblesTest?
+// TODO(cpovirk): Should this be merged into UninterruptiblesTest?
 /**
  * Unit test for {@link Uninterruptibles#getUninterruptibly}
  *
@@ -97,7 +97,7 @@
 
     assertFalse(Thread.interrupted());
     try {
-      delayedFuture.get(10000, TimeUnit.MILLISECONDS);
+      delayedFuture.get(20000, TimeUnit.MILLISECONDS);
       fail("expected to be interrupted");
     } catch (InterruptedException expected) {
     } catch (TimeoutException e) {
diff --git a/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java b/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
index fbe00bf..4343d89 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptiblesTest.java
@@ -17,22 +17,29 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.util.concurrent.InterruptionUtil.repeatedlyInterruptTestThread;
+import static com.google.common.util.concurrent.Uninterruptibles.awaitTerminationUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.awaitUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.joinUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.putUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.takeUninterruptibly;
 import static com.google.common.util.concurrent.Uninterruptibles.tryAcquireUninterruptibly;
+import static com.google.common.util.concurrent.Uninterruptibles.tryLockUninterruptibly;
+import static java.util.concurrent.Executors.newFixedThreadPool;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Stopwatch;
 import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.TearDown;
 import com.google.common.testing.TearDownStack;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.time.Duration;
 import java.util.Date;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
@@ -141,6 +148,63 @@
     assertInterrupted();
   }
 
+  // Lock.tryLock() tests
+  public void testTryLockTimeoutExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    Thread lockThread = acquireFor(lock, 5, SECONDS);
+
+    boolean lockAcquired = tryLockUninterruptibly(lock, 500, MILLISECONDS);
+
+    assertFalse(lockAcquired);
+    assertAtLeastTimePassed(stopwatch, 500);
+    assertNotInterrupted();
+
+    // finish locking thread
+    lockThread.interrupt();
+  }
+
+  public void testTryLockTimeoutNotExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    acquireFor(lock, 500, MILLISECONDS);
+
+    boolean signaledBeforeTimeout = tryLockUninterruptibly(lock, 1500, MILLISECONDS);
+
+    assertTrue(signaledBeforeTimeout);
+    assertTimeNotPassed(stopwatch, LONG_DELAY_MS);
+    assertNotInterrupted();
+  }
+
+  public void testTryLockInterruptedTimeoutExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    Thread lockThread = acquireFor(lock, 5, SECONDS);
+    requestInterruptIn(500);
+
+    boolean signaledBeforeTimeout = tryLockUninterruptibly(lock, 1000, MILLISECONDS);
+
+    assertFalse(signaledBeforeTimeout);
+    assertAtLeastTimePassed(stopwatch, 1000);
+    assertInterrupted();
+
+    // finish locking thread
+    lockThread.interrupt();
+  }
+
+  public void testTryLockInterruptedTimeoutNotExceeded() {
+    Stopwatch stopwatch = Stopwatch.createStarted();
+    Lock lock = new ReentrantLock();
+    acquireFor(lock, 1000, MILLISECONDS);
+    requestInterruptIn(500);
+
+    boolean signaledBeforeTimeout = tryLockUninterruptibly(lock, 1500, MILLISECONDS);
+
+    assertTrue(signaledBeforeTimeout);
+    assertTimeNotPassed(stopwatch, LONG_DELAY_MS);
+    assertInterrupted();
+  }
+
   // BlockingQueue.put() tests
   public void testPutWithNoWait() {
     Stopwatch stopwatch = Stopwatch.createStarted();
@@ -405,6 +469,57 @@
     assertInterrupted();
   }
 
+  // executor.awaitTermination Testcases
+  public void testTryAwaitTerminationUninterruptiblyDuration_success() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(1000));
+    executor.shutdown();
+    assertTrue(awaitTerminationUninterruptibly(executor, Duration.ofMillis(LONG_DELAY_MS)));
+    assertTrue(executor.isTerminated());
+    assertInterrupted();
+  }
+
+  public void testTryAwaitTerminationUninterruptiblyDuration_failure() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(10000));
+    executor.shutdown();
+    assertFalse(awaitTerminationUninterruptibly(executor, Duration.ofMillis(1000)));
+    assertFalse(executor.isTerminated());
+    assertInterrupted();
+  }
+
+  public void testTryAwaitTerminationUninterruptiblyLongTimeUnit_success() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(1000));
+    executor.shutdown();
+    assertTrue(awaitTerminationUninterruptibly(executor, LONG_DELAY_MS, MILLISECONDS));
+    assertTrue(executor.isTerminated());
+    assertInterrupted();
+  }
+
+  public void testTryAwaitTerminationUninterruptiblyLongTimeUnit_failure() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(10000));
+    executor.shutdown();
+    assertFalse(awaitTerminationUninterruptibly(executor, 1000, MILLISECONDS));
+    assertFalse(executor.isTerminated());
+    assertInterrupted();
+  }
+
+  public void testTryAwaitTerminationInfiniteTimeout() {
+    ExecutorService executor = newFixedThreadPool(1);
+    requestInterruptIn(500);
+    executor.execute(new SleepTask(1000));
+    executor.shutdown();
+    awaitTerminationUninterruptibly(executor);
+    assertTrue(executor.isTerminated());
+    assertInterrupted();
+  }
+
   /**
    * Wrapper around {@link Stopwatch} which also contains an "expected completion time." Creating a
    * {@code Completion} starts the underlying stopwatch.
@@ -694,6 +809,15 @@
     }
   }
 
+  private static final class SleepTask extends DelayedActionRunnable {
+    SleepTask(long tMinus) {
+      super(tMinus);
+    }
+
+    @Override
+    protected void doAction() {}
+  }
+
   private static void sleepSuccessfully(long sleepMillis) {
     Completion completed = new Completion(sleepMillis - SLEEP_SLACK);
     Uninterruptibles.sleepUninterruptibly(sleepMillis, MILLISECONDS);
@@ -729,6 +853,30 @@
     InterruptionUtil.requestInterruptIn(millis, MILLISECONDS);
   }
 
+  @CanIgnoreReturnValue
+  private static Thread acquireFor(final Lock lock, final long duration, final TimeUnit unit) {
+    final CountDownLatch latch = new CountDownLatch(1);
+    Thread thread =
+        new Thread() {
+          @Override
+          public void run() {
+            lock.lock();
+            latch.countDown();
+            try {
+              Thread.sleep(unit.toMillis(duration));
+            } catch (InterruptedException e) {
+              // simply finish execution
+            } finally {
+              lock.unlock();
+            }
+          }
+        };
+    thread.setDaemon(true);
+    thread.start();
+    awaitUninterruptibly(latch);
+    return thread;
+  }
+
   private static class TestCondition implements Condition {
     private final Lock lock;
     private final Condition condition;
diff --git a/guava/pom.xml b/guava/pom.xml
index 39c32ec..20e9af8 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>27.1-jre</version>
+    <version>30.0-jre</version>
   </parent>
   <artifactId>guava</artifactId>
   <packaging>bundle</packaging>
@@ -42,11 +42,6 @@
       <groupId>com.google.j2objc</groupId>
       <artifactId>j2objc-annotations</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.mojo</groupId>
-      <artifactId>animal-sniffer-annotations</artifactId>
-      <version>${animal.sniffer.version}</version>
-    </dependency>
     <!-- TODO(cpovirk): does this comment belong on the <dependency> in <profiles>? -->
     <!-- TODO(cpovirk): want this only for dependency plugin but seems not to work there? Maven runs without failure, but the resulting Javadoc is missing the hoped-for inherited text -->
   </dependencies>
@@ -111,6 +106,8 @@
               <includeArtifactIds>srczip</includeArtifactIds>
               <outputDirectory>${project.build.directory}/jdk-sources</outputDirectory>
               <silent>false</silent>
+              <!-- Exclude module-info files (since we're using -source 8 to avoid other modules problems) and FileDescriptor (which uses a language feature not available in Java 8). -->
+              <excludes>**/module-info.java,**/java/io/FileDescriptor.java</excludes>
             </configuration>
           </execution>
         </executions>
@@ -128,7 +125,38 @@
           <sourcepath>${project.build.sourceDirectory}:${project.build.directory}/jdk-sources</sourcepath>
 
           <!-- Passing `-subpackages com.google.common` breaks things, so we explicitly exclude everything else instead. -->
-          <excludePackageNames>com.google.common.base.internal,com.google.thirdparty.publicsuffix,com.oracle,com.sun,java,javax,jdk,org,sun</excludePackageNames>
+          <!-- excludePackageNames requires specification of packages separately from "all subpackages".
+               https://issues.apache.org/jira/browse/MJAVADOC-584 -->
+          <excludePackageNames>
+            com.google.common.base.internal,com.google.common.base.internal.*,com.google.thirdparty.publicsuffix,com.google.thirdparty.publicsuffix.*,com.oracle.*,com.sun.*,java.*,javax.*,jdk,jdk.*,org.*,sun.*
+          </excludePackageNames>
+          <!-- Ignore some tags that are found in Java 11 sources but not recognized... under -source 8, I think it was? I can no longer reproduce the failure. -->
+          <tags>
+            <tag>
+              <name>apiNote</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>implNote</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>implSpec</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>jls</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>revised</name>
+              <placement>X</placement>
+            </tag>
+            <tag>
+              <name>spec</name>
+              <placement>X</placement>
+            </tag>
+          </tags>
 
           <!-- TODO(cpovirk): Move this to the parent after making the package-list files available there. -->
           <!-- We add the link ourselves, both so that we can choose Java 9 over the version that -source suggests and so that we can solve the JSR305 problem described below. -->
@@ -174,7 +202,7 @@
   </build>
   <profiles>
     <profile>
-      <id>srczip</id>
+      <id>srczip-parent</id>
       <activation>
         <file>
           <exists>${java.home}/../src.zip</exists>
@@ -191,5 +219,34 @@
         </dependency>
       </dependencies>
     </profile>
+    <profile>
+      <id>srczip-lib</id>
+      <activation>
+        <file>
+          <exists>${java.home}/lib/src.zip</exists>
+        </file>
+      </activation>
+      <dependencies>
+        <dependency>
+          <groupId>jdk</groupId>
+          <artifactId>srczip</artifactId>
+          <version>999</version>
+          <scope>system</scope>
+          <systemPath>${java.home}/lib/src.zip</systemPath>
+          <optional>true</optional>
+        </dependency>
+      </dependencies>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-javadoc-plugin</artifactId>
+            <configuration>
+              <!-- We need to point at the java.base subdirectory because Maven appears to assume that package foo.bar is located in foo/bar and not java.base/foo/bar when translating excludePackageNames into filenames to pass to javadoc. (Note that manually passing -exclude to javadoc appears to possibly not work at all for java.* types??) Also, referring only to java.base avoids a lot of other sources. -->
+              <sourcepath>${project.build.sourceDirectory}:${project.build.directory}/jdk-sources/java.base</sourcepath>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
   </profiles>
 </project>
diff --git a/guava/src/com/google/common/annotations/VisibleForTesting.java b/guava/src/com/google/common/annotations/VisibleForTesting.java
index 4540cfd..e767afc 100644
--- a/guava/src/com/google/common/annotations/VisibleForTesting.java
+++ b/guava/src/com/google/common/annotations/VisibleForTesting.java
@@ -18,6 +18,13 @@
  * Annotates a program element that exists, or is more widely visible than otherwise necessary, only
  * for use in test code.
  *
+ * <p><b>Do not use this interface</b> for public or protected declarations: it is a fig leaf for
+ * bad design, and it does not prevent anyone from using the declaration---and experience has shown
+ * that they will. If the method breaks the encapsulation of its class, then its internal
+ * representation will be hard to change. Instead, use <a
+ * href="http://errorprone.info/bugpattern/RestrictedApiChecker">RestrictedApiChecker</a>, which
+ * enforces fine-grained visibility policies.
+ *
  * @author Johannes Henkel
  */
 @GwtCompatible
diff --git a/guava/src/com/google/common/base/AbstractIterator.java b/guava/src/com/google/common/base/AbstractIterator.java
index 7b12a3e..57d8167 100644
--- a/guava/src/com/google/common/base/AbstractIterator.java
+++ b/guava/src/com/google/common/base/AbstractIterator.java
@@ -53,10 +53,10 @@
   public final boolean hasNext() {
     checkState(state != State.FAILED);
     switch (state) {
-      case READY:
-        return true;
       case DONE:
         return false;
+      case READY:
+        return true;
       default:
     }
     return tryToComputeNext();
diff --git a/guava/src/com/google/common/base/CaseFormat.java b/guava/src/com/google/common/base/CaseFormat.java
index b7dab1d..188d0d0 100644
--- a/guava/src/com/google/common/base/CaseFormat.java
+++ b/guava/src/com/google/common/base/CaseFormat.java
@@ -73,6 +73,11 @@
     String normalizeWord(String word) {
       return firstCharOnlyToUpper(word);
     }
+
+    @Override
+    String normalizeFirstWord(String word) {
+      return Ascii.toLowerCase(word);
+    }
   },
 
   /** Java and C++ class naming convention, e.g., "UpperCamel". */
@@ -130,7 +135,7 @@
     while ((j = wordBoundary.indexIn(s, ++j)) != -1) {
       if (i == 0) {
         // include some extra space for separators
-        out = new StringBuilder(s.length() + 4 * wordSeparator.length());
+        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)));
@@ -197,8 +202,8 @@
 
   abstract String normalizeWord(String word);
 
-  private String normalizeFirstWord(String word) {
-    return (this == LOWER_CAMEL) ? Ascii.toLowerCase(word) : normalizeWord(word);
+  String normalizeFirstWord(String word) {
+    return normalizeWord(word);
   }
 
   private static String firstCharOnlyToUpper(String word) {
diff --git a/guava/src/com/google/common/base/CharMatcher.java b/guava/src/com/google/common/base/CharMatcher.java
index 89ebfe0..0291086 100644
--- a/guava/src/com/google/common/base/CharMatcher.java
+++ b/guava/src/com/google/common/base/CharMatcher.java
@@ -1209,6 +1209,10 @@
   @VisibleForTesting
   static final class Whitespace extends NamedFastMatcher {
 
+    // TABLE is a precomputed hashset of whitespace characters. MULTIPLIER serves as a hash function
+    // whose key property is that it maps 25 characters into the 32-slot table without collision.
+    // Basically this is an opportunistic fast implementation as opposed to "good code". For most
+    // other use-cases, the reduction in readability isn't worth it.
     static final String TABLE =
         "\u2002\u3000\r\u0085\u200A\u2005\u2000\u3000"
             + "\u2029\u000B\u3000\u2008\u2003\u205F\u3000\u1680"
diff --git a/guava/src/com/google/common/base/Converter.java b/guava/src/com/google/common/base/Converter.java
index cb6f7dd..a9107bf 100644
--- a/guava/src/com/google/common/base/Converter.java
+++ b/guava/src/com/google/common/base/Converter.java
@@ -20,9 +20,9 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.ForOverride;
 import com.google.errorprone.annotations.concurrent.LazyInit;
+import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -118,7 +118,7 @@
   private final boolean handleNullAutomatically;
 
   // We lazily cache the reverse view to avoid allocating on every call to reverse().
-  @LazyInit private transient @MonotonicNonNull Converter<B, A> reverse;
+  @LazyInit @RetainedWith private transient @Nullable Converter<B, A> reverse;
 
   /** Constructor for use by subclasses. */
   protected Converter() {
@@ -482,7 +482,7 @@
    * "pass-through type".
    */
   private static final class IdentityConverter<T> extends Converter<T, T> implements Serializable {
-    static final IdentityConverter INSTANCE = new IdentityConverter();
+    static final IdentityConverter<?> INSTANCE = new IdentityConverter<>();
 
     @Override
     protected T doForward(T t) {
diff --git a/guava/src/com/google/common/base/FinalizableReference.java b/guava/src/com/google/common/base/FinalizableReference.java
index f7e5cf8..848e7ee 100644
--- a/guava/src/com/google/common/base/FinalizableReference.java
+++ b/guava/src/com/google/common/base/FinalizableReference.java
@@ -15,6 +15,7 @@
 package com.google.common.base;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * Implemented by references that have code to run after garbage collection of their referents.
@@ -23,6 +24,7 @@
  * @author Bob Lee
  * @since 2.0
  */
+@DoNotMock("Use an instance of one of the Finalizable*Reference classes")
 @GwtIncompatible
 public interface FinalizableReference {
   /**
diff --git a/guava/src/com/google/common/base/Functions.java b/guava/src/com/google/common/base/Functions.java
index af6ac5e..be845c6 100644
--- a/guava/src/com/google/common/base/Functions.java
+++ b/guava/src/com/google/common/base/Functions.java
@@ -121,7 +121,7 @@
    * set. See also {@link #forMap(Map)}, which throws an exception in this case.
    *
    * <p><b>Java 8 users:</b> you can just write the lambda expression {@code k ->
-   * map.getWithDefault(k, defaultValue)} instead.
+   * map.getOrDefault(k, defaultValue)} instead.
    *
    * @param map source map that determines the function behavior
    * @param defaultValue the value to return for inputs that aren't map keys
diff --git a/guava/src/com/google/common/base/MoreObjects.java b/guava/src/com/google/common/base/MoreObjects.java
index 4245f20..cf901b5 100644
--- a/guava/src/com/google/common/base/MoreObjects.java
+++ b/guava/src/com/google/common/base/MoreObjects.java
@@ -47,6 +47,9 @@
    * lazy evaluation of the fallback instance, using {@link Optional#or(Supplier)
    * first.or(supplier)}.
    *
+   * <p><b>Java 9 users:</b> use {@code java.util.Objects.requireNonNullElse(first, second)}
+   * instead.
+   *
    * @return {@code first} if it is non-null; otherwise {@code second} if it is non-null
    * @throws NullPointerException if both {@code first} and {@code second} are null
    * @since 18.0 (since 3.0 as {@code Objects.firstNonNull()}).
diff --git a/guava/src/com/google/common/base/Objects.java b/guava/src/com/google/common/base/Objects.java
index 4985502..ed513d2 100644
--- a/guava/src/com/google/common/base/Objects.java
+++ b/guava/src/com/google/common/base/Objects.java
@@ -73,7 +73,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(Object @Nullable ... objects) {
+  public static int hashCode(@Nullable Object @Nullable ... 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 fe36bb9..51966f6 100644
--- a/guava/src/com/google/common/base/Optional.java
+++ b/guava/src/com/google/common/base/Optional.java
@@ -15,6 +15,7 @@
 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;
@@ -79,6 +80,7 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
+@DoNotMock("Use Optional.of(value) or Optional.absent()")
 @GwtCompatible(serializable = true)
 public abstract class Optional<T> implements Serializable {
   /**
@@ -267,6 +269,8 @@
    * possibleFoo.ifPresent(foo -> doSomethingWith(foo));
    * }</pre>
    *
+   * <p><b>Java 9 users:</b> some use cases can be written with calls to {@code optional.stream()}.
+   *
    * @since 11.0
    */
   public abstract Set<T> asSet();
@@ -321,6 +325,8 @@
    * {@code Optional} class; use {@code
    * optionals.stream().filter(Optional::isPresent).map(Optional::get)} instead.
    *
+   * <p><b>Java 9 users:</b> use {@code optionals.stream().flatMap(Optional::stream)} instead.
+   *
    * @since 11.0 (generics widened in 13.0)
    */
   @Beta
diff --git a/guava/src/com/google/common/base/Platform.java b/guava/src/com/google/common/base/Platform.java
index 5e1fae5..54b2dfc 100644
--- a/guava/src/com/google/common/base/Platform.java
+++ b/guava/src/com/google/common/base/Platform.java
@@ -94,4 +94,26 @@
       return true;
     }
   }
+
+  static void checkGwtRpcEnabled() {
+    String propertyName = "guava.gwt.emergency_reenable_rpc";
+
+    if (!Boolean.parseBoolean(System.getProperty(propertyName, "false"))) {
+      throw new UnsupportedOperationException(
+          Strings.lenientFormat(
+              "We are removing GWT-RPC support for Guava types. You can temporarily reenable"
+                  + " support by setting the system property %s to true. For more about system"
+                  + " properties, see %s. For more about Guava's GWT-RPC support, see %s.",
+              propertyName,
+              "https://stackoverflow.com/q/5189914/28465",
+              "https://groups.google.com/d/msg/guava-announce/zHZTFg7YF3o/rQNnwdHeEwAJ"));
+    }
+    logger.log(
+        java.util.logging.Level.WARNING,
+        "Later in 2020, we will remove GWT-RPC support for Guava types. You are seeing this"
+            + " 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 f62b880..30cc374 100644
--- a/guava/src/com/google/common/base/Preconditions.java
+++ b/guava/src/com/google/common/base/Preconditions.java
@@ -50,8 +50,8 @@
  * <p>so that a hypothetical bad caller of this method, such as:
  *
  * <pre>{@code
- *   void exampleBadCaller() {
- *     double d = sqrt(-1.0);
+ * void exampleBadCaller() {
+ *   double d = sqrt(-1.0);
  * }
  * }</pre>
  *
@@ -159,7 +159,7 @@
   public static void checkArgument(
       boolean expression,
       @Nullable String errorMessageTemplate,
-      Object @Nullable ... errorMessageArgs) {
+      @Nullable Object @Nullable ... errorMessageArgs) {
     if (!expression) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -916,7 +916,9 @@
    */
   @CanIgnoreReturnValue
   public static <T extends @NonNull Object> T checkNotNull(
-      T reference, @Nullable String errorMessageTemplate, Object @Nullable ... errorMessageArgs) {
+      T reference,
+      @Nullable String errorMessageTemplate,
+      @Nullable Object @Nullable ... errorMessageArgs) {
     if (reference == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -1401,12 +1403,12 @@
   }
 
   /**
-   * Ensures that {@code start} and {@code end} specify a valid <i>positions</i> in an array, list
-   * or string of size {@code size}, and are in order. A position index may range from zero to
-   * {@code size}, inclusive.
+   * Ensures that {@code start} and {@code end} specify valid <i>positions</i> in an array, list or
+   * string of size {@code size}, and are in order. A position index may range from zero to {@code
+   * size}, inclusive.
    *
    * @param start a user-supplied index identifying a starting position in an array, list or string
-   * @param end a user-supplied index identifying a ending position in an array, list or string
+   * @param end a user-supplied index identifying an ending position in an array, list or string
    * @param size the size of that array, list or string
    * @throws IndexOutOfBoundsException if either index is negative or is greater than {@code size},
    *     or if {@code end} is less than {@code start}
diff --git a/guava/src/com/google/common/base/Splitter.java b/guava/src/com/google/common/base/Splitter.java
index 1da372e..e0b498e 100644
--- a/guava/src/com/google/common/base/Splitter.java
+++ b/guava/src/com/google/common/base/Splitter.java
@@ -27,6 +27,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 /**
  * Extracts non-overlapping substrings from an input string, typically by recognizing appearances of
@@ -331,13 +333,13 @@
    * trimmed, including the last. Hence {@code Splitter.on(',').limit(3).trimResults().split(" a , b
    * , c , d ")} results in {@code ["a", "b", "c , d"]}.
    *
-   * @param limit the maximum number of items returned
+   * @param maxItems the maximum number of items returned
    * @return a splitter with the desired configuration
    * @since 9.0
    */
-  public Splitter limit(int limit) {
-    checkArgument(limit > 0, "must be greater than zero: %s", limit);
-    return new Splitter(strategy, omitEmptyStrings, trimmer, limit);
+  public Splitter limit(int maxItems) {
+    checkArgument(maxItems > 0, "must be greater than zero: %s", maxItems);
+    return new Splitter(strategy, omitEmptyStrings, trimmer, maxItems);
   }
 
   /**
@@ -372,7 +374,7 @@
   /**
    * Splits {@code sequence} into string components and makes them available through an {@link
    * Iterator}, which may be lazily evaluated. If you want an eagerly computed {@link List}, use
-   * {@link #splitToList(CharSequence)}.
+   * {@link #splitToList(CharSequence)}. Java 8 users may prefer {@link #splitToStream} instead.
    *
    * @param sequence the sequence of characters to split
    * @return an iteration over the segments split from the parameter
@@ -422,6 +424,21 @@
   }
 
   /**
+   * Splits {@code sequence} into string components and makes them available through an {@link
+   * Stream}, which may be lazily evaluated. If you want an eagerly computed {@link List}, use
+   * {@link #splitToList(CharSequence)}.
+   *
+   * @param sequence the sequence of characters to split
+   * @return a stream over the segments split from the parameter
+   * @since 28.2
+   */
+  @Beta
+  public Stream<String> splitToStream(CharSequence sequence) {
+    // Can't use Streams.stream() from base
+    return StreamSupport.stream(split(sequence).spliterator(), false);
+  }
+
+  /**
    * Returns a {@code MapSplitter} which splits entries based on this splitter, and splits entries
    * into keys and values using the specified separator.
    *
diff --git a/guava/src/com/google/common/base/Stopwatch.java b/guava/src/com/google/common/base/Stopwatch.java
index fe96a97..e4cca1f 100644
--- a/guava/src/com/google/common/base/Stopwatch.java
+++ b/guava/src/com/google/common/base/Stopwatch.java
@@ -32,15 +32,23 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * An object that measures elapsed time in nanoseconds. It is useful to measure elapsed time using
- * this class instead of direct calls to {@link System#nanoTime} for a few reasons:
+ * An object that accurately measures <i>elapsed time</i>: the measured duration between two
+ * successive readings of "now" in the same process.
+ *
+ * <p>In contrast, <i>wall time</i> is a reading of "now" as given by a method like
+ * {@link System#currentTimeMillis()}, best represented as an {@link Instant}. Such values
+ * <i>can</i> be subtracted to obtain a {@code Duration} (such as by {@code Duration.between}), but
+ * doing so does <i>not</i> give a reliable measurement of elapsed time, because wall time readings
+ * are inherently approximate, routinely affected by periodic clock corrections. Because this class
+ * (by default) uses {@link System#nanoTime}, it is unaffected by these changes.
+ *
+ * <p>Use this class instead of direct calls to {@link System#nanoTime} for two reasons:
  *
  * <ul>
- *   <li>An alternate time source can be substituted, for testing or performance reasons.
- *   <li>As documented by {@code nanoTime}, the value returned has no absolute meaning, and can only
- *       be interpreted as relative to another timestamp returned by {@code nanoTime} at a different
- *       time. {@code Stopwatch} is a more effective abstraction because it exposes only these
- *       relative values, not the absolute ones.
+ *   <li>The raw {@code long} values returned by {@code nanoTime} are meaningless and unsafe to use
+ *       in any other way than how {@code Stopwatch} uses them.
+ *   <li>An alternative source of nanosecond ticks can be substituted, for example for testing or
+ *       performance reasons, without affecting most of your code.
  * </ul>
  *
  * <p>Basic usage:
@@ -55,8 +63,8 @@
  * log.info("time: " + stopwatch); // formatted string like "12.3 ms"
  * }</pre>
  *
- * <p>Stopwatch methods are not idempotent; it is an error to start or stop a stopwatch that is
- * already in the desired state.
+ * <p>The state-changing methods are not idempotent; it is an error to start or stop a stopwatch
+ * that is already in the desired state.
  *
  * <p>When testing code that uses this class, use {@link #createUnstarted(Ticker)} or {@link
  * #createStarted(Ticker)} to supply a fake or mock ticker. This allows you to simulate any valid
@@ -194,7 +202,7 @@
    *
    * <p>It is generally not a good idea to use an ambiguous, unitless {@code long} to represent
    * elapsed time. Therefore, we recommend using {@link #elapsed()} instead, which returns a
-   * strongly-typed {@link Duration} instance.
+   * strongly-typed {@code Duration} instance.
    *
    * @since 14.0 (since 10.0 as {@code elapsedTime()})
    */
diff --git a/guava/src/com/google/common/base/Strings.java b/guava/src/com/google/common/base/Strings.java
index 8f70f63..f02b64e 100644
--- a/guava/src/com/google/common/base/Strings.java
+++ b/guava/src/com/google/common/base/Strings.java
@@ -298,8 +298,11 @@
   }
 
   private static String lenientToString(@Nullable Object o) {
+    if (o == null) {
+      return "null";
+    }
     try {
-      return String.valueOf(o);
+      return o.toString();
     } catch (Exception e) {
       // Default toString() behavior - see Object.toString()
       String objectToString =
diff --git a/guava/src/com/google/common/cache/AbstractCache.java b/guava/src/com/google/common/cache/AbstractCache.java
index 0b54d25..d8ef032 100644
--- a/guava/src/com/google/common/cache/AbstractCache.java
+++ b/guava/src/com/google/common/cache/AbstractCache.java
@@ -238,12 +238,17 @@
     @Override
     public CacheStats snapshot() {
       return new CacheStats(
-          hitCount.sum(),
-          missCount.sum(),
-          loadSuccessCount.sum(),
-          loadExceptionCount.sum(),
-          totalLoadTime.sum(),
-          evictionCount.sum());
+          negativeToMaxValue(hitCount.sum()),
+          negativeToMaxValue(missCount.sum()),
+          negativeToMaxValue(loadSuccessCount.sum()),
+          negativeToMaxValue(loadExceptionCount.sum()),
+          negativeToMaxValue(totalLoadTime.sum()),
+          negativeToMaxValue(evictionCount.sum()));
+    }
+
+    /** Returns {@code value}, if non-negative. Otherwise, returns {@link Long#MAX_VALUE}. */
+    private static long negativeToMaxValue(long value) {
+      return (value >= 0) ? value : Long.MAX_VALUE;
     }
 
     /** Increments all counters by the values in {@code other}. */
diff --git a/guava/src/com/google/common/cache/Cache.java b/guava/src/com/google/common/cache/Cache.java
index af662a9..4bcb308 100644
--- a/guava/src/com/google/common/cache/Cache.java
+++ b/guava/src/com/google/common/cache/Cache.java
@@ -19,6 +19,7 @@
 import com.google.common.util.concurrent.ExecutionError;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 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;
@@ -36,6 +37,7 @@
  * @author Charles Fry
  * @since 10.0
  */
+@DoNotMock("Use CacheBuilder.newBuilder().build()")
 @GwtCompatible
 public interface Cache<K, V> {
 
diff --git a/guava/src/com/google/common/cache/CacheBuilder.java b/guava/src/com/google/common/cache/CacheBuilder.java
index eb1395a..944e291 100644
--- a/guava/src/com/google/common/cache/CacheBuilder.java
+++ b/guava/src/com/google/common/cache/CacheBuilder.java
@@ -31,8 +31,6 @@
 import com.google.common.cache.LocalCache.Strength;
 import com.google.errorprone.annotations.CheckReturnValue;
 import com.google.j2objc.annotations.J2ObjCIncompatible;
-import java.lang.ref.SoftReference;
-import java.lang.ref.WeakReference;
 import java.util.ConcurrentModificationException;
 import java.util.IdentityHashMap;
 import java.util.Map;
@@ -40,7 +38,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A builder of {@link LoadingCache} and {@link Cache} instances having any combination of the
@@ -50,9 +48,8 @@
  *   <li>automatic loading of entries into the cache
  *   <li>least-recently-used eviction when a maximum size is exceeded
  *   <li>time-based expiration of entries, measured since last access or last write
- *   <li>keys automatically wrapped in {@linkplain WeakReference weak} references
- *   <li>values automatically wrapped in {@linkplain WeakReference weak} or {@linkplain
- *       SoftReference soft} references
+ *   <li>keys automatically wrapped in {@code WeakReference}
+ *   <li>values automatically wrapped in {@code WeakReference} or {@code SoftReference}
  *   <li>notification of evicted (or otherwise removed) entries
  *   <li>accumulation of cache access statistics
  * </ul>
@@ -233,10 +230,10 @@
   int concurrencyLevel = UNSET_INT;
   long maximumSize = UNSET_INT;
   long maximumWeight = UNSET_INT;
-  @MonotonicNonNull Weigher<? super K, ? super V> weigher;
+  @Nullable Weigher<? super K, ? super V> weigher;
 
-  @MonotonicNonNull Strength keyStrength;
-  @MonotonicNonNull Strength valueStrength;
+  @Nullable Strength keyStrength;
+  @Nullable Strength valueStrength;
 
   @SuppressWarnings("GoodTime") // should be a java.time.Duration
   long expireAfterWriteNanos = UNSET_INT;
@@ -247,11 +244,11 @@
   @SuppressWarnings("GoodTime") // should be a java.time.Duration
   long refreshNanos = UNSET_INT;
 
-  @MonotonicNonNull Equivalence<Object> keyEquivalence;
-  @MonotonicNonNull Equivalence<Object> valueEquivalence;
+  @Nullable Equivalence<Object> keyEquivalence;
+  @Nullable Equivalence<Object> valueEquivalence;
 
-  @MonotonicNonNull RemovalListener<? super K, ? super V> removalListener;
-  @MonotonicNonNull Ticker ticker;
+  @Nullable RemovalListener<? super K, ? super V> removalListener;
+  @Nullable Ticker ticker;
 
   Supplier<? extends StatsCounter> statsCounterSupplier = NULL_STATS_COUNTER;
 
@@ -657,7 +654,7 @@
   @GwtIncompatible // java.time.Duration
   @SuppressWarnings("GoodTime") // java.time.Duration decomposition
   public CacheBuilder<K, V> expireAfterWrite(java.time.Duration duration) {
-    return expireAfterWrite(duration.toNanos(), TimeUnit.NANOSECONDS);
+    return expireAfterWrite(toNanosSaturated(duration), TimeUnit.NANOSECONDS);
   }
 
   /**
@@ -693,6 +690,7 @@
     return this;
   }
 
+  @SuppressWarnings("GoodTime") // nanos internally, should be Duration
   long getExpireAfterWriteNanos() {
     return (expireAfterWriteNanos == UNSET_INT) ? DEFAULT_EXPIRATION_NANOS : expireAfterWriteNanos;
   }
@@ -701,8 +699,10 @@
    * Specifies that each entry should be automatically removed from the cache once a fixed duration
    * has elapsed after the entry's creation, the most recent replacement of its value, or its last
    * access. Access time is reset by all cache read and write operations (including {@code
-   * Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by operations on the
-   * collection-views of {@link Cache#asMap}.
+   * Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by {@code
+   * containsKey(Object)}, nor by operations on the collection-views of {@link Cache#asMap}}. So,
+   * for example, iterating through {@code Cache.asMap().entrySet()} does not reset access time for
+   * the entries you retrieve.
    *
    * <p>When {@code duration} is zero, this method hands off to {@link #maximumSize(long)
    * maximumSize}{@code (0)}, ignoring any otherwise-specified maximum size or weight. This can be
@@ -724,15 +724,17 @@
   @GwtIncompatible // java.time.Duration
   @SuppressWarnings("GoodTime") // java.time.Duration decomposition
   public CacheBuilder<K, V> expireAfterAccess(java.time.Duration duration) {
-    return expireAfterAccess(duration.toNanos(), TimeUnit.NANOSECONDS);
+    return expireAfterAccess(toNanosSaturated(duration), TimeUnit.NANOSECONDS);
   }
 
   /**
    * Specifies that each entry should be automatically removed from the cache once a fixed duration
    * has elapsed after the entry's creation, the most recent replacement of its value, or its last
    * access. Access time is reset by all cache read and write operations (including {@code
-   * Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by operations on the
-   * collection-views of {@link Cache#asMap}.
+   * Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by {@code
+   * containsKey(Object)}, nor by operations on the collection-views of {@link Cache#asMap}. So, for
+   * example, iterating through {@code Cache.asMap().entrySet()} does not reset access time for the
+   * entries you retrieve.
    *
    * <p>When {@code duration} is zero, this method hands off to {@link #maximumSize(long)
    * maximumSize}{@code (0)}, ignoring any otherwise-specified maximum size or weight. This can be
@@ -763,6 +765,7 @@
     return this;
   }
 
+  @SuppressWarnings("GoodTime") // nanos internally, should be Duration
   long getExpireAfterAccessNanos() {
     return (expireAfterAccessNanos == UNSET_INT)
         ? DEFAULT_EXPIRATION_NANOS
@@ -799,7 +802,7 @@
   @GwtIncompatible // java.time.Duration
   @SuppressWarnings("GoodTime") // java.time.Duration decomposition
   public CacheBuilder<K, V> refreshAfterWrite(java.time.Duration duration) {
-    return refreshAfterWrite(duration.toNanos(), TimeUnit.NANOSECONDS);
+    return refreshAfterWrite(toNanosSaturated(duration), TimeUnit.NANOSECONDS);
   }
 
   /**
@@ -841,6 +844,7 @@
     return this;
   }
 
+  @SuppressWarnings("GoodTime") // nanos internally, should be Duration
   long getRefreshNanos() {
     return (refreshNanos == UNSET_INT) ? DEFAULT_REFRESH_NANOS : refreshNanos;
   }
@@ -1026,4 +1030,23 @@
     }
     return s.toString();
   }
+
+  /**
+   * Returns the number of nanoseconds of the given duration without throwing or overflowing.
+   *
+   * <p>Instead of throwing {@link ArithmeticException}, this method silently saturates to either
+   * {@link Long#MAX_VALUE} or {@link Long#MIN_VALUE}. This behavior can be useful when decomposing
+   * a duration in order to call a legacy API which requires a {@code long, TimeUnit} pair.
+   */
+  @GwtIncompatible // java.time.Duration
+  @SuppressWarnings("GoodTime") // duration decomposition
+  private static long toNanosSaturated(java.time.Duration duration) {
+    // Using a try/catch seems lazy, but the catch block will rarely get invoked (except for
+    // durations longer than approximately +/- 292 years).
+    try {
+      return duration.toNanos();
+    } catch (ArithmeticException tooBig) {
+      return duration.isNegative() ? Long.MIN_VALUE : Long.MAX_VALUE;
+    }
+  }
 }
diff --git a/guava/src/com/google/common/cache/CacheBuilderSpec.java b/guava/src/com/google/common/cache/CacheBuilderSpec.java
index f9884ce..cba6721 100644
--- a/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ b/guava/src/com/google/common/cache/CacheBuilderSpec.java
@@ -27,7 +27,6 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -108,19 +107,19 @@
           .put("refreshInterval", new RefreshDurationParser())
           .build();
 
-  @MonotonicNonNull @VisibleForTesting Integer initialCapacity;
-  @MonotonicNonNull @VisibleForTesting Long maximumSize;
-  @MonotonicNonNull @VisibleForTesting Long maximumWeight;
-  @MonotonicNonNull @VisibleForTesting Integer concurrencyLevel;
-  @MonotonicNonNull @VisibleForTesting Strength keyStrength;
-  @MonotonicNonNull @VisibleForTesting Strength valueStrength;
-  @MonotonicNonNull @VisibleForTesting Boolean recordStats;
+  @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 long writeExpirationDuration;
-  @MonotonicNonNull @VisibleForTesting TimeUnit writeExpirationTimeUnit;
+  @VisibleForTesting @Nullable TimeUnit writeExpirationTimeUnit;
   @VisibleForTesting long accessExpirationDuration;
-  @MonotonicNonNull @VisibleForTesting TimeUnit accessExpirationTimeUnit;
+  @VisibleForTesting @Nullable TimeUnit accessExpirationTimeUnit;
   @VisibleForTesting long refreshDuration;
-  @MonotonicNonNull @VisibleForTesting TimeUnit refreshTimeUnit;
+  @VisibleForTesting @Nullable TimeUnit refreshTimeUnit;
   /** Specification; used for toParseableString(). */
   private final String specification;
 
diff --git a/guava/src/com/google/common/cache/CacheStats.java b/guava/src/com/google/common/cache/CacheStats.java
index 78f5a4b..777d53f 100644
--- a/guava/src/com/google/common/cache/CacheStats.java
+++ b/guava/src/com/google/common/cache/CacheStats.java
@@ -15,6 +15,8 @@
 package com.google.common.cache;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.math.LongMath.saturatedAdd;
+import static com.google.common.math.LongMath.saturatedSubtract;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.MoreObjects;
@@ -98,9 +100,13 @@
   /**
    * Returns the number of times {@link Cache} lookup methods have returned either a cached or
    * uncached value. This is defined as {@code hitCount + missCount}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public long requestCount() {
-    return hitCount + missCount;
+    return saturatedAdd(hitCount, missCount);
   }
 
   /** Returns the number of times {@link Cache} lookup methods have returned a cached value. */
@@ -146,9 +152,13 @@
    * Returns the total number of times that {@link Cache} lookup methods attempted to load new
    * values. This includes both successful load operations, as well as those that threw exceptions.
    * This is defined as {@code loadSuccessCount + loadExceptionCount}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public long loadCount() {
-    return loadSuccessCount + loadExceptionCount;
+    return saturatedAdd(loadSuccessCount, loadExceptionCount);
   }
 
   /**
@@ -183,9 +193,13 @@
    * Returns the ratio of cache loading attempts which threw exceptions. This is defined as {@code
    * loadExceptionCount / (loadSuccessCount + loadExceptionCount)}, or {@code 0.0} when {@code
    * loadSuccessCount + loadExceptionCount == 0}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public double loadExceptionRate() {
-    long totalLoadCount = loadSuccessCount + loadExceptionCount;
+    long totalLoadCount = saturatedAdd(loadSuccessCount, loadExceptionCount);
     return (totalLoadCount == 0) ? 0.0 : (double) loadExceptionCount / totalLoadCount;
   }
 
@@ -202,9 +216,13 @@
   /**
    * Returns the average time spent loading new values. This is defined as {@code totalLoadTime /
    * (loadSuccessCount + loadExceptionCount)}.
+   *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
    */
   public double averageLoadPenalty() {
-    long totalLoadCount = loadSuccessCount + loadExceptionCount;
+    long totalLoadCount = saturatedAdd(loadSuccessCount, loadExceptionCount);
     return (totalLoadCount == 0) ? 0.0 : (double) totalLoadTime / totalLoadCount;
   }
 
@@ -223,28 +241,32 @@
    */
   public CacheStats minus(CacheStats other) {
     return new CacheStats(
-        Math.max(0, hitCount - other.hitCount),
-        Math.max(0, missCount - other.missCount),
-        Math.max(0, loadSuccessCount - other.loadSuccessCount),
-        Math.max(0, loadExceptionCount - other.loadExceptionCount),
-        Math.max(0, totalLoadTime - other.totalLoadTime),
-        Math.max(0, evictionCount - other.evictionCount));
+        Math.max(0, saturatedSubtract(hitCount, other.hitCount)),
+        Math.max(0, saturatedSubtract(missCount, other.missCount)),
+        Math.max(0, saturatedSubtract(loadSuccessCount, other.loadSuccessCount)),
+        Math.max(0, saturatedSubtract(loadExceptionCount, other.loadExceptionCount)),
+        Math.max(0, saturatedSubtract(totalLoadTime, other.totalLoadTime)),
+        Math.max(0, saturatedSubtract(evictionCount, other.evictionCount)));
   }
 
   /**
    * Returns a new {@code CacheStats} representing the sum of this {@code CacheStats} and {@code
    * other}.
    *
+   * <p><b>Note:</b> the values of the metrics are undefined in case of overflow (though it is
+   * guaranteed not to throw an exception). If you require specific handling, we recommend
+   * implementing your own stats collector.
+   *
    * @since 11.0
    */
   public CacheStats plus(CacheStats other) {
     return new CacheStats(
-        hitCount + other.hitCount,
-        missCount + other.missCount,
-        loadSuccessCount + other.loadSuccessCount,
-        loadExceptionCount + other.loadExceptionCount,
-        totalLoadTime + other.totalLoadTime,
-        evictionCount + other.evictionCount);
+        saturatedAdd(hitCount, other.hitCount),
+        saturatedAdd(missCount, other.missCount),
+        saturatedAdd(loadSuccessCount, other.loadSuccessCount),
+        saturatedAdd(loadExceptionCount, other.loadExceptionCount),
+        saturatedAdd(totalLoadTime, other.totalLoadTime),
+        saturatedAdd(evictionCount, other.evictionCount));
   }
 
   @Override
diff --git a/guava/src/com/google/common/cache/LocalCache.java b/guava/src/com/google/common/cache/LocalCache.java
index f2b875d..a485ad5 100644
--- a/guava/src/com/google/common/cache/LocalCache.java
+++ b/guava/src/com/google/common/cache/LocalCache.java
@@ -50,8 +50,8 @@
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.google.common.util.concurrent.Uninterruptibles;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
+import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.Weak;
-import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
@@ -85,7 +85,6 @@
 import java.util.function.Predicate;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -998,7 +997,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1011,7 +1010,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1044,7 +1043,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1057,7 +1056,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1090,7 +1089,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1103,7 +1102,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1130,7 +1129,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1143,7 +1142,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1285,7 +1284,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1298,7 +1297,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1331,7 +1330,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1344,7 +1343,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1378,7 +1377,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> nextAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -1391,7 +1390,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousAccess = nullEntry();
+    @Weak ReferenceEntry<K, V> previousAccess = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -1418,7 +1417,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> nextWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> nextWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -1431,7 +1430,7 @@
     }
 
     // Guarded By Segment.this
-    ReferenceEntry<K, V> previousWrite = nullEntry();
+    @Weak ReferenceEntry<K, V> previousWrite = nullEntry();
 
     @Override
     public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -1677,6 +1676,7 @@
    * This method is a convenience for testing. Code should call {@link Segment#copyEntry} directly.
    */
   // Guarded By Segment.this
+  @SuppressWarnings("GuardedBy")
   @VisibleForTesting
   ReferenceEntry<K, V> copyEntry(ReferenceEntry<K, V> original, ReferenceEntry<K, V> newNext) {
     int hash = original.getHash();
@@ -1885,7 +1885,7 @@
     int threshold;
 
     /** The per-segment table. */
-    volatile @MonotonicNonNull AtomicReferenceArray<ReferenceEntry<K, V>> table;
+    volatile @Nullable AtomicReferenceArray<ReferenceEntry<K, V>> table;
 
     /** The maximum weight of this segment. UNSET_INT if there is no maximum. */
     final long maxSegmentWeight;
@@ -2111,7 +2111,7 @@
                     entryKey, hash, value, valueReference.getWeight(), RemovalCause.COLLECTED);
               } else if (map.isExpired(e, now)) {
                 // This is a duplicate check, as preWriteCleanup already purged expired
-                // entries, but let's accomodate an incorrect expiration queue.
+                // entries, but let's accommodate an incorrect expiration queue.
                 enqueueNotification(
                     entryKey, hash, value, valueReference.getWeight(), RemovalCause.EXPIRED);
               } else {
@@ -3628,7 +3628,7 @@
           @Override
           public void setWriteTime(long time) {}
 
-          ReferenceEntry<K, V> nextWrite = this;
+          @Weak ReferenceEntry<K, V> nextWrite = this;
 
           @Override
           public ReferenceEntry<K, V> getNextInWriteQueue() {
@@ -3640,7 +3640,7 @@
             this.nextWrite = next;
           }
 
-          ReferenceEntry<K, V> previousWrite = this;
+          @Weak ReferenceEntry<K, V> previousWrite = this;
 
           @Override
           public ReferenceEntry<K, V> getPreviousInWriteQueue() {
@@ -3687,7 +3687,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean remove(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       ReferenceEntry<K, V> previous = e.getPreviousInWriteQueue();
       ReferenceEntry<K, V> next = e.getNextInWriteQueue();
       connectWriteOrder(previous, next);
@@ -3699,7 +3699,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean contains(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       return e.getNextInWriteQueue() != NullEntry.INSTANCE;
     }
 
@@ -3767,7 +3767,7 @@
           @Override
           public void setAccessTime(long time) {}
 
-          ReferenceEntry<K, V> nextAccess = this;
+          @Weak ReferenceEntry<K, V> nextAccess = this;
 
           @Override
           public ReferenceEntry<K, V> getNextInAccessQueue() {
@@ -3779,7 +3779,7 @@
             this.nextAccess = next;
           }
 
-          ReferenceEntry<K, V> previousAccess = this;
+          @Weak ReferenceEntry<K, V> previousAccess = this;
 
           @Override
           public ReferenceEntry<K, V> getPreviousInAccessQueue() {
@@ -3826,7 +3826,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean remove(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       ReferenceEntry<K, V> previous = e.getPreviousInAccessQueue();
       ReferenceEntry<K, V> next = e.getNextInAccessQueue();
       connectAccessOrder(previous, next);
@@ -3838,7 +3838,7 @@
     @Override
     @SuppressWarnings("unchecked")
     public boolean contains(Object o) {
-      ReferenceEntry<K, V> e = (ReferenceEntry) o;
+      ReferenceEntry<K, V> e = (ReferenceEntry<K, V>) o;
       return e.getNextInAccessQueue() != NullEntry.INSTANCE;
     }
 
@@ -3918,9 +3918,7 @@
         }
         sum -= segments[i].modCount;
       }
-      if (sum != 0L) {
-        return false;
-      }
+      return sum == 0L;
     }
     return true;
   }
@@ -4280,32 +4278,32 @@
     }
   }
 
-  @MonotonicNonNull Set<K> keySet;
+  @RetainedWith @Nullable Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
     // does not impact recency ordering
     Set<K> ks = keySet;
-    return (ks != null) ? ks : (keySet = new KeySet(this));
+    return (ks != null) ? ks : (keySet = new KeySet());
   }
 
-  @MonotonicNonNull Collection<V> values;
+  @RetainedWith @Nullable Collection<V> values;
 
   @Override
   public Collection<V> values() {
     // does not impact recency ordering
     Collection<V> vs = values;
-    return (vs != null) ? vs : (values = new Values(this));
+    return (vs != null) ? vs : (values = new Values());
   }
 
-  @MonotonicNonNull Set<Entry<K, V>> entrySet;
+  @RetainedWith @Nullable Set<Entry<K, V>> entrySet;
 
   @Override
   @GwtIncompatible // Not supported.
   public Set<Entry<K, V>> entrySet() {
     // does not impact recency ordering
     Set<Entry<K, V>> es = entrySet;
-    return (es != null) ? es : (entrySet = new EntrySet(this));
+    return (es != null) ? es : (entrySet = new EntrySet());
   }
 
   // Iterator Support
@@ -4314,8 +4312,8 @@
 
     int nextSegmentIndex;
     int nextTableIndex;
-    @MonotonicNonNull Segment<K, V> currentSegment;
-    @MonotonicNonNull AtomicReferenceArray<ReferenceEntry<K, V>> currentTable;
+    @Nullable Segment<K, V> currentSegment;
+    @Nullable AtomicReferenceArray<ReferenceEntry<K, V>> currentTable;
     @Nullable ReferenceEntry<K, V> nextEntry;
     @Nullable WriteThroughEntry nextExternal;
     @Nullable WriteThroughEntry lastReturned;
@@ -4496,25 +4494,19 @@
   }
 
   abstract class AbstractCacheSet<T> extends AbstractSet<T> {
-    @Weak final ConcurrentMap<?, ?> map;
-
-    AbstractCacheSet(ConcurrentMap<?, ?> map) {
-      this.map = map;
-    }
-
     @Override
     public int size() {
-      return map.size();
+      return LocalCache.this.size();
     }
 
     @Override
     public boolean isEmpty() {
-      return map.isEmpty();
+      return LocalCache.this.isEmpty();
     }
 
     @Override
     public void clear() {
-      map.clear();
+      LocalCache.this.clear();
     }
 
     // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android.
@@ -4555,13 +4547,8 @@
     return changed;
   }
 
-  @WeakOuter
   final class KeySet extends AbstractCacheSet<K> {
 
-    KeySet(ConcurrentMap<?, ?> map) {
-      super(map);
-    }
-
     @Override
     public Iterator<K> iterator() {
       return new KeyIterator();
@@ -4569,36 +4556,29 @@
 
     @Override
     public boolean contains(Object o) {
-      return map.containsKey(o);
+      return LocalCache.this.containsKey(o);
     }
 
     @Override
     public boolean remove(Object o) {
-      return map.remove(o) != null;
+      return LocalCache.this.remove(o) != null;
     }
   }
 
-  @WeakOuter
   final class Values extends AbstractCollection<V> {
-    private final ConcurrentMap<?, ?> map;
-
-    Values(ConcurrentMap<?, ?> map) {
-      this.map = map;
-    }
-
     @Override
     public int size() {
-      return map.size();
+      return LocalCache.this.size();
     }
 
     @Override
     public boolean isEmpty() {
-      return map.isEmpty();
+      return LocalCache.this.isEmpty();
     }
 
     @Override
     public void clear() {
-      map.clear();
+      LocalCache.this.clear();
     }
 
     @Override
@@ -4614,7 +4594,7 @@
 
     @Override
     public boolean contains(Object o) {
-      return map.containsValue(o);
+      return LocalCache.this.containsValue(o);
     }
 
     // super.toArray() may misbehave if size() is inaccurate, at least on old versions of Android.
@@ -4631,13 +4611,8 @@
     }
   }
 
-  @WeakOuter
   final class EntrySet extends AbstractCacheSet<Entry<K, V>> {
 
-    EntrySet(ConcurrentMap<?, ?> map) {
-      super(map);
-    }
-
     @Override
     public Iterator<Entry<K, V>> iterator() {
       return new EntryIterator();
@@ -4702,7 +4677,7 @@
     final @Nullable Ticker ticker;
     final CacheLoader<? super K, V> loader;
 
-    transient @MonotonicNonNull Cache<K, V> delegate;
+    transient @Nullable Cache<K, V> delegate;
 
     ManualSerializationProxy(LocalCache<K, V> cache) {
       this(
@@ -4807,7 +4782,7 @@
       implements LoadingCache<K, V>, Serializable {
     private static final long serialVersionUID = 1;
 
-    transient @MonotonicNonNull LoadingCache<K, V> autoDelegate;
+    transient @Nullable LoadingCache<K, V> autoDelegate;
 
     LoadingSerializationProxy(LocalCache<K, V> cache) {
       super(cache);
diff --git a/guava/src/com/google/common/cache/ReferenceEntry.java b/guava/src/com/google/common/cache/ReferenceEntry.java
index 7c8a88d..63bf2fe 100644
--- a/guava/src/com/google/common/cache/ReferenceEntry.java
+++ b/guava/src/com/google/common/cache/ReferenceEntry.java
@@ -64,6 +64,7 @@
    */
 
   /** Returns the time that this entry was last accessed, in ns. */
+  @SuppressWarnings("GoodTime")
   long getAccessTime();
 
   /** Sets the entry access time in ns. */
@@ -88,6 +89,7 @@
    * expired from the head of the list.
    */
 
+  @SuppressWarnings("GoodTime")
   /** Returns the time that this entry was last written, in ns. */
   long getWriteTime();
 
diff --git a/guava/src/com/google/common/collect/AbstractBiMap.java b/guava/src/com/google/common/collect/AbstractBiMap.java
index 35b1add..68744c1 100644
--- a/guava/src/com/google/common/collect/AbstractBiMap.java
+++ b/guava/src/com/google/common/collect/AbstractBiMap.java
@@ -35,7 +35,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.function.BiFunction;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,8 +50,8 @@
 abstract class AbstractBiMap<K, V> extends ForwardingMap<K, V>
     implements BiMap<K, V>, Serializable {
 
-  private transient @MonotonicNonNull Map<K, V> delegate;
-  @MonotonicNonNull @RetainedWith transient AbstractBiMap<V, K> inverse;
+  private transient @Nullable Map<K, V> delegate;
+  @RetainedWith transient @Nullable AbstractBiMap<V, K> inverse;
 
   /** Package-private constructor for creating a map-backed bimap. */
   AbstractBiMap(Map<K, V> forward, Map<V, K> backward) {
@@ -211,7 +210,7 @@
     return inverse;
   }
 
-  private transient @MonotonicNonNull Set<K> keySet;
+  private transient @Nullable Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -256,7 +255,7 @@
     }
   }
 
-  private transient @MonotonicNonNull Set<V> valueSet;
+  private transient @Nullable Set<V> valueSet;
 
   @Override
   public Set<V> values() {
@@ -298,7 +297,7 @@
     }
   }
 
-  private transient @MonotonicNonNull Set<Entry<K, V>> entrySet;
+  private transient @Nullable Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
diff --git a/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java b/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
index b63281a..b9f46ed 100644
--- a/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
@@ -42,7 +42,6 @@
 import java.util.SortedSet;
 import java.util.Spliterator;
 import java.util.function.BiConsumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -1123,7 +1122,7 @@
   private abstract class Itr<T> implements Iterator<T> {
     final Iterator<Entry<K, Collection<V>>> keyIterator;
     @Nullable K key;
-    @MonotonicNonNull Collection<V> collection;
+    @Nullable Collection<V> collection;
     Iterator<V> valueIterator;
 
     Itr() {
@@ -1472,7 +1471,7 @@
       return new SortedAsMap(sortedMap().tailMap(fromKey));
     }
 
-    @MonotonicNonNull SortedSet<K> sortedKeySet;
+    @Nullable SortedSet<K> sortedKeySet;
 
     // returns a SortedSet, even though returning a Set would be sufficient to
     // satisfy the SortedMap.keySet() interface
diff --git a/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java b/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
index fe98ac8..2d28c1d 100644
--- a/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
@@ -33,7 +33,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.function.ObjIntConsumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -193,7 +192,7 @@
    */
   private class MapBasedMultisetIterator implements Iterator<E> {
     final Iterator<Map.Entry<E, Count>> entryIterator;
-    Map.@MonotonicNonNull Entry<E, Count> currentEntry;
+    Map.@Nullable Entry<E, Count> currentEntry;
     int occurrencesLeft;
     boolean canRemove;
 
diff --git a/guava/src/com/google/common/collect/AbstractMultimap.java b/guava/src/com/google/common/collect/AbstractMultimap.java
index 0625bd8..fedafd2 100644
--- a/guava/src/com/google/common/collect/AbstractMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractMultimap.java
@@ -29,7 +29,6 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -108,7 +107,7 @@
     return result;
   }
 
-  private transient @MonotonicNonNull Collection<Entry<K, V>> entries;
+  private transient @Nullable Collection<Entry<K, V>> entries;
 
   @Override
   public Collection<Entry<K, V>> entries() {
@@ -156,7 +155,7 @@
         entryIterator(), size(), (this instanceof SetMultimap) ? Spliterator.DISTINCT : 0);
   }
 
-  private transient @MonotonicNonNull Set<K> keySet;
+  private transient @Nullable Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -166,7 +165,7 @@
 
   abstract Set<K> createKeySet();
 
-  private transient @MonotonicNonNull Multiset<K> keys;
+  private transient @Nullable Multiset<K> keys;
 
   @Override
   public Multiset<K> keys() {
@@ -176,7 +175,7 @@
 
   abstract Multiset<K> createKeys();
 
-  private transient @MonotonicNonNull Collection<V> values;
+  private transient @Nullable Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -222,7 +221,7 @@
     return Spliterators.spliterator(valueIterator(), size(), 0);
   }
 
-  private transient @MonotonicNonNull Map<K, Collection<V>> asMap;
+  private transient @Nullable Map<K, Collection<V>> asMap;
 
   @Override
   public Map<K, Collection<V>> asMap() {
diff --git a/guava/src/com/google/common/collect/AbstractMultiset.java b/guava/src/com/google/common/collect/AbstractMultiset.java
index aea086f..1bf3721 100644
--- a/guava/src/com/google/common/collect/AbstractMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractMultiset.java
@@ -20,12 +20,12 @@
 
 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;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -124,7 +124,7 @@
 
   // Views
 
-  private transient @MonotonicNonNull Set<E> elementSet;
+  @LazyInit private transient @Nullable Set<E> elementSet;
 
   @Override
   public Set<E> elementSet() {
@@ -158,7 +158,7 @@
 
   abstract Iterator<E> elementIterator();
 
-  private transient @MonotonicNonNull Set<Entry<E>> entrySet;
+  @LazyInit private transient @Nullable Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
diff --git a/guava/src/com/google/common/collect/AbstractSequentialIterator.java b/guava/src/com/google/common/collect/AbstractSequentialIterator.java
index 8ef569f..37540c2 100644
--- a/guava/src/com/google/common/collect/AbstractSequentialIterator.java
+++ b/guava/src/com/google/common/collect/AbstractSequentialIterator.java
@@ -56,8 +56,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()}.
    */
-  @Nullable
-  protected abstract T computeNext(T previous);
+  protected abstract @Nullable T computeNext(T previous);
 
   @Override
   public final boolean hasNext() {
diff --git a/guava/src/com/google/common/collect/AbstractSortedMultiset.java b/guava/src/com/google/common/collect/AbstractSortedMultiset.java
index 6139379..67d629a 100644
--- a/guava/src/com/google/common/collect/AbstractSortedMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractSortedMultiset.java
@@ -21,7 +21,6 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NavigableSet;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -116,7 +115,7 @@
     return Multisets.iteratorImpl(descendingMultiset());
   }
 
-  private transient @MonotonicNonNull SortedMultiset<E> descendingMultiset;
+  private transient @Nullable SortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
diff --git a/guava/src/com/google/common/collect/AbstractTable.java b/guava/src/com/google/common/collect/AbstractTable.java
index d411160..823570d 100644
--- a/guava/src/com/google/common/collect/AbstractTable.java
+++ b/guava/src/com/google/common/collect/AbstractTable.java
@@ -16,6 +16,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.AbstractSet;
@@ -24,7 +25,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -107,7 +107,7 @@
     }
   }
 
-  private transient @MonotonicNonNull Set<Cell<R, C, V>> cellSet;
+  @LazyInit private transient @Nullable Set<Cell<R, C, V>> cellSet;
 
   @Override
   public Set<Cell<R, C, V>> cellSet() {
@@ -170,7 +170,7 @@
     }
   }
 
-  private transient @MonotonicNonNull Collection<V> values;
+  @LazyInit private transient @Nullable Collection<V> values;
 
   @Override
   public Collection<V> values() {
diff --git a/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java b/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java
index 1bd4ba1..9a8cdfb 100644
--- a/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java
+++ b/guava/src/com/google/common/collect/ArrayListMultimapGwtSerializationDependencies.java
@@ -24,7 +24,7 @@
  * A dummy superclass to support GWT serialization of the element types of an {@link
  * ArrayListMultimap}. The GWT supersource for this class contains a field for each type.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/guava/src/com/google/common/collect/ArrayTable.java b/guava/src/com/google/common/collect/ArrayTable.java
index ae6d97f..f500a89 100644
--- a/guava/src/com/google/common/collect/ArrayTable.java
+++ b/guava/src/com/google/common/collect/ArrayTable.java
@@ -35,7 +35,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -142,7 +141,7 @@
      * TODO(jlevy): Support only one of rowKey / columnKey being empty? If we
      * do, when columnKeys is empty but rowKeys isn't, rowKeyList() can contain
      * elements but rowKeySet() will be empty and containsRow() won't
-     * acknolwedge them.
+     * acknowledge them.
      */
     rowKeyToIndex = Maps.indexMap(rowList);
     columnKeyToIndex = Maps.indexMap(columnList);
@@ -621,7 +620,7 @@
     return columnKeyToIndex.keySet();
   }
 
-  private transient @MonotonicNonNull ColumnMap columnMap;
+  private transient @Nullable ColumnMap columnMap;
 
   @Override
   public Map<C, Map<R, V>> columnMap() {
@@ -709,7 +708,7 @@
     return rowKeyToIndex.keySet();
   }
 
-  private transient @MonotonicNonNull RowMap rowMap;
+  private transient @Nullable RowMap rowMap;
 
   @Override
   public Map<R, Map<C, V>> rowMap() {
diff --git a/guava/src/com/google/common/collect/CartesianList.java b/guava/src/com/google/common/collect/CartesianList.java
index 0dd57c3..ebff724 100644
--- a/guava/src/com/google/common/collect/CartesianList.java
+++ b/guava/src/com/google/common/collect/CartesianList.java
@@ -89,6 +89,28 @@
   }
 
   @Override
+  public int lastIndexOf(Object o) {
+    if (!(o instanceof List)) {
+      return -1;
+    }
+    List<?> list = (List<?>) o;
+    if (list.size() != axes.size()) {
+      return -1;
+    }
+    ListIterator<?> itr = list.listIterator();
+    int computedIndex = 0;
+    while (itr.hasNext()) {
+      int axisIndex = itr.nextIndex();
+      int elemIndex = axes.get(axisIndex).lastIndexOf(itr.next());
+      if (elemIndex == -1) {
+        return -1;
+      }
+      computedIndex += elemIndex * axesSizeProduct[axisIndex + 1];
+    }
+    return computedIndex;
+  }
+
+  @Override
   public ImmutableList<E> get(final int index) {
     checkElementIndex(index, size());
     return new ImmutableList<E>() {
@@ -118,7 +140,21 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object o) {
-    return indexOf(o) != -1;
+  public boolean contains(@Nullable Object object) {
+    if (!(object instanceof List)) {
+      return false;
+    }
+    List<?> list = (List<?>) object;
+    if (list.size() != axes.size()) {
+      return false;
+    }
+    int i = 0;
+    for (Object o : list) {
+      if (!axes.get(i).contains(o)) {
+        return false;
+      }
+      i++;
+    }
+    return true;
   }
 }
diff --git a/guava/src/com/google/common/collect/ClassToInstanceMap.java b/guava/src/com/google/common/collect/ClassToInstanceMap.java
index 1b6a5dd..a173556 100644
--- a/guava/src/com/google/common/collect/ClassToInstanceMap.java
+++ b/guava/src/com/google/common/collect/ClassToInstanceMap.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -40,6 +41,7 @@
  * @author Kevin Bourrillion
  * @since 2.0
  */
+@DoNotMock("Use ImmutableClassToInstanceMap or MutableClassToInstanceMap")
 @GwtCompatible
 public interface ClassToInstanceMap<B> extends Map<Class<? extends B>, B> {
   /**
diff --git a/guava/src/com/google/common/collect/CollectSpliterators.java b/guava/src/com/google/common/collect/CollectSpliterators.java
index bb4639e..974f77f 100644
--- a/guava/src/com/google/common/collect/CollectSpliterators.java
+++ b/guava/src/com/google/common/collect/CollectSpliterators.java
@@ -20,12 +20,15 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.j2objc.annotations.Weak;
 import java.util.Comparator;
 import java.util.Spliterator;
 import java.util.function.Consumer;
+import java.util.function.DoubleConsumer;
 import java.util.function.Function;
 import java.util.function.IntConsumer;
 import java.util.function.IntFunction;
+import java.util.function.LongConsumer;
 import java.util.function.Predicate;
 import java.util.stream.IntStream;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -99,26 +102,27 @@
    * Returns a {@code Spliterator} over the elements of {@code fromSpliterator} mapped by {@code
    * function}.
    */
-  static <F, T> Spliterator<T> map(
-      Spliterator<F> fromSpliterator, Function<? super F, ? extends T> function) {
+  static <InElementT, OutElementT> Spliterator<OutElementT> map(
+      Spliterator<InElementT> fromSpliterator,
+      Function<? super InElementT, ? extends OutElementT> function) {
     checkNotNull(fromSpliterator);
     checkNotNull(function);
-    return new Spliterator<T>() {
+    return new Spliterator<OutElementT>() {
 
       @Override
-      public boolean tryAdvance(Consumer<? super T> action) {
+      public boolean tryAdvance(Consumer<? super OutElementT> action) {
         return fromSpliterator.tryAdvance(
             fromElement -> action.accept(function.apply(fromElement)));
       }
 
       @Override
-      public void forEachRemaining(Consumer<? super T> action) {
+      public void forEachRemaining(Consumer<? super OutElementT> action) {
         fromSpliterator.forEachRemaining(fromElement -> action.accept(function.apply(fromElement)));
       }
 
       @Override
-      public Spliterator<T> trySplit() {
-        Spliterator<F> fromSplit = fromSpliterator.trySplit();
+      public Spliterator<OutElementT> trySplit() {
+        Spliterator<InElementT> fromSplit = fromSpliterator.trySplit();
         return (fromSplit != null) ? map(fromSplit, function) : null;
       }
 
@@ -194,9 +198,9 @@
    * Returns a {@code Spliterator} that iterates over the elements of the spliterators generated by
    * applying {@code function} to the elements of {@code fromSpliterator}.
    */
-  static <F, T> Spliterator<T> flatMap(
-      Spliterator<F> fromSpliterator,
-      Function<? super F, Spliterator<T>> function,
+  static <InElementT, OutElementT> Spliterator<OutElementT> flatMap(
+      Spliterator<InElementT> fromSpliterator,
+      Function<? super InElementT, Spliterator<OutElementT>> function,
       int topCharacteristics,
       long topSize) {
     checkArgument(
@@ -207,84 +211,324 @@
         "flatMap does not support SORTED characteristic");
     checkNotNull(fromSpliterator);
     checkNotNull(function);
-    class FlatMapSpliterator implements Spliterator<T> {
-      @Nullable Spliterator<T> prefix;
-      final Spliterator<F> from;
-      int characteristics;
-      long estimatedSize;
+    return new FlatMapSpliteratorOfObject<InElementT, OutElementT>(
+        null, fromSpliterator, function, topCharacteristics, topSize);
+  }
 
-      FlatMapSpliterator(
-          Spliterator<T> prefix, Spliterator<F> from, int characteristics, long estimatedSize) {
-        this.prefix = prefix;
-        this.from = from;
-        this.characteristics = characteristics;
-        this.estimatedSize = estimatedSize;
-      }
+  /**
+   * Returns a {@code Spliterator.OfInt} that iterates over the elements of the spliterators
+   * 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(
+      Spliterator<InElementT> fromSpliterator,
+      Function<? super InElementT, Spliterator.OfInt> function,
+      int topCharacteristics,
+      long topSize) {
+    checkArgument(
+        (topCharacteristics & Spliterator.SUBSIZED) == 0,
+        "flatMap does not support SUBSIZED characteristic");
+    checkArgument(
+        (topCharacteristics & Spliterator.SORTED) == 0,
+        "flatMap does not support SORTED characteristic");
+    checkNotNull(fromSpliterator);
+    checkNotNull(function);
+    return new FlatMapSpliteratorOfInt<InElementT>(
+        null, fromSpliterator, function, topCharacteristics, topSize);
+  }
 
-      @Override
-      public boolean tryAdvance(Consumer<? super T> action) {
-        while (true) {
-          if (prefix != null && prefix.tryAdvance(action)) {
-            if (estimatedSize != Long.MAX_VALUE) {
-              estimatedSize--;
-            }
-            return true;
-          } else {
-            prefix = null;
+  /**
+   * Returns a {@code Spliterator.OfLong} that iterates over the elements of the spliterators
+   * 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(
+      Spliterator<InElementT> fromSpliterator,
+      Function<? super InElementT, Spliterator.OfLong> function,
+      int topCharacteristics,
+      long topSize) {
+    checkArgument(
+        (topCharacteristics & Spliterator.SUBSIZED) == 0,
+        "flatMap does not support SUBSIZED characteristic");
+    checkArgument(
+        (topCharacteristics & Spliterator.SORTED) == 0,
+        "flatMap does not support SORTED characteristic");
+    checkNotNull(fromSpliterator);
+    checkNotNull(function);
+    return new FlatMapSpliteratorOfLong<InElementT>(
+        null, fromSpliterator, function, topCharacteristics, topSize);
+  }
+
+  /**
+   * Returns a {@code Spliterator.OfDouble} that iterates over the elements of the spliterators
+   * 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(
+      Spliterator<InElementT> fromSpliterator,
+      Function<? super InElementT, Spliterator.OfDouble> function,
+      int topCharacteristics,
+      long topSize) {
+    checkArgument(
+        (topCharacteristics & Spliterator.SUBSIZED) == 0,
+        "flatMap does not support SUBSIZED characteristic");
+    checkArgument(
+        (topCharacteristics & Spliterator.SORTED) == 0,
+        "flatMap does not support SORTED characteristic");
+    checkNotNull(fromSpliterator);
+    checkNotNull(function);
+    return new FlatMapSpliteratorOfDouble<InElementT>(
+        null, fromSpliterator, function, topCharacteristics, topSize);
+  }
+
+  /**
+   * Implements the {@link Stream#flatMap} operation on spliterators.
+   *
+   * @param <InElementT> the element type of the input spliterator
+   * @param <OutElementT> the element type of the output spliterators
+   * @param <OutSpliteratorT> the type of the output spliterators
+   */
+  abstract static class FlatMapSpliterator<
+          InElementT, OutElementT, OutSpliteratorT extends Spliterator<OutElementT>>
+      implements Spliterator<OutElementT> {
+    /** Factory for constructing {@link FlatMapSpliterator} instances. */
+    @FunctionalInterface
+    interface Factory<InElementT, OutSpliteratorT extends Spliterator<?>> {
+      OutSpliteratorT newFlatMapSpliterator(
+          OutSpliteratorT prefix,
+          Spliterator<InElementT> fromSplit,
+          Function<? super InElementT, OutSpliteratorT> function,
+          int splitCharacteristics,
+          long estSplitSize);
+    }
+
+    @Nullable @Weak OutSpliteratorT prefix;
+    final Spliterator<InElementT> from;
+    final Function<? super InElementT, OutSpliteratorT> function;
+    final Factory<InElementT, OutSpliteratorT> factory;
+    int characteristics;
+    long estimatedSize;
+
+    FlatMapSpliterator(
+        OutSpliteratorT prefix,
+        Spliterator<InElementT> from,
+        Function<? super InElementT, OutSpliteratorT> function,
+        Factory<InElementT, OutSpliteratorT> factory,
+        int characteristics,
+        long estimatedSize) {
+      this.prefix = prefix;
+      this.from = from;
+      this.function = function;
+      this.factory = factory;
+      this.characteristics = characteristics;
+      this.estimatedSize = estimatedSize;
+    }
+
+    /*
+     * The tryAdvance and forEachRemaining in FlatMapSpliteratorOfPrimitive are overloads of these
+     * methods, not overrides. They are annotated @Override because they implement methods from
+     * Spliterator.OfPrimitive (and override default implementations from Spliterator.OfPrimitive or
+     * a subtype like Spliterator.OfInt).
+     */
+
+    @Override
+    public final boolean tryAdvance(Consumer<? super OutElementT> action) {
+      while (true) {
+        if (prefix != null && prefix.tryAdvance(action)) {
+          if (estimatedSize != Long.MAX_VALUE) {
+            estimatedSize--;
           }
-          if (!from.tryAdvance(fromElement -> prefix = function.apply(fromElement))) {
-            return false;
-          }
-        }
-      }
-
-      @Override
-      public void forEachRemaining(Consumer<? super T> action) {
-        if (prefix != null) {
-          prefix.forEachRemaining(action);
+          return true;
+        } else {
           prefix = null;
         }
-        from.forEachRemaining(fromElement -> function.apply(fromElement).forEachRemaining(action));
-        estimatedSize = 0;
-      }
-
-      @Override
-      public Spliterator<T> trySplit() {
-        Spliterator<F> fromSplit = from.trySplit();
-        if (fromSplit != null) {
-          int splitCharacteristics = characteristics & ~Spliterator.SIZED;
-          long estSplitSize = estimateSize();
-          if (estSplitSize < Long.MAX_VALUE) {
-            estSplitSize /= 2;
-            this.estimatedSize -= estSplitSize;
-            this.characteristics = splitCharacteristics;
-          }
-          Spliterator<T> result =
-              new FlatMapSpliterator(this.prefix, fromSplit, splitCharacteristics, estSplitSize);
-          this.prefix = null;
-          return result;
-        } else if (prefix != null) {
-          Spliterator<T> result = prefix;
-          this.prefix = null;
-          return result;
-        } else {
-          return null;
+        if (!from.tryAdvance(fromElement -> prefix = function.apply(fromElement))) {
+          return false;
         }
       }
-
-      @Override
-      public long estimateSize() {
-        if (prefix != null) {
-          estimatedSize = Math.max(estimatedSize, prefix.estimateSize());
-        }
-        return Math.max(estimatedSize, 0);
-      }
-
-      @Override
-      public int characteristics() {
-        return characteristics;
-      }
     }
-    return new FlatMapSpliterator(null, fromSpliterator, topCharacteristics, topSize);
+
+    @Override
+    public final void forEachRemaining(Consumer<? super OutElementT> action) {
+      if (prefix != null) {
+        prefix.forEachRemaining(action);
+        prefix = null;
+      }
+      from.forEachRemaining(
+          fromElement -> {
+            Spliterator<OutElementT> elements = function.apply(fromElement);
+            if (elements != null) {
+              elements.forEachRemaining(action);
+            }
+          });
+      estimatedSize = 0;
+    }
+
+    @Override
+    public final OutSpliteratorT trySplit() {
+      Spliterator<InElementT> fromSplit = from.trySplit();
+      if (fromSplit != null) {
+        int splitCharacteristics = characteristics & ~Spliterator.SIZED;
+        long estSplitSize = estimateSize();
+        if (estSplitSize < Long.MAX_VALUE) {
+          estSplitSize /= 2;
+          this.estimatedSize -= estSplitSize;
+          this.characteristics = splitCharacteristics;
+        }
+        OutSpliteratorT result =
+            factory.newFlatMapSpliterator(
+                this.prefix, fromSplit, function, splitCharacteristics, estSplitSize);
+        this.prefix = null;
+        return result;
+      } else if (prefix != null) {
+        OutSpliteratorT result = prefix;
+        this.prefix = null;
+        return result;
+      } else {
+        return null;
+      }
+    }
+
+    @Override
+    public final long estimateSize() {
+      if (prefix != null) {
+        estimatedSize = Math.max(estimatedSize, prefix.estimateSize());
+      }
+      return Math.max(estimatedSize, 0);
+    }
+
+    @Override
+    public final int characteristics() {
+      return characteristics;
+    }
+  }
+
+  /**
+   * Implementation of {@link Stream#flatMap} with an object spliterator output type.
+   *
+   * <p>To avoid having this type, we could use {@code FlatMapSpliterator} directly. The main
+   * advantages to having the type are the ability to use its constructor reference below and the
+   * parallelism with the primitive version. In short, it makes its caller ({@code flatMap})
+   * simpler.
+   *
+   * @param <InElementT> the element type of the input spliterator
+   * @param <OutElementT> the element type of the output spliterators
+   */
+  static final class FlatMapSpliteratorOfObject<InElementT, OutElementT>
+      extends FlatMapSpliterator<InElementT, OutElementT, Spliterator<OutElementT>> {
+    FlatMapSpliteratorOfObject(
+        Spliterator<OutElementT> prefix,
+        Spliterator<InElementT> from,
+        Function<? super InElementT, Spliterator<OutElementT>> function,
+        int characteristics,
+        long estimatedSize) {
+      super(
+          prefix, from, function, FlatMapSpliteratorOfObject::new, characteristics, estimatedSize);
+    }
+  }
+
+  /**
+   * Implementation of {@link Stream#flatMap} with a primitive spliterator output type.
+   *
+   * @param <InElementT> the element type of the input spliterator
+   * @param <OutElementT> the (boxed) element type of the output spliterators
+   * @param <OutConsumerT> the specialized consumer type for the primitive output type
+   * @param <OutSpliteratorT> the primitive spliterator type associated with {@code OutElementT}
+   */
+  abstract static class FlatMapSpliteratorOfPrimitive<
+          InElementT,
+          OutElementT,
+          OutConsumerT,
+          OutSpliteratorT extends
+              Spliterator.OfPrimitive<OutElementT, OutConsumerT, OutSpliteratorT>>
+      extends FlatMapSpliterator<InElementT, OutElementT, OutSpliteratorT>
+      implements Spliterator.OfPrimitive<OutElementT, OutConsumerT, OutSpliteratorT> {
+
+    FlatMapSpliteratorOfPrimitive(
+        OutSpliteratorT prefix,
+        Spliterator<InElementT> from,
+        Function<? super InElementT, OutSpliteratorT> function,
+        Factory<InElementT, OutSpliteratorT> factory,
+        int characteristics,
+        long estimatedSize) {
+      super(prefix, from, function, factory, characteristics, estimatedSize);
+    }
+
+    @Override
+    public final boolean tryAdvance(OutConsumerT action) {
+      while (true) {
+        if (prefix != null && prefix.tryAdvance(action)) {
+          if (estimatedSize != Long.MAX_VALUE) {
+            estimatedSize--;
+          }
+          return true;
+        } else {
+          prefix = null;
+        }
+        if (!from.tryAdvance(fromElement -> prefix = function.apply(fromElement))) {
+          return false;
+        }
+      }
+    }
+
+    @Override
+    public final void forEachRemaining(OutConsumerT action) {
+      if (prefix != null) {
+        prefix.forEachRemaining(action);
+        prefix = null;
+      }
+      from.forEachRemaining(
+          fromElement -> {
+            OutSpliteratorT elements = function.apply(fromElement);
+            if (elements != null) {
+              elements.forEachRemaining(action);
+            }
+          });
+      estimatedSize = 0;
+    }
+  }
+
+  /** Implementation of {@link #flatMapToInt}. */
+  static final class FlatMapSpliteratorOfInt<InElementT>
+      extends FlatMapSpliteratorOfPrimitive<InElementT, Integer, IntConsumer, Spliterator.OfInt>
+      implements Spliterator.OfInt {
+    FlatMapSpliteratorOfInt(
+        Spliterator.OfInt prefix,
+        Spliterator<InElementT> from,
+        Function<? super InElementT, Spliterator.OfInt> function,
+        int characteristics,
+        long estimatedSize) {
+      super(prefix, from, function, FlatMapSpliteratorOfInt::new, characteristics, estimatedSize);
+    }
+  }
+
+  /** Implementation of {@link #flatMapToLong}. */
+  static final class FlatMapSpliteratorOfLong<InElementT>
+      extends FlatMapSpliteratorOfPrimitive<InElementT, Long, LongConsumer, Spliterator.OfLong>
+      implements Spliterator.OfLong {
+    FlatMapSpliteratorOfLong(
+        Spliterator.OfLong prefix,
+        Spliterator<InElementT> from,
+        Function<? super InElementT, Spliterator.OfLong> function,
+        int characteristics,
+        long estimatedSize) {
+      super(prefix, from, function, FlatMapSpliteratorOfLong::new, characteristics, estimatedSize);
+    }
+  }
+
+  /** Implementation of {@link #flatMapToDouble}. */
+  static final class FlatMapSpliteratorOfDouble<InElementT>
+      extends FlatMapSpliteratorOfPrimitive<
+          InElementT, Double, DoubleConsumer, Spliterator.OfDouble>
+      implements Spliterator.OfDouble {
+    FlatMapSpliteratorOfDouble(
+        Spliterator.OfDouble prefix,
+        Spliterator<InElementT> from,
+        Function<? super InElementT, Spliterator.OfDouble> function,
+        int characteristics,
+        long estimatedSize) {
+      super(
+          prefix, from, function, FlatMapSpliteratorOfDouble::new, characteristics, estimatedSize);
+    }
   }
 }
diff --git a/guava/src/com/google/common/collect/Collections2.java b/guava/src/com/google/common/collect/Collections2.java
index 2685be9..009f10e 100644
--- a/guava/src/com/google/common/collect/Collections2.java
+++ b/guava/src/com/google/common/collect/Collections2.java
@@ -352,11 +352,6 @@
     return new StringBuilder((int) Math.min(size * 8L, Ints.MAX_POWER_OF_TWO));
   }
 
-  /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> Collection<T> cast(Iterable<T> iterable) {
-    return (Collection<T>) iterable;
-  }
-
   /**
    * Returns a {@link Collection} of all the permutations of the specified {@link Iterable}.
    *
diff --git a/guava/src/com/google/common/collect/CompactHashMap.java b/guava/src/com/google/common/collect/CompactHashMap.java
index 8fa34ed..a68890e 100644
--- a/guava/src/com/google/common/collect/CompactHashMap.java
+++ b/guava/src/com/google/common/collect/CompactHashMap.java
@@ -18,15 +18,18 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 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 com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
+import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
@@ -35,6 +38,7 @@
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -43,7 +47,6 @@
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -70,16 +73,16 @@
  * to prioritize memory over CPU.
  *
  * @author Louis Wasserman
+ * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
 class CompactHashMap<K, V> 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
-   * *Map variants. Followon optimizations, such as using 16-bit indices for small collections, will
-   * take more work to implement. This class is particularly hard to benchmark, because the benefit
-   * is not only in less allocation, but also having the GC do less work to scan the heap because of
-   * fewer references, which is particularly hard to quantify.
+   * *Map variants. This class is particularly hard to benchmark, because the benefit is not only in
+   * less allocation, but also having the GC do less work to scan the heap because of fewer
+   * references, which is particularly hard to quantify.
    */
 
   /** Creates an empty {@code CompactHashMap} instance. */
@@ -100,130 +103,172 @@
     return new CompactHashMap<>(expectedSize);
   }
 
-  private static final int MAXIMUM_CAPACITY = 1 << 30;
-
-  // TODO(user): decide, and inline, load factor. 0.75?
-  static final float DEFAULT_LOAD_FACTOR = 1.0f;
-
-  /** Bitmask that selects the low 32 bits. */
-  private static final long NEXT_MASK = (1L << 32) - 1;
-
-  /** Bitmask that selects the high 32 bits. */
-  private static final long HASH_MASK = ~NEXT_MASK;
-
-  // TODO(user): decide default size
-  static final int DEFAULT_SIZE = 3;
-
-  // used to indicate blank table entries
-  static final int UNSET = -1;
+  private static final Object NOT_FOUND = new Object();
 
   /**
-   * The hashtable. Its values are indexes to the keys, values, and entries arrays.
-   *
-   * <p>Currently, the UNSET value means "null pointer", and any non negative value x is the actual
-   * index.
-   *
-   * <p>Its size must be a power of two.
+   * Maximum allowed false positive probability of detecting a hash flooding attack given random
+   * input.
    */
-  private transient int @MonotonicNonNull [] table;
+  @VisibleForTesting(
+      )
+  static final double HASH_FLOODING_FPP = 0.001;
 
   /**
-   * Contains the logical entries, in the range of [0, size()). The high 32 bits of each long is the
-   * smeared hash of the element, whereas the low 32 bits is the "next" pointer (pointing to the
-   * next entry in the bucket chain). The pointers in [size(), entries.length) are all "null"
-   * (UNSET).
+   * Maximum allowed length of a hash table bucket before falling back to a j.u.LinkedHashMap-based
+   * implementation. Experimentally determined.
    */
-  @VisibleForTesting transient long @MonotonicNonNull [] entries;
+  private static final int MAX_HASH_BUCKET_LENGTH = 9;
+
+  /**
+   * The hashtable object. This can be either:
+   *
+   * <ul>
+   *   <li>a byte[], short[], or int[], with size a power of two, created by
+   *       CompactHashing.createTable, whose values are either
+   *       <ul>
+   *         <li>UNSET, meaning "null pointer"
+   *         <li>one plus an index into the keys, values, and entries arrays
+   *       </ul>
+   *   <li>another java.util.Map delegate implementation. In most modern JDKs, normal java.util hash
+   *       collections intelligently fall back to a binary search tree if hash table collisions are
+   *       detected. Rather than going to all the trouble of reimplementing this ourselves, we
+   *       simply switch over to use the JDK implementation wholesale if probable hash flooding is
+   *       detected, sacrificing the compactness guarantee in very rare cases in exchange for much
+   *       more reliable worst-case behavior.
+   *   <li>null, if no entries have yet been added to the map
+   * </ul>
+   */
+  @Nullable private transient Object table;
+
+  /**
+   * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
+   * part of the smeared hash of the key not covered by the hashtable mask, whereas the low bits are
+   * the "next" pointer (pointing to the next entry in the bucket chain), which will always be less
+   * than or equal to the hashtable mask.
+   *
+   * <pre>
+   * hash  = aaaaaaaa
+   * mask  = 0000ffff
+   * next  = 0000bbbb
+   * entry = aaaabbbb
+   * </pre>
+   *
+   * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
+   */
+  @VisibleForTesting transient int @Nullable [] 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 @MonotonicNonNull [] keys;
+  @VisibleForTesting transient Object @Nullable [] 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 @MonotonicNonNull [] values;
-
-  /** The load factor. */
-  transient float loadFactor;
+  @VisibleForTesting transient Object @Nullable [] values;
 
   /**
-   * Keeps track of modifications of this set, 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.
+   * 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.
    */
-  transient int modCount;
-
-  /** When we have this many elements, resize the hashtable. */
-  private transient int threshold;
+  private transient int metadata;
 
   /** The number of elements contained in the set. */
   private transient int size;
 
   /** Constructs a new empty instance of {@code CompactHashMap}. */
   CompactHashMap() {
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
+    init(CompactHashing.DEFAULT_SIZE);
   }
 
   /**
    * Constructs a new instance of {@code CompactHashMap} with the specified capacity.
    *
-   * @param capacity the initial capacity of this {@code CompactHashMap}.
+   * @param expectedSize the initial capacity of this {@code CompactHashMap}.
    */
-  CompactHashMap(int capacity) {
-    this(capacity, DEFAULT_LOAD_FACTOR);
-  }
-
-  CompactHashMap(int expectedSize, float loadFactor) {
-    init(expectedSize, loadFactor);
+  CompactHashMap(int expectedSize) {
+    init(expectedSize);
   }
 
   /** Pseudoconstructor for serialization support. */
-  void init(int expectedSize, float loadFactor) {
-    Preconditions.checkArgument(expectedSize >= 0, "Initial capacity must be non-negative");
-    Preconditions.checkArgument(loadFactor > 0, "Illegal load factor");
-    int buckets = Hashing.closedTableSize(expectedSize, loadFactor);
-    this.table = newTable(buckets);
-    this.loadFactor = loadFactor;
+  void init(int expectedSize) {
+    Preconditions.checkArgument(expectedSize >= 0, "Expected size must be >= 0");
 
+    // Save expectedSize for use in allocArrays()
+    this.metadata = Ints.constrainToRange(expectedSize, 1, CompactHashing.MAX_SIZE);
+  }
+
+  /** Returns whether arrays need to be allocated. */
+  @VisibleForTesting
+  boolean needsAllocArrays() {
+    return table == null;
+  }
+
+  /** Handle lazy allocation of arrays. */
+  @CanIgnoreReturnValue
+  int allocArrays() {
+    Preconditions.checkState(needsAllocArrays(), "Arrays already allocated");
+
+    int expectedSize = metadata;
+    int buckets = CompactHashing.tableSize(expectedSize);
+    this.table = CompactHashing.createTable(buckets);
+    setHashTableMask(buckets - 1);
+
+    this.entries = new int[expectedSize];
     this.keys = new Object[expectedSize];
     this.values = new Object[expectedSize];
 
-    this.entries = newEntries(expectedSize);
-    this.threshold = Math.max(1, (int) (buckets * loadFactor));
+    return expectedSize;
   }
 
-  private static int[] newTable(int size) {
-    int[] array = new int[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  @SuppressWarnings("unchecked")
+  @VisibleForTesting
+  @Nullable
+  Map<K, V> delegateOrNull() {
+    if (table instanceof Map) {
+      return (Map<K, V>) table;
+    }
+    return null;
   }
 
-  private static long[] newEntries(int size) {
-    long[] array = new long[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  Map<K, V> createHashFloodingResistantDelegate(int tableSize) {
+    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]);
+    }
+    this.table = newDelegate;
+    this.entries = null;
+    this.keys = null;
+    this.values = null;
+    incrementModCount();
+    return newDelegate;
+  }
+
+  /** Stores the hash table mask as the number of bits needed to represent an index. */
+  private void setHashTableMask(int mask) {
+    int hashTableBits = Integer.SIZE - Integer.numberOfLeadingZeros(mask);
+    metadata =
+        CompactHashing.maskCombine(metadata, hashTableBits, CompactHashing.HASH_TABLE_BITS_MASK);
+  }
+
+  /** Gets the hash table mask using the stored number of hash table bits. */
   private int hashTableMask() {
-    return table.length - 1;
+    return (1 << (metadata & CompactHashing.HASH_TABLE_BITS_MASK)) - 1;
   }
 
-  private static int getHash(long entry) {
-    return (int) (entry >>> 32);
-  }
-
-  /** Returns the index, or UNSET if the pointer is "null" */
-  private static int getNext(long entry) {
-    return (int) entry;
-  }
-
-  /** Returns a new entry value by changing the "next" index of an existing entry */
-  private static long swapNext(long entry, int newNext) {
-    return (HASH_MASK & entry) | (NEXT_MASK & newNext);
+  void incrementModCount() {
+    metadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
   }
 
   /**
@@ -237,66 +282,86 @@
   @CanIgnoreReturnValue
   @Override
   public @Nullable V put(@Nullable K key, @Nullable V value) {
-    long[] entries = this.entries;
+    if (needsAllocArrays()) {
+      allocArrays();
+    }
+    @Nullable 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 hash = smearedHash(key);
-    int tableIndex = hash & hashTableMask();
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
-    int next = table[tableIndex];
-    if (next == UNSET) {
-      table[tableIndex] = newEntryIndex;
+    int newSize = newEntryIndex + 1;
+    int hash = smearedHash(key);
+    int mask = hashTableMask();
+    int tableIndex = hash & mask;
+    int next = CompactHashing.tableGet(table, 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);
+      }
     } else {
-      int last;
-      long entry;
+      int entryIndex;
+      int entry;
+      int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+      int bucketLength = 0;
       do {
-        last = next;
-        entry = entries[next];
-        if (getHash(entry) == hash && Objects.equal(key, keys[next])) {
+        entryIndex = next - 1;
+        entry = entries[entryIndex];
+        if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+            && Objects.equal(key, keys[entryIndex])) {
           @SuppressWarnings("unchecked") // known to be a V
           @Nullable
-          V oldValue = (V) values[next];
+          V oldValue = (V) values[entryIndex];
 
-          values[next] = value;
-          accessEntry(next);
+          values[entryIndex] = value;
+          accessEntry(entryIndex);
           return oldValue;
         }
-        next = getNext(entry);
+        next = CompactHashing.getNext(entry, mask);
+        bucketLength++;
       } while (next != UNSET);
-      entries[last] = swapNext(entry, newEntryIndex);
+
+      if (bucketLength >= MAX_HASH_BUCKET_LENGTH) {
+        return convertToHashFloodingResistantImplementation().put(key, value);
+      }
+
+      if (newSize > mask) {
+        // Resize and add new entry
+        mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
+      } else {
+        entries[entryIndex] = CompactHashing.maskCombine(entry, newEntryIndex + 1, mask);
+      }
     }
-    if (newEntryIndex == Integer.MAX_VALUE) {
-      throw new IllegalStateException("Cannot contain more than Integer.MAX_VALUE elements!");
-    }
-    int newSize = newEntryIndex + 1;
     resizeMeMaybe(newSize);
-    insertEntry(newEntryIndex, key, value, hash);
+    insertEntry(newEntryIndex, key, value, hash, mask);
     this.size = newSize;
-    if (newEntryIndex >= threshold) {
-      resizeTable(2 * table.length);
-    }
-    modCount++;
+    incrementModCount();
     return null;
   }
 
   /**
    * 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) {
-    this.entries[entryIndex] = ((long) hash << 32) | (NEXT_MASK & UNSET);
+  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;
   }
 
-  /** Returns currentSize + 1, after resizing the entries storage if necessary. */
+  /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
     int entriesSize = entries.length;
     if (newSize > entriesSize) {
-      int newCapacity = entriesSize + Math.max(1, entriesSize >>> 1);
-      if (newCapacity < 0) {
-        newCapacity = Integer.MAX_VALUE;
-      }
+      // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
+      int newCapacity =
+          Math.min(CompactHashing.MAX_SIZE, (entriesSize + Math.max(1, entriesSize >>> 1)) | 1);
       if (newCapacity != entriesSize) {
         resizeEntries(newCapacity);
       }
@@ -308,152 +373,165 @@
    * 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);
-    long[] entries = this.entries;
-    int oldCapacity = entries.length;
-    entries = Arrays.copyOf(entries, newCapacity);
-    if (newCapacity > oldCapacity) {
-      Arrays.fill(entries, oldCapacity, newCapacity, UNSET);
-    }
-    this.entries = entries;
   }
 
-  private void resizeTable(int newCapacity) { // newCapacity always a power of two
-    int[] oldTable = table;
-    int oldCapacity = oldTable.length;
-    if (oldCapacity >= MAXIMUM_CAPACITY) {
-      threshold = Integer.MAX_VALUE;
-      return;
-    }
-    int newThreshold = 1 + (int) (newCapacity * loadFactor);
-    int[] newTable = newTable(newCapacity);
-    long[] entries = this.entries;
+  @CanIgnoreReturnValue
+  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+    Object newTable = CompactHashing.createTable(newCapacity);
+    int newMask = newCapacity - 1;
 
-    int mask = newTable.length - 1;
-    for (int i = 0; i < size; i++) {
-      long oldEntry = entries[i];
-      int hash = getHash(oldEntry);
-      int tableIndex = hash & mask;
-      int next = newTable[tableIndex];
-      newTable[tableIndex] = i;
-      entries[i] = ((long) hash << 32) | (NEXT_MASK & next);
+    if (targetEntryIndex != UNSET) {
+      // Add target first; it must be last in the chain because its entry hasn't yet been created
+      CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    this.threshold = newThreshold;
+    Object table = this.table;
+    int[] entries = this.entries;
+
+    // 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];
+
+        // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
+        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+
+        int newTableIndex = hash & newMask;
+        int newNext = CompactHashing.tableGet(newTable, newTableIndex);
+        CompactHashing.tableSet(newTable, newTableIndex, next);
+        entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
+
+        next = CompactHashing.getNext(entry, mask);
+      }
+    }
+
     this.table = newTable;
+    setHashTableMask(newMask);
+    return newMask;
   }
 
   private int indexOf(@Nullable Object key) {
-    int hash = smearedHash(key);
-    int next = table[hash & hashTableMask()];
-    while (next != UNSET) {
-      long entry = entries[next];
-      if (getHash(entry) == hash && Objects.equal(key, keys[next])) {
-        return next;
-      }
-      next = getNext(entry);
+    if (needsAllocArrays()) {
+      return -1;
     }
+    int hash = smearedHash(key);
+    int mask = hashTableMask();
+    int next = CompactHashing.tableGet(table, hash & mask);
+    if (next == UNSET) {
+      return -1;
+    }
+    int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+    do {
+      int entryIndex = next - 1;
+      int entry = entries[entryIndex];
+      if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+          && Objects.equal(key, keys[entryIndex])) {
+        return entryIndex;
+      }
+      next = CompactHashing.getNext(entry, mask);
+    } while (next != UNSET);
     return -1;
   }
 
   @Override
   public boolean containsKey(@Nullable Object key) {
-    return indexOf(key) != -1;
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.containsKey(key) : indexOf(key) != -1;
   }
 
-  @SuppressWarnings("unchecked") // values only contains Vs
+  @SuppressWarnings("unchecked") // known to be a V
   @Override
   public V get(@Nullable Object key) {
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.get(key);
+    }
     int index = indexOf(key);
-    accessEntry(index);
-    return (index == -1) ? null : (V) values[index];
-  }
-
-  @CanIgnoreReturnValue
-  @Override
-  public @Nullable V remove(@Nullable Object key) {
-    return remove(key, smearedHash(key));
-  }
-
-  private @Nullable V remove(@Nullable Object key, int hash) {
-    int tableIndex = hash & hashTableMask();
-    int next = table[tableIndex];
-    if (next == UNSET) { // empty bucket
+    if (index == -1) {
       return null;
     }
-    int last = UNSET;
-    do {
-      if (getHash(entries[next]) == hash) {
-        if (Objects.equal(key, keys[next])) {
-          @SuppressWarnings("unchecked") // values only contains Vs
-          @Nullable
-          V oldValue = (V) values[next];
-
-          if (last == UNSET) {
-            // we need to update the root link from table[]
-            table[tableIndex] = getNext(entries[next]);
-          } else {
-            // we need to update the link from the chain
-            entries[last] = swapNext(entries[last], getNext(entries[next]));
-          }
-
-          moveLastEntry(next);
-          size--;
-          modCount++;
-          return oldValue;
-        }
-      }
-      last = next;
-      next = getNext(entries[next]);
-    } while (next != UNSET);
-    return null;
+    accessEntry(index);
+    return (V) values[index];
   }
 
   @CanIgnoreReturnValue
-  private V removeEntry(int entryIndex) {
-    return remove(keys[entryIndex], getHash(entries[entryIndex]));
+  @SuppressWarnings("unchecked") // known to be a V
+  @Override
+  public @Nullable V remove(@Nullable Object key) {
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.remove(key);
+    }
+    Object oldValue = removeHelper(key);
+    return (oldValue == NOT_FOUND) ? null : (V) oldValue;
+  }
+
+  private @Nullable Object removeHelper(@Nullable Object key) {
+    if (needsAllocArrays()) {
+      return NOT_FOUND;
+    }
+    int mask = hashTableMask();
+    int index =
+        CompactHashing.remove(
+            key, /* value= */ null, mask, table, entries, keys, /* values= */ null);
+    if (index == -1) {
+      return NOT_FOUND;
+    }
+
+    @Nullable Object oldValue = values[index];
+
+    moveLastEntry(index, mask);
+    size--;
+    incrementModCount();
+
+    return oldValue;
   }
 
   /**
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
-  void moveLastEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      keys[dstIndex] = keys[srcIndex];
+      @Nullable Object key = keys[srcIndex];
+      keys[dstIndex] = key;
       values[dstIndex] = values[srcIndex];
       keys[srcIndex] = null;
       values[srcIndex] = null;
 
       // move the last entry to the removed spot, just like we moved the element
-      long lastEntry = entries[srcIndex];
-      entries[dstIndex] = lastEntry;
-      entries[srcIndex] = UNSET;
+      entries[dstIndex] = entries[srcIndex];
+      entries[srcIndex] = 0;
 
       // also need to update whoever's "next" pointer was pointing to the last entry place
-      // reusing "tableIndex" and "next"; these variables were no longer needed
-      int tableIndex = getHash(lastEntry) & hashTableMask();
-      int lastNext = table[tableIndex];
-      if (lastNext == srcIndex) {
+      int tableIndex = smearedHash(key) & mask;
+      int next = CompactHashing.tableGet(table, tableIndex);
+      int srcNext = srcIndex + 1;
+      if (next == srcNext) {
         // we need to update the root pointer
-        table[tableIndex] = dstIndex;
+        CompactHashing.tableSet(table, tableIndex, dstIndex + 1);
       } else {
         // we need to update a pointer in an entry
-        int previous;
-        long entry;
+        int entryIndex;
+        int entry;
         do {
-          previous = lastNext;
-          lastNext = getNext(entry = entries[lastNext]);
-        } while (lastNext != srcIndex);
-        // here, entries[previous] points to the old entry location; update it
-        entries[previous] = swapNext(entry, dstIndex);
+          entryIndex = next - 1;
+          entry = entries[entryIndex];
+          next = CompactHashing.getNext(entry, mask);
+        } while (next != srcNext);
+        // here, entries[entryIndex] points to the old entry location; update it
+        entries[entryIndex] = CompactHashing.maskCombine(entry, dstIndex + 1, mask);
       }
     } else {
       keys[dstIndex] = null;
       values[dstIndex] = null;
-      entries[dstIndex] = UNSET;
+      entries[dstIndex] = 0;
     }
   }
 
@@ -475,7 +553,7 @@
   }
 
   private abstract class Itr<T> implements Iterator<T> {
-    int expectedModCount = modCount;
+    int expectedMetadata = metadata;
     int currentIndex = firstEntryIndex();
     int indexToRemove = -1;
 
@@ -502,28 +580,38 @@
     public void remove() {
       checkForConcurrentModification();
       checkRemove(indexToRemove >= 0);
-      expectedModCount++;
-      removeEntry(indexToRemove);
+      incrementExpectedModCount();
+      CompactHashMap.this.remove(keys[indexToRemove]);
       currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
       indexToRemove = -1;
     }
 
+    void incrementExpectedModCount() {
+      expectedMetadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
+    }
+
     private void checkForConcurrentModification() {
-      if (modCount != expectedModCount) {
+      if (metadata != expectedMetadata) {
         throw new ConcurrentModificationException();
       }
     }
   }
 
+  @SuppressWarnings("unchecked") // known to be Ks and Vs
   @Override
   public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
     checkNotNull(function);
-    for (int i = 0; i < size; i++) {
-      values[i] = function.apply((K) keys[i], (V) values[i]);
+    @Nullable 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]);
+      }
     }
   }
 
-  private transient @MonotonicNonNull Set<K> keySetView;
+  private transient @Nullable Set<K> keySetView;
 
   @Override
   public Set<K> keySet() {
@@ -542,23 +630,35 @@
 
     @Override
     public Object[] toArray() {
-      return ObjectArrays.copyAsObjectArray(keys, 0, size);
+      if (needsAllocArrays()) {
+        return new Object[0];
+      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.keySet().toArray()
+          : ObjectArrays.copyAsObjectArray(keys, 0, size);
     }
 
     @Override
     public <T> T[] toArray(T[] a) {
-      return ObjectArrays.toArrayImpl(keys, 0, size, a);
+      if (needsAllocArrays()) {
+        if (a.length > 0) {
+          a[0] = null;
+        }
+        return a;
+      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.keySet().toArray(a)
+          : ObjectArrays.toArrayImpl(keys, 0, size, a);
     }
 
     @Override
     public boolean remove(@Nullable Object o) {
-      int index = indexOf(o);
-      if (index == -1) {
-        return false;
-      } else {
-        removeEntry(index);
-        return true;
-      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.keySet().remove(o)
+          : CompactHashMap.this.removeHelper(o) != NOT_FOUND;
     }
 
     @Override
@@ -568,21 +668,37 @@
 
     @Override
     public Spliterator<K> spliterator() {
-      return Spliterators.spliterator(keys, 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
+      if (needsAllocArrays()) {
+        return Spliterators.spliterator(new Object[0], Spliterator.DISTINCT | Spliterator.ORDERED);
+      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.keySet().spliterator()
+          : Spliterators.spliterator(keys, 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
     }
 
+    @SuppressWarnings("unchecked") // known to be Ks
     @Override
     public void forEach(Consumer<? super K> action) {
       checkNotNull(action);
-      for (int i = 0; i < size; i++) {
-        action.accept((K) keys[i]);
+      @Nullable 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]);
+        }
       }
     }
   }
 
   Iterator<K> keySetIterator() {
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.keySet().iterator();
+    }
     return new Itr<K>() {
-      @SuppressWarnings("unchecked") // keys only contains Ks
+      @SuppressWarnings("unchecked") // known to be a K
       @Override
       K getOutput(int entry) {
         return (K) keys[entry];
@@ -590,15 +706,21 @@
     };
   }
 
+  @SuppressWarnings("unchecked") // known to be Ks and Vs
   @Override
   public void forEach(BiConsumer<? super K, ? super V> action) {
     checkNotNull(action);
-    for (int i = 0; i < size; i++) {
-      action.accept((K) keys[i], (V) values[i]);
+    @Nullable 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]);
+      }
     }
   }
 
-  private transient @MonotonicNonNull Set<Entry<K, V>> entrySetView;
+  private transient @Nullable Set<Entry<K, V>> entrySetView;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -623,13 +745,19 @@
 
     @Override
     public Spliterator<Entry<K, V>> spliterator() {
-      return CollectSpliterators.indexed(
-          size, Spliterator.DISTINCT | Spliterator.ORDERED, MapEntry::new);
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.entrySet().spliterator()
+          : CollectSpliterators.indexed(
+              size, Spliterator.DISTINCT | Spliterator.ORDERED, MapEntry::new);
     }
 
     @Override
     public boolean contains(@Nullable Object o) {
-      if (o instanceof Entry) {
+      @Nullable 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());
@@ -639,19 +767,37 @@
 
     @Override
     public boolean remove(@Nullable Object o) {
-      if (o instanceof Entry) {
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      if (delegate != null) {
+        return delegate.entrySet().remove(o);
+      } else if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
-        int index = indexOf(entry.getKey());
-        if (index != -1 && Objects.equal(values[index], entry.getValue())) {
-          removeEntry(index);
-          return true;
+        if (needsAllocArrays()) {
+          return false;
         }
+        int mask = hashTableMask();
+        int index =
+            CompactHashing.remove(
+                entry.getKey(), entry.getValue(), mask, table, entries, keys, values);
+        if (index == -1) {
+          return false;
+        }
+
+        moveLastEntry(index, mask);
+        size--;
+        incrementModCount();
+
+        return true;
       }
       return false;
     }
   }
 
   Iterator<Entry<K, V>> entrySetIterator() {
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.entrySet().iterator();
+    }
     return new Itr<Entry<K, V>>() {
       @Override
       Entry<K, V> getOutput(int entry) {
@@ -665,12 +811,13 @@
 
     private int lastKnownIndex;
 
-    @SuppressWarnings("unchecked") // keys only contains Ks
+    @SuppressWarnings("unchecked") // known to be a K
     MapEntry(int index) {
       this.key = (K) keys[index];
       this.lastKnownIndex = index;
     }
 
+    @Nullable
     @Override
     public K getKey() {
       return key;
@@ -684,16 +831,24 @@
       }
     }
 
-    @SuppressWarnings("unchecked") // values only contains Vs
+    @SuppressWarnings("unchecked") // known to be a V
     @Override
-    public V getValue() {
+    public @Nullable V getValue() {
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      if (delegate != null) {
+        return delegate.get(key);
+      }
       updateLastKnownIndex();
       return (lastKnownIndex == -1) ? null : (V) values[lastKnownIndex];
     }
 
-    @SuppressWarnings("unchecked") // values only contains Vs
+    @SuppressWarnings("unchecked") // known to be a V
     @Override
     public V setValue(V value) {
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      if (delegate != null) {
+        return delegate.put(key, value);
+      }
       updateLastKnownIndex();
       if (lastKnownIndex == -1) {
         put(key, value);
@@ -708,16 +863,21 @@
 
   @Override
   public int size() {
-    return size;
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.size() : size;
   }
 
   @Override
   public boolean isEmpty() {
-    return size == 0;
+    return size() == 0;
   }
 
   @Override
   public boolean containsValue(@Nullable Object value) {
+    @Nullable 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])) {
         return true;
@@ -726,7 +886,7 @@
     return false;
   }
 
-  private transient @MonotonicNonNull Collection<V> valuesView;
+  private transient @Nullable Collection<V> valuesView;
 
   @Override
   public Collection<V> values() {
@@ -748,33 +908,64 @@
       return valuesIterator();
     }
 
+    @SuppressWarnings("unchecked") // known to be Vs
     @Override
     public void forEach(Consumer<? super V> action) {
       checkNotNull(action);
-      for (int i = 0; i < size; i++) {
-        action.accept((V) values[i]);
+      @Nullable 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]);
+        }
       }
     }
 
     @Override
     public Spliterator<V> spliterator() {
-      return Spliterators.spliterator(values, 0, size, Spliterator.ORDERED);
+      if (needsAllocArrays()) {
+        return Spliterators.spliterator(new Object[0], Spliterator.ORDERED);
+      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.values().spliterator()
+          : Spliterators.spliterator(values, 0, size, Spliterator.ORDERED);
     }
 
     @Override
     public Object[] toArray() {
-      return ObjectArrays.copyAsObjectArray(values, 0, size);
+      if (needsAllocArrays()) {
+        return new Object[0];
+      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.values().toArray()
+          : ObjectArrays.copyAsObjectArray(values, 0, size);
     }
 
     @Override
     public <T> T[] toArray(T[] a) {
-      return ObjectArrays.toArrayImpl(values, 0, size, a);
+      if (needsAllocArrays()) {
+        if (a.length > 0) {
+          a[0] = null;
+        }
+        return a;
+      }
+      @Nullable Map<K, V> delegate = delegateOrNull();
+      return (delegate != null)
+          ? delegate.values().toArray(a)
+          : ObjectArrays.toArrayImpl(values, 0, size, a);
     }
   }
 
   Iterator<V> valuesIterator() {
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.values().iterator();
+    }
     return new Itr<V>() {
-      @SuppressWarnings("unchecked") // values only contains Vs
+      @SuppressWarnings("unchecked") // known to be a V
       @Override
       V getOutput(int entry) {
         return (V) values[entry];
@@ -787,56 +978,69 @@
    * current size.
    */
   public void trimToSize() {
+    if (needsAllocArrays()) {
+      return;
+    }
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      Map<K, V> newDelegate = createHashFloodingResistantDelegate(size());
+      newDelegate.putAll(delegate);
+      this.table = newDelegate;
+      return;
+    }
     int size = this.size;
     if (size < entries.length) {
       resizeEntries(size);
     }
-    // size / loadFactor gives the table size of the appropriate load factor,
-    // but that may not be a power of two. We floor it to a power of two by
-    // keeping its highest bit. But the smaller table may have a load factor
-    // larger than what we want; then we want to go to the next power of 2 if we can
-    int minimumTableSize = Math.max(1, Integer.highestOneBit((int) (size / loadFactor)));
-    if (minimumTableSize < MAXIMUM_CAPACITY) {
-      double load = (double) size / minimumTableSize;
-      if (load > loadFactor) {
-        minimumTableSize <<= 1; // increase to next power if possible
-      }
-    }
-
-    if (minimumTableSize < table.length) {
-      resizeTable(minimumTableSize);
+    int minimumTableSize = CompactHashing.tableSize(size);
+    int mask = hashTableMask();
+    if (minimumTableSize < mask) { // smaller table size will always be less than current mask
+      resizeTable(mask, minimumTableSize, UNSET, UNSET);
     }
   }
 
   @Override
   public void clear() {
-    modCount++;
-    Arrays.fill(keys, 0, size, null);
-    Arrays.fill(values, 0, size, null);
-    Arrays.fill(table, UNSET);
-    Arrays.fill(entries, UNSET);
-    this.size = 0;
+    if (needsAllocArrays()) {
+      return;
+    }
+    incrementModCount();
+    @Nullable Map<K, V> delegate = delegateOrNull();
+    if (delegate != null) {
+      metadata =
+          Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
+      delegate.clear(); // invalidate any iterators left over!
+      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);
+      this.size = 0;
+    }
   }
 
-  /**
-   * The serial form currently mimics Android's java.util.HashMap version, e.g. see
-   * http://omapzoom.org/?p=platform/libcore.git;a=blob;f=luni/src/main/java/java/util/HashMap.java
-   */
   private void writeObject(ObjectOutputStream stream) throws IOException {
     stream.defaultWriteObject();
-    stream.writeInt(size);
-    for (int i = 0; i < size; i++) {
-      stream.writeObject(keys[i]);
-      stream.writeObject(values[i]);
+    stream.writeInt(size());
+    Iterator<Entry<K, V>> entryIterator = entrySetIterator();
+    while (entryIterator.hasNext()) {
+      Entry<K, V> e = entryIterator.next();
+      stream.writeObject(e.getKey());
+      stream.writeObject(e.getValue());
     }
   }
 
   @SuppressWarnings("unchecked")
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
     int elementCount = stream.readInt();
-    for (int i = elementCount; --i >= 0; ) {
+    if (elementCount < 0) {
+      throw new InvalidObjectException("Invalid size: " + elementCount);
+    }
+    init(elementCount);
+    for (int i = 0; i < elementCount; i++) {
       K key = (K) stream.readObject();
       V value = (V) stream.readObject();
       put(key, value);
diff --git a/guava/src/com/google/common/collect/CompactHashSet.java b/guava/src/com/google/common/collect/CompactHashSet.java
index 5afc71c..d54e166 100644
--- a/guava/src/com/google/common/collect/CompactHashSet.java
+++ b/guava/src/com/google/common/collect/CompactHashSet.java
@@ -18,13 +18,17 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 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 com.google.common.annotations.GwtIncompatible;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.IOException;
+import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
@@ -34,11 +38,12 @@
 import java.util.Collections;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.NoSuchElementException;
+import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -66,6 +71,7 @@
  * to prioritize memory over CPU.
  *
  * @author Dimitris Andreou
+ * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
 class CompactHashSet<E> extends AbstractSet<E> implements Serializable {
@@ -73,7 +79,7 @@
 
   /** Creates an empty {@code CompactHashSet} instance. */
   public static <E> CompactHashSet<E> create() {
-    return new CompactHashSet<E>();
+    return new CompactHashSet<>();
   }
 
   /**
@@ -96,6 +102,7 @@
    * @param elements the elements that the set should contain
    * @return a new {@code CompactHashSet} containing those elements (minus duplicates)
    */
+  @SafeVarargs
   public static <E> CompactHashSet<E> create(E... elements) {
     CompactHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
@@ -112,65 +119,81 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
   public static <E> CompactHashSet<E> createWithExpectedSize(int expectedSize) {
-    return new CompactHashSet<E>(expectedSize);
+    return new CompactHashSet<>(expectedSize);
   }
 
-  private static final int MAXIMUM_CAPACITY = 1 << 30;
-
-  // TODO(user): decide, and inline, load factor. 0.75?
-  private static final float DEFAULT_LOAD_FACTOR = 1.0f;
-
-  /** Bitmask that selects the low 32 bits. */
-  private static final long NEXT_MASK = (1L << 32) - 1;
-
-  /** Bitmask that selects the high 32 bits. */
-  private static final long HASH_MASK = ~NEXT_MASK;
-
-  // TODO(user): decide default size
-  private static final int DEFAULT_SIZE = 3;
-
-  static final int UNSET = -1;
+  /**
+   * Maximum allowed false positive probability of detecting a hash flooding attack given random
+   * input.
+   */
+  @VisibleForTesting(
+      )
+  static final double HASH_FLOODING_FPP = 0.001;
 
   /**
-   * The hashtable. Its values are indexes to both the elements and entries arrays.
+   * Maximum allowed length of a hash table bucket before falling back to a j.u.LinkedHashSet based
+   * implementation. Experimentally determined.
+   */
+  private static final int MAX_HASH_BUCKET_LENGTH = 9;
+
+  /**
+   * The hashtable object. This can be either:
    *
-   * <p>Currently, the UNSET value means "null pointer", and any non negative value x is the actual
-   * index.
+   * <ul>
+   *   <li>a byte[], short[], or int[], with size a power of two, created by
+   *       CompactHashing.createTable, whose values are either
+   *       <ul>
+   *         <li>UNSET, meaning "null pointer"
+   *         <li>one plus an index into the entries and elements array
+   *       </ul>
+   *   <li>another java.util.Set delegate implementation. In most modern JDKs, normal java.util hash
+   *       collections intelligently fall back to a binary search tree if hash table collisions are
+   *       detected. Rather than going to all the trouble of reimplementing this ourselves, we
+   *       simply switch over to use the JDK implementation wholesale if probable hash flooding is
+   *       detected, sacrificing the compactness guarantee in very rare cases in exchange for much
+   *       more reliable worst-case behavior.
+   *   <li>null, if no entries have yet been added to the map
+   * </ul>
+   */
+  @Nullable private transient Object table;
+
+  /**
+   * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
+   * part of the smeared hash of the element not covered by the hashtable mask, whereas the low bits
+   * are the "next" pointer (pointing to the next entry in the bucket chain), which will always be
+   * less than or equal to the hashtable mask.
    *
-   * <p>Its size must be a power of two.
+   * <pre>
+   * hash  = aaaaaaaa
+   * mask  = 0000ffff
+   * next  = 0000bbbb
+   * entry = aaaabbbb
+   * </pre>
+   *
+   * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
    */
-  private transient int @MonotonicNonNull [] table;
+  private transient int @Nullable [] entries;
 
   /**
-   * Contains the logical entries, in the range of [0, size()). The high 32 bits of each long is the
-   * smeared hash of the element, whereas the low 32 bits is the "next" pointer (pointing to the
-   * next entry in the bucket chain). The pointers in [size(), entries.length) are all "null"
-   * (UNSET).
+   * The elements contained in the set, in the range of [0, size()). The elements in [size(),
+   * elements.length) are all {@code null}.
    */
-  private transient long @MonotonicNonNull [] entries;
-
-  /** The elements contained in the set, in the range of [0, size()). */
-  transient Object @MonotonicNonNull [] elements;
-
-  /** The load factor. */
-  transient float loadFactor;
+  @VisibleForTesting transient Object @Nullable [] elements;
 
   /**
-   * Keeps track of modifications of this set, 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.
+   * 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.
    */
-  transient int modCount;
-
-  /** When we have this many elements, resize the hashtable. */
-  private transient int threshold;
+  private transient int metadata;
 
   /** The number of elements contained in the set. */
   private transient int size;
 
   /** Constructs a new empty instance of {@code CompactHashSet}. */
   CompactHashSet() {
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
+    init(CompactHashing.DEFAULT_SIZE);
   }
 
   /**
@@ -179,105 +202,164 @@
    * @param expectedSize the initial capacity of this {@code CompactHashSet}.
    */
   CompactHashSet(int expectedSize) {
-    init(expectedSize, DEFAULT_LOAD_FACTOR);
+    init(expectedSize);
   }
 
   /** Pseudoconstructor for serialization support. */
-  void init(int expectedSize, float loadFactor) {
-    Preconditions.checkArgument(expectedSize >= 0, "Initial capacity must be non-negative");
-    Preconditions.checkArgument(loadFactor > 0, "Illegal load factor");
-    int buckets = Hashing.closedTableSize(expectedSize, loadFactor);
-    this.table = newTable(buckets);
-    this.loadFactor = loadFactor;
+  void init(int expectedSize) {
+    Preconditions.checkArgument(expectedSize >= 0, "Expected size must be >= 0");
+
+    // Save expectedSize for use in allocArrays()
+    this.metadata = Ints.constrainToRange(expectedSize, 1, CompactHashing.MAX_SIZE);
+  }
+
+  /** Returns whether arrays need to be allocated. */
+  @VisibleForTesting
+  boolean needsAllocArrays() {
+    return table == null;
+  }
+
+  /** Handle lazy allocation of arrays. */
+  @CanIgnoreReturnValue
+  int allocArrays() {
+    Preconditions.checkState(needsAllocArrays(), "Arrays already allocated");
+
+    int expectedSize = metadata;
+    int buckets = CompactHashing.tableSize(expectedSize);
+    this.table = CompactHashing.createTable(buckets);
+    setHashTableMask(buckets - 1);
+
+    this.entries = new int[expectedSize];
     this.elements = new Object[expectedSize];
-    this.entries = newEntries(expectedSize);
-    this.threshold = Math.max(1, (int) (buckets * loadFactor));
+
+    return expectedSize;
   }
 
-  private static int[] newTable(int size) {
-    int[] array = new int[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  @SuppressWarnings("unchecked")
+  @VisibleForTesting
+  @Nullable
+  Set<E> delegateOrNull() {
+    if (table instanceof Set) {
+      return (Set<E>) table;
+    }
+    return null;
   }
 
-  private static long[] newEntries(int size) {
-    long[] array = new long[size];
-    Arrays.fill(array, UNSET);
-    return array;
+  private Set<E> createHashFloodingResistantDelegate(int tableSize) {
+    return new LinkedHashSet<>(tableSize, 1.0f);
   }
 
-  private static int getHash(long entry) {
-    return (int) (entry >>> 32);
+  @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]);
+    }
+    this.table = newDelegate;
+    this.entries = null;
+    this.elements = null;
+    incrementModCount();
+    return newDelegate;
   }
 
-  /** Returns the index, or UNSET if the pointer is "null" */
-  private static int getNext(long entry) {
-    return (int) entry;
+  @VisibleForTesting
+  boolean isUsingHashFloodingResistance() {
+    return delegateOrNull() != null;
   }
 
-  /** Returns a new entry value by changing the "next" index of an existing entry */
-  private static long swapNext(long entry, int newNext) {
-    return (HASH_MASK & entry) | (NEXT_MASK & newNext);
+  /** Stores the hash table mask as the number of bits needed to represent an index. */
+  private void setHashTableMask(int mask) {
+    int hashTableBits = Integer.SIZE - Integer.numberOfLeadingZeros(mask);
+    metadata =
+        CompactHashing.maskCombine(metadata, hashTableBits, CompactHashing.HASH_TABLE_BITS_MASK);
   }
 
+  /** Gets the hash table mask using the stored number of hash table bits. */
   private int hashTableMask() {
-    return table.length - 1;
+    return (1 << (metadata & CompactHashing.HASH_TABLE_BITS_MASK)) - 1;
+  }
+
+  void incrementModCount() {
+    metadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
   }
 
   @CanIgnoreReturnValue
   @Override
   public boolean add(@Nullable E object) {
-    long[] entries = this.entries;
+    if (needsAllocArrays()) {
+      allocArrays();
+    }
+    @Nullable Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.add(object);
+    }
+    int[] entries = this.entries;
     Object[] elements = this.elements;
-    int hash = smearedHash(object);
-    int tableIndex = hash & hashTableMask();
+
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
-    int next = table[tableIndex];
+    int newSize = newEntryIndex + 1;
+    int hash = smearedHash(object);
+    int mask = hashTableMask();
+    int tableIndex = hash & mask;
+    int next = CompactHashing.tableGet(table, tableIndex);
     if (next == UNSET) { // uninitialized bucket
-      table[tableIndex] = newEntryIndex;
+      if (newSize > mask) {
+        // Resize and add new entry
+        mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
+      } else {
+        CompactHashing.tableSet(table, tableIndex, newEntryIndex + 1);
+      }
     } else {
-      int last;
-      long entry;
+      int entryIndex;
+      int entry;
+      int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+      int bucketLength = 0;
       do {
-        last = next;
-        entry = entries[next];
-        if (getHash(entry) == hash && Objects.equal(object, elements[next])) {
+        entryIndex = next - 1;
+        entry = entries[entryIndex];
+        if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+            && Objects.equal(object, elements[entryIndex])) {
           return false;
         }
-        next = getNext(entry);
+        next = CompactHashing.getNext(entry, mask);
+        bucketLength++;
       } while (next != UNSET);
-      entries[last] = swapNext(entry, newEntryIndex);
+
+      if (bucketLength >= MAX_HASH_BUCKET_LENGTH) {
+        return convertToHashFloodingResistantImplementation().add(object);
+      }
+
+      if (newSize > mask) {
+        // Resize and add new entry
+        mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
+      } else {
+        entries[entryIndex] = CompactHashing.maskCombine(entry, newEntryIndex + 1, mask);
+      }
     }
-    if (newEntryIndex == Integer.MAX_VALUE) {
-      throw new IllegalStateException("Cannot contain more than Integer.MAX_VALUE elements!");
-    }
-    int newSize = newEntryIndex + 1;
     resizeMeMaybe(newSize);
-    insertEntry(newEntryIndex, object, hash);
+    insertEntry(newEntryIndex, object, hash, mask);
     this.size = newSize;
-    if (newEntryIndex >= threshold) {
-      resizeTable(2 * table.length);
-    }
-    modCount++;
+    incrementModCount();
     return true;
   }
 
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry arrays.
    */
-  void insertEntry(int entryIndex, E object, int hash) {
-    this.entries[entryIndex] = ((long) hash << 32) | (NEXT_MASK & UNSET);
+  void insertEntry(int entryIndex, @Nullable E object, int hash, int mask) {
+    this.entries[entryIndex] = CompactHashing.maskCombine(hash, UNSET, mask);
     this.elements[entryIndex] = object;
   }
 
-  /** Returns currentSize + 1, after resizing the entries storage if necessary. */
+  /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
     int entriesSize = entries.length;
     if (newSize > entriesSize) {
-      int newCapacity = entriesSize + Math.max(1, entriesSize >>> 1);
-      if (newCapacity < 0) {
-        newCapacity = Integer.MAX_VALUE;
-      }
+      // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
+      int newCapacity =
+          Math.min(CompactHashing.MAX_SIZE, (entriesSize + Math.max(1, entriesSize >>> 1)) | 1);
       if (newCapacity != entriesSize) {
         resizeEntries(newCapacity);
       }
@@ -289,126 +371,137 @@
    * the current capacity.
    */
   void resizeEntries(int newCapacity) {
+    this.entries = Arrays.copyOf(entries, newCapacity);
     this.elements = Arrays.copyOf(elements, newCapacity);
-    long[] entries = this.entries;
-    int oldSize = entries.length;
-    entries = Arrays.copyOf(entries, newCapacity);
-    if (newCapacity > oldSize) {
-      Arrays.fill(entries, oldSize, newCapacity, UNSET);
-    }
-    this.entries = entries;
   }
 
-  private void resizeTable(int newCapacity) { // newCapacity always a power of two
-    int[] oldTable = table;
-    int oldCapacity = oldTable.length;
-    if (oldCapacity >= MAXIMUM_CAPACITY) {
-      threshold = Integer.MAX_VALUE;
-      return;
-    }
-    int newThreshold = 1 + (int) (newCapacity * loadFactor);
-    int[] newTable = newTable(newCapacity);
-    long[] entries = this.entries;
+  @CanIgnoreReturnValue
+  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+    Object newTable = CompactHashing.createTable(newCapacity);
+    int newMask = newCapacity - 1;
 
-    int mask = newTable.length - 1;
-    for (int i = 0; i < size; i++) {
-      long oldEntry = entries[i];
-      int hash = getHash(oldEntry);
-      int tableIndex = hash & mask;
-      int next = newTable[tableIndex];
-      newTable[tableIndex] = i;
-      entries[i] = ((long) hash << 32) | (NEXT_MASK & next);
+    if (targetEntryIndex != UNSET) {
+      // Add target first; it must be last in the chain because its entry hasn't yet been created
+      CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    this.threshold = newThreshold;
+    Object table = this.table;
+    int[] entries = this.entries;
+
+    // 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];
+
+        // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
+        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+
+        int newTableIndex = hash & newMask;
+        int newNext = CompactHashing.tableGet(newTable, newTableIndex);
+        CompactHashing.tableSet(newTable, newTableIndex, next);
+        entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
+
+        next = CompactHashing.getNext(entry, mask);
+      }
+    }
+
     this.table = newTable;
+    setHashTableMask(newMask);
+    return newMask;
   }
 
   @Override
   public boolean contains(@Nullable Object object) {
+    if (needsAllocArrays()) {
+      return false;
+    }
+    @Nullable Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.contains(object);
+    }
     int hash = smearedHash(object);
-    int next = table[hash & hashTableMask()];
-    while (next != UNSET) {
-      long entry = entries[next];
-      if (getHash(entry) == hash && Objects.equal(object, elements[next])) {
+    int mask = hashTableMask();
+    int next = CompactHashing.tableGet(table, hash & mask);
+    if (next == UNSET) {
+      return false;
+    }
+    int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
+    do {
+      int entryIndex = next - 1;
+      int entry = entries[entryIndex];
+      if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
+          && Objects.equal(object, elements[entryIndex])) {
         return true;
       }
-      next = getNext(entry);
-    }
+      next = CompactHashing.getNext(entry, mask);
+    } while (next != UNSET);
     return false;
   }
 
   @CanIgnoreReturnValue
   @Override
   public boolean remove(@Nullable Object object) {
-    return remove(object, smearedHash(object));
-  }
-
-  @CanIgnoreReturnValue
-  private boolean remove(Object object, int hash) {
-    int tableIndex = hash & hashTableMask();
-    int next = table[tableIndex];
-    if (next == UNSET) {
+    if (needsAllocArrays()) {
       return false;
     }
-    int last = UNSET;
-    do {
-      if (getHash(entries[next]) == hash && Objects.equal(object, elements[next])) {
-        if (last == UNSET) {
-          // we need to update the root link from table[]
-          table[tableIndex] = getNext(entries[next]);
-        } else {
-          // we need to update the link from the chain
-          entries[last] = swapNext(entries[last], getNext(entries[next]));
-        }
+    @Nullable 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);
+    if (index == -1) {
+      return false;
+    }
 
-        moveEntry(next);
-        size--;
-        modCount++;
-        return true;
-      }
-      last = next;
-      next = getNext(entries[next]);
-    } while (next != UNSET);
-    return false;
+    moveLastEntry(index, mask);
+    size--;
+    incrementModCount();
+
+    return true;
   }
 
   /**
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
-  void moveEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      elements[dstIndex] = elements[srcIndex];
+      @Nullable Object object = elements[srcIndex];
+      elements[dstIndex] = object;
       elements[srcIndex] = null;
 
       // move the last entry to the removed spot, just like we moved the element
-      long lastEntry = entries[srcIndex];
-      entries[dstIndex] = lastEntry;
-      entries[srcIndex] = UNSET;
+      entries[dstIndex] = entries[srcIndex];
+      entries[srcIndex] = 0;
 
       // also need to update whoever's "next" pointer was pointing to the last entry place
-      // reusing "tableIndex" and "next"; these variables were no longer needed
-      int tableIndex = getHash(lastEntry) & hashTableMask();
-      int lastNext = table[tableIndex];
-      if (lastNext == srcIndex) {
+      int tableIndex = smearedHash(object) & mask;
+      int next = CompactHashing.tableGet(table, tableIndex);
+      int srcNext = srcIndex + 1;
+      if (next == srcNext) {
         // we need to update the root pointer
-        table[tableIndex] = dstIndex;
+        CompactHashing.tableSet(table, tableIndex, dstIndex + 1);
       } else {
         // we need to update a pointer in an entry
-        int previous;
-        long entry;
+        int entryIndex;
+        int entry;
         do {
-          previous = lastNext;
-          lastNext = getNext(entry = entries[lastNext]);
-        } while (lastNext != srcIndex);
-        // here, entries[previous] points to the old entry location; update it
-        entries[previous] = swapNext(entry, dstIndex);
+          entryIndex = next - 1;
+          entry = entries[entryIndex];
+          next = CompactHashing.getNext(entry, mask);
+        } while (next != srcNext);
+        // here, entries[entryIndex] points to the old entry location; update it
+        entries[entryIndex] = CompactHashing.maskCombine(entry, dstIndex + 1, mask);
       }
     } else {
       elements[dstIndex] = null;
-      entries[dstIndex] = UNSET;
+      entries[dstIndex] = 0;
     }
   }
 
@@ -431,26 +524,30 @@
 
   @Override
   public Iterator<E> iterator() {
+    @Nullable Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      return delegate.iterator();
+    }
     return new Iterator<E>() {
-      int expectedModCount = modCount;
-      int index = firstEntryIndex();
+      int expectedMetadata = metadata;
+      int currentIndex = firstEntryIndex();
       int indexToRemove = -1;
 
       @Override
       public boolean hasNext() {
-        return index >= 0;
+        return currentIndex >= 0;
       }
 
+      @SuppressWarnings("unchecked") // known to be Es
       @Override
-      @SuppressWarnings("unchecked")
       public E next() {
         checkForConcurrentModification();
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        indexToRemove = index;
-        E result = (E) elements[index];
-        index = getSuccessor(index);
+        indexToRemove = currentIndex;
+        E result = (E) elements[currentIndex];
+        currentIndex = getSuccessor(currentIndex);
         return result;
       }
 
@@ -458,14 +555,18 @@
       public void remove() {
         checkForConcurrentModification();
         checkRemove(indexToRemove >= 0);
-        expectedModCount++;
-        CompactHashSet.this.remove(elements[indexToRemove], getHash(entries[indexToRemove]));
-        index = adjustAfterRemove(index, indexToRemove);
+        incrementExpectedModCount();
+        CompactHashSet.this.remove(elements[indexToRemove]);
+        currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
         indexToRemove = -1;
       }
 
+      void incrementExpectedModCount() {
+        expectedMetadata += CompactHashing.MODIFICATION_COUNT_INCREMENT;
+      }
+
       private void checkForConcurrentModification() {
-        if (modCount != expectedModCount) {
+        if (metadata != expectedMetadata) {
           throw new ConcurrentModificationException();
         }
       }
@@ -474,36 +575,62 @@
 
   @Override
   public Spliterator<E> spliterator() {
-    return Spliterators.spliterator(elements, 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
+    if (needsAllocArrays()) {
+      return Spliterators.spliterator(new Object[0], Spliterator.DISTINCT | Spliterator.ORDERED);
+    }
+    @Nullable Set<E> delegate = delegateOrNull();
+    return (delegate != null)
+        ? delegate.spliterator()
+        : Spliterators.spliterator(elements, 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
   }
 
+  @SuppressWarnings("unchecked") // known to be Es
   @Override
   public void forEach(Consumer<? super E> action) {
     checkNotNull(action);
-    for (int i = 0; i < size; i++) {
-      action.accept((E) elements[i]);
+    @Nullable 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]);
+      }
     }
   }
 
   @Override
   public int size() {
-    return size;
+    @Nullable Set<E> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.size() : size;
   }
 
   @Override
   public boolean isEmpty() {
-    return size == 0;
+    return size() == 0;
   }
 
   @Override
   public Object[] toArray() {
-    return Arrays.copyOf(elements, size);
+    if (needsAllocArrays()) {
+      return new Object[0];
+    }
+    @Nullable Set<E> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.toArray() : Arrays.copyOf(elements, size);
   }
 
   @CanIgnoreReturnValue
   @Override
   public <T> T[] toArray(T[] a) {
-    return ObjectArrays.toArrayImpl(elements, 0, size, a);
+    if (needsAllocArrays()) {
+      if (a.length > 0) {
+        a[0] = null;
+      }
+      return a;
+    }
+    @Nullable Set<E> delegate = delegateOrNull();
+    return (delegate != null)
+        ? delegate.toArray(a)
+        : ObjectArrays.toArrayImpl(elements, 0, size, a);
   }
 
   /**
@@ -511,43 +638,51 @@
    * current size.
    */
   public void trimToSize() {
+    if (needsAllocArrays()) {
+      return;
+    }
+    @Nullable Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      Set<E> newDelegate = createHashFloodingResistantDelegate(size());
+      newDelegate.addAll(delegate);
+      this.table = newDelegate;
+      return;
+    }
     int size = this.size;
     if (size < entries.length) {
       resizeEntries(size);
     }
-    // size / loadFactor gives the table size of the appropriate load factor,
-    // but that may not be a power of two. We floor it to a power of two by
-    // keeping its highest bit. But the smaller table may have a load factor
-    // larger than what we want; then we want to go to the next power of 2 if we can
-    int minimumTableSize = Math.max(1, Integer.highestOneBit((int) (size / loadFactor)));
-    if (minimumTableSize < MAXIMUM_CAPACITY) {
-      double load = (double) size / minimumTableSize;
-      if (load > loadFactor) {
-        minimumTableSize <<= 1; // increase to next power if possible
-      }
-    }
-
-    if (minimumTableSize < table.length) {
-      resizeTable(minimumTableSize);
+    int minimumTableSize = CompactHashing.tableSize(size);
+    int mask = hashTableMask();
+    if (minimumTableSize < mask) { // smaller table size will always be less than current mask
+      resizeTable(mask, minimumTableSize, UNSET, UNSET);
     }
   }
 
   @Override
   public void clear() {
-    modCount++;
-    Arrays.fill(elements, 0, size, null);
-    Arrays.fill(table, UNSET);
-    Arrays.fill(entries, UNSET);
-    this.size = 0;
+    if (needsAllocArrays()) {
+      return;
+    }
+    incrementModCount();
+    @Nullable Set<E> delegate = delegateOrNull();
+    if (delegate != null) {
+      metadata =
+          Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
+      delegate.clear(); // invalidate any iterators left over!
+      table = null;
+      size = 0;
+    } else {
+      Arrays.fill(elements, 0, size, null);
+      CompactHashing.tableClear(table);
+      Arrays.fill(entries, 0, size, 0);
+      this.size = 0;
+    }
   }
 
-  /**
-   * The serial form currently mimics Android's java.util.HashSet version, e.g. see
-   * http://omapzoom.org/?p=platform/libcore.git;a=blob;f=luni/src/main/java/java/util/HashSet.java
-   */
   private void writeObject(ObjectOutputStream stream) throws IOException {
     stream.defaultWriteObject();
-    stream.writeInt(size);
+    stream.writeInt(size());
     for (E e : this) {
       stream.writeObject(e);
     }
@@ -556,9 +691,12 @@
   @SuppressWarnings("unchecked")
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
-    init(DEFAULT_SIZE, DEFAULT_LOAD_FACTOR);
     int elementCount = stream.readInt();
-    for (int i = elementCount; --i >= 0; ) {
+    if (elementCount < 0) {
+      throw new InvalidObjectException("Invalid size: " + elementCount);
+    }
+    init(elementCount);
+    for (int i = 0; i < elementCount; i++) {
       E element = (E) stream.readObject();
       add(element);
     }
diff --git a/guava/src/com/google/common/collect/CompactHashing.java b/guava/src/com/google/common/collect/CompactHashing.java
new file mode 100644
index 0000000..3444aeb
--- /dev/null
+++ b/guava/src/com/google/common/collect/CompactHashing.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 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.collect;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Ints;
+import java.util.Arrays;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/**
+ * Helper classes and static methods for implementing compact hash-based collections.
+ *
+ * @author Jon Noack
+ */
+@GwtIncompatible
+final class CompactHashing {
+  private CompactHashing() {}
+
+  /** Indicates blank table entries. */
+  static final byte UNSET = 0;
+
+  /** Number of bits used to store the numbers of hash table bits (max 30). */
+  private static final int HASH_TABLE_BITS_MAX_BITS = 5;
+
+  /** Use high bits of metadata for modification count. */
+  static final int MODIFICATION_COUNT_INCREMENT = (1 << HASH_TABLE_BITS_MAX_BITS);
+
+  /** Bitmask that selects the low bits of metadata to get hashTableBits. */
+  static final int HASH_TABLE_BITS_MASK = (1 << HASH_TABLE_BITS_MAX_BITS) - 1;
+
+  /** Maximum size of a compact hash-based collection (2^30 - 1 because 0 is UNSET). */
+  static final int MAX_SIZE = Ints.MAX_POWER_OF_TWO - 1;
+
+  /** Default size of a compact hash-based collection. */
+  static final int DEFAULT_SIZE = 3;
+
+  /**
+   * Minimum size of the hash table of a compact hash-based collection. Because small hash tables
+   * use a byte[], any smaller size uses the same amount of memory due to object padding.
+   */
+  private static final int MIN_HASH_TABLE_SIZE = 4;
+
+  private static final int BYTE_MAX_SIZE = 1 << Byte.SIZE; // 2^8 = 256
+  private static final int BYTE_MASK = (1 << Byte.SIZE) - 1; // 2^8 - 1 = 255
+
+  private static final int SHORT_MAX_SIZE = 1 << Short.SIZE; // 2^16 = 65_536
+  private static final int SHORT_MASK = (1 << Short.SIZE) - 1; // 2^16 - 1 = 65_535
+
+  /**
+   * Returns the power of 2 hashtable size required to hold the expected number of items or the
+   * minimum hashtable size, whichever is greater.
+   */
+  static int tableSize(int expectedSize) {
+    // We use entries next == 0 to indicate UNSET, so actual capacity is 1 less than requested.
+    return Math.max(MIN_HASH_TABLE_SIZE, Hashing.closedTableSize(expectedSize + 1, 1.0f));
+  }
+
+  /** Creates and returns a properly-sized array with the given number of buckets. */
+  static Object createTable(int buckets) {
+    if (buckets < 2
+        || buckets > Ints.MAX_POWER_OF_TWO
+        || Integer.highestOneBit(buckets) != buckets) {
+      throw new IllegalArgumentException("must be power of 2 between 2^1 and 2^30: " + buckets);
+    }
+    if (buckets <= BYTE_MAX_SIZE) {
+      return new byte[buckets];
+    } else if (buckets <= SHORT_MAX_SIZE) {
+      return new short[buckets];
+    } else {
+      return new int[buckets];
+    }
+  }
+
+  static void tableClear(Object table) {
+    if (table instanceof byte[]) {
+      Arrays.fill((byte[]) table, (byte) 0);
+    } else if (table instanceof short[]) {
+      Arrays.fill((short[]) table, (short) 0);
+    } else {
+      Arrays.fill((int[]) table, 0);
+    }
+  }
+
+  static int tableGet(Object table, int index) {
+    if (table instanceof byte[]) {
+      return ((byte[]) table)[index] & BYTE_MASK; // unsigned read
+    } else if (table instanceof short[]) {
+      return ((short[]) table)[index] & SHORT_MASK; // unsigned read
+    } else {
+      return ((int[]) table)[index];
+    }
+  }
+
+  static void tableSet(Object table, int index, int entry) {
+    if (table instanceof byte[]) {
+      ((byte[]) table)[index] = (byte) entry; // unsigned write
+    } else if (table instanceof short[]) {
+      ((short[]) table)[index] = (short) entry; // unsigned write
+    } else {
+      ((int[]) table)[index] = entry;
+    }
+  }
+
+  /**
+   * Returns a larger power of 2 hashtable size given the current mask.
+   *
+   * <p>For hashtable sizes less than or equal to 32, the returned power of 2 is 4x the current
+   * hashtable size to reduce expensive rehashing. Otherwise the returned power of 2 is 2x the
+   * current hashtable size.
+   */
+  static int newCapacity(int mask) {
+    return ((mask < 32) ? 4 : 2) * (mask + 1);
+  }
+
+  /** Returns the hash prefix given the current mask. */
+  static int getHashPrefix(int value, int mask) {
+    return value & ~mask;
+  }
+
+  /** Returns the index, or 0 if the entry is "null". */
+  static int getNext(int entry, int mask) {
+    return entry & mask;
+  }
+
+  /** Returns a new value combining the prefix and suffix using the given mask. */
+  static int maskCombine(int prefix, int suffix, int mask) {
+    return (prefix & ~mask) | (suffix & mask);
+  }
+
+  static int remove(
+      @Nullable Object key,
+      @Nullable Object value,
+      int mask,
+      Object table,
+      int[] entries,
+      Object[] keys,
+      Object @Nullable [] values) {
+    int hash = Hashing.smearedHash(key);
+    int tableIndex = hash & mask;
+    int next = tableGet(table, tableIndex);
+    if (next == UNSET) {
+      return -1;
+    }
+    int hashPrefix = getHashPrefix(hash, mask);
+    int lastEntryIndex = -1;
+    do {
+      int entryIndex = next - 1;
+      int entry = entries[entryIndex];
+      if (getHashPrefix(entry, mask) == hashPrefix
+          && Objects.equal(key, keys[entryIndex])
+          && (values == null || Objects.equal(value, values[entryIndex]))) {
+        int newNext = getNext(entry, mask);
+        if (lastEntryIndex == -1) {
+          // we need to update the root link from table[]
+          tableSet(table, tableIndex, newNext);
+        } else {
+          // we need to update the link from the chain
+          entries[lastEntryIndex] = maskCombine(entries[lastEntryIndex], newNext, mask);
+        }
+
+        return entryIndex;
+      }
+      lastEntryIndex = entryIndex;
+      next = getNext(entry, mask);
+    } while (next != UNSET);
+    return -1;
+  }
+}
diff --git a/guava/src/com/google/common/collect/CompactLinkedHashMap.java b/guava/src/com/google/common/collect/CompactLinkedHashMap.java
index 3f219f5..be878c8 100644
--- a/guava/src/com/google/common/collect/CompactLinkedHashMap.java
+++ b/guava/src/com/google/common/collect/CompactLinkedHashMap.java
@@ -13,21 +13,21 @@
  * 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;
+package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.j2objc.annotations.WeakOuter;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * CompactLinkedHashMap is an implementation of a Map with insertion or LRU iteration order,
@@ -60,7 +60,7 @@
 
   /**
    * Creates a {@code CompactLinkedHashMap} instance, with a high enough "initial capacity" that it
-   * <i>should</i> hold {@code expectedSize} elements without growth.
+   * <i>should</i> hold {@code expectedSize} elements without rebuilding internal data structures.
    *
    * @param expectedSize the number of elements you expect to add to the returned set
    * @return a new, empty {@code CompactLinkedHashMap} with enough capacity to hold {@code
@@ -82,7 +82,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 @MonotonicNonNull [] links;
+  @VisibleForTesting transient long @Nullable [] links;
 
   /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
@@ -93,44 +93,62 @@
   private final boolean accessOrder;
 
   CompactLinkedHashMap() {
-    this(DEFAULT_SIZE);
+    this(CompactHashing.DEFAULT_SIZE);
   }
 
   CompactLinkedHashMap(int expectedSize) {
-    this(expectedSize, DEFAULT_LOAD_FACTOR, false);
+    this(expectedSize, false);
   }
 
-  CompactLinkedHashMap(int expectedSize, float loadFactor, boolean accessOrder) {
-    super(expectedSize, loadFactor);
+  CompactLinkedHashMap(int expectedSize, boolean accessOrder) {
+    super(expectedSize);
     this.accessOrder = accessOrder;
   }
 
   @Override
-  void init(int expectedSize, float loadFactor) {
-    super.init(expectedSize, loadFactor);
-    firstEntry = ENDPOINT;
-    lastEntry = ENDPOINT;
-    links = new long[expectedSize];
-    Arrays.fill(links, UNSET);
+  void init(int expectedSize) {
+    super.init(expectedSize);
+    this.firstEntry = ENDPOINT;
+    this.lastEntry = ENDPOINT;
+  }
+
+  @Override
+  int allocArrays() {
+    int expectedSize = super.allocArrays();
+    this.links = new long[expectedSize];
+    return expectedSize;
+  }
+
+  @Override
+  Map<K, V> createHashFloodingResistantDelegate(int tableSize) {
+    return new LinkedHashMap<K, V>(tableSize, 1.0f, accessOrder);
+  }
+
+  @Override
+  @CanIgnoreReturnValue
+  Map<K, V> convertToHashFloodingResistantImplementation() {
+    Map<K, V> result = super.convertToHashFloodingResistantImplementation();
+    links = null;
+    return result;
   }
 
   private int getPredecessor(int entry) {
-    return (int) (links[entry] >>> 32);
+    return ((int) (links[entry] >>> 32)) - 1;
   }
 
   @Override
   int getSuccessor(int entry) {
-    return (int) links[entry];
+    return ((int) links[entry]) - 1;
   }
 
   private void setSuccessor(int entry, int succ) {
     long succMask = (~0L) >>> 32;
-    links[entry] = (links[entry] & ~succMask) | (succ & succMask);
+    links[entry] = (links[entry] & ~succMask) | ((succ + 1) & succMask);
   }
 
   private void setPredecessor(int entry, int pred) {
     long predMask = ~0L << 32;
-    links[entry] = (links[entry] & ~predMask) | ((long) pred << 32);
+    links[entry] = (links[entry] & ~predMask) | ((long) (pred + 1) << 32);
   }
 
   private void setSucceeds(int pred, int succ) {
@@ -139,6 +157,7 @@
     } else {
       setSuccessor(pred, succ);
     }
+
     if (succ == ENDPOINT) {
       lastEntry = pred;
     } else {
@@ -147,8 +166,8 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, K key, V value, int hash) {
-    super.insertEntry(entryIndex, key, value, hash);
+  void insertEntry(int entryIndex, @Nullable K key, @Nullable V value, int hash, int mask) {
+    super.insertEntry(entryIndex, key, value, hash, mask);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
   }
@@ -161,19 +180,21 @@
       // ...and insert at the end.
       setSucceeds(lastEntry, index);
       setSucceeds(index, ENDPOINT);
-      modCount++;
+      incrementModCount();
     }
   }
 
   @Override
-  void moveLastEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
+    super.moveLastEntry(dstIndex, mask);
+
     setSucceeds(getPredecessor(dstIndex), getSuccessor(dstIndex));
     if (dstIndex < srcIndex) {
       setSucceeds(getPredecessor(srcIndex), dstIndex);
       setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    super.moveLastEntry(dstIndex);
+    links[srcIndex] = 0;
   }
 
   @Override
@@ -193,14 +214,6 @@
   }
 
   @Override
-  public void forEach(BiConsumer<? super K, ? super V> action) {
-    checkNotNull(action);
-    for (int i = firstEntry; i != ENDPOINT; i = getSuccessor(i)) {
-      action.accept((K) keys[i], (V) values[i]);
-    }
-  }
-
-  @Override
   Set<Entry<K, V>> createEntrySet() {
     @WeakOuter
     class EntrySetImpl extends EntrySetView {
@@ -230,14 +243,6 @@
       public Spliterator<K> spliterator() {
         return Spliterators.spliterator(this, Spliterator.ORDERED | Spliterator.DISTINCT);
       }
-
-      @Override
-      public void forEach(Consumer<? super K> action) {
-        checkNotNull(action);
-        for (int i = firstEntry; i != ENDPOINT; i = getSuccessor(i)) {
-          action.accept((K) keys[i]);
-        }
-      }
     }
     return new KeySetImpl();
   }
@@ -260,22 +265,20 @@
       public Spliterator<V> spliterator() {
         return Spliterators.spliterator(this, Spliterator.ORDERED);
       }
-
-      @Override
-      public void forEach(Consumer<? super V> action) {
-        checkNotNull(action);
-        for (int i = firstEntry; i != ENDPOINT; i = getSuccessor(i)) {
-          action.accept((V) values[i]);
-        }
-      }
     }
     return new ValuesImpl();
   }
 
   @Override
   public void clear() {
-    super.clear();
+    if (needsAllocArrays()) {
+      return;
+    }
     this.firstEntry = ENDPOINT;
     this.lastEntry = ENDPOINT;
+    if (links != null) {
+      Arrays.fill(links, 0, size(), 0);
+    }
+    super.clear();
   }
 }
diff --git a/guava/src/com/google/common/collect/CompactLinkedHashSet.java b/guava/src/com/google/common/collect/CompactLinkedHashSet.java
index de31fcd..74caf47 100644
--- a/guava/src/com/google/common/collect/CompactLinkedHashSet.java
+++ b/guava/src/com/google/common/collect/CompactLinkedHashSet.java
@@ -16,16 +16,15 @@
 
 package com.google.common.collect;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
 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 java.util.Spliterator;
 import java.util.Spliterators;
-import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * CompactLinkedHashSet is an implementation of a Set, which a predictable iteration order that
@@ -53,7 +52,7 @@
 
   /** Creates an empty {@code CompactLinkedHashSet} instance. */
   public static <E> CompactLinkedHashSet<E> create() {
-    return new CompactLinkedHashSet<E>();
+    return new CompactLinkedHashSet<>();
   }
 
   /**
@@ -76,6 +75,7 @@
    * @param elements the elements that the set should contain
    * @return a new {@code CompactLinkedHashSet} containing those elements (minus duplicates)
    */
+  @SafeVarargs
   public static <E> CompactLinkedHashSet<E> create(E... elements) {
     CompactLinkedHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
@@ -92,28 +92,31 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
   public static <E> CompactLinkedHashSet<E> createWithExpectedSize(int expectedSize) {
-    return new CompactLinkedHashSet<E>(expectedSize);
+    return new CompactLinkedHashSet<>(expectedSize);
   }
 
   private static final int ENDPOINT = -2;
 
   // TODO(user): predecessors and successors should be collocated (reducing cache misses).
-  // Might also explore collocating all of [hash, next, predecessor, succesor] fields of an
+  // Might also explore collocating all of [hash, next, predecessor, successor] fields of an
   // entry in a *single* long[], though that reduces the maximum size of the set by a factor of 2
 
   /**
    * 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 @MonotonicNonNull [] predecessor;
+  private transient int @Nullable [] 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 @MonotonicNonNull [] successor;
+  private transient int @Nullable [] successor;
 
+  /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
+
+  /** Pointer to the last node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int lastEntry;
 
   CompactLinkedHashSet() {
@@ -125,72 +128,96 @@
   }
 
   @Override
-  void init(int expectedSize, float loadFactor) {
-    super.init(expectedSize, loadFactor);
-    this.predecessor = new int[expectedSize];
-    this.successor = new int[expectedSize];
-
-    Arrays.fill(predecessor, UNSET);
-    Arrays.fill(successor, UNSET);
-    firstEntry = ENDPOINT;
-    lastEntry = ENDPOINT;
+  void init(int expectedSize) {
+    super.init(expectedSize);
+    this.firstEntry = ENDPOINT;
+    this.lastEntry = ENDPOINT;
   }
 
-  private void succeeds(int pred, int succ) {
+  @Override
+  int allocArrays() {
+    int expectedSize = super.allocArrays();
+    this.predecessor = new int[expectedSize];
+    this.successor = new int[expectedSize];
+    return expectedSize;
+  }
+
+  @Override
+  @CanIgnoreReturnValue
+  Set<E> convertToHashFloodingResistantImplementation() {
+    Set<E> result = super.convertToHashFloodingResistantImplementation();
+    this.predecessor = null;
+    this.successor = null;
+    return result;
+  }
+
+  private int getPredecessor(int entry) {
+    return predecessor[entry] - 1;
+  }
+
+  @Override
+  int getSuccessor(int entry) {
+    return successor[entry] - 1;
+  }
+
+  private void setSuccessor(int entry, int succ) {
+    successor[entry] = succ + 1;
+  }
+
+  private void setPredecessor(int entry, int pred) {
+    predecessor[entry] = pred + 1;
+  }
+
+  private void setSucceeds(int pred, int succ) {
     if (pred == ENDPOINT) {
       firstEntry = succ;
     } else {
-      successor[pred] = succ;
+      setSuccessor(pred, succ);
     }
 
     if (succ == ENDPOINT) {
       lastEntry = pred;
     } else {
-      predecessor[succ] = pred;
+      setPredecessor(succ, pred);
     }
   }
 
   @Override
-  void insertEntry(int entryIndex, E object, int hash) {
-    super.insertEntry(entryIndex, object, hash);
-    succeeds(lastEntry, entryIndex);
-    succeeds(entryIndex, ENDPOINT);
+  void insertEntry(int entryIndex, @Nullable E object, int hash, int mask) {
+    super.insertEntry(entryIndex, object, hash, mask);
+    setSucceeds(lastEntry, entryIndex);
+    setSucceeds(entryIndex, ENDPOINT);
   }
 
   @Override
-  void moveEntry(int dstIndex) {
+  void moveLastEntry(int dstIndex, int mask) {
     int srcIndex = size() - 1;
-    super.moveEntry(dstIndex);
+    super.moveLastEntry(dstIndex, mask);
 
-    succeeds(predecessor[dstIndex], successor[dstIndex]);
-    if (srcIndex != dstIndex) {
-      succeeds(predecessor[srcIndex], dstIndex);
-      succeeds(dstIndex, successor[srcIndex]);
+    setSucceeds(getPredecessor(dstIndex), getSuccessor(dstIndex));
+    if (dstIndex < srcIndex) {
+      setSucceeds(getPredecessor(srcIndex), dstIndex);
+      setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    predecessor[srcIndex] = UNSET;
-    successor[srcIndex] = UNSET;
-  }
-
-  @Override
-  public void clear() {
-    super.clear();
-    firstEntry = ENDPOINT;
-    lastEntry = ENDPOINT;
-    Arrays.fill(predecessor, UNSET);
-    Arrays.fill(successor, UNSET);
+    predecessor[srcIndex] = 0;
+    successor[srcIndex] = 0;
   }
 
   @Override
   void resizeEntries(int newCapacity) {
     super.resizeEntries(newCapacity);
-    int oldCapacity = predecessor.length;
     predecessor = Arrays.copyOf(predecessor, newCapacity);
     successor = Arrays.copyOf(successor, newCapacity);
+  }
 
-    if (oldCapacity < newCapacity) {
-      Arrays.fill(predecessor, oldCapacity, newCapacity, UNSET);
-      Arrays.fill(successor, oldCapacity, newCapacity, UNSET);
-    }
+  @Override
+  int firstEntryIndex() {
+    return firstEntry;
+  }
+
+  @Override
+  int adjustAfterRemove(int indexBeforeRemove, int indexRemoved) {
+    return (indexBeforeRemove >= size()) ? indexRemoved : indexBeforeRemove;
   }
 
   @Override
@@ -204,30 +231,21 @@
   }
 
   @Override
-  int firstEntryIndex() {
-    return firstEntry;
-  }
-
-  @Override
-  int adjustAfterRemove(int indexBeforeRemove, int indexRemoved) {
-    return (indexBeforeRemove == size()) ? indexRemoved : indexBeforeRemove;
-  }
-
-  @Override
-  int getSuccessor(int entryIndex) {
-    return successor[entryIndex];
-  }
-
-  @Override
   public Spliterator<E> spliterator() {
     return Spliterators.spliterator(this, Spliterator.ORDERED | Spliterator.DISTINCT);
   }
 
   @Override
-  public void forEach(Consumer<? super E> action) {
-    checkNotNull(action);
-    for (int i = firstEntry; i != ENDPOINT; i = successor[i]) {
-      action.accept((E) elements[i]);
+  public void clear() {
+    if (needsAllocArrays()) {
+      return;
     }
+    this.firstEntry = ENDPOINT;
+    this.lastEntry = ENDPOINT;
+    if (predecessor != null) {
+      Arrays.fill(predecessor, 0, size(), 0);
+      Arrays.fill(successor, 0, size(), 0);
+    }
+    super.clear();
   }
 }
diff --git a/guava/src/com/google/common/collect/Comparators.java b/guava/src/com/google/common/collect/Comparators.java
index 06b398f..a541de9 100644
--- a/guava/src/com/google/common/collect/Comparators.java
+++ b/guava/src/com/google/common/collect/Comparators.java
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collector;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods for working with {@link Comparator} instances. For many other helpful
@@ -190,4 +191,80 @@
     checkNotNull(valueComparator);
     return Comparator.comparing(o -> o.orElse(null), Comparator.nullsLast(valueComparator));
   }
+
+  /**
+   * Returns the minimum of the two values. If the values compare as 0, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code minimum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if less than or equal to b.
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
+   * @since 30.0
+   */
+  @Beta
+  public static <T extends Comparable<? super T>> T min(T a, T b) {
+    return (a.compareTo(b) <= 0) ? a : b;
+  }
+
+  /**
+   * Returns the minimum of the two values, according to the given comparator. If the values compare
+   * as equal, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code minimum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if less than or equal to b
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i> using the given
+   *     comparator.
+   * @since 30.0
+   */
+  @Beta
+  public static <T> T min(@Nullable T a, @Nullable T b, Comparator<T> comparator) {
+    return (comparator.compare(a, b) <= 0) ? a : b;
+  }
+
+  /**
+   * Returns the maximum of the two values. If the values compare as 0, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code maximum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if greater than or equal to b.
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i>.
+   * @since 30.0
+   */
+  @Beta
+  public static <T extends Comparable<? super T>> T max(T a, T b) {
+    return (a.compareTo(b) >= 0) ? a : b;
+  }
+
+  /**
+   * Returns the maximum of the two values, according to the given comparator. If the values compare
+   * as equal, the first is returned.
+   *
+   * <p>The recommended solution for finding the {@code maximum} of some values depends on the type
+   * of your data and the number of elements you have. Read more in the Guava User Guide article on
+   * <a href="https://github.com/google/guava/wiki/CollectionUtilitiesExplained#comparators">{@code
+   * Comparators}</a>.
+   *
+   * @param a first value to compare, returned if greater than or equal to b.
+   * @param b second value to compare.
+   * @throws ClassCastException if the parameters are not <i>mutually comparable</i> using the given
+   *     comparator.
+   * @since 30.0
+   */
+  @Beta
+  public static <T> T max(@Nullable T a, @Nullable T b, Comparator<T> comparator) {
+    return (comparator.compare(a, b) >= 0) ? a : b;
+  }
 }
diff --git a/guava/src/com/google/common/collect/ComputationException.java b/guava/src/com/google/common/collect/ComputationException.java
index 5905467..df8d377 100644
--- a/guava/src/com/google/common/collect/ComputationException.java
+++ b/guava/src/com/google/common/collect/ComputationException.java
@@ -24,7 +24,15 @@
  *
  * @author Bob Lee
  * @since 2.0
+ * @deprecated This exception is no longer thrown by {@code com.google.common}. Previously, it was
+ *     thrown by {@link MapMaker} computing maps. When support for computing maps was removed from
+ *     {@code MapMaker}, it was added to {@code CacheBuilder}, which throws {@code
+ *     ExecutionException}, {@code UncheckedExecutionException}, and {@code ExecutionError}. Any
+ *     code that is still catching {@code ComputationException} may need to be updated to catch some
+ *     of those types instead. (Note that this type, though deprecated, is not planned to be removed
+ *     from Guava.)
  */
+@Deprecated
 @GwtCompatible
 public class ComputationException extends RuntimeException {
   /** Creates a new instance with the given cause. */
diff --git a/guava/src/com/google/common/collect/DescendingMultiset.java b/guava/src/com/google/common/collect/DescendingMultiset.java
index 59570a2..74590ac 100644
--- a/guava/src/com/google/common/collect/DescendingMultiset.java
+++ b/guava/src/com/google/common/collect/DescendingMultiset.java
@@ -22,7 +22,7 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A skeleton implementation of a descending multiset. Only needs {@code forwardMultiset()} and
@@ -34,7 +34,7 @@
 abstract class DescendingMultiset<E> extends ForwardingMultiset<E> implements SortedMultiset<E> {
   abstract SortedMultiset<E> forwardMultiset();
 
-  private transient @MonotonicNonNull Comparator<? super E> comparator;
+  private transient @Nullable Comparator<? super E> comparator;
 
   @Override
   public Comparator<? super E> comparator() {
@@ -45,7 +45,7 @@
     return result;
   }
 
-  private transient @MonotonicNonNull NavigableSet<E> elementSet;
+  private transient @Nullable NavigableSet<E> elementSet;
 
   @Override
   public NavigableSet<E> elementSet() {
@@ -106,7 +106,7 @@
 
   abstract Iterator<Entry<E>> entryIterator();
 
-  private transient @MonotonicNonNull Set<Entry<E>> entrySet;
+  private transient @Nullable Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
diff --git a/guava/src/com/google/common/collect/EnumMultiset.java b/guava/src/com/google/common/collect/EnumMultiset.java
index 76f007f..c6b9b5b 100644
--- a/guava/src/com/google/common/collect/EnumMultiset.java
+++ b/guava/src/com/google/common/collect/EnumMultiset.java
@@ -126,7 +126,7 @@
 
   @Override
   public int count(@Nullable Object element) {
-    if (element == null || !isActuallyE(element)) {
+    if (!isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
@@ -158,7 +158,7 @@
   @CanIgnoreReturnValue
   @Override
   public int remove(@Nullable Object element, int occurrences) {
-    if (element == null || !isActuallyE(element)) {
+    if (!isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
diff --git a/guava/src/com/google/common/collect/FluentIterable.java b/guava/src/com/google/common/collect/FluentIterable.java
index 9f7214b..a15bcdd 100644
--- a/guava/src/com/google/common/collect/FluentIterable.java
+++ b/guava/src/com/google/common/collect/FluentIterable.java
@@ -52,7 +52,7 @@
  * <p>Several lesser-used features are currently available only as static methods on the {@link
  * Iterables} class.
  *
- * <p><a name="streams"></a>
+ * <p><a id="streams"></a>
  *
  * <h3>Comparison to streams</h3>
  *
@@ -786,7 +786,7 @@
     checkNotNull(collection);
     Iterable<E> iterable = getDelegate();
     if (iterable instanceof Collection) {
-      collection.addAll(Collections2.cast(iterable));
+      collection.addAll((Collection<E>) iterable);
     } else {
       for (E item : iterable) {
         collection.add(item);
diff --git a/guava/src/com/google/common/collect/ForwardingMap.java b/guava/src/com/google/common/collect/ForwardingMap.java
index 20e32b3..3a6aa52 100644
--- a/guava/src/com/google/common/collect/ForwardingMap.java
+++ b/guava/src/com/google/common/collect/ForwardingMap.java
@@ -76,8 +76,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(Object object) {
-    return delegate().remove(object);
+  public V remove(Object key) {
+    return delegate().remove(key);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/GeneralRange.java b/guava/src/com/google/common/collect/GeneralRange.java
index 387d3f4..1ce5659 100644
--- a/guava/src/com/google/common/collect/GeneralRange.java
+++ b/guava/src/com/google/common/collect/GeneralRange.java
@@ -23,7 +23,6 @@
 import com.google.common.base.Objects;
 import java.io.Serializable;
 import java.util.Comparator;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -245,7 +244,7 @@
         getUpperBoundType());
   }
 
-  private transient @MonotonicNonNull GeneralRange<T> reverse;
+  private transient @Nullable GeneralRange<T> reverse;
 
   /** Returns the same range relative to the reversed comparator. */
   GeneralRange<T> reverse() {
diff --git a/guava/src/com/google/common/collect/HashBiMap.java b/guava/src/com/google/common/collect/HashBiMap.java
index d53a7dc..33365ec 100644
--- a/guava/src/com/google/common/collect/HashBiMap.java
+++ b/guava/src/com/google/common/collect/HashBiMap.java
@@ -25,6 +25,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.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
@@ -39,7 +40,6 @@
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -244,6 +244,16 @@
     return seekByKey(key, smearedHash(key)) != null;
   }
 
+  /**
+   * Returns {@code true} if this BiMap contains an entry whose value is equal to {@code value} (or,
+   * equivalently, if this inverse view contains a key that is equal to {@code value}).
+   *
+   * <p>Due to the property that values in a BiMap are unique, this will tend to execute in
+   * faster-than-linear time.
+   *
+   * @param value the object to search for in the values of this BiMap
+   * @return true if a mapping exists from a key to the specified value
+   */
   @Override
   public boolean containsValue(@Nullable Object value) {
     return seekByValue(value, smearedHash(value)) != null;
@@ -296,8 +306,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  @Nullable
-  public V forcePut(@Nullable K key, @Nullable V value) {
+  public @Nullable V forcePut(@Nullable K key, @Nullable V value) {
     return put(key, value, true);
   }
 
@@ -371,8 +380,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  @Nullable
-  public V remove(@Nullable Object key) {
+  public @Nullable V remove(@Nullable Object key) {
     BiEntry<K, V> entry = seekByKey(key, smearedHash(key));
     if (entry == null) {
       return null;
@@ -549,7 +557,7 @@
     }
   }
 
-  @MonotonicNonNull @RetainedWith private transient BiMap<V, K> inverse;
+  @LazyInit @RetainedWith private transient @Nullable BiMap<V, K> inverse;
 
   @Override
   public BiMap<V, K> inverse() {
@@ -585,20 +593,17 @@
 
     @CanIgnoreReturnValue
     @Override
-    @Nullable
-    public K put(@Nullable V value, @Nullable K key) {
+    public @Nullable K put(@Nullable V value, @Nullable K key) {
       return putInverse(value, key, false);
     }
 
     @Override
-    @Nullable
-    public K forcePut(@Nullable V value, @Nullable K key) {
+    public @Nullable K forcePut(@Nullable V value, @Nullable K key) {
       return putInverse(value, key, true);
     }
 
     @Override
-    @Nullable
-    public K remove(@Nullable Object value) {
+    public @Nullable K remove(@Nullable Object value) {
       BiEntry<K, V> entry = seekByValue(value, smearedHash(value));
       if (entry == null) {
         return null;
diff --git a/guava/src/com/google/common/collect/HashMultimap.java b/guava/src/com/google/common/collect/HashMultimap.java
index 250f4f6..9297260 100644
--- a/guava/src/com/google/common/collect/HashMultimap.java
+++ b/guava/src/com/google/common/collect/HashMultimap.java
@@ -37,8 +37,9 @@
  * views are modifiable.
  *
  * <p>This class is not threadsafe when any concurrent operations update the multimap. Concurrent
- * read operations will work correctly. To allow concurrent update operations, wrap your multimap
- * with a call to {@link Multimaps#synchronizedSetMultimap}.
+ * read operations will work correctly if the last write <i>happens-before</i> any reads. To allow
+ * concurrent update operations, wrap your multimap with a call to {@link
+ * Multimaps#synchronizedSetMultimap}.
  *
  * @author Jared Levy
  * @since 2.0
diff --git a/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java b/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java
index 9c6b616..0922c38 100644
--- a/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java
+++ b/guava/src/com/google/common/collect/HashMultimapGwtSerializationDependencies.java
@@ -24,7 +24,7 @@
  * A dummy superclass to support GWT serialization of the element types of a {@link HashMultimap}.
  * The GWT supersource for this class contains a field for each type.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/guava/src/com/google/common/collect/ImmutableBiMap.java b/guava/src/com/google/common/collect/ImmutableBiMap.java
index d26a32c..d7855c3 100644
--- a/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -413,15 +413,14 @@
    * <p>Since the bimap is immutable, ImmutableBiMap doesn't require special logic for keeping the
    * bimap and its inverse in sync during serialization, the way AbstractBiMap does.
    */
-  private static class SerializedForm extends ImmutableMap.SerializedForm {
-    SerializedForm(ImmutableBiMap<?, ?> bimap) {
+  private static class SerializedForm<K, V> extends ImmutableMap.SerializedForm<K, V> {
+    SerializedForm(ImmutableBiMap<K, V> bimap) {
       super(bimap);
     }
 
     @Override
-    Object readResolve() {
-      Builder<Object, Object> builder = new Builder<>();
-      return createMap(builder);
+    Builder<K, V> makeBuilder(int size) {
+      return new Builder<>(size);
     }
 
     private static final long serialVersionUID = 0;
@@ -429,6 +428,6 @@
 
   @Override
   Object writeReplace() {
-    return new SerializedForm(this);
+    return new SerializedForm<>(this);
   }
 }
diff --git a/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java b/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
index 419b67b..8370f0a 100644
--- a/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
+++ b/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
@@ -151,8 +151,7 @@
       Map<? extends Class<? extends S>, ? extends S> map) {
     if (map instanceof ImmutableClassToInstanceMap) {
       @SuppressWarnings("unchecked") // covariant casts safe (unmodifiable)
-      // Eclipse won't compile if we cast to the parameterized type.
-      ImmutableClassToInstanceMap<B> cast = (ImmutableClassToInstanceMap) map;
+      ImmutableClassToInstanceMap<B> cast = (ImmutableClassToInstanceMap<B>) map;
       return cast;
     }
     return new Builder<B>().putAll(map).build();
diff --git a/guava/src/com/google/common/collect/ImmutableCollection.java b/guava/src/com/google/common/collect/ImmutableCollection.java
index b099992..5a76efa 100644
--- a/guava/src/com/google/common/collect/ImmutableCollection.java
+++ b/guava/src/com/google/common/collect/ImmutableCollection.java
@@ -20,10 +20,12 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.AbstractCollection;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Spliterator;
@@ -156,6 +158,7 @@
  *
  * @since 2.0
  */
+@DoNotMock("Use ImmutableList.of or another implementation")
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
 // TODO(kevinb): I think we should push everything down to "BaseImmutableCollection" or something,
@@ -207,8 +210,7 @@
   }
 
   /** If this collection is backed by an array of its elements in insertion order, returns it. */
-  @Nullable
-  Object[] internalArray() {
+  Object @Nullable [] internalArray() {
     return null;
   }
 
@@ -371,6 +373,7 @@
    *
    * @since 10.0
    */
+  @DoNotMock
   public abstract static class Builder<E> {
     static final int DEFAULT_INITIAL_CAPACITY = 4;
 
diff --git a/guava/src/com/google/common/collect/ImmutableList.java b/guava/src/com/google/common/collect/ImmutableList.java
index 8dd49de..05e7088 100644
--- a/guava/src/com/google/common/collect/ImmutableList.java
+++ b/guava/src/com/google/common/collect/ImmutableList.java
@@ -84,7 +84,7 @@
 
   /**
    * Returns an immutable list containing a single element. This list behaves and performs
-   * comparably to {@link Collections#singleton}, but will not accept a null element. It is
+   * comparably to {@link Collections#singletonList}, but will not accept a null element. It is
    * preferable mainly for consistency and maintainability of your code.
    *
    * @throws NullPointerException if {@code element} is null
@@ -223,7 +223,7 @@
    * {@link Collection}, this method behaves exactly as {@link #copyOf(Collection)}; otherwise, it
    * behaves exactly as {@code copyOf(elements.iterator()}.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    */
   public static <E> ImmutableList<E> copyOf(Iterable<? extends E> elements) {
     checkNotNull(elements); // TODO(kevinb): is this here only for GWT?
@@ -247,7 +247,7 @@
    * <p>This method is safe to use even when {@code elements} is a synchronized or concurrent
    * collection that is currently being modified by another thread.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    */
   public static <E> ImmutableList<E> copyOf(Collection<? extends E> elements) {
     if (elements instanceof ImmutableCollection) {
@@ -261,7 +261,7 @@
   /**
    * Returns an immutable list containing the given elements, in order.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    */
   public static <E> ImmutableList<E> copyOf(Iterator<? extends E> elements) {
     // We special-case for 0 or 1 elements, but going further is madness.
@@ -279,7 +279,7 @@
   /**
    * Returns an immutable list containing the given elements, in order.
    *
-   * @throws NullPointerException if any of {@code elements} is null
+   * @throws NullPointerException if {@code elements} contains a null element
    * @since 3.0
    */
   public static <E> ImmutableList<E> copyOf(E[] elements) {
@@ -837,7 +837,7 @@
     /**
      * Adds each element of {@code elements} to the {@code ImmutableList}.
      *
-     * @param elements the {@code Iterable} to add to the {@code ImmutableList}
+     * @param elements the {@code Iterator} to add to the {@code ImmutableList}
      * @return this {@code Builder} object
      * @throws NullPointerException if {@code elements} is null or contains a null element
      */
diff --git a/guava/src/com/google/common/collect/ImmutableListMultimap.java b/guava/src/com/google/common/collect/ImmutableListMultimap.java
index 43becc6..879c71e 100644
--- a/guava/src/com/google/common/collect/ImmutableListMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableListMultimap.java
@@ -57,8 +57,9 @@
    * whose keys and values are the result of applying the provided mapping functions to the input
    * elements.
    *
-   * <p>For streams with {@linkplain java.util.stream#Ordering defined encounter order}, that order
-   * is preserved, but entries are <a href="ImmutableMultimap.html#iteration">grouped by key</a>.
+   * <p>For streams with defined encounter order (as defined in the Ordering section of the {@link
+   * java.util.stream} Javadoc), that order is preserved, but entries are <a
+   * href="ImmutableMultimap.html#iteration">grouped by key</a>.
    *
    * <p>Example:
    *
diff --git a/guava/src/com/google/common/collect/ImmutableMap.java b/guava/src/com/google/common/collect/ImmutableMap.java
index 0a376ed..5c24df2 100644
--- a/guava/src/com/google/common/collect/ImmutableMap.java
+++ b/guava/src/com/google/common/collect/ImmutableMap.java
@@ -25,6 +25,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.WeakOuter;
@@ -46,7 +47,6 @@
 import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -60,6 +60,7 @@
  * @author Kevin Bourrillion
  * @since 2.0
  */
+@DoNotMock("Use ImmutableMap.of or another implementation")
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
 public abstract class ImmutableMap<K, V> implements Map<K, V>, Serializable {
@@ -244,8 +245,9 @@
    *
    * @since 2.0
    */
+  @DoNotMock
   public static class Builder<K, V> {
-    @MonotonicNonNull Comparator<? super V> valueComparator;
+    @Nullable Comparator<? super V> valueComparator;
     Entry<K, V>[] entries;
     int size;
     boolean entriesUsed;
@@ -492,7 +494,6 @@
 
     @Override
     ImmutableSet<Entry<K, V>> createEntrySet() {
-      @WeakOuter
       class EntrySetImpl extends ImmutableMapEntrySet<K, V> {
         @Override
         ImmutableMap<K, V> map() {
@@ -705,7 +706,7 @@
     return (result != null) ? result : defaultValue;
   }
 
-  @LazyInit private transient ImmutableSet<Entry<K, V>> entrySet;
+  @LazyInit @RetainedWith private transient ImmutableSet<Entry<K, V>> entrySet;
 
   /**
    * Returns an immutable set of the mappings in this map. The iteration order is specified by the
@@ -890,37 +891,85 @@
    * reconstructed using public factory methods. This ensures that the implementation types remain
    * as implementation details.
    */
-  static class SerializedForm implements Serializable {
-    private final Object[] keys;
-    private final Object[] values;
+  static class SerializedForm<K, V> implements Serializable {
+    // This object retains references to collections returned by keySet() and value(). This saves
+    // bytes when the both the map and its keySet or value collection are written to the same
+    // instance of ObjectOutputStream.
 
-    SerializedForm(ImmutableMap<?, ?> map) {
-      keys = new Object[map.size()];
-      values = new Object[map.size()];
-      int i = 0;
-      for (Entry<?, ?> entry : map.entrySet()) {
-        keys[i] = entry.getKey();
-        values[i] = entry.getValue();
-        i++;
+    // TODO(b/160980469): remove support for the old serialization format after some time
+    private static final boolean USE_LEGACY_SERIALIZATION = true;
+
+    private final Object keys;
+    private final Object values;
+
+    SerializedForm(ImmutableMap<K, V> map) {
+      if (USE_LEGACY_SERIALIZATION) {
+        Object[] keys = new Object[map.size()];
+        Object[] values = new Object[map.size()];
+        int i = 0;
+        for (Entry<?, ?> entry : map.entrySet()) {
+          keys[i] = entry.getKey();
+          values[i] = entry.getValue();
+          i++;
+        }
+        this.keys = keys;
+        this.values = values;
+        return;
       }
+      this.keys = map.keySet();
+      this.values = map.values();
     }
 
-    Object readResolve() {
-      Builder<Object, Object> builder = new Builder<>(keys.length);
-      return createMap(builder);
+    @SuppressWarnings("unchecked")
+    final Object readResolve() {
+      if (!(this.keys instanceof ImmutableSet)) {
+        return legacyReadResolve();
+      }
+
+      ImmutableSet<K> keySet = (ImmutableSet<K>) this.keys;
+      ImmutableCollection<V> values = (ImmutableCollection<V>) this.values;
+
+      Builder<K, V> builder = makeBuilder(keySet.size());
+
+      UnmodifiableIterator<K> keyIter = keySet.iterator();
+      UnmodifiableIterator<V> valueIter = values.iterator();
+
+      while (keyIter.hasNext()) {
+        builder.put(keyIter.next(), valueIter.next());
+      }
+
+      return builder.build();
     }
 
-    Object createMap(Builder<Object, Object> builder) {
+    @SuppressWarnings("unchecked")
+    final Object legacyReadResolve() {
+      K[] keys = (K[]) this.keys;
+      V[] values = (V[]) this.values;
+
+      Builder<K, V> builder = makeBuilder(keys.length);
+
       for (int i = 0; i < keys.length; i++) {
         builder.put(keys[i], values[i]);
       }
       return builder.build();
     }
 
+    /**
+     * Returns a builder that builds the unserialized type. Subclasses should override this method.
+     */
+    Builder<K, V> makeBuilder(int size) {
+      return new Builder<>(size);
+    }
+
     private static final long serialVersionUID = 0;
   }
 
+  /**
+   * Returns a serializable form of this object. Non-public subclasses should not override this
+   * method. Publicly-accessible subclasses must override this method and should return a subclass
+   * of SerializedForm whose readResolve() method returns objects of the subclass type.
+   */
   Object writeReplace() {
-    return new SerializedForm(this);
+    return new SerializedForm<>(this);
   }
 }
diff --git a/guava/src/com/google/common/collect/ImmutableMapEntrySet.java b/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
index 323dba3..8305283 100644
--- a/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
+++ b/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
@@ -18,7 +18,6 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
-import com.google.j2objc.annotations.Weak;
 import java.io.Serializable;
 import java.util.Map.Entry;
 import java.util.Spliterator;
@@ -34,7 +33,7 @@
 @GwtCompatible(emulated = true)
 abstract class ImmutableMapEntrySet<K, V> extends ImmutableSet<Entry<K, V>> {
   static final class RegularEntrySet<K, V> extends ImmutableMapEntrySet<K, V> {
-    @Weak private final transient ImmutableMap<K, V> map;
+    private final transient ImmutableMap<K, V> map;
     private final transient ImmutableList<Entry<K, V>> entries;
 
     RegularEntrySet(ImmutableMap<K, V> map, Entry<K, V>[] entries) {
diff --git a/guava/src/com/google/common/collect/ImmutableMapKeySet.java b/guava/src/com/google/common/collect/ImmutableMapKeySet.java
index 56110a8..0b28cc2 100644
--- a/guava/src/com/google/common/collect/ImmutableMapKeySet.java
+++ b/guava/src/com/google/common/collect/ImmutableMapKeySet.java
@@ -75,13 +75,9 @@
     return true;
   }
 
+  // No longer used for new writes, but kept so that old data can still be read.
   @GwtIncompatible // serialization
-  @Override
-  Object writeReplace() {
-    return new KeySetSerializedForm<K>(map);
-  }
-
-  @GwtIncompatible // serialization
+  @SuppressWarnings("unused")
   private static class KeySetSerializedForm<K> implements Serializable {
     final ImmutableMap<K, ?> map;
 
diff --git a/guava/src/com/google/common/collect/ImmutableMapValues.java b/guava/src/com/google/common/collect/ImmutableMapValues.java
index 2c13c47..2950f90 100644
--- a/guava/src/com/google/common/collect/ImmutableMapValues.java
+++ b/guava/src/com/google/common/collect/ImmutableMapValues.java
@@ -100,13 +100,9 @@
     map.forEach((k, v) -> action.accept(v));
   }
 
+  // No longer used for new writes, but kept so that old data can still be read.
   @GwtIncompatible // serialization
-  @Override
-  Object writeReplace() {
-    return new SerializedForm<V>(map);
-  }
-
-  @GwtIncompatible // serialization
+  @SuppressWarnings("unused")
   private static class SerializedForm<V> implements Serializable {
     final ImmutableMap<?, V> map;
 
diff --git a/guava/src/com/google/common/collect/ImmutableMultimap.java b/guava/src/com/google/common/collect/ImmutableMultimap.java
index 06d8cf0..cf785ef 100644
--- a/guava/src/com/google/common/collect/ImmutableMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableMultimap.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.DoNotMock;
 import com.google.j2objc.annotations.Weak;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
@@ -36,7 +37,6 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.function.BiConsumer;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,7 +51,7 @@
  * <p><b>Note:</b> every {@link ImmutableMultimap} offers an {@link #inverse} view, so there is no
  * need for a distinct {@code ImmutableBiMultimap} type.
  *
- * <p><a name="iteration"></a>
+ * <p><a id="iteration"></a>
  *
  * <p><b>Key-grouped iteration.</b> All view collections follow the same iteration order. In all
  * current implementations, the iteration order always keeps multiple entries with the same key
@@ -138,10 +138,11 @@
    *
    * @since 2.0
    */
+  @DoNotMock
   public static class Builder<K, V> {
     Map<K, Collection<V>> builderMap;
-    @MonotonicNonNull Comparator<? super K> keyComparator;
-    @MonotonicNonNull Comparator<? super V> valueComparator;
+    @Nullable Comparator<? super K> keyComparator;
+    @Nullable Comparator<? super V> valueComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
diff --git a/guava/src/com/google/common/collect/ImmutableMultiset.java b/guava/src/com/google/common/collect/ImmutableMultiset.java
index 5320e39..77d6cc5 100644
--- a/guava/src/com/google/common/collect/ImmutableMultiset.java
+++ b/guava/src/com/google/common/collect/ImmutableMultiset.java
@@ -33,7 +33,6 @@
 import java.util.function.Function;
 import java.util.function.ToIntFunction;
 import java.util.stream.Collector;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -237,7 +236,7 @@
     final Iterator<Entry<E>> entryIterator = entrySet().iterator();
     return new UnmodifiableIterator<E>() {
       int remaining;
-      @MonotonicNonNull E element;
+      @Nullable E element;
 
       @Override
       public boolean hasNext() {
diff --git a/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java b/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
index 7aaab52..a8b1899 100644
--- a/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
+++ b/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
@@ -22,7 +22,7 @@
  * A dummy superclass to support GWT serialization of the element type of an {@link
  * ImmutableMultiset}. The GWT supersource for this class contains a field of type {@code E}.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/guava/src/com/google/common/collect/ImmutableRangeMap.java b/guava/src/com/google/common/collect/ImmutableRangeMap.java
index 56f36f3..f164701 100644
--- a/guava/src/com/google/common/collect/ImmutableRangeMap.java
+++ b/guava/src/com/google/common/collect/ImmutableRangeMap.java
@@ -23,12 +23,14 @@
 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.DoNotMock;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
+import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collector;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -97,6 +99,7 @@
    *
    * @since 14.0
    */
+  @DoNotMock
   public static final class Builder<K extends Comparable<?>, V> {
     private final List<Entry<Range<K>, V>> entries;
 
@@ -271,6 +274,21 @@
     throw new UnsupportedOperationException();
   }
 
+  /**
+   * Guaranteed to throw an exception and leave the {@code RangeMap} unmodified.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated Unsupported operation.
+   */
+  @Deprecated
+  @Override
+  public void merge(
+      Range<K> range,
+      @Nullable V value,
+      BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+    throw new UnsupportedOperationException();
+  }
+
   @Override
   public ImmutableMap<Range<K>, V> asMapOfRanges() {
     if (ranges.isEmpty()) {
diff --git a/guava/src/com/google/common/collect/ImmutableRangeSet.java b/guava/src/com/google/common/collect/ImmutableRangeSet.java
index 70eb859..df063a8 100644
--- a/guava/src/com/google/common/collect/ImmutableRangeSet.java
+++ b/guava/src/com/google/common/collect/ImmutableRangeSet.java
@@ -35,7 +35,6 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.stream.Collector;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -541,7 +540,7 @@
       this.domain = domain;
     }
 
-    private transient @MonotonicNonNull Integer size;
+    private transient @Nullable Integer size;
 
     @Override
     public int size() {
diff --git a/guava/src/com/google/common/collect/ImmutableSet.java b/guava/src/com/google/common/collect/ImmutableSet.java
index cd55c8b..097b877 100644
--- a/guava/src/com/google/common/collect/ImmutableSet.java
+++ b/guava/src/com/google/common/collect/ImmutableSet.java
@@ -90,7 +90,7 @@
    * the first are ignored.
    */
   public static <E> ImmutableSet<E> of(E e1, E e2) {
-    return construct(2, e1, e2);
+    return construct(2, 2, e1, e2);
   }
 
   /**
@@ -99,7 +99,7 @@
    * the first are ignored.
    */
   public static <E> ImmutableSet<E> of(E e1, E e2, E e3) {
-    return construct(3, e1, e2, e3);
+    return construct(3, 3, e1, e2, e3);
   }
 
   /**
@@ -108,7 +108,7 @@
    * the first are ignored.
    */
   public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4) {
-    return construct(4, e1, e2, e3, e4);
+    return construct(4, 4, e1, e2, e3, e4);
   }
 
   /**
@@ -117,7 +117,7 @@
    * the first are ignored.
    */
   public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5) {
-    return construct(5, e1, e2, e3, e4, e5);
+    return construct(5, 5, e1, e2, e3, e4, e5);
   }
 
   /**
@@ -142,7 +142,32 @@
     elements[4] = e5;
     elements[5] = e6;
     System.arraycopy(others, 0, elements, paramCount, others.length);
-    return construct(elements.length, elements);
+    return construct(elements.length, elements.length, elements);
+  }
+
+  /**
+   * Constructs an {@code ImmutableSet} from the first {@code n} elements of the specified array,
+   * which we have no particular reason to believe does or does not contain duplicates. If {@code k}
+   * is the size of the returned {@code ImmutableSet}, then the unique elements of {@code elements}
+   * will be in the first {@code k} positions, and {@code elements[i] == null} for {@code k <= i <
+   * n}.
+   *
+   * <p>This may modify {@code elements}. Additionally, if {@code n == elements.length} and {@code
+   * elements} contains no duplicates, {@code elements} may be used without copying in the returned
+   * {@code ImmutableSet}, in which case the caller must not modify it.
+   *
+   * <p>{@code elements} may contain only values of type {@code E}.
+   *
+   * @throws NullPointerException if any of the first {@code n} elements of {@code elements} is null
+   */
+  private static <E> ImmutableSet<E> constructUnknownDuplication(int n, Object... elements) {
+    // Guess the size is "halfway between" all duplicates and no duplicates, on a log scale.
+    return construct(
+        n,
+        Math.max(
+            ImmutableCollection.Builder.DEFAULT_INITIAL_CAPACITY,
+            IntMath.sqrt(n, RoundingMode.CEILING)),
+        elements);
   }
 
   /**
@@ -159,7 +184,7 @@
    *
    * @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, int expectedSize, Object... elements) {
     switch (n) {
       case 0:
         return of();
@@ -168,8 +193,7 @@
         E elem = (E) elements[0];
         return of(elem);
       default:
-        SetBuilderImpl<E> builder =
-            new RegularSetBuilderImpl<E>(ImmutableCollection.Builder.DEFAULT_INITIAL_CAPACITY);
+        SetBuilderImpl<E> builder = new RegularSetBuilderImpl<E>(expectedSize);
         for (int i = 0; i < n; i++) {
           @SuppressWarnings("unchecked")
           E e = (E) checkNotNull(elements[i]);
@@ -207,7 +231,12 @@
       return copyOfEnumSet((EnumSet) elements);
     }
     Object[] array = elements.toArray();
-    return construct(array.length, array);
+    if (elements instanceof Set) {
+      // assume probably no duplicates (though it might be using different equality semantics)
+      return construct(array.length, array.length, array);
+    } else {
+      return constructUnknownDuplication(array.length, array);
+    }
   }
 
   /**
@@ -261,7 +290,7 @@
       case 1:
         return of(elements[0]);
       default:
-        return construct(elements.length, elements.clone());
+        return constructUnknownDuplication(elements.length, elements.clone());
     }
   }
 
@@ -491,7 +520,6 @@
       return this;
     }
 
-    @Override
     /**
      * Adds each element of {@code elements} to the {@code ImmutableSet}, ignoring duplicate
      * elements (only the first duplicate element is added).
@@ -500,6 +528,7 @@
      * @return this {@code Builder} object
      * @throws NullPointerException if {@code elements} is null or contains a null element
      */
+    @Override
     @CanIgnoreReturnValue
     public Builder<E> addAll(Iterable<? extends E> elements) {
       super.addAll(elements);
@@ -784,6 +813,8 @@
       int targetTableSize = chooseTableSize(distinct);
       if (targetTableSize * 2 < hashTable.length) {
         hashTable = rebuildHashTable(targetTableSize, dedupedElements, distinct);
+        maxRunBeforeFallback = maxRunBeforeFallback(targetTableSize);
+        expandTableThreshold = (int) (DESIRED_LOAD_FACTOR * targetTableSize);
       }
       return hashFloodingDetected(hashTable) ? new JdkBackedSetBuilderImpl<E>(this) : this;
     }
diff --git a/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/guava/src/com/google/common/collect/ImmutableSetMultimap.java
index 5abe680..9691ef5 100644
--- a/guava/src/com/google/common/collect/ImmutableSetMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableSetMultimap.java
@@ -40,7 +40,6 @@
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -61,8 +60,9 @@
    * whose keys and values are the result of applying the provided mapping functions to the input
    * elements.
    *
-   * <p>For streams with {@linkplain java.util.stream#Ordering defined encounter order}, that order
-   * is preserved, but entries are <a href="ImmutableMultimap.html#iteration">grouped by key</a>.
+   * <p>For streams with defined encounter order (as defined in the Ordering section of the {@link
+   * java.util.stream} Javadoc), that order is preserved, but entries are <a
+   * href="ImmutableMultimap.html#iteration">grouped by key</a>.
    *
    * <p>Example:
    *
@@ -461,7 +461,7 @@
     return MoreObjects.firstNonNull(set, emptySet);
   }
 
-  @LazyInit @MonotonicNonNull @RetainedWith private transient ImmutableSetMultimap<V, K> inverse;
+  @LazyInit @RetainedWith private transient @Nullable ImmutableSetMultimap<V, K> inverse;
 
   /**
    * {@inheritDoc}
@@ -512,7 +512,7 @@
     throw new UnsupportedOperationException();
   }
 
-  private transient @MonotonicNonNull ImmutableSet<Entry<K, V>> entries;
+  @LazyInit @RetainedWith private transient @Nullable ImmutableSet<Entry<K, V>> entries;
 
   /**
    * Returns an immutable collection of all key-value pairs in the multimap. Its iterator traverses
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMap.java b/guava/src/com/google/common/collect/ImmutableSortedMap.java
index 2cfba0d..dcda1f4 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMap.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMap.java
@@ -24,7 +24,6 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import com.google.j2objc.annotations.WeakOuter;
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -606,7 +605,6 @@
 
   @Override
   ImmutableSet<Entry<K, V>> createEntrySet() {
-    @WeakOuter
     class EntrySet extends ImmutableMapEntrySet<K, V> {
       @Override
       public UnmodifiableIterator<Entry<K, V>> iterator() {
@@ -918,19 +916,17 @@
    * are reconstructed using public factory methods. This ensures that the implementation types
    * remain as implementation details.
    */
-  private static class SerializedForm extends ImmutableMap.SerializedForm {
-    private final Comparator<Object> comparator;
+  private static class SerializedForm<K, V> extends ImmutableMap.SerializedForm<K, V> {
+    private final Comparator<? super K> comparator;
 
-    @SuppressWarnings("unchecked")
-    SerializedForm(ImmutableSortedMap<?, ?> sortedMap) {
+    SerializedForm(ImmutableSortedMap<K, V> sortedMap) {
       super(sortedMap);
-      comparator = (Comparator<Object>) sortedMap.comparator();
+      comparator = sortedMap.comparator();
     }
 
     @Override
-    Object readResolve() {
-      Builder<Object, Object> builder = new Builder<>(comparator);
-      return createMap(builder);
+    Builder<K, V> makeBuilder(int size) {
+      return new Builder<>(comparator);
     }
 
     private static final long serialVersionUID = 0;
@@ -938,7 +934,7 @@
 
   @Override
   Object writeReplace() {
-    return new SerializedForm(this);
+    return new SerializedForm<>(this);
   }
 
   // This class is never actually serialized directly, but we have to make the
diff --git a/guava/src/com/google/common/collect/ImmutableSortedSet.java b/guava/src/com/google/common/collect/ImmutableSortedSet.java
index c025c5f..9a3409c 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedSet.java
@@ -618,7 +618,6 @@
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public ImmutableSortedSet<E> headSet(E toElement, boolean inclusive) {
     return headSetImpl(checkNotNull(toElement), inclusive);
@@ -668,7 +667,6 @@
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public ImmutableSortedSet<E> tailSet(E fromElement, boolean inclusive) {
     return tailSetImpl(checkNotNull(fromElement), inclusive);
@@ -693,14 +691,12 @@
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public E floor(E e) {
     return Iterators.getNext(headSet(e, true).descendingIterator(), null);
   }
 
   /** @since 12.0 */
-  @GwtIncompatible // NavigableSet
   @Override
   public E ceiling(E e) {
     return Iterables.getFirst(tailSet(e, true), null);
diff --git a/guava/src/com/google/common/collect/ImmutableTable.java b/guava/src/com/google/common/collect/ImmutableTable.java
index 04acb8b..bdaddc3 100644
--- a/guava/src/com/google/common/collect/ImmutableTable.java
+++ b/guava/src/com/google/common/collect/ImmutableTable.java
@@ -22,6 +22,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.Tables.AbstractCell;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -31,8 +32,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 org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -67,11 +68,11 @@
     checkNotNull(columnFunction, "columnFunction");
     checkNotNull(valueFunction, "valueFunction");
     return Collector.of(
-        () -> new ImmutableTable.Builder<R, C, V>(),
+        (Supplier<Builder<R, C, V>>) Builder::new,
         (builder, t) ->
             builder.put(rowFunction.apply(t), columnFunction.apply(t), valueFunction.apply(t)),
-        (b1, b2) -> b1.combine(b2),
-        b -> b.build());
+        Builder::combine,
+        Builder::build);
   }
 
   /**
@@ -263,10 +264,11 @@
    *
    * @since 11.0
    */
+  @DoNotMock
   public static final class Builder<R, C, V> {
     private final List<Cell<R, C, V>> cells = Lists.newArrayList();
-    @MonotonicNonNull private Comparator<? super R> rowComparator;
-    @MonotonicNonNull private Comparator<? super C> columnComparator;
+    private @Nullable Comparator<? super R> rowComparator;
+    private @Nullable Comparator<? super C> columnComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
diff --git a/guava/src/com/google/common/collect/Interner.java b/guava/src/com/google/common/collect/Interner.java
index 0a06bfc..310bfca 100644
--- a/guava/src/com/google/common/collect/Interner.java
+++ b/guava/src/com/google/common/collect/Interner.java
@@ -19,15 +19,21 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
- * Provides equivalent behavior to {@link String#intern} for other immutable types. Common
- * implementations are available from the {@link Interners} class.
+ * Provides similar behavior to {@link String#intern} for any immutable type. Common implementations
+ * are available from the {@link Interners} class.
+ *
+ * <p>Note that {@code String.intern()} has some well-known performance limitations, and should
+ * generally be avoided. Prefer {@link Interners#newWeakInterner} or another {@code Interner}
+ * implementation even for {@code String} interning.
  *
  * @author Kevin Bourrillion
  * @since 3.0
  */
 @Beta
+@DoNotMock("Use Interners.new*Interner")
 @GwtIncompatible
 public interface Interner<E> {
   /**
diff --git a/guava/src/com/google/common/collect/Iterables.java b/guava/src/com/google/common/collect/Iterables.java
index 5313b49..4aa02e1 100644
--- a/guava/src/com/google/common/collect/Iterables.java
+++ b/guava/src/com/google/common/collect/Iterables.java
@@ -314,7 +314,7 @@
   @CanIgnoreReturnValue
   public static <T> boolean addAll(Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
     if (elementsToAdd instanceof Collection) {
-      Collection<? extends T> c = Collections2.cast(elementsToAdd);
+      Collection<? extends T> c = (Collection<? extends T>) elementsToAdd;
       return addTo.addAll(c);
     }
     return Iterators.addAll(addTo, checkNotNull(elementsToAdd).iterator());
@@ -814,7 +814,7 @@
    */
   public static <T> @Nullable T getLast(Iterable<? extends T> iterable, @Nullable T defaultValue) {
     if (iterable instanceof Collection) {
-      Collection<? extends T> c = Collections2.cast(iterable);
+      Collection<? extends T> c = (Collection<? extends T>) iterable;
       if (c.isEmpty()) {
         return defaultValue;
       } else if (iterable instanceof List) {
diff --git a/guava/src/com/google/common/collect/Iterators.java b/guava/src/com/google/common/collect/Iterators.java
index d300ceb..f655c27 100644
--- a/guava/src/com/google/common/collect/Iterators.java
+++ b/guava/src/com/google/common/collect/Iterators.java
@@ -1071,6 +1071,9 @@
    * <p>This method has no equivalent in {@link Iterables} because viewing an {@code Enumeration} as
    * an {@code Iterable} is impossible. However, the contents can be <i>copied</i> into a collection
    * using {@link Collections#list}.
+   *
+   * <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) {
     checkNotNull(enumeration);
diff --git a/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java b/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java
index d3c7898..bb4a2e4 100644
--- a/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java
+++ b/guava/src/com/google/common/collect/LinkedHashMultimapGwtSerializationDependencies.java
@@ -24,7 +24,7 @@
  * A dummy superclass to support GWT serialization of the element types of a {@link
  * LinkedHashMultimap}. The GWT supersource for this class contains a field for each type.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/guava/src/com/google/common/collect/Lists.java b/guava/src/com/google/common/collect/Lists.java
index b0b3710..3882493 100644
--- a/guava/src/com/google/common/collect/Lists.java
+++ b/guava/src/com/google/common/collect/Lists.java
@@ -126,7 +126,7 @@
     checkNotNull(elements); // for GWT
     // Let ArrayList's sizing logic work, if possible
     return (elements instanceof Collection)
-        ? new ArrayList<>(Collections2.cast(elements))
+        ? new ArrayList<>((Collection<? extends E>) elements)
         : newArrayList(elements.iterator());
   }
 
@@ -265,7 +265,9 @@
     // We copy elements to an ArrayList first, rather than incurring the
     // quadratic cost of adding them to the COWAL directly.
     Collection<? extends E> elementsCollection =
-        (elements instanceof Collection) ? Collections2.cast(elements) : newArrayList(elements);
+        (elements instanceof Collection)
+            ? (Collection<? extends E>) elements
+            : newArrayList(elements);
     return new CopyOnWriteArrayList<>(elementsCollection);
   }
 
diff --git a/guava/src/com/google/common/collect/MapDifference.java b/guava/src/com/google/common/collect/MapDifference.java
index 760473f..066aebf 100644
--- a/guava/src/com/google/common/collect/MapDifference.java
+++ b/guava/src/com/google/common/collect/MapDifference.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -26,6 +27,7 @@
  * @author Kevin Bourrillion
  * @since 2.0
  */
+@DoNotMock("Use Maps.difference")
 @GwtCompatible
 public interface MapDifference<K, V> {
   /**
@@ -84,6 +86,7 @@
    *
    * @since 2.0
    */
+  @DoNotMock("Use Maps.difference")
   interface ValueDifference<V> {
     /** Returns the value from the left map (possibly null). */
     V leftValue();
diff --git a/guava/src/com/google/common/collect/MapMaker.java b/guava/src/com/google/common/collect/MapMaker.java
index 75fe7cc..1cbe4a4 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.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A builder of {@link ConcurrentMap} instances that can have keys or values automatically wrapped
@@ -66,10 +66,10 @@
  * present in the map to be reclaimed by the garbage collector. Entries with reclaimed keys or
  * values may be removed from the map on each map modification or on occasional map accesses; such
  * entries may be counted by {@link Map#size}, but will never be visible to read or write
- * operations. A partially-reclaimed entry is never exposed to the user. Any {@link java.util.Entry}
+ * operations. A partially-reclaimed entry is never exposed to the user. Any {@link Map.Entry}
  * instance retrieved from the map's {@linkplain Map#entrySet entry set} is a snapshot of that
  * entry's state at the time of retrieval; such entries do, however, support {@link
- * java.util.Entry#setValue}, which simply calls {@link Map#put} on the entry's key.
+ * Map.Entry#setValue}, which simply calls {@link Map#put} on the entry's key.
  *
  * <p>The maps produced by {@code MapMaker} are serializable, and the deserialized maps retain all
  * the configuration properties of the original map. During deserialization, if the original map had
@@ -98,10 +98,10 @@
   int initialCapacity = UNSET_INT;
   int concurrencyLevel = UNSET_INT;
 
-  @MonotonicNonNull Strength keyStrength;
-  @MonotonicNonNull Strength valueStrength;
+  @Nullable Strength keyStrength;
+  @Nullable Strength valueStrength;
 
-  @MonotonicNonNull Equivalence<Object> keyEquivalence;
+  @Nullable 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 1d1e429..b647f76 100644
--- a/guava/src/com/google/common/collect/MapMakerInternalMap.java
+++ b/guava/src/com/google/common/collect/MapMakerInternalMap.java
@@ -47,7 +47,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReferenceArray;
 import java.util.concurrent.locks.ReentrantLock;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -64,7 +63,7 @@
  * @author Charles Fry
  * @author Doug Lea ({@code ConcurrentHashMap})
  */
-// TODO(kak/cpovirk): Consider removing @CanIgnoreReturnValue from this class.
+// TODO(kak): Consider removing @CanIgnoreReturnValue from this class.
 @GwtIncompatible
 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
 class MapMakerInternalMap<
@@ -1119,11 +1118,7 @@
     if (entry.getKey() == null) {
       return null;
     }
-    V value = entry.getValue();
-    if (value == null) {
-      return null;
-    }
-    return value;
+    return entry.getValue();
   }
 
   @SuppressWarnings("unchecked")
@@ -1193,7 +1188,7 @@
     int threshold;
 
     /** The per-segment table. */
-    @MonotonicNonNull volatile AtomicReferenceArray<E> table;
+    volatile @Nullable AtomicReferenceArray<E> table;
 
     /** The maximum size of this map. MapMaker.UNSET_INT if there is no maximum. */
     final int maxSegmentSize;
@@ -2319,9 +2314,7 @@
         }
         sum -= segments[i].modCount;
       }
-      if (sum != 0L) {
-        return false;
-      }
+      return sum == 0L;
     }
     return true;
   }
@@ -2477,7 +2470,7 @@
     }
   }
 
-  @MonotonicNonNull transient Set<K> keySet;
+  transient @Nullable Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -2485,7 +2478,7 @@
     return (ks != null) ? ks : (keySet = new KeySet());
   }
 
-  @MonotonicNonNull transient Collection<V> values;
+  transient @Nullable Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -2493,7 +2486,7 @@
     return (vs != null) ? vs : (values = new Values());
   }
 
-  @MonotonicNonNull transient Set<Entry<K, V>> entrySet;
+  transient @Nullable Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -2507,8 +2500,8 @@
 
     int nextSegmentIndex;
     int nextTableIndex;
-    @MonotonicNonNull Segment<K, V, E, S> currentSegment;
-    @MonotonicNonNull AtomicReferenceArray<E> currentTable;
+    @Nullable Segment<K, V, E, S> currentSegment;
+    @Nullable AtomicReferenceArray<E> currentTable;
     @Nullable E nextEntry;
     @Nullable WriteThroughEntry nextExternal;
     @Nullable WriteThroughEntry lastReturned;
diff --git a/guava/src/com/google/common/collect/Maps.java b/guava/src/com/google/common/collect/Maps.java
index 38fd601..3dad657 100644
--- a/guava/src/com/google/common/collect/Maps.java
+++ b/guava/src/com/google/common/collect/Maps.java
@@ -68,7 +68,6 @@
 import java.util.function.BinaryOperator;
 import java.util.function.Consumer;
 import java.util.stream.Collector;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -1594,8 +1593,8 @@
       implements BiMap<K, V>, Serializable {
     final Map<K, V> unmodifiableMap;
     final BiMap<? extends K, ? extends V> delegate;
-    @MonotonicNonNull @RetainedWith BiMap<V, K> inverse;
-    @MonotonicNonNull transient Set<V> values;
+    @RetainedWith @Nullable BiMap<V, K> inverse;
+    transient @Nullable Set<V> values;
 
     UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, @Nullable BiMap<V, K> inverse) {
       unmodifiableMap = Collections.unmodifiableMap(delegate);
@@ -3268,7 +3267,7 @@
     checkNotNull(map);
     if (map instanceof UnmodifiableNavigableMap) {
       @SuppressWarnings("unchecked") // covariant
-      NavigableMap<K, V> result = (NavigableMap) map;
+      NavigableMap<K, V> result = (NavigableMap<K, V>) map;
       return result;
     } else {
       return new UnmodifiableNavigableMap<>(map);
@@ -3360,7 +3359,7 @@
       throw new UnsupportedOperationException();
     }
 
-    private transient @MonotonicNonNull UnmodifiableNavigableMap<K, V> descendingMap;
+    private transient @Nullable UnmodifiableNavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -3485,7 +3484,7 @@
      */
     abstract Set<Entry<K, V>> createEntrySet();
 
-    private transient @MonotonicNonNull Set<Entry<K, V>> entrySet;
+    private transient @Nullable Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -3493,7 +3492,7 @@
       return (result == null) ? entrySet = createEntrySet() : result;
     }
 
-    private transient @MonotonicNonNull Set<K> keySet;
+    private transient @Nullable Set<K> keySet;
 
     @Override
     public Set<K> keySet() {
@@ -3505,7 +3504,7 @@
       return new KeySet<>(this);
     }
 
-    private transient @MonotonicNonNull Collection<V> values;
+    private transient @Nullable Collection<V> values;
 
     @Override
     public Collection<V> values() {
@@ -4033,7 +4032,7 @@
       return forward();
     }
 
-    private transient @MonotonicNonNull Comparator<? super K> comparator;
+    private transient @Nullable Comparator<? super K> comparator;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -4129,7 +4128,7 @@
       return forward();
     }
 
-    private transient @MonotonicNonNull Set<Entry<K, V>> entrySet;
+    private transient @Nullable Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -4160,7 +4159,7 @@
       return navigableKeySet();
     }
 
-    private transient @MonotonicNonNull NavigableSet<K> navigableKeySet;
+    private transient @Nullable NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
diff --git a/guava/src/com/google/common/collect/MinMaxPriorityQueue.java b/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
index bc1ccf1..32cebef 100644
--- a/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
+++ b/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
@@ -41,7 +41,6 @@
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -505,7 +504,7 @@
   @WeakOuter
   private class Heap {
     final Ordering<E> ordering;
-    @MonotonicNonNull @Weak Heap otherHeap;
+    @Weak @Nullable Heap otherHeap;
 
     Heap(Ordering<E> ordering) {
       this.ordering = ordering;
@@ -752,8 +751,8 @@
     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.
-    @MonotonicNonNull private Queue<E> forgetMeNot;
-    @MonotonicNonNull private List<E> skipMe;
+    private @Nullable Queue<E> forgetMeNot;
+    private @Nullable List<E> skipMe;
     private @Nullable E lastFromForgetMeNot;
     private boolean canRemove;
 
diff --git a/guava/src/com/google/common/collect/Multimap.java b/guava/src/com/google/common/collect/Multimap.java
index 13256ba..ec2b9ef 100644
--- a/guava/src/com/google/common/collect/Multimap.java
+++ b/guava/src/com/google/common/collect/Multimap.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.CompatibleWith;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -158,6 +159,7 @@
  * @author Jared Levy
  * @since 2.0
  */
+@DoNotMock("Use ImmutableMultimap, HashMultimap, or another implementation")
 @GwtCompatible
 public interface Multimap<K, V> {
   // Query Operations
diff --git a/guava/src/com/google/common/collect/Multimaps.java b/guava/src/com/google/common/collect/Multimaps.java
index 6253496..f97191d 100644
--- a/guava/src/com/google/common/collect/Multimaps.java
+++ b/guava/src/com/google/common/collect/Multimaps.java
@@ -49,10 +49,10 @@
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.Spliterator;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -104,7 +104,6 @@
    *
    * @since 21.0
    */
-  @Beta
   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,
@@ -647,11 +646,11 @@
   private static class UnmodifiableMultimap<K, V> extends ForwardingMultimap<K, V>
       implements Serializable {
     final Multimap<K, V> delegate;
-    @MonotonicNonNull transient Collection<Entry<K, V>> entries;
-    @MonotonicNonNull transient Multiset<K> keys;
-    @MonotonicNonNull transient Set<K> keySet;
-    @MonotonicNonNull transient Collection<V> values;
-    @MonotonicNonNull transient Map<K, Collection<V>> map;
+    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;
 
     UnmodifiableMultimap(final Multimap<K, V> delegate) {
       this.delegate = checkNotNull(delegate);
@@ -696,6 +695,11 @@
     }
 
     @Override
+    public void forEach(BiConsumer<? super K, ? super V> consumer) {
+      delegate.forEach(checkNotNull(consumer));
+    }
+
+    @Override
     public Collection<V> get(K key) {
       return unmodifiableValueCollection(delegate.get(key));
     }
diff --git a/guava/src/com/google/common/collect/Multisets.java b/guava/src/com/google/common/collect/Multisets.java
index 73129ec..36d146e 100644
--- a/guava/src/com/google/common/collect/Multisets.java
+++ b/guava/src/com/google/common/collect/Multisets.java
@@ -40,7 +40,6 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.stream.Collector;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -133,7 +132,7 @@
       return (Multiset<E>) delegate;
     }
 
-    @MonotonicNonNull transient Set<E> elementSet;
+    transient @Nullable Set<E> elementSet;
 
     Set<E> createElementSet() {
       return Collections.<E>unmodifiableSet(delegate.elementSet());
@@ -145,7 +144,7 @@
       return (es == null) ? elementSet = createElementSet() : es;
     }
 
-    @MonotonicNonNull transient Set<Multiset.Entry<E>> entrySet;
+    transient @Nullable Set<Multiset.Entry<E>> entrySet;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -1035,7 +1034,7 @@
         if (entryCount != 0) {
           // Safe as long as we never add a new entry, which we won't.
           @SuppressWarnings("unchecked")
-          Multiset<Object> multiset = (Multiset) multiset();
+          Multiset<Object> multiset = (Multiset<Object>) multiset();
           return multiset.setCount(element, entryCount, 0);
         }
       }
@@ -1056,7 +1055,7 @@
   static final class MultisetIteratorImpl<E> implements Iterator<E> {
     private final Multiset<E> multiset;
     private final Iterator<Entry<E>> entryIterator;
-    @MonotonicNonNull private Entry<E> currentEntry;
+    private @Nullable Entry<E> currentEntry;
 
     /** Count of subsequent elements equal to current element */
     private int laterCount;
diff --git a/guava/src/com/google/common/collect/NaturalOrdering.java b/guava/src/com/google/common/collect/NaturalOrdering.java
index b80f5d6..c4b98e3 100644
--- a/guava/src/com/google/common/collect/NaturalOrdering.java
+++ b/guava/src/com/google/common/collect/NaturalOrdering.java
@@ -20,7 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that uses the natural order of the values. */
 @GwtCompatible(serializable = true)
@@ -28,8 +28,8 @@
 final class NaturalOrdering extends Ordering<Comparable> implements Serializable {
   static final NaturalOrdering INSTANCE = new NaturalOrdering();
 
-  private transient @MonotonicNonNull Ordering<Comparable> nullsFirst;
-  private transient @MonotonicNonNull Ordering<Comparable> nullsLast;
+  private transient @Nullable Ordering<Comparable> nullsFirst;
+  private transient @Nullable Ordering<Comparable> nullsLast;
 
   @Override
   public int compare(Comparable left, Comparable right) {
diff --git a/guava/src/com/google/common/collect/Ordering.java b/guava/src/com/google/common/collect/Ordering.java
index adb49e3..aa51fb6 100644
--- a/guava/src/com/google/common/collect/Ordering.java
+++ b/guava/src/com/google/common/collect/Ordering.java
@@ -28,11 +28,14 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -534,9 +537,8 @@
    * least values, the first of those is returned. The iterator will be left exhausted: its {@code
    * hasNext()} method will return {@code false}.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).min(thisComparator).get()} instead (but note that it does
-   * not guarantee which tied minimum element is returned).
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).min(thisComparator).get()} instead
+   * (but note that it does not guarantee which tied minimum element is returned).
    *
    * @param iterator the iterator whose minimum element is to be determined
    * @throws NoSuchElementException if {@code iterator} is empty
@@ -560,8 +562,7 @@
    * least values, the first of those is returned.
    *
    * <p><b>Java 8 users:</b> If {@code iterable} is a {@link Collection}, use {@code
-   * Collections.min(collection, thisComparator)} instead. Otherwise, continue to use this method
-   * for now. After the next release of Guava, use {@code
+   * Collections.min(collection, thisComparator)} instead. Otherwise, use {@code
    * Streams.stream(iterable).min(thisComparator).get()} instead. Note that these alternatives do
    * not guarantee which tied minimum element is returned)
    *
@@ -581,8 +582,8 @@
    * <p><b>Implementation note:</b> this method is invoked by the default implementations of the
    * other {@code min} overloads, so overriding it will affect their behavior.
    *
-   * <p><b>Java 8 users:</b> Use {@code Collections.min(Arrays.asList(a, b), thisComparator)}
-   * instead (but note that it does not guarantee which tied minimum element is returned).
+   * <p><b>Note:</b> Consider using {@code Comparators.min(a, b, thisComparator)} instead. If {@code
+   * thisComparator} is {@link Ordering#natural}, then use {@code Comparators.min(a, b)}.
    *
    * @param a value to compare, returned if less than or equal to b.
    * @param b value to compare.
@@ -622,9 +623,8 @@
    * greatest values, the first of those is returned. The iterator will be left exhausted: its
    * {@code hasNext()} method will return {@code false}.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).max(thisComparator).get()} instead (but note that it does
-   * not guarantee which tied maximum element is returned).
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).max(thisComparator).get()} instead
+   * (but note that it does not guarantee which tied maximum element is returned).
    *
    * @param iterator the iterator whose maximum element is to be determined
    * @throws NoSuchElementException if {@code iterator} is empty
@@ -648,8 +648,7 @@
    * greatest values, the first of those is returned.
    *
    * <p><b>Java 8 users:</b> If {@code iterable} is a {@link Collection}, use {@code
-   * Collections.max(collection, thisComparator)} instead. Otherwise, continue to use this method
-   * for now. After the next release of Guava, use {@code
+   * Collections.max(collection, thisComparator)} instead. Otherwise, use {@code
    * Streams.stream(iterable).max(thisComparator).get()} instead. Note that these alternatives do
    * not guarantee which tied maximum element is returned)
    *
@@ -669,8 +668,8 @@
    * <p><b>Implementation note:</b> this method is invoked by the default implementations of the
    * other {@code max} overloads, so overriding it will affect their behavior.
    *
-   * <p><b>Java 8 users:</b> Use {@code Collections.max(Arrays.asList(a, b), thisComparator)}
-   * instead (but note that it does not guarantee which tied maximum element is returned).
+   * <p><b>Note:</b> Consider using {@code Comparators.max(a, b, thisComparator)} instead. If {@code
+   * thisComparator} is {@link Ordering#natural}, then use {@code Comparators.max(a, b)}.
    *
    * @param a value to compare, returned if greater than or equal to b.
    * @param b value to compare.
@@ -749,8 +748,8 @@
    * <p>The implementation does not necessarily use a <i>stable</i> sorting algorithm; when multiple
    * elements are equivalent, it is undefined which will come first.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).collect(Comparators.least(k, thisComparator))} instead.
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).collect(Comparators.least(k,
+   * thisComparator))} instead.
    *
    * @return an immutable {@code RandomAccess} list of the {@code k} least elements in ascending
    *     order
@@ -809,8 +808,8 @@
    * <p>The implementation does not necessarily use a <i>stable</i> sorting algorithm; when multiple
    * elements are equivalent, it is undefined which will come first.
    *
-   * <p><b>Java 8 users:</b> Continue to use this method for now. After the next release of Guava,
-   * use {@code Streams.stream(iterator).collect(Comparators.greatest(k, thisComparator))} instead.
+   * <p><b>Java 8 users:</b> Use {@code Streams.stream(iterator).collect(Comparators.greatest(k,
+   * thisComparator))} instead.
    *
    * @return an immutable {@code RandomAccess} list of the {@code k} greatest elements in
    *     <i>descending order</i>
diff --git a/guava/src/com/google/common/collect/PeekingIterator.java b/guava/src/com/google/common/collect/PeekingIterator.java
index bcb84a0..5a6c60b 100644
--- a/guava/src/com/google/common/collect/PeekingIterator.java
+++ b/guava/src/com/google/common/collect/PeekingIterator.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
@@ -31,6 +32,7 @@
  * @author Mick Killianey
  * @since 2.0
  */
+@DoNotMock("Use Iterators.peekingIterator")
 @GwtCompatible
 public interface PeekingIterator<E> extends Iterator<E> {
   /**
diff --git a/guava/src/com/google/common/collect/Platform.java b/guava/src/com/google/common/collect/Platform.java
index ce5c53b..d4afd32 100644
--- a/guava/src/com/google/common/collect/Platform.java
+++ b/guava/src/com/google/common/collect/Platform.java
@@ -29,6 +29,9 @@
  */
 @GwtCompatible(emulated = true)
 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) {
     return Maps.newHashMapWithExpectedSize(expectedSize);
@@ -109,5 +112,27 @@
     return exponent;
   }
 
+  static void checkGwtRpcEnabled() {
+    String propertyName = "guava.gwt.emergency_reenable_rpc";
+
+    if (!Boolean.parseBoolean(System.getProperty(propertyName, "false"))) {
+      throw new UnsupportedOperationException(
+          com.google.common.base.Strings.lenientFormat(
+              "We are removing GWT-RPC support for Guava types. You can temporarily reenable"
+                  + " support by setting the system property %s to true. For more about system"
+                  + " properties, see %s. For more about Guava's GWT-RPC support, see %s.",
+              propertyName,
+              "https://stackoverflow.com/q/5189914/28465",
+              "https://groups.google.com/d/msg/guava-announce/zHZTFg7YF3o/rQNnwdHeEwAJ"));
+    }
+    logger.log(
+        java.util.logging.Level.WARNING,
+        "Later in 2020, we will remove GWT-RPC support for Guava types. You are seeing this"
+            + " 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 1059fe6..8a69326 100644
--- a/guava/src/com/google/common/collect/Queues.java
+++ b/guava/src/com/google/common/collect/Queues.java
@@ -74,7 +74,7 @@
    */
   public static <E> ArrayDeque<E> newArrayDeque(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new ArrayDeque<E>(Collections2.cast(elements));
+      return new ArrayDeque<E>((Collection<? extends E>) elements);
     }
     ArrayDeque<E> deque = new ArrayDeque<E>();
     Iterables.addAll(deque, elements);
@@ -97,7 +97,7 @@
   public static <E> ConcurrentLinkedQueue<E> newConcurrentLinkedQueue(
       Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new ConcurrentLinkedQueue<E>(Collections2.cast(elements));
+      return new ConcurrentLinkedQueue<E>((Collection<? extends E>) elements);
     }
     ConcurrentLinkedQueue<E> queue = new ConcurrentLinkedQueue<E>();
     Iterables.addAll(queue, elements);
@@ -137,7 +137,7 @@
   @GwtIncompatible // LinkedBlockingDeque
   public static <E> LinkedBlockingDeque<E> newLinkedBlockingDeque(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new LinkedBlockingDeque<E>(Collections2.cast(elements));
+      return new LinkedBlockingDeque<E>((Collection<? extends E>) elements);
     }
     LinkedBlockingDeque<E> deque = new LinkedBlockingDeque<E>();
     Iterables.addAll(deque, elements);
@@ -173,7 +173,7 @@
   @GwtIncompatible // LinkedBlockingQueue
   public static <E> LinkedBlockingQueue<E> newLinkedBlockingQueue(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new LinkedBlockingQueue<E>(Collections2.cast(elements));
+      return new LinkedBlockingQueue<E>((Collection<? extends E>) elements);
     }
     LinkedBlockingQueue<E> queue = new LinkedBlockingQueue<E>();
     Iterables.addAll(queue, elements);
@@ -207,7 +207,7 @@
   public static <E extends Comparable> PriorityBlockingQueue<E> newPriorityBlockingQueue(
       Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new PriorityBlockingQueue<E>(Collections2.cast(elements));
+      return new PriorityBlockingQueue<E>((Collection<? extends E>) elements);
     }
     PriorityBlockingQueue<E> queue = new PriorityBlockingQueue<E>();
     Iterables.addAll(queue, elements);
@@ -237,7 +237,7 @@
   public static <E extends Comparable> PriorityQueue<E> newPriorityQueue(
       Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new PriorityQueue<E>(Collections2.cast(elements));
+      return new PriorityQueue<E>((Collection<? extends E>) elements);
     }
     PriorityQueue<E> queue = new PriorityQueue<E>();
     Iterables.addAll(queue, elements);
@@ -259,6 +259,28 @@
    * @param q the blocking queue to be drained
    * @param buffer where to add the transferred elements
    * @param numElements the number of elements to be waited for
+   * @param timeout how long to wait before giving up
+   * @return the number of elements transferred
+   * @throws InterruptedException if interrupted while waiting
+   * @since 28.0
+   */
+  @Beta
+  @CanIgnoreReturnValue
+  @GwtIncompatible // BlockingQueue
+  public static <E> int drain(
+      BlockingQueue<E> q, Collection<? super E> buffer, int numElements, java.time.Duration timeout)
+      throws InterruptedException {
+    // TODO(b/126049426): Consider using saturateToNanos(timeout) instead.
+    return drain(q, buffer, numElements, timeout.toNanos(), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Drains the queue as {@link BlockingQueue#drainTo(Collection, int)}, but if the requested {@code
+   * numElements} elements are not available, it will wait for them up to the specified timeout.
+   *
+   * @param q the blocking queue to be drained
+   * @param buffer where to add the transferred elements
+   * @param numElements the number of elements to be waited for
    * @param timeout how long to wait before giving up, in units of {@code unit}
    * @param unit a {@code TimeUnit} determining how to interpret the timeout parameter
    * @return the number of elements transferred
@@ -300,6 +322,31 @@
   }
 
   /**
+   * Drains the queue as {@linkplain #drain(BlockingQueue, Collection, int, Duration)}, but with a
+   * different behavior in case it is interrupted while waiting. In that case, the operation will
+   * continue as usual, and in the end the thread's interruption status will be set (no {@code
+   * InterruptedException} is thrown).
+   *
+   * @param q the blocking queue to be drained
+   * @param buffer where to add the transferred elements
+   * @param numElements the number of elements to be waited for
+   * @param timeout how long to wait before giving up
+   * @return the number of elements transferred
+   * @since 28.0
+   */
+  @Beta
+  @CanIgnoreReturnValue
+  @GwtIncompatible // BlockingQueue
+  public static <E> int drainUninterruptibly(
+      BlockingQueue<E> q,
+      Collection<? super E> buffer,
+      int numElements,
+      java.time.Duration timeout) {
+    // TODO(b/126049426): Consider using saturateToNanos(timeout) instead.
+    return drainUninterruptibly(q, buffer, numElements, timeout.toNanos(), TimeUnit.NANOSECONDS);
+  }
+
+  /**
    * Drains the queue as {@linkplain #drain(BlockingQueue, Collection, int, long, TimeUnit)}, but
    * with a different behavior in case it is interrupted while waiting. In that case, the operation
    * will continue as usual, and in the end the thread's interruption status will be set (no {@code
diff --git a/guava/src/com/google/common/collect/Range.java b/guava/src/com/google/common/collect/Range.java
index a6bae20..1c6002e 100644
--- a/guava/src/com/google/common/collect/Range.java
+++ b/guava/src/com/google/common/collect/Range.java
@@ -91,6 +91,7 @@
  * <h3>Other notes</h3>
  *
  * <ul>
+ *   <li>All ranges are shallow-immutable.
  *   <li>Instances of this type are obtained using the static factory methods in this class.
  *   <li>Ranges are <i>convex</i>: whenever two values are contained, all values in between them
  *       must also be contained. More formally, for any {@code c1 <= c2 <= c3} of type {@code C},
@@ -576,6 +577,22 @@
    * @since 27.0
    */
   public Range<C> gap(Range<C> otherRange) {
+    /*
+     * For an explanation of the basic principle behind this check, see
+     * https://stackoverflow.com/a/35754308/28465
+     *
+     * In that explanation's notation, our `overlap` check would be `x1 < y2 && y1 < x2`. We've
+     * flipped one part of the check so that we're using "less than" in both cases (rather than a
+     * mix of "less than" and "greater than"). We've also switched to "strictly less than" rather
+     * than "less than or equal to" because of *handwave* the difference between "endpoints of
+     * inclusive ranges" and "Cuts."
+     */
+    if (lowerBound.compareTo(otherRange.upperBound) < 0
+        && otherRange.lowerBound.compareTo(upperBound) < 0) {
+      throw new IllegalArgumentException(
+          "Ranges have a nonempty intersection: " + this + ", " + otherRange);
+    }
+
     boolean isThisFirst = this.lowerBound.compareTo(otherRange.lowerBound) < 0;
     Range<C> firstRange = isThisFirst ? this : otherRange;
     Range<C> secondRange = isThisFirst ? otherRange : this;
diff --git a/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java b/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java
index 21bf769..222c128 100644
--- a/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java
+++ b/guava/src/com/google/common/collect/RangeGwtSerializationDependencies.java
@@ -23,7 +23,7 @@
  * A dummy superclass to support GWT serialization of the element type of a {@link Range}. The GWT
  * supersource for this class contains a field of type {@code C}.
  *
- * <p>For details about this hack, see {@link GwtSerializationDependencies}, which takes the same
+ * <p>For details about this hack, see {@code GwtSerializationDependencies}, which takes the same
  * approach but with a subclass rather than a superclass.
  *
  * <p>TODO(cpovirk): Consider applying this subclass approach to our other types.
diff --git a/guava/src/com/google/common/collect/RangeMap.java b/guava/src/com/google/common/collect/RangeMap.java
index 13ec7f0..0b319bd 100644
--- a/guava/src/com/google/common/collect/RangeMap.java
+++ b/guava/src/com/google/common/collect/RangeMap.java
@@ -18,10 +18,12 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
+import java.util.function.BiFunction;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -35,6 +37,7 @@
  * @since 14.0
  */
 @Beta
+@DoNotMock("Use ImmutableRangeMap or TreeRangeMap")
 @GwtIncompatible
 public interface RangeMap<K extends Comparable, V> {
   /**
@@ -108,6 +111,27 @@
   void remove(Range<K> range);
 
   /**
+   * Merges a value into the map over a range 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>Any existing map entry spanning either range boundary may be split at the boundary, even if
+   * the merge does not affect its value.
+   *
+   * <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}.
+   *
+   * @since 28.1
+   */
+  void merge(
+      Range<K> range,
+      @Nullable V value,
+      BiFunction<? super V, ? super V, ? extends V> remappingFunction);
+
+  /**
    * Returns a view of this range map as an unmodifiable {@code Map<Range<K>, V>}. Modifications to
    * this range map are guaranteed to read through to the returned {@code Map}.
    *
diff --git a/guava/src/com/google/common/collect/RangeSet.java b/guava/src/com/google/common/collect/RangeSet.java
index dce3bd8..4805108 100644
--- a/guava/src/com/google/common/collect/RangeSet.java
+++ b/guava/src/com/google/common/collect/RangeSet.java
@@ -15,6 +15,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import com.google.common.annotations.GwtIncompatible;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -49,6 +50,7 @@
  * @since 14.0
  */
 @Beta
+@DoNotMock("Use ImmutableRangeSet or TreeRangeSet")
 @GwtIncompatible
 public interface RangeSet<C extends Comparable> {
   // TODO(lowasser): consider adding default implementations of some of these methods
diff --git a/guava/src/com/google/common/collect/RegularImmutableBiMap.java b/guava/src/com/google/common/collect/RegularImmutableBiMap.java
index e040884..f5b8988 100644
--- a/guava/src/com/google/common/collect/RegularImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/RegularImmutableBiMap.java
@@ -28,7 +28,6 @@
 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 java.io.Serializable;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
@@ -234,7 +233,6 @@
       return new InverseEntrySet();
     }
 
-    @WeakOuter
     final class InverseEntrySet extends ImmutableMapEntrySet<V, K> {
       @Override
       ImmutableMap<V, K> map() {
diff --git a/guava/src/com/google/common/collect/RegularImmutableMap.java b/guava/src/com/google/common/collect/RegularImmutableMap.java
index 3c74dc2..9efda84 100644
--- a/guava/src/com/google/common/collect/RegularImmutableMap.java
+++ b/guava/src/com/google/common/collect/RegularImmutableMap.java
@@ -207,10 +207,10 @@
   }
 
   @GwtCompatible(emulated = true)
-  private static final class KeySet<K, V> extends IndexedImmutableSet<K> {
-    private final RegularImmutableMap<K, V> map;
+  private static final class KeySet<K> extends IndexedImmutableSet<K> {
+    private final RegularImmutableMap<K, ?> map;
 
-    KeySet(RegularImmutableMap<K, V> map) {
+    KeySet(RegularImmutableMap<K, ?> map) {
       this.map = map;
     }
 
@@ -234,13 +234,9 @@
       return map.size();
     }
 
+    // No longer used for new writes, but kept so that old data can still be read.
     @GwtIncompatible // serialization
-    @Override
-    Object writeReplace() {
-      return new SerializedForm<K>(map);
-    }
-
-    @GwtIncompatible // serialization
+    @SuppressWarnings("unused")
     private static class SerializedForm<K> implements Serializable {
       final ImmutableMap<K, ?> map;
 
@@ -284,13 +280,9 @@
       return true;
     }
 
+    // No longer used for new writes, but kept so that old data can still be read.
     @GwtIncompatible // serialization
-    @Override
-    Object writeReplace() {
-      return new SerializedForm<V>(map);
-    }
-
-    @GwtIncompatible // serialization
+    @SuppressWarnings("unused")
     private static class SerializedForm<V> implements Serializable {
       final ImmutableMap<?, V> map;
 
diff --git a/guava/src/com/google/common/collect/Sets.java b/guava/src/com/google/common/collect/Sets.java
index a83f1b3..3ad0f9d 100644
--- a/guava/src/com/google/common/collect/Sets.java
+++ b/guava/src/com/google/common/collect/Sets.java
@@ -51,7 +51,6 @@
 import java.util.function.Consumer;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -148,7 +147,7 @@
                 Accumulator::toImmutableSet,
                 Collector.Characteristics.UNORDERED);
 
-    @MonotonicNonNull private EnumSet<E> set;
+    private @Nullable EnumSet<E> set;
 
     void add(E e) {
       if (set == null) {
@@ -254,7 +253,7 @@
    */
   public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
     return (elements instanceof Collection)
-        ? new HashSet<E>(Collections2.cast(elements))
+        ? new HashSet<E>((Collection<? extends E>) elements)
         : newHashSet(elements.iterator());
   }
 
@@ -359,7 +358,7 @@
    */
   public static <E> LinkedHashSet<E> newLinkedHashSet(Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
-      return new LinkedHashSet<E>(Collections2.cast(elements));
+      return new LinkedHashSet<E>((Collection<? extends E>) elements);
     }
     LinkedHashSet<E> set = newLinkedHashSet();
     Iterables.addAll(set, elements);
@@ -487,7 +486,7 @@
     // quadratic cost of adding them to the COWAS directly.
     Collection<? extends E> elementsCollection =
         (elements instanceof Collection)
-            ? Collections2.cast(elements)
+            ? (Collection<? extends E>) elements
             : Lists.newArrayList(elements);
     return new CopyOnWriteArraySet<E>(elementsCollection);
   }
@@ -1319,6 +1318,7 @@
    * @return the Cartesian product, as an immutable set containing immutable lists
    * @throws NullPointerException if {@code sets}, any one of the {@code sets}, or any element of a
    *     provided set is null
+   * @throws IllegalArgumentException if the cartesian product size exceeds the {@code int} range
    * @since 2.0
    */
   public static <B> Set<List<B>> cartesianProduct(List<? extends Set<? extends B>> sets) {
@@ -1375,6 +1375,7 @@
    * @return the Cartesian product, as an immutable set containing immutable lists
    * @throws NullPointerException if {@code sets}, any one of the {@code sets}, or any element of a
    *     provided set is null
+   * @throws IllegalArgumentException if the cartesian product size exceeds the {@code int} range
    * @since 2.0
    */
   @SafeVarargs
@@ -1428,6 +1429,25 @@
     }
 
     @Override
+    public boolean contains(@Nullable Object object) {
+      if (!(object instanceof List)) {
+        return false;
+      }
+      List<?> list = (List<?>) object;
+      if (list.size() != axes.size()) {
+        return false;
+      }
+      int i = 0;
+      for (Object o : list) {
+        if (!axes.get(i).contains(o)) {
+          return false;
+        }
+        i++;
+      }
+      return true;
+    }
+
+    @Override
     public boolean equals(@Nullable 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
@@ -1576,7 +1596,7 @@
     public boolean equals(@Nullable Object obj) {
       if (obj instanceof PowerSet) {
         PowerSet<?> that = (PowerSet<?>) obj;
-        return inputSet.equals(that.inputSet);
+        return inputSet.keySet().equals(that.inputSet.keySet());
       }
       return super.equals(obj);
     }
@@ -1836,7 +1856,7 @@
       throw new UnsupportedOperationException();
     }
 
-    private transient @MonotonicNonNull UnmodifiableNavigableSet<E> descendingSet;
+    private transient @Nullable UnmodifiableNavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
diff --git a/guava/src/com/google/common/collect/SingletonImmutableBiMap.java b/guava/src/com/google/common/collect/SingletonImmutableBiMap.java
index 32376e0..ea6f275 100644
--- a/guava/src/com/google/common/collect/SingletonImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/SingletonImmutableBiMap.java
@@ -42,6 +42,7 @@
     checkEntryNotNull(singleKey, singleValue);
     this.singleKey = singleKey;
     this.singleValue = singleValue;
+    this.inverse = null;
   }
 
   private SingletonImmutableBiMap(K singleKey, V singleValue, ImmutableBiMap<V, K> inverse) {
@@ -90,16 +91,21 @@
     return ImmutableSet.of(singleKey);
   }
 
-  @LazyInit @RetainedWith transient ImmutableBiMap<V, K> inverse;
+  private final transient @Nullable ImmutableBiMap<V, K> inverse;
+  @LazyInit @RetainedWith private transient @Nullable ImmutableBiMap<V, K> lazyInverse;
 
   @Override
   public ImmutableBiMap<V, K> inverse() {
-    // racy single-check idiom
-    ImmutableBiMap<V, K> result = inverse;
-    if (result == null) {
-      return inverse = new SingletonImmutableBiMap<>(singleValue, singleKey, this);
+    if (inverse != null) {
+      return inverse;
     } else {
-      return result;
+      // racy single-check idiom
+      ImmutableBiMap<V, K> result = lazyInverse;
+      if (result == null) {
+        return lazyInverse = new SingletonImmutableBiMap<>(singleValue, singleKey, this);
+      } else {
+        return result;
+      }
     }
   }
 }
diff --git a/guava/src/com/google/common/collect/SortedMultiset.java b/guava/src/com/google/common/collect/SortedMultiset.java
index 849ea50..2635b37 100644
--- a/guava/src/com/google/common/collect/SortedMultiset.java
+++ b/guava/src/com/google/common/collect/SortedMultiset.java
@@ -32,7 +32,7 @@
  *
  * <p><b>Warning:</b> The comparison must be <i>consistent with equals</i> as explained by the
  * {@link Comparable} class specification. Otherwise, the resulting multiset will violate the {@link
- * Collection} contract, which it is specified in terms of {@link Object#equals}.
+ * Collection} contract, which is specified in terms of {@link Object#equals}.
  *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multiset"> {@code
diff --git a/guava/src/com/google/common/collect/SortedSetMultimap.java b/guava/src/com/google/common/collect/SortedSetMultimap.java
index cefe6aa..9f073bf 100644
--- a/guava/src/com/google/common/collect/SortedSetMultimap.java
+++ b/guava/src/com/google/common/collect/SortedSetMultimap.java
@@ -22,6 +22,7 @@
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 import java.util.SortedSet;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -95,7 +96,11 @@
    *
    * <p><b>Note:</b> The returned map's values are guaranteed to be of type {@link SortedSet}. To
    * obtain this map with the more specific generic type {@code Map<K, SortedSet<V>>}, call {@link
-   * Multimaps#asMap(SortedSetMultimap)} instead.
+   * Multimaps#asMap(SortedSetMultimap)} instead. <b>However</b>, the returned map <i>itself</i> is
+   * not necessarily a {@link SortedMap}: A {@code SortedSetMultimap} must expose the <i>values</i>
+   * for a given key in sorted order, but it need not expose the <i>keys</i> in sorted order.
+   * Individual {@code SortedSetMultimap} implementations, like those built with {@link
+   * MultimapBuilder#treeKeys()}, may make additional guarantees.
    */
   @Override
   Map<K, Collection<V>> asMap();
diff --git a/guava/src/com/google/common/collect/StandardTable.java b/guava/src/com/google/common/collect/StandardTable.java
index 3d4e321..6adc4dc 100644
--- a/guava/src/com/google/common/collect/StandardTable.java
+++ b/guava/src/com/google/common/collect/StandardTable.java
@@ -42,7 +42,6 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -619,7 +618,7 @@
     return rowMap().keySet();
   }
 
-  private transient @MonotonicNonNull Set<C> columnKeySet;
+  private transient @Nullable Set<C> columnKeySet;
 
   /**
    * {@inheritDoc}
@@ -749,7 +748,7 @@
     return super.values();
   }
 
-  private transient @MonotonicNonNull Map<R, Map<C, V>> rowMap;
+  private transient @Nullable Map<R, Map<C, V>> rowMap;
 
   @Override
   public Map<R, Map<C, V>> rowMap() {
@@ -828,7 +827,7 @@
     }
   }
 
-  private transient @MonotonicNonNull ColumnMap columnMap;
+  private transient @Nullable ColumnMap columnMap;
 
   @Override
   public Map<C, Map<R, V>> columnMap() {
diff --git a/guava/src/com/google/common/collect/Streams.java b/guava/src/com/google/common/collect/Streams.java
index 974c18d..333fc2a 100644
--- a/guava/src/com/google/common/collect/Streams.java
+++ b/guava/src/com/google/common/collect/Streams.java
@@ -39,6 +39,7 @@
 import java.util.function.DoubleConsumer;
 import java.util.function.IntConsumer;
 import java.util.function.LongConsumer;
+import java.util.stream.BaseStream;
 import java.util.stream.DoubleStream;
 import java.util.stream.IntStream;
 import java.util.stream.LongStream;
@@ -89,7 +90,7 @@
    */
   @Beta
   public static <T> Stream<T> stream(com.google.common.base.Optional<T> optional) {
-    return optional.isPresent() ? Stream.of(optional.get()) : Stream.of();
+    return optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
   }
 
   /**
@@ -100,7 +101,7 @@
    */
   @Beta
   public static <T> Stream<T> stream(java.util.Optional<T> optional) {
-    return optional.isPresent() ? Stream.of(optional.get()) : Stream.of();
+    return optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
   }
 
   /**
@@ -136,6 +137,13 @@
     return optional.isPresent() ? DoubleStream.of(optional.getAsDouble()) : DoubleStream.empty();
   }
 
+  private static void closeAll(BaseStream<?, ?>[] toClose) {
+    for (BaseStream<?, ?> stream : toClose) {
+      // TODO(b/80534298): Catch exceptions, rethrowing later with extras as suppressed exceptions.
+      stream.close();
+    }
+  }
+
   /**
    * Returns a {@link Stream} containing the elements of the first stream, followed by the elements
    * of the second stream, and so on.
@@ -167,12 +175,7 @@
                 characteristics,
                 estimatedSize),
             isParallel)
-        .onClose(
-            () -> {
-              for (Stream<? extends T> stream : streams) {
-                stream.close();
-              }
-            });
+        .onClose(() -> closeAll(streams));
   }
 
   /**
@@ -185,8 +188,26 @@
    * @see IntStream#concat(IntStream, IntStream)
    */
   public static IntStream concat(IntStream... streams) {
-    // TODO(lowasser): optimize this later
-    return Stream.of(streams).flatMapToInt(stream -> stream);
+    boolean isParallel = false;
+    int characteristics = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.NONNULL;
+    long estimatedSize = 0L;
+    ImmutableList.Builder<Spliterator.OfInt> splitrsBuilder =
+        new ImmutableList.Builder<>(streams.length);
+    for (IntStream stream : streams) {
+      isParallel |= stream.isParallel();
+      Spliterator.OfInt splitr = stream.spliterator();
+      splitrsBuilder.add(splitr);
+      characteristics &= splitr.characteristics();
+      estimatedSize = LongMath.saturatedAdd(estimatedSize, splitr.estimateSize());
+    }
+    return StreamSupport.intStream(
+            CollectSpliterators.flatMapToInt(
+                splitrsBuilder.build().spliterator(),
+                splitr -> splitr,
+                characteristics,
+                estimatedSize),
+            isParallel)
+        .onClose(() -> closeAll(streams));
   }
 
   /**
@@ -199,8 +220,26 @@
    * @see LongStream#concat(LongStream, LongStream)
    */
   public static LongStream concat(LongStream... streams) {
-    // TODO(lowasser): optimize this later
-    return Stream.of(streams).flatMapToLong(stream -> stream);
+    boolean isParallel = false;
+    int characteristics = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.NONNULL;
+    long estimatedSize = 0L;
+    ImmutableList.Builder<Spliterator.OfLong> splitrsBuilder =
+        new ImmutableList.Builder<>(streams.length);
+    for (LongStream stream : streams) {
+      isParallel |= stream.isParallel();
+      Spliterator.OfLong splitr = stream.spliterator();
+      splitrsBuilder.add(splitr);
+      characteristics &= splitr.characteristics();
+      estimatedSize = LongMath.saturatedAdd(estimatedSize, splitr.estimateSize());
+    }
+    return StreamSupport.longStream(
+            CollectSpliterators.flatMapToLong(
+                splitrsBuilder.build().spliterator(),
+                splitr -> splitr,
+                characteristics,
+                estimatedSize),
+            isParallel)
+        .onClose(() -> closeAll(streams));
   }
 
   /**
@@ -213,12 +252,30 @@
    * @see DoubleStream#concat(DoubleStream, DoubleStream)
    */
   public static DoubleStream concat(DoubleStream... streams) {
-    // TODO(lowasser): optimize this later
-    return Stream.of(streams).flatMapToDouble(stream -> stream);
+    boolean isParallel = false;
+    int characteristics = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.NONNULL;
+    long estimatedSize = 0L;
+    ImmutableList.Builder<Spliterator.OfDouble> splitrsBuilder =
+        new ImmutableList.Builder<>(streams.length);
+    for (DoubleStream stream : streams) {
+      isParallel |= stream.isParallel();
+      Spliterator.OfDouble splitr = stream.spliterator();
+      splitrsBuilder.add(splitr);
+      characteristics &= splitr.characteristics();
+      estimatedSize = LongMath.saturatedAdd(estimatedSize, splitr.estimateSize());
+    }
+    return StreamSupport.doubleStream(
+            CollectSpliterators.flatMapToDouble(
+                splitrsBuilder.build().spliterator(),
+                splitr -> splitr,
+                characteristics,
+                estimatedSize),
+            isParallel)
+        .onClose(() -> closeAll(streams));
   }
 
   /**
-   * Returns a stream in which each element is the result of passing the corresponding elementY of
+   * Returns a stream in which each element is the result of passing the corresponding element of
    * each of {@code streamA} and {@code streamB} to {@code function}.
    *
    * <p>For example:
diff --git a/guava/src/com/google/common/collect/Synchronized.java b/guava/src/com/google/common/collect/Synchronized.java
index 9ddfd03..0f175cc 100644
--- a/guava/src/com/google/common/collect/Synchronized.java
+++ b/guava/src/com/google/common/collect/Synchronized.java
@@ -48,7 +48,6 @@
 import java.util.function.Predicate;
 import java.util.function.UnaryOperator;
 import java.util.stream.Stream;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -477,8 +476,8 @@
 
   private static class SynchronizedMultiset<E> extends SynchronizedCollection<E>
       implements Multiset<E> {
-    @MonotonicNonNull transient Set<E> elementSet;
-    @MonotonicNonNull transient Set<Entry<E>> entrySet;
+    transient @Nullable Set<E> elementSet;
+    transient @Nullable Set<Entry<E>> entrySet;
 
     SynchronizedMultiset(Multiset<E> delegate, @Nullable Object mutex) {
       super(delegate, mutex);
@@ -573,11 +572,11 @@
 
   private static class SynchronizedMultimap<K, V> extends SynchronizedObject
       implements Multimap<K, V> {
-    @MonotonicNonNull transient Set<K> keySet;
-    @MonotonicNonNull transient Collection<V> valuesCollection;
-    @MonotonicNonNull transient Collection<Entry<K, V>> entries;
-    @MonotonicNonNull transient Map<K, Collection<V>> asMap;
-    @MonotonicNonNull transient Multiset<K> keys;
+    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;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -809,7 +808,7 @@
 
   private static class SynchronizedSetMultimap<K, V> extends SynchronizedMultimap<K, V>
       implements SetMultimap<K, V> {
-    @MonotonicNonNull transient Set<Entry<K, V>> entrySet;
+    transient @Nullable Set<Entry<K, V>> entrySet;
 
     SynchronizedSetMultimap(SetMultimap<K, V> delegate, @Nullable Object mutex) {
       super(delegate, mutex);
@@ -1024,9 +1023,9 @@
   }
 
   private static class SynchronizedMap<K, V> extends SynchronizedObject implements Map<K, V> {
-    @MonotonicNonNull transient Set<K> keySet;
-    @MonotonicNonNull transient Collection<V> values;
-    @MonotonicNonNull transient Set<Entry<K, V>> entrySet;
+    transient @Nullable Set<K> keySet;
+    transient @Nullable Collection<V> values;
+    transient @Nullable Set<Entry<K, V>> entrySet;
 
     SynchronizedMap(Map<K, V> delegate, @Nullable Object mutex) {
       super(delegate, mutex);
@@ -1301,8 +1300,8 @@
   @VisibleForTesting
   static class SynchronizedBiMap<K, V> extends SynchronizedMap<K, V>
       implements BiMap<K, V>, Serializable {
-    private transient @MonotonicNonNull Set<V> valueSet;
-    @MonotonicNonNull @RetainedWith private transient BiMap<V, K> inverse;
+    private transient @Nullable Set<V> valueSet;
+    @RetainedWith private transient @Nullable BiMap<V, K> inverse;
 
     private SynchronizedBiMap(
         BiMap<K, V> delegate, @Nullable Object mutex, @Nullable BiMap<V, K> inverse) {
@@ -1346,8 +1345,8 @@
   }
 
   private static class SynchronizedAsMap<K, V> extends SynchronizedMap<K, Collection<V>> {
-    @MonotonicNonNull transient Set<Entry<K, Collection<V>>> asMapEntrySet;
-    @MonotonicNonNull transient Collection<Collection<V>> asMapValues;
+    transient @Nullable Set<Entry<K, Collection<V>>> asMapEntrySet;
+    transient @Nullable Collection<Collection<V>> asMapValues;
 
     SynchronizedAsMap(Map<K, Collection<V>> delegate, @Nullable Object mutex) {
       super(delegate, mutex);
@@ -1434,7 +1433,7 @@
       return delegate().descendingIterator(); // manually synchronized
     }
 
-    @MonotonicNonNull transient NavigableSet<E> descendingSet;
+    transient @Nullable NavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
@@ -1573,7 +1572,7 @@
       }
     }
 
-    @MonotonicNonNull transient NavigableSet<K> descendingKeySet;
+    transient @Nullable NavigableSet<K> descendingKeySet;
 
     @Override
     public NavigableSet<K> descendingKeySet() {
@@ -1585,7 +1584,7 @@
       }
     }
 
-    @MonotonicNonNull transient NavigableMap<K, V> descendingMap;
+    transient @Nullable NavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -1670,7 +1669,7 @@
       return navigableKeySet();
     }
 
-    @MonotonicNonNull transient NavigableSet<K> navigableKeySet;
+    transient @Nullable NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
diff --git a/guava/src/com/google/common/collect/Table.java b/guava/src/com/google/common/collect/Table.java
index 9e29aa9..136ec17 100644
--- a/guava/src/com/google/common/collect/Table.java
+++ b/guava/src/com/google/common/collect/Table.java
@@ -20,6 +20,7 @@
 import com.google.common.base.Objects;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.CompatibleWith;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
@@ -52,6 +53,7 @@
  * @param <V> the type of the mapped values
  * @since 7.0
  */
+@DoNotMock("Use ImmutableTable, HashBasedTable, or another implementation")
 @GwtCompatible
 public interface Table<R, C, V> {
   // TODO(jlevy): Consider adding methods similar to ConcurrentMap methods.
@@ -96,6 +98,7 @@
    * @param rowKey key of row to search for
    * @param columnKey key of column to search for
    */
+  @Nullable
   V get(
       @Nullable @CompatibleWith("R") Object rowKey,
       @Nullable @CompatibleWith("C") Object columnKey);
diff --git a/guava/src/com/google/common/collect/TopKSelector.java b/guava/src/com/google/common/collect/TopKSelector.java
index 8d9e0e4..09f38aa 100644
--- a/guava/src/com/google/common/collect/TopKSelector.java
+++ b/guava/src/com/google/common/collect/TopKSelector.java
@@ -58,7 +58,7 @@
    * relative to the natural ordering of the elements, and returns them via {@link #topK} in
    * ascending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
   public static <T extends Comparable<? super T>> TopKSelector<T> least(int k) {
     return least(k, Ordering.natural());
@@ -68,7 +68,7 @@
    * Returns a {@code TopKSelector} that collects the lowest {@code k} elements added to it,
    * relative to the specified comparator, and returns them via {@link #topK} in ascending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @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) {
     return new TopKSelector<T>(comparator, k);
@@ -79,7 +79,7 @@
    * relative to the natural ordering of the elements, and returns them via {@link #topK} in
    * descending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
   public static <T extends Comparable<? super T>> TopKSelector<T> greatest(int k) {
     return greatest(k, Ordering.natural());
@@ -89,7 +89,7 @@
    * Returns a {@code TopKSelector} that collects the greatest {@code k} elements added to it,
    * relative to the specified comparator, and returns them via {@link #topK} in descending order.
    *
-   * @throws IllegalArgumentException if {@code k < 0}
+   * @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) {
     return new TopKSelector<T>(Ordering.from(comparator).reverse(), k);
@@ -115,8 +115,9 @@
   private TopKSelector(Comparator<? super T> comparator, int k) {
     this.comparator = checkNotNull(comparator, "comparator");
     this.k = k;
-    checkArgument(k >= 0, "k must be nonnegative, was %s", k);
-    this.buffer = (T[]) new Object[k * 2];
+    checkArgument(k >= 0, "k (%s) must be >= 0", k);
+    checkArgument(k <= Integer.MAX_VALUE / 2, "k (%s) must be <= Integer.MAX_VALUE / 2", k);
+    this.buffer = (T[]) new Object[IntMath.checkedMultiply(k, 2)];
     this.bufferSize = 0;
     this.threshold = null;
   }
diff --git a/guava/src/com/google/common/collect/TreeBasedTable.java b/guava/src/com/google/common/collect/TreeBasedTable.java
index 615d31b..510f75c 100644
--- a/guava/src/com/google/common/collect/TreeBasedTable.java
+++ b/guava/src/com/google/common/collect/TreeBasedTable.java
@@ -196,8 +196,8 @@
 
     int compare(Object a, Object b) {
       // pretend we can compare anything
-      @SuppressWarnings({"rawtypes", "unchecked"})
-      Comparator<Object> cmp = (Comparator) comparator();
+      @SuppressWarnings("unchecked")
+      Comparator<Object> cmp = (Comparator<Object>) comparator();
       return cmp.compare(a, b);
     }
 
diff --git a/guava/src/com/google/common/collect/TreeMultimap.java b/guava/src/com/google/common/collect/TreeMultimap.java
index 9a36126..82c97af 100644
--- a/guava/src/com/google/common/collect/TreeMultimap.java
+++ b/guava/src/com/google/common/collect/TreeMultimap.java
@@ -41,7 +41,7 @@
  *
  * <p><b>Warning:</b> The comparators or comparables used must be <i>consistent with equals</i> as
  * explained by the {@link Comparable} class specification. Otherwise, the resulting multiset will
- * violate the general contract of {@link SetMultimap}, which it is specified in terms of {@link
+ * violate the general contract of {@link SetMultimap}, which is specified in terms of {@link
  * Object#equals}.
  *
  * <p>The collections returned by {@code keySet} and {@code asMap} iterate through the keys
diff --git a/guava/src/com/google/common/collect/TreeRangeMap.java b/guava/src/com/google/common/collect/TreeRangeMap.java
index 72f6d36..69491d4 100644
--- a/guava/src/com/google/common/collect/TreeRangeMap.java
+++ b/guava/src/com/google/common/collect/TreeRangeMap.java
@@ -37,6 +37,7 @@
 import java.util.NavigableMap;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.function.BiFunction;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -118,7 +119,6 @@
 
   @Override
   public void put(Range<K> range, V value) {
-    // don't short-circuit if the range is empty - it may be between two ranges we can coalesce.
     if (!range.isEmpty()) {
       checkNotNull(value);
       remove(range);
@@ -128,6 +128,7 @@
 
   @Override
   public void putCoalescing(Range<K> range, V value) {
+    // don't short-circuit if the range is empty - it may be between two ranges we can coalesce.
     if (entriesByLowerBound.isEmpty()) {
       put(range, value);
       return;
@@ -239,6 +240,80 @@
     entriesByLowerBound.subMap(rangeToRemove.lowerBound, rangeToRemove.upperBound).clear();
   }
 
+  private void split(Cut<K> cut) {
+    /*
+     * The comments for this method will use | to indicate the cut point and ( ) to indicate the
+     * bounds of ranges in the range map.
+     */
+    Entry<Cut<K>, RangeMapEntry<K, V>> mapEntryToSplit = entriesByLowerBound.lowerEntry(cut);
+    if (mapEntryToSplit == null) {
+      return;
+    }
+    // we know ( |
+    RangeMapEntry<K, V> rangeMapEntry = mapEntryToSplit.getValue();
+    if (rangeMapEntry.getUpperBound().compareTo(cut) <= 0) {
+      return;
+    }
+    // we know ( | )
+    putRangeMapEntry(rangeMapEntry.getLowerBound(), cut, rangeMapEntry.getValue());
+    putRangeMapEntry(cut, rangeMapEntry.getUpperBound(), rangeMapEntry.getValue());
+  }
+
+  @Override
+  public void merge(
+      Range<K> range,
+      @Nullable V value,
+      BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+    checkNotNull(range);
+    checkNotNull(remappingFunction);
+
+    if (range.isEmpty()) {
+      return;
+    }
+    split(range.lowerBound);
+    split(range.upperBound);
+
+    // Due to the splitting of any entries spanning the range bounds, we know that any entry with a
+    // lower bound in the merge range is entirely contained by the merge range.
+    Set<Entry<Cut<K>, RangeMapEntry<K, V>>> entriesInMergeRange =
+        entriesByLowerBound.subMap(range.lowerBound, range.upperBound).entrySet();
+
+    // Create entries mapping any unmapped ranges in the merge range to the specified value.
+    ImmutableMap.Builder<Cut<K>, RangeMapEntry<K, V>> gaps = ImmutableMap.builder();
+    if (value != null) {
+      final Iterator<Entry<Cut<K>, RangeMapEntry<K, V>>> backingItr =
+          entriesInMergeRange.iterator();
+      Cut<K> lowerBound = range.lowerBound;
+      while (backingItr.hasNext()) {
+        RangeMapEntry<K, V> entry = backingItr.next().getValue();
+        Cut<K> upperBound = entry.getLowerBound();
+        if (!lowerBound.equals(upperBound)) {
+          gaps.put(lowerBound, new RangeMapEntry<K, V>(lowerBound, upperBound, value));
+        }
+        lowerBound = entry.getUpperBound();
+      }
+      if (!lowerBound.equals(range.upperBound)) {
+        gaps.put(lowerBound, new RangeMapEntry<K, V>(lowerBound, range.upperBound, value));
+      }
+    }
+
+    // Remap all existing entries in the merge range.
+    final Iterator<Entry<Cut<K>, RangeMapEntry<K, V>>> backingItr = entriesInMergeRange.iterator();
+    while (backingItr.hasNext()) {
+      Entry<Cut<K>, RangeMapEntry<K, V>> entry = backingItr.next();
+      V newValue = remappingFunction.apply(entry.getValue().getValue(), value);
+      if (newValue == null) {
+        backingItr.remove();
+      } else {
+        entry.setValue(
+            new RangeMapEntry<K, V>(
+                entry.getValue().getLowerBound(), entry.getValue().getUpperBound(), newValue));
+      }
+    }
+
+    entriesByLowerBound.putAll(gaps.build());
+  }
+
   @Override
   public Map<Range<K>, V> asMapOfRanges() {
     return new AsMapOfRanges(entriesByLowerBound.values());
@@ -348,6 +423,14 @@
         }
 
         @Override
+        @SuppressWarnings("rawtypes") // necessary for static EMPTY_SUB_RANGE_MAP instance
+        public void merge(Range range, @Nullable Object value, BiFunction remappingFunction) {
+          checkNotNull(range);
+          throw new IllegalArgumentException(
+              "Cannot merge range " + range + " into an empty subRangeMap");
+        }
+
+        @Override
         public Map<Range, Object> asMapOfRanges() {
           return Collections.emptyMap();
         }
@@ -425,7 +508,7 @@
 
     @Override
     public void putCoalescing(Range<K> range, V value) {
-      if (entriesByLowerBound.isEmpty() || range.isEmpty() || !subRange.encloses(range)) {
+      if (entriesByLowerBound.isEmpty() || !subRange.encloses(range)) {
         put(range, value);
         return;
       }
@@ -462,6 +545,19 @@
     }
 
     @Override
+    public void merge(
+        Range<K> range,
+        @Nullable V value,
+        BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+      checkArgument(
+          subRange.encloses(range),
+          "Cannot merge range %s into a subRangeMap(%s)",
+          range,
+          subRange);
+      TreeRangeMap.this.merge(range, value, remappingFunction);
+    }
+
+    @Override
     public RangeMap<K, V> subRangeMap(Range<K> range) {
       if (!range.isConnected(subRange)) {
         return emptySubRangeMap();
diff --git a/guava/src/com/google/common/collect/TreeRangeSet.java b/guava/src/com/google/common/collect/TreeRangeSet.java
index 8fce49b..58cdac1 100644
--- a/guava/src/com/google/common/collect/TreeRangeSet.java
+++ b/guava/src/com/google/common/collect/TreeRangeSet.java
@@ -30,7 +30,6 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -77,8 +76,8 @@
     this.rangesByLowerBound = rangesByLowerCut;
   }
 
-  private transient @MonotonicNonNull Set<Range<C>> asRanges;
-  private transient @MonotonicNonNull Set<Range<C>> asDescendingSetOfRanges;
+  private transient @Nullable Set<Range<C>> asRanges;
+  private transient @Nullable Set<Range<C>> asDescendingSetOfRanges;
 
   @Override
   public Set<Range<C>> asRanges() {
@@ -268,7 +267,7 @@
     }
   }
 
-  private transient @MonotonicNonNull RangeSet<C> complement;
+  private transient @Nullable RangeSet<C> complement;
 
   @Override
   public RangeSet<C> complement() {
@@ -892,7 +891,7 @@
           "Cannot add range %s to subRangeSet(%s)",
           rangeToAdd,
           restriction);
-      super.add(rangeToAdd);
+      TreeRangeSet.this.add(rangeToAdd);
     }
 
     @Override
diff --git a/guava/src/com/google/common/collect/TreeTraverser.java b/guava/src/com/google/common/collect/TreeTraverser.java
index 4ad55ee..9109252 100644
--- a/guava/src/com/google/common/collect/TreeTraverser.java
+++ b/guava/src/com/google/common/collect/TreeTraverser.java
@@ -68,9 +68,9 @@
  *     their equivalent on the result of {@code Traverser.forTree(tree)} where {@code tree}
  *     implements {@code SuccessorsFunction}, which has a similar API as {@link #children} or can be
  *     the same lambda function as passed into {@link #using(Function)}.
- *     <p>This class is scheduled to be removed in January 2019.
+ *     <p>This class is scheduled to be removed in October 2019.
  */
-// TODO(b/68134636): Remove by 2019-01
+// TODO(b/68134636): Remove by 2019-10
 @Deprecated
 @Beta
 @GwtCompatible
diff --git a/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java b/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
index 7cb83a4..d7a20cc 100644
--- a/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.Multisets.UnmodifiableMultiset;
 import java.util.Comparator;
 import java.util.NavigableSet;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multisets#unmodifiableSortedMultiset(SortedMultiset)}, split out into
@@ -56,7 +56,7 @@
     return (NavigableSet<E>) super.elementSet();
   }
 
-  private transient @MonotonicNonNull UnmodifiableSortedMultiset<E> descendingMultiset;
+  private transient @Nullable UnmodifiableSortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
diff --git a/guava/src/com/google/common/escape/Escaper.java b/guava/src/com/google/common/escape/Escaper.java
index 97abc75..0d32a09 100644
--- a/guava/src/com/google/common/escape/Escaper.java
+++ b/guava/src/com/google/common/escape/Escaper.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * An object that converts literal text into a format safe for inclusion in a particular context
@@ -53,6 +54,7 @@
  * @author David Beaumont
  * @since 15.0
  */
+@DoNotMock("Use Escapers.nullEscaper() or another methods from the *Escapers classes")
 @GwtCompatible
 public abstract class Escaper {
   // TODO(dbeaumont): evaluate custom implementations, considering package private constructor.
diff --git a/guava/src/com/google/common/escape/UnicodeEscaper.java b/guava/src/com/google/common/escape/UnicodeEscaper.java
index 73f0bef..0642162 100644
--- a/guava/src/com/google/common/escape/UnicodeEscaper.java
+++ b/guava/src/com/google/common/escape/UnicodeEscaper.java
@@ -90,7 +90,7 @@
    * <p><b>Note:</b> When implementing an escaper it is a good idea to override this method for
    * efficiency by inlining the implementation of {@link #nextEscapeIndex(CharSequence, int, int)}
    * directly. Doing this for {@link com.google.common.net.PercentEscaper} more than doubled the
-   * performance for unescaped strings (as measured by {@link CharEscapersBenchmark}).
+   * performance for unescaped strings (as measured by {@code CharEscapersBenchmark}).
    *
    * @param string the literal string to be escaped
    * @return the escaped form of {@code string}
diff --git a/guava/src/com/google/common/eventbus/Subscribe.java b/guava/src/com/google/common/eventbus/Subscribe.java
index 37337e6..52b999d 100644
--- a/guava/src/com/google/common/eventbus/Subscribe.java
+++ b/guava/src/com/google/common/eventbus/Subscribe.java
@@ -23,9 +23,10 @@
 /**
  * Marks a method as an event subscriber.
  *
- * <p>The type of event will be indicated by the method's first (and only) parameter. If this
- * annotation is applied to methods with zero parameters, or more than one parameter, the object
- * containing the method will not be able to register for event delivery from the {@link EventBus}.
+ * <p>The type of event will be indicated by the method's first (and only) parameter, which cannot
+ * be primitive. If this annotation is applied to methods with zero parameters, or more than one
+ * parameter, the object containing the method will not be able to register for event delivery from
+ * the {@link EventBus}.
  *
  * <p>Unless also annotated with @{@link AllowConcurrentEvents}, event subscriber methods will be
  * invoked serially by each event bus that they are registered with.
diff --git a/guava/src/com/google/common/eventbus/SubscriberRegistry.java b/guava/src/com/google/common/eventbus/SubscriberRegistry.java
index c6990dd..876af8b 100644
--- a/guava/src/com/google/common/eventbus/SubscriberRegistry.java
+++ b/guava/src/com/google/common/eventbus/SubscriberRegistry.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Throwables.throwIfUnchecked;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -31,6 +32,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
+import com.google.common.primitives.Primitives;
 import com.google.common.reflect.TypeToken;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.google.j2objc.annotations.Weak;
@@ -170,7 +172,12 @@
   }
 
   private static ImmutableList<Method> getAnnotatedMethods(Class<?> clazz) {
-    return subscriberMethodsCache.getUnchecked(clazz);
+    try {
+      return subscriberMethodsCache.getUnchecked(clazz);
+    } catch (UncheckedExecutionException e) {
+      throwIfUnchecked(e.getCause());
+      throw e;
+    }
   }
 
   private static ImmutableList<Method> getAnnotatedMethodsNotCached(Class<?> clazz) {
@@ -183,11 +190,20 @@
           Class<?>[] parameterTypes = method.getParameterTypes();
           checkArgument(
               parameterTypes.length == 1,
-              "Method %s has @Subscribe annotation but has %s parameters."
+              "Method %s has @Subscribe annotation but has %s parameters. "
                   + "Subscriber methods must have exactly 1 parameter.",
               method,
               parameterTypes.length);
 
+          checkArgument(
+              !parameterTypes[0].isPrimitive(),
+              "@Subscribe method %s's parameter is %s. "
+                  + "Subscriber methods cannot accept primitives. "
+                  + "Consider changing the parameter to %s.",
+              method,
+              parameterTypes[0].getName(),
+              Primitives.wrap(parameterTypes[0]).getSimpleName());
+
           MethodIdentifier ident = new MethodIdentifier(method);
           if (!identifiers.containsKey(ident)) {
             identifiers.put(ident, method);
diff --git a/guava/src/com/google/common/graph/AbstractBaseGraph.java b/guava/src/com/google/common/graph/AbstractBaseGraph.java
index a2c996d..352df19 100644
--- a/guava/src/com/google/common/graph/AbstractBaseGraph.java
+++ b/guava/src/com/google/common/graph/AbstractBaseGraph.java
@@ -98,10 +98,50 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return ElementOrder.unordered();
+  }
+
+  @Override
   public Set<EndpointPair<N>> incidentEdges(N node) {
     checkNotNull(node);
     checkArgument(nodes().contains(node), "Node %s is not an element of this graph.", node);
-    return IncidentEdgeSet.of(this, node);
+    return new IncidentEdgeSet<N>(this, node) {
+      @Override
+      public UnmodifiableIterator<EndpointPair<N>> iterator() {
+        if (graph.isDirected()) {
+          return Iterators.unmodifiableIterator(
+              Iterators.concat(
+                  Iterators.transform(
+                      graph.predecessors(node).iterator(),
+                      new Function<N, EndpointPair<N>>() {
+                        @Override
+                        public EndpointPair<N> apply(N predecessor) {
+                          return EndpointPair.ordered(predecessor, node);
+                        }
+                      }),
+                  Iterators.transform(
+                      // filter out 'node' from successors (already covered by predecessors, above)
+                      Sets.difference(graph.successors(node), ImmutableSet.of(node)).iterator(),
+                      new Function<N, EndpointPair<N>>() {
+                        @Override
+                        public EndpointPair<N> apply(N successor) {
+                          return EndpointPair.ordered(node, successor);
+                        }
+                      })));
+        } else {
+          return Iterators.unmodifiableIterator(
+              Iterators.transform(
+                  graph.adjacentNodes(node).iterator(),
+                  new Function<N, EndpointPair<N>>() {
+                    @Override
+                    public EndpointPair<N> apply(N adjacentNode) {
+                      return EndpointPair.unordered(node, adjacentNode);
+                    }
+                  }));
+        }
+      }
+    };
   }
 
   @Override
@@ -155,119 +195,4 @@
   protected final boolean isOrderingCompatible(EndpointPair<?> endpoints) {
     return endpoints.isOrdered() || !this.isDirected();
   }
-
-  private abstract static class IncidentEdgeSet<N> extends AbstractSet<EndpointPair<N>> {
-    protected final N node;
-    protected final BaseGraph<N> graph;
-
-    public static <N> IncidentEdgeSet<N> of(BaseGraph<N> graph, N node) {
-      return graph.isDirected() ? new Directed<>(graph, node) : new Undirected<>(graph, node);
-    }
-
-    private IncidentEdgeSet(BaseGraph<N> graph, N node) {
-      this.graph = graph;
-      this.node = node;
-    }
-
-    @Override
-    public boolean remove(Object o) {
-      throw new UnsupportedOperationException();
-    }
-
-    private static final class Directed<N> extends IncidentEdgeSet<N> {
-
-      private Directed(BaseGraph<N> graph, N node) {
-        super(graph, node);
-      }
-
-      @Override
-      public UnmodifiableIterator<EndpointPair<N>> iterator() {
-        return Iterators.unmodifiableIterator(
-            Iterators.concat(
-                Iterators.transform(
-                    graph.predecessors(node).iterator(),
-                    new Function<N, EndpointPair<N>>() {
-                      @Override
-                      public EndpointPair<N> apply(N predecessor) {
-                        return EndpointPair.ordered(predecessor, node);
-                      }
-                    }),
-                Iterators.transform(
-                    // filter out 'node' from successors (already covered by predecessors, above)
-                    Sets.difference(graph.successors(node), ImmutableSet.of(node)).iterator(),
-                    new Function<N, EndpointPair<N>>() {
-                      @Override
-                      public EndpointPair<N> apply(N successor) {
-                        return EndpointPair.ordered(node, successor);
-                      }
-                    })));
-      }
-
-      @Override
-      public int size() {
-        return graph.inDegree(node)
-            + graph.outDegree(node)
-            - (graph.successors(node).contains(node) ? 1 : 0);
-      }
-
-      @Override
-      public boolean contains(@Nullable Object obj) {
-        if (!(obj instanceof EndpointPair)) {
-          return false;
-        }
-
-        EndpointPair<?> endpointPair = (EndpointPair<?>) obj;
-        if (!endpointPair.isOrdered()) {
-          return false;
-        }
-
-        Object source = endpointPair.source();
-        Object target = endpointPair.target();
-        return (node.equals(source) && graph.successors(node).contains(target))
-            || (node.equals(target) && graph.predecessors(node).contains(source));
-      }
-    }
-
-    private static final class Undirected<N> extends IncidentEdgeSet<N> {
-      private Undirected(BaseGraph<N> graph, N node) {
-        super(graph, node);
-      }
-
-      @Override
-      public UnmodifiableIterator<EndpointPair<N>> iterator() {
-        return Iterators.unmodifiableIterator(
-            Iterators.transform(
-                graph.adjacentNodes(node).iterator(),
-                new Function<N, EndpointPair<N>>() {
-                  @Override
-                  public EndpointPair<N> apply(N adjacentNode) {
-                    return EndpointPair.unordered(node, adjacentNode);
-                  }
-                }));
-      }
-
-      @Override
-      public int size() {
-        return graph.adjacentNodes(node).size();
-      }
-
-      @Override
-      public boolean contains(@Nullable Object obj) {
-        if (!(obj instanceof EndpointPair)) {
-          return false;
-        }
-
-        EndpointPair<?> endpointPair = (EndpointPair<?>) obj;
-        if (endpointPair.isOrdered()) {
-          return false;
-        }
-        Set<N> adjacent = graph.adjacentNodes(node);
-        Object nodeU = endpointPair.nodeU();
-        Object nodeV = endpointPair.nodeV();
-
-        return (node.equals(nodeV) && adjacent.contains(nodeU))
-            || (node.equals(nodeU) && adjacent.contains(nodeV));
-      }
-    }
-  }
 }
diff --git a/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java b/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
index 2bed9c3..9afaf3e 100644
--- a/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
@@ -119,6 +119,9 @@
 
   @Override
   public void addInEdge(E edge, N node, boolean isSelfLoop) {
+    checkNotNull(edge);
+    checkNotNull(node);
+
     if (isSelfLoop) {
       checkPositive(++selfLoopCount);
     }
@@ -128,6 +131,9 @@
 
   @Override
   public void addOutEdge(E edge, N node) {
+    checkNotNull(edge);
+    checkNotNull(node);
+
     N previousNode = outEdgeMap.put(edge, node);
     checkState(previousNode == null);
   }
diff --git a/guava/src/com/google/common/graph/AbstractGraphBuilder.java b/guava/src/com/google/common/graph/AbstractGraphBuilder.java
index 4c726f4..84e461a 100644
--- a/guava/src/com/google/common/graph/AbstractGraphBuilder.java
+++ b/guava/src/com/google/common/graph/AbstractGraphBuilder.java
@@ -27,6 +27,8 @@
   final boolean directed;
   boolean allowsSelfLoops = false;
   ElementOrder<N> nodeOrder = ElementOrder.insertion();
+  ElementOrder<N> incidentEdgeOrder = ElementOrder.unordered();
+
   Optional<Integer> expectedNodeCount = Optional.absent();
 
   /**
diff --git a/guava/src/com/google/common/graph/AbstractNetwork.java b/guava/src/com/google/common/graph/AbstractNetwork.java
index 904e2aa..648ee9b 100644
--- a/guava/src/com/google/common/graph/AbstractNetwork.java
+++ b/guava/src/com/google/common/graph/AbstractNetwork.java
@@ -108,6 +108,13 @@
       }
 
       @Override
+      public ElementOrder<N> incidentEdgeOrder() {
+        // TODO(b/142723300): Return AbstractNetwork.this.incidentEdgeOrder() once Network has that
+        //   method.
+        return ElementOrder.unordered();
+      }
+
+      @Override
       public boolean isDirected() {
         return AbstractNetwork.this.isDirected();
       }
@@ -219,7 +226,9 @@
 
   @Override
   public boolean hasEdgeConnecting(N nodeU, N nodeV) {
-    return !edgesConnecting(nodeU, nodeV).isEmpty();
+    checkNotNull(nodeU);
+    checkNotNull(nodeV);
+    return nodes().contains(nodeU) && successors(nodeU).contains(nodeV);
   }
 
   @Override
@@ -228,7 +237,7 @@
     if (!isOrderingCompatible(endpoints)) {
       return false;
     }
-    return !edgesConnecting(endpoints.nodeU(), endpoints.nodeV()).isEmpty();
+    return hasEdgeConnecting(endpoints.nodeU(), endpoints.nodeV());
   }
 
   /**
diff --git a/guava/src/com/google/common/graph/AbstractValueGraph.java b/guava/src/com/google/common/graph/AbstractValueGraph.java
index 4348b96..c83cff5 100644
--- a/guava/src/com/google/common/graph/AbstractValueGraph.java
+++ b/guava/src/com/google/common/graph/AbstractValueGraph.java
@@ -69,6 +69,11 @@
       }
 
       @Override
+      public ElementOrder<N> incidentEdgeOrder() {
+        return AbstractValueGraph.this.incidentEdgeOrder();
+      }
+
+      @Override
       public Set<N> adjacentNodes(N node) {
         return AbstractValueGraph.this.adjacentNodes(node);
       }
diff --git a/guava/src/com/google/common/graph/BaseGraph.java b/guava/src/com/google/common/graph/BaseGraph.java
index 3929ad0..1df5de7 100644
--- a/guava/src/com/google/common/graph/BaseGraph.java
+++ b/guava/src/com/google/common/graph/BaseGraph.java
@@ -56,6 +56,15 @@
   /** Returns the order of iteration for the elements of {@link #nodes()}. */
   ElementOrder<N> nodeOrder();
 
+  /**
+   * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of
+   * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link
+   * #successors(Object)} and {@link #incidentEdges(Object)}.
+   *
+   * @since 29.0
+   */
+  ElementOrder<N> incidentEdgeOrder();
+
   //
   // Element-level accessors
   //
@@ -63,6 +72,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this graph.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    */
   Set<N> adjacentNodes(N node);
@@ -95,6 +106,8 @@
   /**
    * Returns the edges in this graph whose endpoints include {@code node}.
    *
+   * <p>This is equal to the union of incoming and outgoing edges.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    * @since 24.0
    */
diff --git a/guava/src/com/google/common/graph/ConfigurableMutableGraph.java b/guava/src/com/google/common/graph/ConfigurableMutableGraph.java
deleted file mode 100644
index db6bca7..0000000
--- a/guava/src/com/google/common/graph/ConfigurableMutableGraph.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2016 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 com.google.common.graph.GraphConstants.Presence;
-
-/**
- * Configurable implementation of {@link MutableGraph} that supports both directed and undirected
- * graphs. Instances of this class should be constructed with {@link GraphBuilder}.
- *
- * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
- * which is in O(d_node) where d_node is the degree of {@code node}.
- *
- * @author James Sexton
- * @param <N> Node parameter type
- */
-final class ConfigurableMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
-  private final MutableValueGraph<N, Presence> backingValueGraph;
-
-  /** Constructs a {@link MutableGraph} with the properties specified in {@code builder}. */
-  ConfigurableMutableGraph(AbstractGraphBuilder<? super N> builder) {
-    this.backingValueGraph = new ConfigurableMutableValueGraph<>(builder);
-  }
-
-  @Override
-  protected BaseGraph<N> delegate() {
-    return backingValueGraph;
-  }
-
-  @Override
-  public boolean addNode(N node) {
-    return backingValueGraph.addNode(node);
-  }
-
-  @Override
-  public boolean putEdge(N nodeU, N nodeV) {
-    return backingValueGraph.putEdgeValue(nodeU, nodeV, Presence.EDGE_EXISTS) == null;
-  }
-
-  @Override
-  public boolean putEdge(EndpointPair<N> endpoints) {
-    validateEndpoints(endpoints);
-    return putEdge(endpoints.nodeU(), endpoints.nodeV());
-  }
-
-  @Override
-  public boolean removeNode(N node) {
-    return backingValueGraph.removeNode(node);
-  }
-
-  @Override
-  public boolean removeEdge(N nodeU, N nodeV) {
-    return backingValueGraph.removeEdge(nodeU, nodeV) != null;
-  }
-
-  @Override
-  public boolean removeEdge(EndpointPair<N> endpoints) {
-    validateEndpoints(endpoints);
-    return removeEdge(endpoints.nodeU(), endpoints.nodeV());
-  }
-}
diff --git a/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java b/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java
deleted file mode 100644
index 1fcacbe..0000000
--- a/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2016 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 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.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 com.google.common.collect.ImmutableList;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-
-/**
- * Configurable implementation of {@link MutableNetwork} that supports both directed and undirected
- * graphs. Instances of this class should be constructed with {@link NetworkBuilder}.
- *
- * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
- * which is in O(d_node) where d_node is the degree of {@code node}.
- *
- * @author James Sexton
- * @author Joshua O'Madadhain
- * @author Omar Darwish
- * @param <N> Node parameter type
- * @param <E> Edge parameter type
- */
-final class ConfigurableMutableNetwork<N, E> extends ConfigurableNetwork<N, E>
-    implements MutableNetwork<N, E> {
-
-  /** Constructs a mutable graph with the properties specified in {@code builder}. */
-  ConfigurableMutableNetwork(NetworkBuilder<? super N, ? super E> builder) {
-    super(builder);
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean addNode(N node) {
-    checkNotNull(node, "node");
-
-    if (containsNode(node)) {
-      return false;
-    }
-
-    addNodeInternal(node);
-    return true;
-  }
-
-  /**
-   * Adds {@code node} to the graph and returns the associated {@link NetworkConnections}.
-   *
-   * @throws IllegalStateException if {@code node} is already present
-   */
-  @CanIgnoreReturnValue
-  private NetworkConnections<N, E> addNodeInternal(N node) {
-    NetworkConnections<N, E> connections = newConnections();
-    checkState(nodeConnections.put(node, connections) == null);
-    return connections;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean addEdge(N nodeU, N nodeV, E edge) {
-    checkNotNull(nodeU, "nodeU");
-    checkNotNull(nodeV, "nodeV");
-    checkNotNull(edge, "edge");
-
-    if (containsEdge(edge)) {
-      EndpointPair<N> existingIncidentNodes = incidentNodes(edge);
-      EndpointPair<N> newIncidentNodes = EndpointPair.of(this, nodeU, nodeV);
-      checkArgument(
-          existingIncidentNodes.equals(newIncidentNodes),
-          REUSING_EDGE,
-          edge,
-          existingIncidentNodes,
-          newIncidentNodes);
-      return false;
-    }
-    NetworkConnections<N, E> connectionsU = nodeConnections.get(nodeU);
-    if (!allowsParallelEdges()) {
-      checkArgument(
-          !(connectionsU != null && connectionsU.successors().contains(nodeV)),
-          PARALLEL_EDGES_NOT_ALLOWED,
-          nodeU,
-          nodeV);
-    }
-    boolean isSelfLoop = nodeU.equals(nodeV);
-    if (!allowsSelfLoops()) {
-      checkArgument(!isSelfLoop, SELF_LOOPS_NOT_ALLOWED, nodeU);
-    }
-
-    if (connectionsU == null) {
-      connectionsU = addNodeInternal(nodeU);
-    }
-    connectionsU.addOutEdge(edge, nodeV);
-    NetworkConnections<N, E> connectionsV = nodeConnections.get(nodeV);
-    if (connectionsV == null) {
-      connectionsV = addNodeInternal(nodeV);
-    }
-    connectionsV.addInEdge(edge, nodeU, isSelfLoop);
-    edgeToReferenceNode.put(edge, nodeU);
-    return true;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean addEdge(EndpointPair<N> endpoints, E edge) {
-    validateEndpoints(endpoints);
-    return addEdge(endpoints.nodeU(), endpoints.nodeV(), edge);
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean removeNode(N node) {
-    checkNotNull(node, "node");
-
-    NetworkConnections<N, E> connections = nodeConnections.get(node);
-    if (connections == null) {
-      return false;
-    }
-
-    // Since views are returned, we need to copy the edges that will be removed.
-    // Thus we avoid modifying the underlying view while iterating over it.
-    for (E edge : ImmutableList.copyOf(connections.incidentEdges())) {
-      removeEdge(edge);
-    }
-    nodeConnections.remove(node);
-    return true;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean removeEdge(E edge) {
-    checkNotNull(edge, "edge");
-
-    N nodeU = edgeToReferenceNode.get(edge);
-    if (nodeU == null) {
-      return false;
-    }
-
-    NetworkConnections<N, E> connectionsU = nodeConnections.get(nodeU);
-    N nodeV = connectionsU.adjacentNode(edge);
-    NetworkConnections<N, E> connectionsV = nodeConnections.get(nodeV);
-    connectionsU.removeOutEdge(edge);
-    connectionsV.removeInEdge(edge, allowsSelfLoops() && nodeU.equals(nodeV));
-    edgeToReferenceNode.remove(edge);
-    return true;
-  }
-
-  private NetworkConnections<N, E> newConnections() {
-    return isDirected()
-        ? allowsParallelEdges()
-            ? DirectedMultiNetworkConnections.<N, E>of()
-            : DirectedNetworkConnections.<N, E>of()
-        : allowsParallelEdges()
-            ? UndirectedMultiNetworkConnections.<N, E>of()
-            : UndirectedNetworkConnections.<N, E>of();
-  }
-}
diff --git a/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java b/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java
deleted file mode 100644
index 38b31b7..0000000
--- a/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2016 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 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.graph.GraphConstants.SELF_LOOPS_NOT_ALLOWED;
-import static com.google.common.graph.Graphs.checkNonNegative;
-import static com.google.common.graph.Graphs.checkPositive;
-
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-
-/**
- * Configurable implementation of {@link MutableValueGraph} that supports both directed and
- * undirected graphs. Instances of this class should be constructed with {@link ValueGraphBuilder}.
- *
- * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
- * which is in O(d_node) where d_node is the degree of {@code node}.
- *
- * @author James Sexton
- * @author Joshua O'Madadhain
- * @author Omar Darwish
- * @param <N> Node parameter type
- * @param <V> Value parameter type
- */
-final class ConfigurableMutableValueGraph<N, V> extends ConfigurableValueGraph<N, V>
-    implements MutableValueGraph<N, V> {
-
-  /** Constructs a mutable graph with the properties specified in {@code builder}. */
-  ConfigurableMutableValueGraph(AbstractGraphBuilder<? super N> builder) {
-    super(builder);
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean addNode(N node) {
-    checkNotNull(node, "node");
-
-    if (containsNode(node)) {
-      return false;
-    }
-
-    addNodeInternal(node);
-    return true;
-  }
-
-  /**
-   * Adds {@code node} to the graph and returns the associated {@link GraphConnections}.
-   *
-   * @throws IllegalStateException if {@code node} is already present
-   */
-  @CanIgnoreReturnValue
-  private GraphConnections<N, V> addNodeInternal(N node) {
-    GraphConnections<N, V> connections = newConnections();
-    checkState(nodeConnections.put(node, connections) == null);
-    return connections;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public V putEdgeValue(N nodeU, N nodeV, V value) {
-    checkNotNull(nodeU, "nodeU");
-    checkNotNull(nodeV, "nodeV");
-    checkNotNull(value, "value");
-
-    if (!allowsSelfLoops()) {
-      checkArgument(!nodeU.equals(nodeV), SELF_LOOPS_NOT_ALLOWED, nodeU);
-    }
-
-    GraphConnections<N, V> connectionsU = nodeConnections.get(nodeU);
-    if (connectionsU == null) {
-      connectionsU = addNodeInternal(nodeU);
-    }
-    V previousValue = connectionsU.addSuccessor(nodeV, value);
-    GraphConnections<N, V> connectionsV = nodeConnections.get(nodeV);
-    if (connectionsV == null) {
-      connectionsV = addNodeInternal(nodeV);
-    }
-    connectionsV.addPredecessor(nodeU, value);
-    if (previousValue == null) {
-      checkPositive(++edgeCount);
-    }
-    return previousValue;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public V putEdgeValue(EndpointPair<N> endpoints, V value) {
-    validateEndpoints(endpoints);
-    return putEdgeValue(endpoints.nodeU(), endpoints.nodeV(), value);
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public boolean removeNode(N node) {
-    checkNotNull(node, "node");
-
-    GraphConnections<N, V> connections = nodeConnections.get(node);
-    if (connections == null) {
-      return false;
-    }
-
-    if (allowsSelfLoops()) {
-      // Remove self-loop (if any) first, so we don't get CME while removing incident edges.
-      if (connections.removeSuccessor(node) != null) {
-        connections.removePredecessor(node);
-        --edgeCount;
-      }
-    }
-
-    for (N successor : connections.successors()) {
-      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);
-        --edgeCount;
-      }
-    }
-    nodeConnections.remove(node);
-    checkNonNegative(edgeCount);
-    return true;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public V removeEdge(N nodeU, N nodeV) {
-    checkNotNull(nodeU, "nodeU");
-    checkNotNull(nodeV, "nodeV");
-
-    GraphConnections<N, V> connectionsU = nodeConnections.get(nodeU);
-    GraphConnections<N, V> connectionsV = nodeConnections.get(nodeV);
-    if (connectionsU == null || connectionsV == null) {
-      return null;
-    }
-
-    V previousValue = connectionsU.removeSuccessor(nodeV);
-    if (previousValue != null) {
-      connectionsV.removePredecessor(nodeU);
-      checkNonNegative(--edgeCount);
-    }
-    return previousValue;
-  }
-
-  @Override
-  @CanIgnoreReturnValue
-  public V removeEdge(EndpointPair<N> endpoints) {
-    validateEndpoints(endpoints);
-    return removeEdge(endpoints.nodeU(), endpoints.nodeV());
-  }
-
-  private GraphConnections<N, V> newConnections() {
-    return isDirected()
-        ? DirectedGraphConnections.<N, V>of()
-        : UndirectedGraphConnections.<N, V>of();
-  }
-}
diff --git a/guava/src/com/google/common/graph/DirectedGraphConnections.java b/guava/src/com/google/common/graph/DirectedGraphConnections.java
index 0c86a75..3838bcf 100644
--- a/guava/src/com/google/common/graph/DirectedGraphConnections.java
+++ b/guava/src/com/google/common/graph/DirectedGraphConnections.java
@@ -16,6 +16,7 @@
 
 package com.google.common.graph;
 
+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.graph.GraphConstants.INNER_CAPACITY;
@@ -23,22 +24,29 @@
 import static com.google.common.graph.Graphs.checkNonNegative;
 import static com.google.common.graph.Graphs.checkPositive;
 
+import com.google.common.base.Function;
 import com.google.common.collect.AbstractIterator;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
 import java.util.AbstractSet;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An implementation of {@link GraphConnections} for directed graphs.
  *
  * @author James Sexton
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
@@ -55,18 +63,88 @@
     }
   }
 
+  /**
+   * A value class representing single connection between the origin node and another node.
+   *
+   * <p>There can be two types of connections (predecessor and successor), which is represented by
+   * the two implementations.
+   */
+  private abstract static class NodeConnection<N> {
+    final N node;
+
+    NodeConnection(N node) {
+      this.node = checkNotNull(node);
+    }
+
+    static final class Pred<N> extends NodeConnection<N> {
+      Pred(N node) {
+        super(node);
+      }
+
+      @Override
+      public boolean equals(Object that) {
+        if (that instanceof Pred) {
+          return this.node.equals(((Pred<?>) that).node);
+        } else {
+          return false;
+        }
+      }
+
+      @Override
+      public int hashCode() {
+        // Adding the class hashCode to avoid a clash with Succ instances.
+        return Pred.class.hashCode() + node.hashCode();
+      }
+    }
+
+    static final class Succ<N> extends NodeConnection<N> {
+      Succ(N node) {
+        super(node);
+      }
+
+      @Override
+      public boolean equals(Object that) {
+        if (that instanceof Succ) {
+          return this.node.equals(((Succ<?>) that).node);
+        } else {
+          return false;
+        }
+      }
+
+      @Override
+      public int hashCode() {
+        // Adding the class hashCode to avoid a clash with Pred instances.
+        return Succ.class.hashCode() + node.hashCode();
+      }
+    }
+  }
+
   private static final Object PRED = new Object();
 
   // Every value in this map must either be an instance of PredAndSucc with a successorValue of
   // type V, PRED (representing predecessor), or an instance of type V (representing successor).
   private final Map<N, Object> adjacentNodeValues;
 
+  /**
+   * All node connections in this graph, in edge insertion order.
+   *
+   * <p>Note: This field and {@link #adjacentNodeValues} cannot be combined into a single
+   * LinkedHashMap because one target node may be mapped to both a predecessor and a successor. A
+   * 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;
+
   private int predecessorCount;
   private int successorCount;
 
   private DirectedGraphConnections(
-      Map<N, Object> adjacentNodeValues, int predecessorCount, int successorCount) {
+      Map<N, Object> adjacentNodeValues,
+      @Nullable List<NodeConnection<N>> orderedNodeConnections,
+      int predecessorCount,
+      int successorCount) {
     this.adjacentNodeValues = checkNotNull(adjacentNodeValues);
+    this.orderedNodeConnections = orderedNodeConnections;
     this.predecessorCount = checkNonNegative(predecessorCount);
     this.successorCount = checkNonNegative(successorCount);
     checkState(
@@ -74,30 +152,120 @@
             && successorCount <= adjacentNodeValues.size());
   }
 
-  static <N, V> DirectedGraphConnections<N, V> of() {
+  static <N, V> DirectedGraphConnections<N, V> of(ElementOrder<N> incidentEdgeOrder) {
     // We store predecessors and successors in the same map, so double the initial capacity.
     int initialCapacity = INNER_CAPACITY * 2;
-    return new DirectedGraphConnections<>(
-        new HashMap<N, Object>(initialCapacity, INNER_LOAD_FACTOR), 0, 0);
+
+    List<NodeConnection<N>> orderedNodeConnections;
+    switch (incidentEdgeOrder.type()) {
+      case UNORDERED:
+        orderedNodeConnections = null;
+        break;
+      case STABLE:
+        orderedNodeConnections = new ArrayList<NodeConnection<N>>();
+        break;
+      default:
+        throw new AssertionError(incidentEdgeOrder.type());
+    }
+
+    return new DirectedGraphConnections<N, V>(
+        /* adjacentNodeValues = */ new HashMap<N, Object>(initialCapacity, INNER_LOAD_FACTOR),
+        orderedNodeConnections,
+        /* predecessorCount = */ 0,
+        /* successorCount = */ 0);
   }
 
   static <N, V> DirectedGraphConnections<N, V> ofImmutable(
-      Set<N> predecessors, Map<N, V> successorValues) {
+      N thisNode, Iterable<EndpointPair<N>> incidentEdges, Function<N, V> successorNodeToValueFn) {
+    checkNotNull(thisNode);
+    checkNotNull(successorNodeToValueFn);
+
     Map<N, Object> adjacentNodeValues = new HashMap<>();
-    adjacentNodeValues.putAll(successorValues);
-    for (N predecessor : predecessors) {
-      Object value = adjacentNodeValues.put(predecessor, PRED);
-      if (value != null) {
-        adjacentNodeValues.put(predecessor, new PredAndSucc(value));
+    ImmutableList.Builder<NodeConnection<N>> orderedNodeConnectionsBuilder =
+        ImmutableList.builder();
+    int predecessorCount = 0;
+    int successorCount = 0;
+
+    for (EndpointPair<N> incidentEdge : incidentEdges) {
+      if (incidentEdge.nodeU().equals(thisNode) && incidentEdge.nodeV().equals(thisNode)) {
+        // incidentEdge is a self-loop
+
+        adjacentNodeValues.put(thisNode, new PredAndSucc(successorNodeToValueFn.apply(thisNode)));
+
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Pred<>(thisNode));
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Succ<>(thisNode));
+        predecessorCount++;
+        successorCount++;
+      } else if (incidentEdge.nodeV().equals(thisNode)) { // incidentEdge is an inEdge
+        N predecessor = incidentEdge.nodeU();
+
+        Object existingValue = adjacentNodeValues.put(predecessor, PRED);
+        if (existingValue != null) {
+          adjacentNodeValues.put(predecessor, new PredAndSucc(existingValue));
+        }
+
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Pred<>(predecessor));
+        predecessorCount++;
+      } else { // incidentEdge is an outEdge
+        checkArgument(incidentEdge.nodeU().equals(thisNode));
+
+        N successor = incidentEdge.nodeV();
+        V value = successorNodeToValueFn.apply(successor);
+
+        Object existingValue = adjacentNodeValues.put(successor, value);
+        if (existingValue != null) {
+          checkArgument(existingValue == PRED);
+          adjacentNodeValues.put(successor, new PredAndSucc(value));
+        }
+
+        orderedNodeConnectionsBuilder.add(new NodeConnection.Succ<>(successor));
+        successorCount++;
       }
     }
+
     return new DirectedGraphConnections<>(
-        ImmutableMap.copyOf(adjacentNodeValues), predecessors.size(), successorValues.size());
+        adjacentNodeValues,
+        orderedNodeConnectionsBuilder.build(),
+        predecessorCount,
+        successorCount);
   }
 
   @Override
   public Set<N> adjacentNodes() {
-    return Collections.unmodifiableSet(adjacentNodeValues.keySet());
+    if (orderedNodeConnections == null) {
+      return Collections.unmodifiableSet(adjacentNodeValues.keySet());
+    } else {
+      return new AbstractSet<N>() {
+        @Override
+        public UnmodifiableIterator<N> iterator() {
+          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          final Set<N> seenNodes = new HashSet<>();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (nodeConnections.hasNext()) {
+                NodeConnection<N> nodeConnection = nodeConnections.next();
+                boolean added = seenNodes.add(nodeConnection.node);
+                if (added) {
+                  return nodeConnection.node;
+                }
+              }
+              return endOfData();
+            }
+          };
+        }
+
+        @Override
+        public int size() {
+          return adjacentNodeValues.size();
+        }
+
+        @Override
+        public boolean contains(@Nullable Object obj) {
+          return adjacentNodeValues.containsKey(obj);
+        }
+      };
+    }
   }
 
   @Override
@@ -105,19 +273,35 @@
     return new AbstractSet<N>() {
       @Override
       public UnmodifiableIterator<N> iterator() {
-        final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
-        return new AbstractIterator<N>() {
-          @Override
-          protected N computeNext() {
-            while (entries.hasNext()) {
-              Entry<N, Object> entry = entries.next();
-              if (isPredecessor(entry.getValue())) {
-                return entry.getKey();
+        if (orderedNodeConnections == null) {
+          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (entries.hasNext()) {
+                Entry<N, Object> entry = entries.next();
+                if (isPredecessor(entry.getValue())) {
+                  return entry.getKey();
+                }
               }
+              return endOfData();
             }
-            return endOfData();
-          }
-        };
+          };
+        } else {
+          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (nodeConnections.hasNext()) {
+                NodeConnection<N> nodeConnection = nodeConnections.next();
+                if (nodeConnection instanceof NodeConnection.Pred) {
+                  return nodeConnection.node;
+                }
+              }
+              return endOfData();
+            }
+          };
+        }
       }
 
       @Override
@@ -137,19 +321,35 @@
     return new AbstractSet<N>() {
       @Override
       public UnmodifiableIterator<N> iterator() {
-        final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
-        return new AbstractIterator<N>() {
-          @Override
-          protected N computeNext() {
-            while (entries.hasNext()) {
-              Entry<N, Object> entry = entries.next();
-              if (isSuccessor(entry.getValue())) {
-                return entry.getKey();
+        if (orderedNodeConnections == null) {
+          final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (entries.hasNext()) {
+                Entry<N, Object> entry = entries.next();
+                if (isSuccessor(entry.getValue())) {
+                  return entry.getKey();
+                }
               }
+              return endOfData();
             }
-            return endOfData();
-          }
-        };
+          };
+        } else {
+          final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
+          return new AbstractIterator<N>() {
+            @Override
+            protected N computeNext() {
+              while (nodeConnections.hasNext()) {
+                NodeConnection<N> nodeConnection = nodeConnections.next();
+                if (nodeConnection instanceof NodeConnection.Succ) {
+                  return nodeConnection.node;
+                }
+              }
+              return endOfData();
+            }
+          };
+        }
       }
 
       @Override
@@ -164,9 +364,69 @@
     };
   }
 
+  @Override
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+    checkNotNull(thisNode);
+
+    final Iterator<EndpointPair<N>> resultWithDoubleSelfLoop;
+    if (orderedNodeConnections == null) {
+      resultWithDoubleSelfLoop =
+          Iterators.concat(
+              Iterators.transform(
+                  predecessors().iterator(),
+                  new Function<N, EndpointPair<N>>() {
+                    @Override
+                    public EndpointPair<N> apply(N predecessor) {
+                      return EndpointPair.ordered(predecessor, thisNode);
+                    }
+                  }),
+              Iterators.transform(
+                  successors().iterator(),
+                  new Function<N, EndpointPair<N>>() {
+                    @Override
+                    public EndpointPair<N> apply(N successor) {
+                      return EndpointPair.ordered(thisNode, successor);
+                    }
+                  }));
+    } else {
+      resultWithDoubleSelfLoop =
+          Iterators.transform(
+              orderedNodeConnections.iterator(),
+              new Function<NodeConnection<N>, EndpointPair<N>>() {
+                @Override
+                public EndpointPair<N> apply(NodeConnection<N> connection) {
+                  if (connection instanceof NodeConnection.Succ) {
+                    return EndpointPair.ordered(thisNode, connection.node);
+                  } else {
+                    return EndpointPair.ordered(connection.node, thisNode);
+                  }
+                }
+              });
+    }
+
+    final AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
+    return new AbstractIterator<EndpointPair<N>>() {
+      @Override
+      protected EndpointPair<N> computeNext() {
+        while (resultWithDoubleSelfLoop.hasNext()) {
+          EndpointPair<N> edge = resultWithDoubleSelfLoop.next();
+          if (edge.nodeU().equals(edge.nodeV())) {
+            if (!alreadySeenSelfLoop.getAndSet(true)) {
+              return edge;
+            }
+          } else {
+            return edge;
+          }
+        }
+        return endOfData();
+      }
+    };
+  }
+
   @SuppressWarnings("unchecked")
   @Override
   public V value(N node) {
+    checkNotNull(node);
     Object value = adjacentNodeValues.get(node);
     if (value == PRED) {
       return null;
@@ -180,45 +440,83 @@
   @SuppressWarnings("unchecked")
   @Override
   public void removePredecessor(N node) {
+    checkNotNull(node);
+
     Object previousValue = adjacentNodeValues.get(node);
+    boolean removedPredecessor;
+
     if (previousValue == PRED) {
       adjacentNodeValues.remove(node);
-      checkNonNegative(--predecessorCount);
+      removedPredecessor = true;
     } else if (previousValue instanceof PredAndSucc) {
       adjacentNodeValues.put((N) node, ((PredAndSucc) previousValue).successorValue);
+      removedPredecessor = true;
+    } else {
+      removedPredecessor = false;
+    }
+
+    if (removedPredecessor) {
       checkNonNegative(--predecessorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.remove(new NodeConnection.Pred<>(node));
+      }
     }
   }
 
   @SuppressWarnings("unchecked")
   @Override
   public V removeSuccessor(Object node) {
+    checkNotNull(node);
     Object previousValue = adjacentNodeValues.get(node);
+    Object removedValue;
+
     if (previousValue == null || previousValue == PRED) {
-      return null;
+      removedValue = null;
     } else if (previousValue instanceof PredAndSucc) {
       adjacentNodeValues.put((N) node, PRED);
-      checkNonNegative(--successorCount);
-      return (V) ((PredAndSucc) previousValue).successorValue;
+      removedValue = ((PredAndSucc) previousValue).successorValue;
     } else { // successor
       adjacentNodeValues.remove(node);
-      checkNonNegative(--successorCount);
-      return (V) previousValue;
+      removedValue = previousValue;
     }
+
+    if (removedValue != null) {
+      checkNonNegative(--successorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.remove(new NodeConnection.Succ<>((N) node));
+      }
+    }
+
+    return (V) removedValue;
   }
 
   @Override
   public void addPredecessor(N node, V unused) {
     Object previousValue = adjacentNodeValues.put(node, PRED);
+    boolean addedPredecessor;
+
     if (previousValue == null) {
-      checkPositive(++predecessorCount);
+      addedPredecessor = true;
     } else if (previousValue instanceof PredAndSucc) {
       // Restore previous PredAndSucc object.
       adjacentNodeValues.put(node, previousValue);
+      addedPredecessor = false;
     } else if (previousValue != PRED) { // successor
       // Do NOT use method parameter value 'unused'. In directed graphs, successors store the value.
       adjacentNodeValues.put(node, new PredAndSucc(previousValue));
+      addedPredecessor = true;
+    } else {
+      addedPredecessor = false;
+    }
+
+    if (addedPredecessor) {
       checkPositive(++predecessorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.add(new NodeConnection.Pred<>(node));
+      }
     }
   }
 
@@ -226,19 +524,29 @@
   @Override
   public V addSuccessor(N node, V value) {
     Object previousValue = adjacentNodeValues.put(node, value);
+    Object previousSuccessor;
+
     if (previousValue == null) {
-      checkPositive(++successorCount);
-      return null;
+      previousSuccessor = null;
     } else if (previousValue instanceof PredAndSucc) {
       adjacentNodeValues.put(node, new PredAndSucc(value));
-      return (V) ((PredAndSucc) previousValue).successorValue;
+      previousSuccessor = ((PredAndSucc) previousValue).successorValue;
     } else if (previousValue == PRED) {
       adjacentNodeValues.put(node, new PredAndSucc(value));
-      checkPositive(++successorCount);
-      return null;
+      previousSuccessor = null;
     } else { // successor
-      return (V) previousValue;
+      previousSuccessor = previousValue;
     }
+
+    if (previousSuccessor == null) {
+      checkPositive(++successorCount);
+
+      if (orderedNodeConnections != null) {
+        orderedNodeConnections.add(new NodeConnection.Succ<>(node));
+      }
+    }
+
+    return (V) previousSuccessor;
   }
 
   private static boolean isPredecessor(@Nullable Object value) {
diff --git a/guava/src/com/google/common/graph/ElementOrder.java b/guava/src/com/google/common/graph/ElementOrder.java
index 54fe186..257bdd6 100644
--- a/guava/src/com/google/common/graph/ElementOrder.java
+++ b/guava/src/com/google/common/graph/ElementOrder.java
@@ -57,12 +57,15 @@
    *
    * <ul>
    *   <li>UNORDERED: no order is guaranteed.
+   *   <li>STABLE: ordering is guaranteed to follow a pattern that won't change between releases.
+   *       Some methods may have stronger guarantees.
    *   <li>INSERTION: insertion ordering is guaranteed.
    *   <li>SORTED: ordering according to a supplied comparator is guaranteed.
    * </ul>
    */
   public enum Type {
     UNORDERED,
+    STABLE,
     INSERTION,
     SORTED
   }
@@ -78,6 +81,46 @@
     return new ElementOrder<S>(Type.UNORDERED, null);
   }
 
+  /**
+   * Returns an instance which specifies that ordering is guaranteed to be always be the same across
+   * iterations, and across releases. Some methods may have stronger guarantees.
+   *
+   * <p>This instance is only useful in combination with {@code incidentEdgeOrder}, e.g. {@code
+   * graphBuilder.incidentEdgeOrder(ElementOrder.stable())}.
+   *
+   * <h3>In combination with {@code incidentEdgeOrder}</h3>
+   *
+   * <p>{@code incidentEdgeOrder(ElementOrder.stable())} guarantees the ordering of the returned
+   * collections of the following methods:
+   *
+   * <ul>
+   *   <li>For {@link Graph} and {@link ValueGraph}:
+   *       <ul>
+   *         <li>{@code edges()}: Stable order
+   *         <li>{@code adjacentNodes(node)}: Connecting edge insertion order
+   *         <li>{@code predecessors(node)}: Connecting edge insertion order
+   *         <li>{@code successors(node)}: Connecting edge insertion order
+   *         <li>{@code incidentEdges(node)}: Edge insertion order
+   *       </ul>
+   *   <li>For {@link Network}:
+   *       <ul>
+   *         <li>{@code adjacentNodes(node)}: Stable order
+   *         <li>{@code predecessors(node)}: Connecting edge insertion order
+   *         <li>{@code successors(node)}: Connecting edge insertion order
+   *         <li>{@code incidentEdges(node)}: Stable order
+   *         <li>{@code inEdges(node)}: Edge insertion order
+   *         <li>{@code outEdges(node)}: Edge insertion order
+   *         <li>{@code adjacentEdges(edge)}: Stable order
+   *         <li>{@code edgesConnecting(nodeU, nodeV)}: Edge insertion order
+   *       </ul>
+   * </ul>
+   *
+   * @since 29.0
+   */
+  public static <S> ElementOrder<S> stable() {
+    return new ElementOrder<S>(Type.STABLE, null);
+  }
+
   /** Returns an instance which specifies that insertion ordering is guaranteed. */
   public static <S> ElementOrder<S> insertion() {
     return new ElementOrder<S>(Type.INSERTION, null);
@@ -95,7 +138,7 @@
    * determined by {@code comparator}.
    */
   public static <S> ElementOrder<S> sorted(Comparator<S> comparator) {
-    return new ElementOrder<S>(Type.SORTED, comparator);
+    return new ElementOrder<S>(Type.SORTED, checkNotNull(comparator));
   }
 
   /** Returns the type of ordering used. */
@@ -148,6 +191,7 @@
       case UNORDERED:
         return Maps.newHashMapWithExpectedSize(expectedSize);
       case INSERTION:
+      case STABLE:
         return Maps.newLinkedHashMapWithExpectedSize(expectedSize);
       case SORTED:
         return Maps.newTreeMap(comparator());
diff --git a/guava/src/com/google/common/graph/ForwardingGraph.java b/guava/src/com/google/common/graph/ForwardingGraph.java
index a72abc0..4a3ab8c 100644
--- a/guava/src/com/google/common/graph/ForwardingGraph.java
+++ b/guava/src/com/google/common/graph/ForwardingGraph.java
@@ -58,6 +58,11 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return delegate().incidentEdgeOrder();
+  }
+
+  @Override
   public Set<N> adjacentNodes(N node) {
     return delegate().adjacentNodes(node);
   }
@@ -73,6 +78,11 @@
   }
 
   @Override
+  public Set<EndpointPair<N>> incidentEdges(N node) {
+    return delegate().incidentEdges(node);
+  }
+
+  @Override
   public int degree(N node) {
     return delegate().degree(node);
   }
diff --git a/guava/src/com/google/common/graph/ForwardingValueGraph.java b/guava/src/com/google/common/graph/ForwardingValueGraph.java
index 3020c9e..8db773f 100644
--- a/guava/src/com/google/common/graph/ForwardingValueGraph.java
+++ b/guava/src/com/google/common/graph/ForwardingValueGraph.java
@@ -61,6 +61,11 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return delegate().incidentEdgeOrder();
+  }
+
+  @Override
   public Set<N> adjacentNodes(N node) {
     return delegate().adjacentNodes(node);
   }
diff --git a/guava/src/com/google/common/graph/Graph.java b/guava/src/com/google/common/graph/Graph.java
index 3417aa9..84f9695 100644
--- a/guava/src/com/google/common/graph/Graph.java
+++ b/guava/src/com/google/common/graph/Graph.java
@@ -17,6 +17,8 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
+import java.util.Collection;
 import java.util.Set;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -100,6 +102,7 @@
  * @since 20.0
  */
 @Beta
+@DoNotMock("Use GraphBuilder to create a real instance")
 public interface Graph<N> extends BaseGraph<N> {
   //
   // Graph-level accessors
@@ -137,6 +140,16 @@
   @Override
   ElementOrder<N> nodeOrder();
 
+  /**
+   * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of
+   * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link
+   * #successors(Object)} and {@link #incidentEdges(Object)}.
+   *
+   * @since 29.0
+   */
+  @Override
+  ElementOrder<N> incidentEdgeOrder();
+
   //
   // Element-level accessors
   //
@@ -144,6 +157,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this graph.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    */
   @Override
@@ -177,6 +192,8 @@
   /**
    * Returns the edges in this graph whose endpoints include {@code node}.
    *
+   * <p>This is equal to the union of incoming and outgoing edges.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    * @since 24.0
    */
diff --git a/guava/src/com/google/common/graph/GraphBuilder.java b/guava/src/com/google/common/graph/GraphBuilder.java
index e285866..f00d7b1 100644
--- a/guava/src/com/google/common/graph/GraphBuilder.java
+++ b/guava/src/com/google/common/graph/GraphBuilder.java
@@ -16,14 +16,17 @@
 
 package com.google.common.graph;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.graph.Graphs.checkNonNegative;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
- * A builder for constructing instances of {@link MutableGraph} with user-defined properties.
+ * A builder for constructing instances of {@link MutableGraph} or {@link ImmutableGraph} with
+ * user-defined properties.
  *
  * <p>A graph built by this class will have the following properties by default:
  *
@@ -32,13 +35,24 @@
  *   <li>orders {@link Graph#nodes()} in the order in which the elements were added
  * </ul>
  *
- * <p>Example of use:
+ * <p>Examples of use:
  *
  * <pre>{@code
+ * // Building a mutable graph
  * MutableGraph<String> graph = GraphBuilder.undirected().allowsSelfLoops(true).build();
  * graph.putEdge("bread", "bread");
  * graph.putEdge("chocolate", "peanut butter");
  * graph.putEdge("peanut butter", "jelly");
+ *
+ * // Building an immutable graph
+ * ImmutableGraph<String> immutableGraph =
+ *     GraphBuilder.undirected()
+ *         .allowsSelfLoops(true)
+ *         .<String>immutable()
+ *         .putEdge("bread", "bread")
+ *         .putEdge("chocolate", "peanut butter")
+ *         .putEdge("peanut butter", "jelly")
+ *         .build();
  * }</pre>
  *
  * @author James Sexton
@@ -49,6 +63,7 @@
  * @since 20.0
  */
 @Beta
+@DoNotMock
 public final class GraphBuilder<N> extends AbstractGraphBuilder<N> {
 
   /** Creates a new instance with the specified edge directionality. */
@@ -76,13 +91,31 @@
   public static <N> GraphBuilder<N> from(Graph<N> graph) {
     return new GraphBuilder<N>(graph.isDirected())
         .allowsSelfLoops(graph.allowsSelfLoops())
-        .nodeOrder(graph.nodeOrder());
+        .nodeOrder(graph.nodeOrder())
+        .incidentEdgeOrder(graph.incidentEdgeOrder());
+  }
+
+  /**
+   * Returns an {@link ImmutableGraph.Builder} with the properties of this {@link GraphBuilder}.
+   *
+   * <p>The returned builder can be used for populating an {@link ImmutableGraph}.
+   *
+   * <p>Note that the returned builder will always have {@link #incidentEdgeOrder} set to {@link
+   * ElementOrder#stable()}, regardless of the value that was set in this builder.
+   *
+   * @since 28.0
+   */
+  public <N1 extends N> ImmutableGraph.Builder<N1> immutable() {
+    GraphBuilder<N1> castBuilder = cast();
+    return new ImmutableGraph.Builder<>(castBuilder);
   }
 
   /**
    * Specifies whether the graph will allow self-loops (edges that connect a node to itself).
    * Attempting to add a self-loop to a graph that does not allow them will throw an {@link
    * UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public GraphBuilder<N> allowsSelfLoops(boolean allowsSelfLoops) {
     this.allowsSelfLoops = allowsSelfLoops;
@@ -99,16 +132,54 @@
     return this;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Graph#nodes()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Graph#nodes()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <N1 extends N> GraphBuilder<N1> nodeOrder(ElementOrder<N1> nodeOrder) {
     GraphBuilder<N1> newBuilder = cast();
     newBuilder.nodeOrder = checkNotNull(nodeOrder);
     return newBuilder;
   }
 
+  /**
+   * Specifies the order of iteration for the elements of {@link Graph#edges()}, {@link
+   * Graph#adjacentNodes(Object)}, {@link Graph#predecessors(Object)}, {@link
+   * Graph#successors(Object)} and {@link Graph#incidentEdges(Object)}.
+   *
+   * <p>The default value is {@link ElementOrder#unordered() unordered} for mutable graphs. For
+   * immutable graphs, this value is ignored; they always have a {@link ElementOrder#stable()
+   * stable} order.
+   *
+   * @throws IllegalArgumentException if {@code incidentEdgeOrder} is not either {@code
+   *     ElementOrder.unordered()} or {@code ElementOrder.stable()}.
+   * @since 29.0
+   */
+  public <N1 extends N> GraphBuilder<N1> incidentEdgeOrder(ElementOrder<N1> incidentEdgeOrder) {
+    checkArgument(
+        incidentEdgeOrder.type() == ElementOrder.Type.UNORDERED
+            || incidentEdgeOrder.type() == ElementOrder.Type.STABLE,
+        "The given elementOrder (%s) is unsupported. incidentEdgeOrder() only supports"
+            + " ElementOrder.unordered() and ElementOrder.stable().",
+        incidentEdgeOrder);
+    GraphBuilder<N1> newBuilder = cast();
+    newBuilder.incidentEdgeOrder = checkNotNull(incidentEdgeOrder);
+    return newBuilder;
+  }
+
   /** Returns an empty {@link MutableGraph} with the properties of this {@link GraphBuilder}. */
   public <N1 extends N> MutableGraph<N1> build() {
-    return new ConfigurableMutableGraph<N1>(this);
+    return new StandardMutableGraph<N1>(this);
+  }
+
+  GraphBuilder<N> copy() {
+    GraphBuilder<N> newBuilder = new GraphBuilder<>(directed);
+    newBuilder.allowsSelfLoops = allowsSelfLoops;
+    newBuilder.nodeOrder = nodeOrder;
+    newBuilder.expectedNodeCount = expectedNodeCount;
+    newBuilder.incidentEdgeOrder = incidentEdgeOrder;
+    return newBuilder;
   }
 
   @SuppressWarnings("unchecked")
diff --git a/guava/src/com/google/common/graph/GraphConnections.java b/guava/src/com/google/common/graph/GraphConnections.java
index e4b3aa7..bed5508 100644
--- a/guava/src/com/google/common/graph/GraphConnections.java
+++ b/guava/src/com/google/common/graph/GraphConnections.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.Iterator;
 import java.util.Set;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -37,6 +38,13 @@
   Set<N> successors();
 
   /**
+   * Returns an iterator over the incident edges.
+   *
+   * @param thisNode The node that this all of the connections in this class are connected to.
+   */
+  Iterator<EndpointPair<N>> incidentEdgeIterator(N thisNode);
+
+  /**
    * Returns the value associated with the edge connecting the origin node to {@code node}, or null
    * if there is no such edge.
    */
diff --git a/guava/src/com/google/common/graph/Graphs.java b/guava/src/com/google/common/graph/Graphs.java
index 34a5cc4..35f0efe 100644
--- a/guava/src/com/google/common/graph/Graphs.java
+++ b/guava/src/com/google/common/graph/Graphs.java
@@ -20,18 +20,18 @@
 import static com.google.common.graph.GraphConstants.NODE_NOT_IN_GRAPH;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.ArrayDeque;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashSet;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Queue;
 import java.util.Set;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -191,20 +191,7 @@
    */
   public static <N> Set<N> reachableNodes(Graph<N> graph, N node) {
     checkArgument(graph.nodes().contains(node), NODE_NOT_IN_GRAPH, node);
-    Set<N> visitedNodes = new LinkedHashSet<N>();
-    Queue<N> queuedNodes = new ArrayDeque<N>();
-    visitedNodes.add(node);
-    queuedNodes.add(node);
-    // Perform a breadth-first traversal rooted at the input node.
-    while (!queuedNodes.isEmpty()) {
-      N currentNode = queuedNodes.remove();
-      for (N successor : graph.successors(currentNode)) {
-        if (visitedNodes.add(successor)) {
-          queuedNodes.add(successor);
-        }
-      }
-    }
-    return Collections.unmodifiableSet(visitedNodes);
+    return ImmutableSet.copyOf(Traverser.forGraph(graph).breadthFirst(node));
   }
 
   // Graph mutation methods
@@ -291,6 +278,23 @@
     }
 
     @Override
+    public Set<EndpointPair<N>> incidentEdges(N node) {
+      return new IncidentEdgeSet<N>(this, node) {
+        @Override
+        public Iterator<EndpointPair<N>> iterator() {
+          return Iterators.transform(
+              delegate().incidentEdges(node).iterator(),
+              new Function<EndpointPair<N>, EndpointPair<N>>() {
+                @Override
+                public EndpointPair<N> apply(EndpointPair<N> edge) {
+                  return EndpointPair.of(delegate(), edge.nodeV(), edge.nodeU());
+                }
+              });
+        }
+      };
+    }
+
+    @Override
     public int inDegree(N node) {
       return delegate().outDegree(node); // transpose
     }
diff --git a/guava/src/com/google/common/graph/ImmutableGraph.java b/guava/src/com/google/common/graph/ImmutableGraph.java
index c878a5c..4027ca8 100644
--- a/guava/src/com/google/common/graph/ImmutableGraph.java
+++ b/guava/src/com/google/common/graph/ImmutableGraph.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.common.graph.GraphConstants.Presence;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 
 /**
@@ -38,6 +39,7 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  * @author Omar Darwish
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @since 20.0
  */
@@ -56,7 +58,7 @@
     return (graph instanceof ImmutableGraph)
         ? (ImmutableGraph<N>) graph
         : new ImmutableGraph<N>(
-            new ConfigurableValueGraph<N, Presence>(
+            new StandardValueGraph<N, Presence>(
                 GraphBuilder.from(graph), getNodeConnections(graph), graph.edges().size()));
   }
 
@@ -70,6 +72,11 @@
     return checkNotNull(graph);
   }
 
+  @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return ElementOrder.stable();
+  }
+
   private static <N> ImmutableMap<N, GraphConnections<N, Presence>> getNodeConnections(
       Graph<N> graph) {
     // ImmutableMap.Builder maintains the order of the elements as inserted, so the map will have
@@ -82,11 +89,12 @@
     return nodeConnections.build();
   }
 
+  @SuppressWarnings("unchecked")
   private static <N> GraphConnections<N, Presence> connectionsOf(Graph<N> graph, N node) {
-    Function<Object, Presence> edgeValueFn = Functions.constant(Presence.EDGE_EXISTS);
+    Function<N, Presence> edgeValueFn =
+        (Function<N, Presence>) Functions.constant(Presence.EDGE_EXISTS);
     return graph.isDirected()
-        ? DirectedGraphConnections.ofImmutable(
-            graph.predecessors(node), Maps.asMap(graph.successors(node), edgeValueFn))
+        ? DirectedGraphConnections.ofImmutable(node, graph.incidentEdges(node), edgeValueFn)
         : UndirectedGraphConnections.ofImmutable(
             Maps.asMap(graph.adjacentNodes(node), edgeValueFn));
   }
@@ -95,4 +103,98 @@
   protected BaseGraph<N> delegate() {
     return backingGraph;
   }
+
+  /**
+   * A builder for creating {@link ImmutableGraph} instances, especially {@code static final}
+   * graphs. Example:
+   *
+   * <pre>{@code
+   * static final ImmutableGraph<Country> COUNTRY_ADJACENCY_GRAPH =
+   *     GraphBuilder.undirected()
+   *         .<Country>immutable()
+   *         .putEdge(FRANCE, GERMANY)
+   *         .putEdge(FRANCE, BELGIUM)
+   *         .putEdge(GERMANY, BELGIUM)
+   *         .addNode(ICELAND)
+   *         .build();
+   * }</pre>
+   *
+   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple times to build
+   * multiple graphs in series. Each new graph contains all the elements of the ones created before
+   * it.
+   *
+   * @since 28.0
+   */
+  public static class Builder<N> {
+
+    private final MutableGraph<N> mutableGraph;
+
+    Builder(GraphBuilder<N> graphBuilder) {
+      // The incidentEdgeOrder for immutable graphs is always stable. However, we don't want to
+      // modify this builder, so we make a copy instead.
+      this.mutableGraph = graphBuilder.copy().incidentEdgeOrder(ElementOrder.<N>stable()).build();
+    }
+
+    /**
+     * Adds {@code node} if it is not already present.
+     *
+     * <p><b>Nodes must be unique</b>, just as {@code Map} keys must be. They must also be non-null.
+     *
+     * @return this {@code Builder} object
+     */
+    @CanIgnoreReturnValue
+    public Builder<N> addNode(N node) {
+      mutableGraph.addNode(node);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code nodeU} to {@code nodeV} if one is not already present.
+     *
+     * <p>If the graph is directed, the resultant edge will be directed; otherwise, it will be
+     * undirected.
+     *
+     * <p>If {@code nodeU} and {@code nodeV} are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} {@code nodeU} and {@code nodeV} to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     */
+    @CanIgnoreReturnValue
+    public Builder<N> putEdge(N nodeU, N nodeV) {
+      mutableGraph.putEdge(nodeU, nodeV);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code endpoints} (in the order, if any, specified by {@code
+     * endpoints}) if one is not already present.
+     *
+     * <p>If this graph is directed, {@code endpoints} must be ordered and the added edge will be
+     * directed; if it is undirected, the added edge will be undirected.
+     *
+     * <p>If this graph is directed, {@code endpoints} must be ordered.
+     *
+     * <p>If either or both endpoints are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} each missing endpoint to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
+     */
+    @CanIgnoreReturnValue
+    public Builder<N> putEdge(EndpointPair<N> endpoints) {
+      mutableGraph.putEdge(endpoints);
+      return this;
+    }
+
+    /**
+     * Returns a newly-created {@code ImmutableGraph} based on the contents of this {@code Builder}.
+     */
+    public ImmutableGraph<N> build() {
+      return ImmutableGraph.copyOf(mutableGraph);
+    }
+  }
 }
diff --git a/guava/src/com/google/common/graph/ImmutableNetwork.java b/guava/src/com/google/common/graph/ImmutableNetwork.java
index 3d5da1c..b35d722 100644
--- a/guava/src/com/google/common/graph/ImmutableNetwork.java
+++ b/guava/src/com/google/common/graph/ImmutableNetwork.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 import java.util.Map;
 
@@ -37,14 +38,15 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  * @author Omar Darwish
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  * @since 20.0
  */
 @Beta
 @Immutable(containerOf = {"N", "E"})
-@SuppressWarnings("Immutable") // Extends ConfigurableNetwork but uses ImmutableMaps.
-public final class ImmutableNetwork<N, E> extends ConfigurableNetwork<N, E> {
+@SuppressWarnings("Immutable") // Extends StandardNetwork but uses ImmutableMaps.
+public final class ImmutableNetwork<N, E> extends StandardNetwork<N, E> {
 
   private ImmutableNetwork(Network<N, E> network) {
     super(
@@ -138,4 +140,115 @@
       }
     };
   }
+
+  /**
+   * A builder for creating {@link ImmutableNetwork} instances, especially {@code static final}
+   * networks. Example:
+   *
+   * <pre>{@code
+   * static final ImmutableNetwork<City, Train> TRAIN_NETWORK =
+   *     NetworkBuilder.undirected()
+   *         .allowsParallelEdges(true)
+   *         .<City, Train>immutable()
+   *         .addEdge(PARIS, BRUSSELS, Thalys.trainNumber("1111"))
+   *         .addEdge(PARIS, BRUSSELS, RegionalTrain.trainNumber("2222"))
+   *         .addEdge(LONDON, PARIS, Eurostar.trainNumber("3333"))
+   *         .addEdge(LONDON, BRUSSELS, Eurostar.trainNumber("4444"))
+   *         .addNode(REYKJAVIK)
+   *         .build();
+   * }</pre>
+   *
+   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple times to build
+   * multiple networks in series. Each new network contains all the elements of the ones created
+   * before it.
+   *
+   * @since 28.0
+   */
+  public static class Builder<N, E> {
+
+    private final MutableNetwork<N, E> mutableNetwork;
+
+    Builder(NetworkBuilder<N, E> networkBuilder) {
+      this.mutableNetwork = networkBuilder.build();
+    }
+
+    /**
+     * Adds {@code node} if it is not already present.
+     *
+     * <p><b>Nodes must be unique</b>, just as {@code Map} keys must be. They must also be non-null.
+     *
+     * @return this {@code Builder} object
+     */
+    @CanIgnoreReturnValue
+    public ImmutableNetwork.Builder<N, E> addNode(N node) {
+      mutableNetwork.addNode(node);
+      return this;
+    }
+
+    /**
+     * Adds {@code edge} connecting {@code nodeU} to {@code nodeV}.
+     *
+     * <p>If the network is directed, {@code edge} will be directed in this network; otherwise, it
+     * will be undirected.
+     *
+     * <p><b>{@code edge} must be unique to this network</b>, just as a {@code Map} key must be. It
+     * must also be non-null.
+     *
+     * <p>If {@code nodeU} and {@code nodeV} are not already present in this network, this method
+     * will silently {@link #addNode(Object) add} {@code nodeU} and {@code nodeV} to the network.
+     *
+     * <p>If {@code edge} already connects {@code nodeU} to {@code nodeV} (in the specified order if
+     * this network {@link #isDirected()}, else in any order), then this method will have no effect.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if {@code edge} already exists in the network and does not
+     *     connect {@code nodeU} to {@code nodeV}
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsParallelEdges()} or {@link #allowsSelfLoops()}
+     */
+    @CanIgnoreReturnValue
+    public ImmutableNetwork.Builder<N, E> addEdge(N nodeU, N nodeV, E edge) {
+      mutableNetwork.addEdge(nodeU, nodeV, edge);
+      return this;
+    }
+
+    /**
+     * Adds {@code edge} connecting {@code endpoints}. In an undirected network, {@code edge} will
+     * also connect {@code nodeV} to {@code nodeU}.
+     *
+     * <p>If this network is directed, {@code edge} will be directed in this network; if it is
+     * undirected, {@code edge} will be undirected in this network.
+     *
+     * <p>If this network is directed, {@code endpoints} must be ordered.
+     *
+     * <p><b>{@code edge} must be unique to this network</b>, just as a {@code Map} key must be. It
+     * must also be non-null.
+     *
+     * <p>If either or both endpoints are not already present in this network, this method will
+     * silently {@link #addNode(Object) add} each missing endpoint to the network.
+     *
+     * <p>If {@code edge} already connects an endpoint pair equal to {@code endpoints}, then this
+     * method will have no effect.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if {@code edge} already exists in the network and connects
+     *     some other endpoint pair that is not equal to {@code endpoints}
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsParallelEdges()} or {@link #allowsSelfLoops()}
+     * @throws IllegalArgumentException if the endpoints are unordered and the network is directed
+     */
+    @CanIgnoreReturnValue
+    public ImmutableNetwork.Builder<N, E> addEdge(EndpointPair<N> endpoints, E edge) {
+      mutableNetwork.addEdge(endpoints, edge);
+      return this;
+    }
+
+    /**
+     * Returns a newly-created {@code ImmutableNetwork} based on the contents of this {@code
+     * Builder}.
+     */
+    public ImmutableNetwork<N, E> build() {
+      return ImmutableNetwork.copyOf(mutableNetwork);
+    }
+  }
 }
diff --git a/guava/src/com/google/common/graph/ImmutableValueGraph.java b/guava/src/com/google/common/graph/ImmutableValueGraph.java
index be46c08..f2e2386 100644
--- a/guava/src/com/google/common/graph/ImmutableValueGraph.java
+++ b/guava/src/com/google/common/graph/ImmutableValueGraph.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.Immutable;
 
 /**
@@ -34,14 +35,15 @@
  * provided by this class.
  *
  * @author James Sexton
+ * @author Jens Nyman
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  * @since 20.0
  */
 @Beta
 @Immutable(containerOf = {"N", "V"})
-@SuppressWarnings("Immutable") // Extends ConfigurableValueGraph but uses ImmutableMaps.
-public final class ImmutableValueGraph<N, V> extends ConfigurableValueGraph<N, V> {
+@SuppressWarnings("Immutable") // Extends StandardValueGraph but uses ImmutableMaps.
+public final class ImmutableValueGraph<N, V> extends StandardValueGraph<N, V> {
 
   private ImmutableValueGraph(ValueGraph<N, V> graph) {
     super(ValueGraphBuilder.from(graph), getNodeConnections(graph), graph.edges().size());
@@ -65,6 +67,11 @@
   }
 
   @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return ElementOrder.stable();
+  }
+
+  @Override
   public ImmutableGraph<N> asGraph() {
     return new ImmutableGraph<N>(this); // safe because the view is effectively immutable
   }
@@ -92,8 +99,109 @@
         };
     return graph.isDirected()
         ? DirectedGraphConnections.ofImmutable(
-            graph.predecessors(node), Maps.asMap(graph.successors(node), successorNodeToValueFn))
+            node, graph.incidentEdges(node), successorNodeToValueFn)
         : UndirectedGraphConnections.ofImmutable(
             Maps.asMap(graph.adjacentNodes(node), successorNodeToValueFn));
   }
+
+  /**
+   * A builder for creating {@link ImmutableValueGraph} instances, especially {@code static final}
+   * graphs. Example:
+   *
+   * <pre>{@code
+   * static final ImmutableValueGraph<City, Distance> CITY_ROAD_DISTANCE_GRAPH =
+   *     ValueGraphBuilder.undirected()
+   *         .<City, Distance>immutable()
+   *         .putEdgeValue(PARIS, BERLIN, kilometers(1060))
+   *         .putEdgeValue(PARIS, BRUSSELS, kilometers(317))
+   *         .putEdgeValue(BERLIN, BRUSSELS, kilometers(764))
+   *         .addNode(REYKJAVIK)
+   *         .build();
+   * }</pre>
+   *
+   * <p>Builder instances can be reused; it is safe to call {@link #build} multiple times to build
+   * multiple graphs in series. Each new graph contains all the elements of the ones created before
+   * it.
+   *
+   * @since 28.0
+   */
+  public static class Builder<N, V> {
+
+    private final MutableValueGraph<N, V> mutableValueGraph;
+
+    Builder(ValueGraphBuilder<N, V> graphBuilder) {
+      // The incidentEdgeOrder for immutable graphs is always stable. However, we don't want to
+      // modify this builder, so we make a copy instead.
+      this.mutableValueGraph =
+          graphBuilder.copy().incidentEdgeOrder(ElementOrder.<N>stable()).build();
+    }
+
+    /**
+     * Adds {@code node} if it is not already present.
+     *
+     * <p><b>Nodes must be unique</b>, just as {@code Map} keys must be. They must also be non-null.
+     *
+     * @return this {@code Builder} object
+     */
+    @CanIgnoreReturnValue
+    public ImmutableValueGraph.Builder<N, V> addNode(N node) {
+      mutableValueGraph.addNode(node);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code nodeU} to {@code nodeV} if one is not already present, and
+     * sets a value for that edge to {@code value} (overwriting the existing value, if any).
+     *
+     * <p>If the graph is directed, the resultant edge will be directed; otherwise, it will be
+     * undirected.
+     *
+     * <p>Values do not have to be unique. However, values must be non-null.
+     *
+     * <p>If {@code nodeU} and {@code nodeV} are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} {@code nodeU} and {@code nodeV} to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     */
+    @CanIgnoreReturnValue
+    public ImmutableValueGraph.Builder<N, V> putEdgeValue(N nodeU, N nodeV, V value) {
+      mutableValueGraph.putEdgeValue(nodeU, nodeV, value);
+      return this;
+    }
+
+    /**
+     * Adds an edge connecting {@code endpoints} if one is not already present, and sets a value for
+     * that edge to {@code value} (overwriting the existing value, if any).
+     *
+     * <p>If the graph is directed, the resultant edge will be directed; otherwise, it will be
+     * undirected.
+     *
+     * <p>If this graph is directed, {@code endpoints} must be ordered.
+     *
+     * <p>Values do not have to be unique. However, values must be non-null.
+     *
+     * <p>If either or both endpoints are not already present in this graph, this method will
+     * silently {@link #addNode(Object) add} each missing endpoint to the graph.
+     *
+     * @return this {@code Builder} object
+     * @throws IllegalArgumentException if the introduction of the edge would violate {@link
+     *     #allowsSelfLoops()}
+     * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
+     */
+    @CanIgnoreReturnValue
+    public ImmutableValueGraph.Builder<N, V> putEdgeValue(EndpointPair<N> endpoints, V value) {
+      mutableValueGraph.putEdgeValue(endpoints, value);
+      return this;
+    }
+
+    /**
+     * Returns a newly-created {@code ImmutableValueGraph} based on the contents of this {@code
+     * Builder}.
+     */
+    public ImmutableValueGraph<N, V> build() {
+      return ImmutableValueGraph.copyOf(mutableValueGraph);
+    }
+  }
 }
diff --git a/guava/src/com/google/common/graph/IncidentEdgeSet.java b/guava/src/com/google/common/graph/IncidentEdgeSet.java
new file mode 100644
index 0000000..f306a67
--- /dev/null
+++ b/guava/src/com/google/common/graph/IncidentEdgeSet.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 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.graph;
+
+import java.util.AbstractSet;
+import java.util.Set;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/**
+ * Abstract base class for an incident edges set that allows different implementations of {@link
+ * AbstractSet#iterator()}.
+ */
+abstract class IncidentEdgeSet<N> extends AbstractSet<EndpointPair<N>> {
+  protected final N node;
+  protected final BaseGraph<N> graph;
+
+  IncidentEdgeSet(BaseGraph<N> graph, N node) {
+    this.graph = graph;
+    this.node = node;
+  }
+
+  @Override
+  public boolean remove(Object o) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public int size() {
+    if (graph.isDirected()) {
+      return graph.inDegree(node)
+          + graph.outDegree(node)
+          - (graph.successors(node).contains(node) ? 1 : 0);
+    } else {
+      return graph.adjacentNodes(node).size();
+    }
+  }
+
+  @Override
+  public boolean contains(@Nullable Object obj) {
+    if (!(obj instanceof EndpointPair)) {
+      return false;
+    }
+    EndpointPair<?> endpointPair = (EndpointPair<?>) obj;
+
+    if (graph.isDirected()) {
+      if (!endpointPair.isOrdered()) {
+        return false;
+      }
+
+      Object source = endpointPair.source();
+      Object target = endpointPair.target();
+      return (node.equals(source) && graph.successors(node).contains(target))
+          || (node.equals(target) && graph.predecessors(node).contains(source));
+    } else {
+      if (endpointPair.isOrdered()) {
+        return false;
+      }
+      Set<N> adjacent = graph.adjacentNodes(node);
+      Object nodeU = endpointPair.nodeU();
+      Object nodeV = endpointPair.nodeV();
+
+      return (node.equals(nodeV) && adjacent.contains(nodeU))
+          || (node.equals(nodeU) && adjacent.contains(nodeV));
+    }
+  }
+}
diff --git a/guava/src/com/google/common/graph/MapIteratorCache.java b/guava/src/com/google/common/graph/MapIteratorCache.java
index ca4b301..182a67f 100644
--- a/guava/src/com/google/common/graph/MapIteratorCache.java
+++ b/guava/src/com/google/common/graph/MapIteratorCache.java
@@ -44,28 +44,34 @@
 class MapIteratorCache<K, V> {
   private final Map<K, V> backingMap;
 
-  // Per JDK: "the behavior of a map entry is undefined if the backing map has been modified after
-  // the entry was returned by the iterator, except through the setValue operation on the map entry"
-  // As such, this field must be cleared before every map mutation.
-  private transient @Nullable Entry<K, V> entrySetCache;
+  /*
+   * Per JDK: "the behavior of a map entry is undefined if the backing map has been modified after
+   * the entry was returned by the iterator, except through the setValue operation on the map entry"
+   * As such, this field must be cleared before every map mutation.
+   *
+   * Note about volatile: volatile doesn't make it safe to read from a mutable graph in one thread
+   * 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;
 
   MapIteratorCache(Map<K, V> backingMap) {
     this.backingMap = checkNotNull(backingMap);
   }
 
   @CanIgnoreReturnValue
-  public V put(@Nullable K key, @Nullable V value) {
+  public final V put(@Nullable K key, @Nullable V value) {
     clearCache();
     return backingMap.put(key, value);
   }
 
   @CanIgnoreReturnValue
-  public V remove(@Nullable Object key) {
+  public final V remove(@Nullable Object key) {
     clearCache();
     return backingMap.remove(key);
   }
 
-  public void clear() {
+  public final void clear() {
     clearCache();
     backingMap.clear();
   }
@@ -98,7 +104,7 @@
           @Override
           public K next() {
             Entry<K, V> entry = entryIterator.next(); // store local reference for thread-safety
-            entrySetCache = entry;
+            cacheEntry = entry;
             return entry.getKey();
           }
         };
@@ -119,7 +125,7 @@
   // Internal methods ('protected' is still package-visible, but treat as only subclass-visible)
 
   protected V getIfCached(@Nullable Object key) {
-    Entry<K, V> entry = entrySetCache; // store local reference for thread-safety
+    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.
     if (entry != null && entry.getKey() == key) {
@@ -129,6 +135,6 @@
   }
 
   protected void clearCache() {
-    entrySetCache = null;
+    cacheEntry = null;
   }
 }
diff --git a/guava/src/com/google/common/graph/MapRetrievalCache.java b/guava/src/com/google/common/graph/MapRetrievalCache.java
index ee774a5..3a406e9 100644
--- a/guava/src/com/google/common/graph/MapRetrievalCache.java
+++ b/guava/src/com/google/common/graph/MapRetrievalCache.java
@@ -26,8 +26,9 @@
  * @author James Sexton
  */
 class MapRetrievalCache<K, V> extends MapIteratorCache<K, V> {
-  private transient @Nullable CacheEntry<K, V> cacheEntry1;
-  private transient @Nullable CacheEntry<K, V> cacheEntry2;
+  // See the note about volatile in the superclass.
+  private transient volatile @Nullable CacheEntry<K, V> cacheEntry1;
+  private transient volatile @Nullable CacheEntry<K, V> cacheEntry2;
 
   MapRetrievalCache(Map<K, V> backingMap) {
     super(backingMap);
diff --git a/guava/src/com/google/common/graph/Network.java b/guava/src/com/google/common/graph/Network.java
index 2a4b25d..6bb8452 100644
--- a/guava/src/com/google/common/graph/Network.java
+++ b/guava/src/com/google/common/graph/Network.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Optional;
 import java.util.Set;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -102,6 +103,7 @@
  * @since 20.0
  */
 @Beta
+@DoNotMock("Use NetworkBuilder to create a real instance")
 public interface Network<N, E> extends SuccessorsFunction<N>, PredecessorsFunction<N> {
   //
   // Network-level accessors
@@ -160,6 +162,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this network.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this network
    */
   Set<N> adjacentNodes(N node);
@@ -193,6 +197,8 @@
    * Returns the edges whose {@link #incidentNodes(Object) incident nodes} in this network include
    * {@code node}.
    *
+   * <p>This is equal to the union of {@link #inEdges(Object)} and {@link #outEdges(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this network
    */
   Set<E> incidentEdges(N node);
diff --git a/guava/src/com/google/common/graph/NetworkBuilder.java b/guava/src/com/google/common/graph/NetworkBuilder.java
index c2b10c7..d289ee2 100644
--- a/guava/src/com/google/common/graph/NetworkBuilder.java
+++ b/guava/src/com/google/common/graph/NetworkBuilder.java
@@ -23,7 +23,8 @@
 import com.google.common.base.Optional;
 
 /**
- * A builder for constructing instances of {@link MutableNetwork} with user-defined properties.
+ * A builder for constructing instances of {@link MutableNetwork} or {@link ImmutableNetwork} with
+ * user-defined properties.
  *
  * <p>A network built by this class will have the following properties by default:
  *
@@ -34,14 +35,25 @@
  *       elements were added
  * </ul>
  *
- * <p>Example of use:
+ * <p>Examples of use:
  *
  * <pre>{@code
- * MutableNetwork<String, Integer> flightNetwork =
+ * // Building a mutable network
+ * MutableNetwork<String, Integer> network =
  *     NetworkBuilder.directed().allowsParallelEdges(true).build();
  * flightNetwork.addEdge("LAX", "ATL", 3025);
  * flightNetwork.addEdge("LAX", "ATL", 1598);
  * flightNetwork.addEdge("ATL", "LAX", 2450);
+ *
+ * // Building a immutable network
+ * ImmutableNetwork<String, Integer> immutableNetwork =
+ *     NetworkBuilder.directed()
+ *         .allowsParallelEdges(true)
+ *         .<String, Integer>immutable()
+ *         .addEdge("LAX", "ATL", 3025)
+ *         .addEdge("LAX", "ATL", 1598)
+ *         .addEdge("ATL", "LAX", 2450)
+ *         .build();
  * }</pre>
  *
  * @author James Sexton
@@ -49,7 +61,7 @@
  * @param <N> The most general node type this builder will support. This is normally {@code Object}
  *     unless it is constrained by using a method like {@link #nodeOrder}, or the builder is
  *     constructed based on an existing {@code Network} using {@link #from(Network)}.
- * @param <N> The most general edge type this builder will support. This is normally {@code Object}
+ * @param <E> The most general edge type this builder will support. This is normally {@code Object}
  *     unless it is constrained by using a method like {@link #edgeOrder}, or the builder is
  *     constructed based on an existing {@code Network} using {@link #from(Network)}.
  * @since 20.0
@@ -92,8 +104,22 @@
   }
 
   /**
+   * Returns an {@link ImmutableNetwork.Builder} with the properties of this {@link NetworkBuilder}.
+   *
+   * <p>The returned builder can be used for populating an {@link ImmutableNetwork}.
+   *
+   * @since 28.0
+   */
+  public <N1 extends N, E1 extends E> ImmutableNetwork.Builder<N1, E1> immutable() {
+    NetworkBuilder<N1, E1> castBuilder = cast();
+    return new ImmutableNetwork.Builder<>(castBuilder);
+  }
+
+  /**
    * Specifies whether the network will allow parallel edges. Attempting to add a parallel edge to a
    * network that does not allow them will throw an {@link UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public NetworkBuilder<N, E> allowsParallelEdges(boolean allowsParallelEdges) {
     this.allowsParallelEdges = allowsParallelEdges;
@@ -104,6 +130,8 @@
    * Specifies whether the network will allow self-loops (edges that connect a node to itself).
    * Attempting to add a self-loop to a network that does not allow them will throw an {@link
    * UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public NetworkBuilder<N, E> allowsSelfLoops(boolean allowsSelfLoops) {
     this.allowsSelfLoops = allowsSelfLoops;
@@ -130,14 +158,22 @@
     return this;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Network#nodes()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Network#nodes()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <N1 extends N> NetworkBuilder<N1, E> nodeOrder(ElementOrder<N1> nodeOrder) {
     NetworkBuilder<N1, E> newBuilder = cast();
     newBuilder.nodeOrder = checkNotNull(nodeOrder);
     return newBuilder;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Network#edges()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Network#edges()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <E1 extends E> NetworkBuilder<N, E1> edgeOrder(ElementOrder<E1> edgeOrder) {
     NetworkBuilder<N, E1> newBuilder = cast();
     newBuilder.edgeOrder = checkNotNull(edgeOrder);
@@ -146,7 +182,7 @@
 
   /** Returns an empty {@link MutableNetwork} with the properties of this {@link NetworkBuilder}. */
   public <N1 extends N, E1 extends E> MutableNetwork<N1, E1> build() {
-    return new ConfigurableMutableNetwork<>(this);
+    return new StandardMutableNetwork<>(this);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/guava/src/com/google/common/graph/PredecessorsFunction.java b/guava/src/com/google/common/graph/PredecessorsFunction.java
index b8f7ea5..f9ca48a 100644
--- a/guava/src/com/google/common/graph/PredecessorsFunction.java
+++ b/guava/src/com/google/common/graph/PredecessorsFunction.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * A functional interface for <a
@@ -78,6 +79,7 @@
  * @since 23.0
  */
 @Beta
+@DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
 public interface PredecessorsFunction<N> {
 
   /**
diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableGraph.java b/guava/src/com/google/common/graph/StandardMutableGraph.java
similarity index 85%
copy from android/guava/src/com/google/common/graph/ConfigurableMutableGraph.java
copy to guava/src/com/google/common/graph/StandardMutableGraph.java
index db6bca7..41acccf 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableMutableGraph.java
+++ b/guava/src/com/google/common/graph/StandardMutableGraph.java
@@ -19,7 +19,7 @@
 import com.google.common.graph.GraphConstants.Presence;
 
 /**
- * Configurable implementation of {@link MutableGraph} that supports both directed and undirected
+ * Standard implementation of {@link MutableGraph} that supports both directed and undirected
  * graphs. Instances of this class should be constructed with {@link GraphBuilder}.
  *
  * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
@@ -28,12 +28,12 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
-final class ConfigurableMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
+final class StandardMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
   private final MutableValueGraph<N, Presence> backingValueGraph;
 
   /** Constructs a {@link MutableGraph} with the properties specified in {@code builder}. */
-  ConfigurableMutableGraph(AbstractGraphBuilder<? super N> builder) {
-    this.backingValueGraph = new ConfigurableMutableValueGraph<>(builder);
+  StandardMutableGraph(AbstractGraphBuilder<? super N> builder) {
+    this.backingValueGraph = new StandardMutableValueGraph<>(builder);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java b/guava/src/com/google/common/graph/StandardMutableNetwork.java
similarity index 95%
copy from android/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java
copy to guava/src/com/google/common/graph/StandardMutableNetwork.java
index 1fcacbe..8cfe9c5 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableMutableNetwork.java
+++ b/guava/src/com/google/common/graph/StandardMutableNetwork.java
@@ -27,7 +27,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 /**
- * Configurable implementation of {@link MutableNetwork} that supports both directed and undirected
+ * Standard implementation of {@link MutableNetwork} that supports both directed and undirected
  * graphs. Instances of this class should be constructed with {@link NetworkBuilder}.
  *
  * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
@@ -39,11 +39,11 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
-final class ConfigurableMutableNetwork<N, E> extends ConfigurableNetwork<N, E>
+final class StandardMutableNetwork<N, E> extends StandardNetwork<N, E>
     implements MutableNetwork<N, E> {
 
   /** Constructs a mutable graph with the properties specified in {@code builder}. */
-  ConfigurableMutableNetwork(NetworkBuilder<? super N, ? super E> builder) {
+  StandardMutableNetwork(NetworkBuilder<? super N, ? super E> builder) {
     super(builder);
   }
 
diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java b/guava/src/com/google/common/graph/StandardMutableValueGraph.java
similarity index 88%
copy from android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java
copy to guava/src/com/google/common/graph/StandardMutableValueGraph.java
index 38b31b7..558d8d6 100644
--- a/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java
+++ b/guava/src/com/google/common/graph/StandardMutableValueGraph.java
@@ -26,8 +26,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 
 /**
- * Configurable implementation of {@link MutableValueGraph} that supports both directed and
- * undirected graphs. Instances of this class should be constructed with {@link ValueGraphBuilder}.
+ * Standard implementation of {@link MutableValueGraph} that supports both directed and undirected
+ * graphs. Instances of this class should be constructed with {@link ValueGraphBuilder}.
  *
  * <p>Time complexities for mutation methods are all O(1) except for {@code removeNode(N node)},
  * which is in O(d_node) where d_node is the degree of {@code node}.
@@ -38,12 +38,20 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
-final class ConfigurableMutableValueGraph<N, V> extends ConfigurableValueGraph<N, V>
+final class StandardMutableValueGraph<N, V> extends StandardValueGraph<N, V>
     implements MutableValueGraph<N, V> {
 
+  private final ElementOrder<N> incidentEdgeOrder;
+
   /** Constructs a mutable graph with the properties specified in {@code builder}. */
-  ConfigurableMutableValueGraph(AbstractGraphBuilder<? super N> builder) {
+  StandardMutableValueGraph(AbstractGraphBuilder<? super N> builder) {
     super(builder);
+    incidentEdgeOrder = builder.incidentEdgeOrder.cast();
+  }
+
+  @Override
+  public ElementOrder<N> incidentEdgeOrder() {
+    return incidentEdgeOrder;
   }
 
   @Override
@@ -167,7 +175,7 @@
 
   private GraphConnections<N, V> newConnections() {
     return isDirected()
-        ? DirectedGraphConnections.<N, V>of()
-        : UndirectedGraphConnections.<N, V>of();
+        ? DirectedGraphConnections.<N, V>of(incidentEdgeOrder)
+        : UndirectedGraphConnections.<N, V>of(incidentEdgeOrder);
   }
 }
diff --git a/guava/src/com/google/common/graph/ConfigurableNetwork.java b/guava/src/com/google/common/graph/StandardNetwork.java
similarity index 96%
rename from guava/src/com/google/common/graph/ConfigurableNetwork.java
rename to guava/src/com/google/common/graph/StandardNetwork.java
index 3d2679d..1b82301 100644
--- a/guava/src/com/google/common/graph/ConfigurableNetwork.java
+++ b/guava/src/com/google/common/graph/StandardNetwork.java
@@ -30,7 +30,7 @@
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * Configurable implementation of {@link Network} that supports the options supplied by {@link
+ * Standard implementation of {@link Network} that supports the options supplied by {@link
  * NetworkBuilder}.
  *
  * <p>This class maintains a map of nodes to {@link NetworkConnections}. This class also maintains a
@@ -48,7 +48,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
-class ConfigurableNetwork<N, E> extends AbstractNetwork<N, E> {
+class StandardNetwork<N, E> extends AbstractNetwork<N, E> {
   private final boolean isDirected;
   private final boolean allowsParallelEdges;
   private final boolean allowsSelfLoops;
@@ -62,7 +62,7 @@
   protected final MapIteratorCache<E, N> edgeToReferenceNode; // referenceNode == source if directed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
-  ConfigurableNetwork(NetworkBuilder<? super N, ? super E> builder) {
+  StandardNetwork(NetworkBuilder<? super N, ? super E> builder) {
     this(
         builder,
         builder.nodeOrder.<N, NetworkConnections<N, E>>createMap(
@@ -74,7 +74,7 @@
    * Constructs a graph with the properties specified in {@code builder}, initialized with the given
    * node and edge maps.
    */
-  ConfigurableNetwork(
+  StandardNetwork(
       NetworkBuilder<? super N, ? super E> builder,
       Map<N, NetworkConnections<N, E>> nodeConnections,
       Map<E, N> edgeToReferenceNode) {
diff --git a/guava/src/com/google/common/graph/ConfigurableValueGraph.java b/guava/src/com/google/common/graph/StandardValueGraph.java
similarity index 89%
rename from guava/src/com/google/common/graph/ConfigurableValueGraph.java
rename to guava/src/com/google/common/graph/StandardValueGraph.java
index bba57b2..8da0b0f 100644
--- a/guava/src/com/google/common/graph/ConfigurableValueGraph.java
+++ b/guava/src/com/google/common/graph/StandardValueGraph.java
@@ -20,13 +20,14 @@
 import static com.google.common.graph.GraphConstants.DEFAULT_NODE_COUNT;
 import static com.google.common.graph.Graphs.checkNonNegative;
 
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * Configurable implementation of {@link ValueGraph} that supports the options supplied by {@link
+ * Standard implementation of {@link ValueGraph} that supports the options supplied by {@link
  * AbstractGraphBuilder}.
  *
  * <p>This class maintains a map of nodes to {@link GraphConnections}.
@@ -42,7 +43,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
-class ConfigurableValueGraph<N, V> extends AbstractValueGraph<N, V> {
+class StandardValueGraph<N, V> extends AbstractValueGraph<N, V> {
   private final boolean isDirected;
   private final boolean allowsSelfLoops;
   private final ElementOrder<N> nodeOrder;
@@ -52,7 +53,7 @@
   protected long edgeCount; // must be updated when edges are added or removed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
-  ConfigurableValueGraph(AbstractGraphBuilder<? super N> builder) {
+  StandardValueGraph(AbstractGraphBuilder<? super N> builder) {
     this(
         builder,
         builder.nodeOrder.<N, GraphConnections<N, V>>createMap(
@@ -64,7 +65,7 @@
    * Constructs a graph with the properties specified in {@code builder}, initialized with the given
    * node map.
    */
-  ConfigurableValueGraph(
+  StandardValueGraph(
       AbstractGraphBuilder<? super N> builder,
       Map<N, GraphConnections<N, V>> nodeConnections,
       long edgeCount) {
@@ -115,6 +116,18 @@
   }
 
   @Override
+  public Set<EndpointPair<N>> incidentEdges(N node) {
+    final GraphConnections<N, V> connections = checkedConnections(node);
+
+    return new IncidentEdgeSet<N>(this, node) {
+      @Override
+      public Iterator<EndpointPair<N>> iterator() {
+        return connections.incidentEdgeIterator(node);
+      }
+    };
+  }
+
+  @Override
   public boolean hasEdgeConnecting(N nodeU, N nodeV) {
     return hasEdgeConnecting_internal(checkNotNull(nodeU), checkNotNull(nodeV));
   }
diff --git a/guava/src/com/google/common/graph/SuccessorsFunction.java b/guava/src/com/google/common/graph/SuccessorsFunction.java
index ed60a5d..f74f437 100644
--- a/guava/src/com/google/common/graph/SuccessorsFunction.java
+++ b/guava/src/com/google/common/graph/SuccessorsFunction.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 
 /**
  * A functional interface for <a
@@ -78,6 +79,7 @@
  * @since 23.0
  */
 @Beta
+@DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
 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 1a53dc6..be0eecb 100644
--- a/guava/src/com/google/common/graph/Traverser.java
+++ b/guava/src/com/google/common/graph/Traverser.java
@@ -22,13 +22,11 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.UnmodifiableIterator;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.Queue;
 import java.util.Set;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -62,7 +60,15 @@
  * @since 23.1
  */
 @Beta
+@DoNotMock(
+    "Call forGraph or forTree, passing a lambda or a Graph with the desired edges (built with"
+        + " GraphBuilder)")
 public abstract class Traverser<N> {
+  private final SuccessorsFunction<N> successorFunction;
+
+  private Traverser(SuccessorsFunction<N> successorFunction) {
+    this.successorFunction = checkNotNull(successorFunction);
+  }
 
   /**
    * Creates a new traverser for the given general {@code graph}.
@@ -88,9 +94,13 @@
    *
    * @param graph {@link SuccessorsFunction} representing a general graph that may have cycles.
    */
-  public static <N> Traverser<N> forGraph(SuccessorsFunction<N> graph) {
-    checkNotNull(graph);
-    return new GraphTraverser<>(graph);
+  public static <N> Traverser<N> forGraph(final SuccessorsFunction<N> graph) {
+    return new Traverser<N>(graph) {
+      @Override
+      Traversal<N> newTraversal() {
+        return Traversal.inGraph(graph);
+      }
+    };
   }
 
   /**
@@ -166,15 +176,19 @@
    * @param tree {@link SuccessorsFunction} representing a directed acyclic graph that has at most
    *     one path between any two nodes
    */
-  public static <N> Traverser<N> forTree(SuccessorsFunction<N> tree) {
-    checkNotNull(tree);
+  public static <N> Traverser<N> forTree(final SuccessorsFunction<N> tree) {
     if (tree instanceof BaseGraph) {
       checkArgument(((BaseGraph<?>) tree).isDirected(), "Undirected graphs can never be trees.");
     }
     if (tree instanceof Network) {
       checkArgument(((Network<?, ?>) tree).isDirected(), "Undirected networks can never be trees.");
     }
-    return new TreeTraverser<>(tree);
+    return new Traverser<N>(tree) {
+      @Override
+      Traversal<N> newTraversal() {
+        return Traversal.inTree(tree);
+      }
+    };
   }
 
   /**
@@ -208,7 +222,9 @@
    *
    * @throws IllegalArgumentException if {@code startNode} is not an element of the graph
    */
-  public abstract Iterable<N> breadthFirst(N startNode);
+  public final Iterable<N> breadthFirst(N startNode) {
+    return breadthFirst(ImmutableSet.of(startNode));
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from any of the {@code
@@ -220,7 +236,15 @@
    * @see #breadthFirst(Object)
    * @since 24.1
    */
-  public abstract Iterable<N> breadthFirst(Iterable<? extends N> startNodes);
+  public final Iterable<N> breadthFirst(Iterable<? extends N> startNodes) {
+    final ImmutableSet<N> validated = validate(startNodes);
+    return new Iterable<N>() {
+      @Override
+      public Iterator<N> iterator() {
+        return newTraversal().breadthFirst(validated.iterator());
+      }
+    };
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from {@code startNode}, in
@@ -253,7 +277,9 @@
    *
    * @throws IllegalArgumentException if {@code startNode} is not an element of the graph
    */
-  public abstract Iterable<N> depthFirstPreOrder(N startNode);
+  public final Iterable<N> depthFirstPreOrder(N startNode) {
+    return depthFirstPreOrder(ImmutableSet.of(startNode));
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from any of the {@code
@@ -265,7 +291,15 @@
    * @see #depthFirstPreOrder(Object)
    * @since 24.1
    */
-  public abstract Iterable<N> depthFirstPreOrder(Iterable<? extends N> startNodes);
+  public final Iterable<N> depthFirstPreOrder(Iterable<? extends N> startNodes) {
+    final ImmutableSet<N> validated = validate(startNodes);
+    return new Iterable<N>() {
+      @Override
+      public Iterator<N> iterator() {
+        return newTraversal().preOrder(validated.iterator());
+      }
+    };
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from {@code startNode}, in
@@ -298,7 +332,9 @@
    *
    * @throws IllegalArgumentException if {@code startNode} is not an element of the graph
    */
-  public abstract Iterable<N> depthFirstPostOrder(N startNode);
+  public final Iterable<N> depthFirstPostOrder(N startNode) {
+    return depthFirstPostOrder(ImmutableSet.of(startNode));
+  }
 
   /**
    * Returns an unmodifiable {@code Iterable} over the nodes reachable from any of the {@code
@@ -310,352 +346,157 @@
    * @see #depthFirstPostOrder(Object)
    * @since 24.1
    */
-  public abstract Iterable<N> depthFirstPostOrder(Iterable<? extends N> startNodes);
-
-  // Avoid subclasses outside of this class
-  private Traverser() {}
-
-  private static final class GraphTraverser<N> extends Traverser<N> {
-    private final SuccessorsFunction<N> graph;
-
-    GraphTraverser(SuccessorsFunction<N> graph) {
-      this.graph = checkNotNull(graph);
-    }
-
-    @Override
-    public Iterable<N> breadthFirst(final N startNode) {
-      checkNotNull(startNode);
-      return breadthFirst(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> breadthFirst(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInGraph(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new BreadthFirstIterator(startNodes);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPreOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInGraph(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstIterator(startNodes, Order.PREORDER);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPostOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInGraph(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstIterator(startNodes, Order.POSTORDER);
-        }
-      };
-    }
-
-    @SuppressWarnings("CheckReturnValue")
-    private void checkThatNodeIsInGraph(N startNode) {
-      // successors() throws an IllegalArgumentException for nodes that are not an element of the
-      // graph.
-      graph.successors(startNode);
-    }
-
-    private final class BreadthFirstIterator extends UnmodifiableIterator<N> {
-      private final Queue<N> queue = new ArrayDeque<>();
-      private final Set<N> visited = new HashSet<>();
-
-      BreadthFirstIterator(Iterable<? extends N> roots) {
-        for (N root : roots) {
-          // add all roots to the queue, skipping duplicates
-          if (visited.add(root)) {
-            queue.add(root);
-          }
-        }
-      }
-
+  public final Iterable<N> depthFirstPostOrder(Iterable<? extends N> startNodes) {
+    final ImmutableSet<N> validated = validate(startNodes);
+    return new Iterable<N>() {
       @Override
-      public boolean hasNext() {
-        return !queue.isEmpty();
+      public Iterator<N> iterator() {
+        return newTraversal().postOrder(validated.iterator());
       }
-
-      @Override
-      public N next() {
-        N current = queue.remove();
-        for (N neighbor : graph.successors(current)) {
-          if (visited.add(neighbor)) {
-            queue.add(neighbor);
-          }
-        }
-        return current;
-      }
-    }
-
-    private final class DepthFirstIterator extends AbstractIterator<N> {
-      private final Deque<NodeAndSuccessors> stack = new ArrayDeque<>();
-      private final Set<N> visited = new HashSet<>();
-      private final Order order;
-
-      DepthFirstIterator(Iterable<? extends N> roots, Order order) {
-        stack.push(new NodeAndSuccessors(null, roots));
-        this.order = order;
-      }
-
-      @Override
-      protected N computeNext() {
-        while (true) {
-          if (stack.isEmpty()) {
-            return endOfData();
-          }
-          NodeAndSuccessors nodeAndSuccessors = stack.getFirst();
-          boolean firstVisit = visited.add(nodeAndSuccessors.node);
-          boolean lastVisit = !nodeAndSuccessors.successorIterator.hasNext();
-          boolean produceNode =
-              (firstVisit && order == Order.PREORDER) || (lastVisit && order == Order.POSTORDER);
-          if (lastVisit) {
-            stack.pop();
-          } else {
-            // we need to push a neighbor, but only if we haven't already seen it
-            N successor = nodeAndSuccessors.successorIterator.next();
-            if (!visited.contains(successor)) {
-              stack.push(withSuccessors(successor));
-            }
-          }
-          if (produceNode && nodeAndSuccessors.node != null) {
-            return nodeAndSuccessors.node;
-          }
-        }
-      }
-
-      NodeAndSuccessors withSuccessors(N node) {
-        return new NodeAndSuccessors(node, graph.successors(node));
-      }
-
-      /** A simple tuple of a node and a partially iterated {@link Iterator} of its successors. */
-      private final class NodeAndSuccessors {
-        final @Nullable N node;
-        final Iterator<? extends N> successorIterator;
-
-        NodeAndSuccessors(@Nullable N node, Iterable<? extends N> successors) {
-          this.node = node;
-          this.successorIterator = successors.iterator();
-        }
-      }
-    }
+    };
   }
 
-  private static final class TreeTraverser<N> extends Traverser<N> {
-    private final SuccessorsFunction<N> tree;
+  abstract Traversal<N> newTraversal();
 
-    TreeTraverser(SuccessorsFunction<N> tree) {
-      this.tree = checkNotNull(tree);
+  @SuppressWarnings("CheckReturnValue")
+  private ImmutableSet<N> validate(Iterable<? extends N> startNodes) {
+    ImmutableSet<N> copy = ImmutableSet.copyOf(startNodes);
+    for (N node : copy) {
+      successorFunction.successors(node); // Will throw if node doesn't exist
     }
-
-    @Override
-    public Iterable<N> breadthFirst(final N startNode) {
-      checkNotNull(startNode);
-      return breadthFirst(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> breadthFirst(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInTree(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new BreadthFirstIterator(startNodes);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPreOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPreOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N node : startNodes) {
-        checkThatNodeIsInTree(node);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstPreOrderIterator(startNodes);
-        }
-      };
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final N startNode) {
-      checkNotNull(startNode);
-      return depthFirstPostOrder(ImmutableSet.of(startNode));
-    }
-
-    @Override
-    public Iterable<N> depthFirstPostOrder(final Iterable<? extends N> startNodes) {
-      checkNotNull(startNodes);
-      if (Iterables.isEmpty(startNodes)) {
-        return ImmutableSet.of();
-      }
-      for (N startNode : startNodes) {
-        checkThatNodeIsInTree(startNode);
-      }
-      return new Iterable<N>() {
-        @Override
-        public Iterator<N> iterator() {
-          return new DepthFirstPostOrderIterator(startNodes);
-        }
-      };
-    }
-
-    @SuppressWarnings("CheckReturnValue")
-    private void checkThatNodeIsInTree(N startNode) {
-      // successors() throws an IllegalArgumentException for nodes that are not an element of the
-      // graph.
-      tree.successors(startNode);
-    }
-
-    private final class BreadthFirstIterator extends UnmodifiableIterator<N> {
-      private final Queue<N> queue = new ArrayDeque<>();
-
-      BreadthFirstIterator(Iterable<? extends N> roots) {
-        for (N root : roots) {
-          queue.add(root);
-        }
-      }
-
-      @Override
-      public boolean hasNext() {
-        return !queue.isEmpty();
-      }
-
-      @Override
-      public N next() {
-        N current = queue.remove();
-        Iterables.addAll(queue, tree.successors(current));
-        return current;
-      }
-    }
-
-    private final class DepthFirstPreOrderIterator extends UnmodifiableIterator<N> {
-      private final Deque<Iterator<? extends N>> stack = new ArrayDeque<>();
-
-      DepthFirstPreOrderIterator(Iterable<? extends N> roots) {
-        stack.addLast(roots.iterator());
-      }
-
-      @Override
-      public boolean hasNext() {
-        return !stack.isEmpty();
-      }
-
-      @Override
-      public N next() {
-        Iterator<? extends N> iterator = stack.getLast(); // throws NoSuchElementException if empty
-        N result = checkNotNull(iterator.next());
-        if (!iterator.hasNext()) {
-          stack.removeLast();
-        }
-        Iterator<? extends N> childIterator = tree.successors(result).iterator();
-        if (childIterator.hasNext()) {
-          stack.addLast(childIterator);
-        }
-        return result;
-      }
-    }
-
-    private final class DepthFirstPostOrderIterator extends AbstractIterator<N> {
-      private final ArrayDeque<NodeAndChildren> stack = new ArrayDeque<>();
-
-      DepthFirstPostOrderIterator(Iterable<? extends N> roots) {
-        stack.addLast(new NodeAndChildren(null, roots));
-      }
-
-      @Override
-      protected N computeNext() {
-        while (!stack.isEmpty()) {
-          NodeAndChildren top = stack.getLast();
-          if (top.childIterator.hasNext()) {
-            N child = top.childIterator.next();
-            stack.addLast(withChildren(child));
-          } else {
-            stack.removeLast();
-            if (top.node != null) {
-              return top.node;
-            }
-          }
-        }
-        return endOfData();
-      }
-
-      NodeAndChildren withChildren(N node) {
-        return new NodeAndChildren(node, tree.successors(node));
-      }
-
-      /** A simple tuple of a node and a partially iterated {@link Iterator} of its children. */
-      private final class NodeAndChildren {
-        final @Nullable N node;
-        final Iterator<? extends N> childIterator;
-
-        NodeAndChildren(@Nullable N node, Iterable<? extends N> children) {
-          this.node = node;
-          this.childIterator = children.iterator();
-        }
-      }
-    }
+    return copy;
   }
 
-  private enum Order {
-    PREORDER,
-    POSTORDER
+  /**
+   * Abstracts away the difference between traversing a graph vs. a tree. For a tree, we just take
+   * the next element from the next non-empty iterator; for graph, we need to loop through the next
+   * non-empty iterator to find first unvisited node.
+   */
+  private abstract static class Traversal<N> {
+    final SuccessorsFunction<N> successorFunction;
+
+    Traversal(SuccessorsFunction<N> successorFunction) {
+      this.successorFunction = successorFunction;
+    }
+
+    static <N> Traversal<N> inGraph(SuccessorsFunction<N> graph) {
+      final Set<N> visited = new HashSet<>();
+      return new Traversal<N>(graph) {
+        @Override
+        N visitNext(Deque<Iterator<? extends N>> horizon) {
+          Iterator<? extends N> top = horizon.getFirst();
+          while (top.hasNext()) {
+            N element = checkNotNull(top.next());
+            if (visited.add(element)) {
+              return element;
+            }
+          }
+          horizon.removeFirst();
+          return null;
+        }
+      };
+    }
+
+    static <N> Traversal<N> inTree(SuccessorsFunction<N> tree) {
+      return new Traversal<N>(tree) {
+        @Override
+        N visitNext(Deque<Iterator<? extends N>> horizon) {
+          Iterator<? extends N> top = horizon.getFirst();
+          if (top.hasNext()) {
+            return checkNotNull(top.next());
+          }
+          horizon.removeFirst();
+          return null;
+        }
+      };
+    }
+
+    final Iterator<N> breadthFirst(Iterator<? extends N> startNodes) {
+      return topDown(startNodes, InsertionOrder.BACK);
+    }
+
+    final Iterator<N> preOrder(Iterator<? extends N> startNodes) {
+      return topDown(startNodes, InsertionOrder.FRONT);
+    }
+
+    /**
+     * In top-down traversal, an ancestor node is always traversed before any of its descendant
+     * nodes. The traversal order among descendant nodes (particularly aunts and nieces) are
+     * determined by the {@code InsertionOrder} parameter: nieces are placed at the FRONT before
+     * aunts for pre-order; while in BFS they are placed at the BACK after aunts.
+     */
+    private Iterator<N> topDown(Iterator<? extends N> startNodes, final InsertionOrder order) {
+      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+      horizon.add(startNodes);
+      return new AbstractIterator<N>() {
+        @Override
+        protected N computeNext() {
+          do {
+            N next = visitNext(horizon);
+            if (next != null) {
+              Iterator<? extends N> successors = successorFunction.successors(next).iterator();
+              if (successors.hasNext()) {
+                // BFS: horizon.addLast(successors)
+                // Pre-order: horizon.addFirst(successors)
+                order.insertInto(horizon, successors);
+              }
+              return next;
+            }
+          } while (!horizon.isEmpty());
+          return endOfData();
+        }
+      };
+    }
+
+    final Iterator<N> postOrder(Iterator<? extends N> startNodes) {
+      final Deque<N> ancestorStack = new ArrayDeque<>();
+      final Deque<Iterator<? extends N>> horizon = new ArrayDeque<>();
+      horizon.add(startNodes);
+      return new AbstractIterator<N>() {
+        @Override
+        protected N computeNext() {
+          for (N next = visitNext(horizon); next != null; next = visitNext(horizon)) {
+            Iterator<? extends N> successors = successorFunction.successors(next).iterator();
+            if (!successors.hasNext()) {
+              return next;
+            }
+            horizon.addFirst(successors);
+            ancestorStack.push(next);
+          }
+          return ancestorStack.isEmpty() ? endOfData() : ancestorStack.pop();
+        }
+      };
+    }
+
+    /**
+     * Visits the next node from the top iterator of {@code horizon} and returns the visited node.
+     * Null is returned to indicate reaching the end of the top iterator.
+     *
+     * <p>For example, if horizon is {@code [[a, b], [c, d], [e]]}, {@code visitNext()} will return
+     * {@code [a, b, null, c, d, null, e, null]} sequentially, encoding the topological structure.
+     * (Note, however, that the callers of {@code visitNext()} often insert additional iterators
+     * into {@code horizon} between calls to {@code visitNext()}. This causes them to receive
+     * additional values interleaved with those shown above.)
+     */
+    @Nullable
+    abstract N visitNext(Deque<Iterator<? extends N>> horizon);
+  }
+
+  /** Poor man's method reference for {@code Deque::addFirst} and {@code Deque::addLast}. */
+  private enum InsertionOrder {
+    FRONT {
+      @Override
+      <T> void insertInto(Deque<T> deque, T value) {
+        deque.addFirst(value);
+      }
+    },
+    BACK {
+      @Override
+      <T> void insertInto(Deque<T> deque, T value) {
+        deque.addLast(value);
+      }
+    };
+
+    abstract <T> void insertInto(Deque<T> deque, T value);
   }
 }
diff --git a/guava/src/com/google/common/graph/UndirectedGraphConnections.java b/guava/src/com/google/common/graph/UndirectedGraphConnections.java
index 9636ccb..49689f9 100644
--- a/guava/src/com/google/common/graph/UndirectedGraphConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedGraphConnections.java
@@ -20,9 +20,13 @@
 import static com.google.common.graph.GraphConstants.INNER_CAPACITY;
 import static com.google.common.graph.GraphConstants.INNER_LOAD_FACTOR;
 
+import com.google.common.base.Function;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterators;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -40,8 +44,17 @@
     this.adjacentNodeValues = checkNotNull(adjacentNodeValues);
   }
 
-  static <N, V> UndirectedGraphConnections<N, V> of() {
-    return new UndirectedGraphConnections<>(new HashMap<N, V>(INNER_CAPACITY, INNER_LOAD_FACTOR));
+  static <N, V> UndirectedGraphConnections<N, V> of(ElementOrder<N> incidentEdgeOrder) {
+    switch (incidentEdgeOrder.type()) {
+      case UNORDERED:
+        return new UndirectedGraphConnections<>(
+            new HashMap<N, V>(INNER_CAPACITY, INNER_LOAD_FACTOR));
+      case STABLE:
+        return new UndirectedGraphConnections<>(
+            new LinkedHashMap<N, V>(INNER_CAPACITY, INNER_LOAD_FACTOR));
+      default:
+        throw new AssertionError(incidentEdgeOrder.type());
+    }
   }
 
   static <N, V> UndirectedGraphConnections<N, V> ofImmutable(Map<N, V> adjacentNodeValues) {
@@ -64,6 +77,18 @@
   }
 
   @Override
+  public Iterator<EndpointPair<N>> incidentEdgeIterator(final N thisNode) {
+    return Iterators.transform(
+        adjacentNodeValues.keySet().iterator(),
+        new Function<N, EndpointPair<N>>() {
+          @Override
+          public EndpointPair<N> apply(N incidentNode) {
+            return EndpointPair.unordered(thisNode, incidentNode);
+          }
+        });
+  }
+
+  @Override
   public V value(N node) {
     return adjacentNodeValues.get(node);
   }
diff --git a/guava/src/com/google/common/graph/ValueGraph.java b/guava/src/com/google/common/graph/ValueGraph.java
index 4aa54d7..ed27058 100644
--- a/guava/src/com/google/common/graph/ValueGraph.java
+++ b/guava/src/com/google/common/graph/ValueGraph.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
+import java.util.Collection;
 import java.util.Optional;
 import java.util.Set;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -150,6 +151,16 @@
   @Override
   ElementOrder<N> nodeOrder();
 
+  /**
+   * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of
+   * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link
+   * #successors(Object)} and {@link #incidentEdges(Object)}.
+   *
+   * @since 29.0
+   */
+  @Override
+  ElementOrder<N> incidentEdgeOrder();
+
   //
   // Element-level accessors
   //
@@ -157,6 +168,8 @@
   /**
    * Returns the nodes which have an incident edge in common with {@code node} in this graph.
    *
+   * <p>This is equal to the union of {@link #predecessors(Object)} and {@link #successors(Object)}.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    */
   @Override
@@ -190,6 +203,8 @@
   /**
    * Returns the edges in this graph whose endpoints include {@code node}.
    *
+   * <p>This is equal to the union of incoming and outgoing edges.
+   *
    * @throws IllegalArgumentException if {@code node} is not an element of this graph
    * @since 24.0
    */
diff --git a/guava/src/com/google/common/graph/ValueGraphBuilder.java b/guava/src/com/google/common/graph/ValueGraphBuilder.java
index c41422a..4fc752d 100644
--- a/guava/src/com/google/common/graph/ValueGraphBuilder.java
+++ b/guava/src/com/google/common/graph/ValueGraphBuilder.java
@@ -16,6 +16,7 @@
 
 package com.google.common.graph;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.graph.Graphs.checkNonNegative;
 
@@ -23,7 +24,8 @@
 import com.google.common.base.Optional;
 
 /**
- * A builder for constructing instances of {@link MutableValueGraph} with user-defined properties.
+ * A builder for constructing instances of {@link MutableValueGraph} or {@link ImmutableValueGraph}
+ * with user-defined properties.
  *
  * <p>A graph built by this class will have the following properties by default:
  *
@@ -32,14 +34,25 @@
  *   <li>orders {@link Graph#nodes()} in the order in which the elements were added
  * </ul>
  *
- * <p>Example of use:
+ * <p>Examples of use:
  *
  * <pre>{@code
+ * // Building a mutable value graph
  * MutableValueGraph<String, Double> graph =
  *     ValueGraphBuilder.undirected().allowsSelfLoops(true).build();
  * graph.putEdgeValue("San Francisco", "San Francisco", 0.0);
  * graph.putEdgeValue("San Jose", "San Jose", 0.0);
  * graph.putEdgeValue("San Francisco", "San Jose", 48.4);
+ *
+ * // Building an immutable value graph
+ * ImmutableValueGraph<String, Double> immutableGraph =
+ *     ValueGraphBuilder.undirected()
+ *         .allowsSelfLoops(true)
+ *         .<String, Double>immutable()
+ *         .putEdgeValue("San Francisco", "San Francisco", 0.0)
+ *         .putEdgeValue("San Jose", "San Jose", 0.0)
+ *         .putEdgeValue("San Francisco", "San Jose", 48.4)
+ *         .build();
  * }</pre>
  *
  * @author James Sexton
@@ -81,13 +94,32 @@
   public static <N, V> ValueGraphBuilder<N, V> from(ValueGraph<N, V> graph) {
     return new ValueGraphBuilder<N, V>(graph.isDirected())
         .allowsSelfLoops(graph.allowsSelfLoops())
-        .nodeOrder(graph.nodeOrder());
+        .nodeOrder(graph.nodeOrder())
+        .incidentEdgeOrder(graph.incidentEdgeOrder());
+  }
+
+  /**
+   * Returns an {@link ImmutableValueGraph.Builder} with the properties of this {@link
+   * ValueGraphBuilder}.
+   *
+   * <p>The returned builder can be used for populating an {@link ImmutableValueGraph}.
+   *
+   * <p>Note that the returned builder will always have {@link #incidentEdgeOrder} set to {@link
+   * ElementOrder#stable()}, regardless of the value that was set in this builder.
+   *
+   * @since 28.0
+   */
+  public <N1 extends N, V1 extends V> ImmutableValueGraph.Builder<N1, V1> immutable() {
+    ValueGraphBuilder<N1, V1> castBuilder = cast();
+    return new ImmutableValueGraph.Builder<>(castBuilder);
   }
 
   /**
    * Specifies whether the graph will allow self-loops (edges that connect a node to itself).
    * Attempting to add a self-loop to a graph that does not allow them will throw an {@link
    * UnsupportedOperationException}.
+   *
+   * <p>The default value is {@code false}.
    */
   public ValueGraphBuilder<N, V> allowsSelfLoops(boolean allowsSelfLoops) {
     this.allowsSelfLoops = allowsSelfLoops;
@@ -104,7 +136,11 @@
     return this;
   }
 
-  /** Specifies the order of iteration for the elements of {@link Graph#nodes()}. */
+  /**
+   * Specifies the order of iteration for the elements of {@link Graph#nodes()}.
+   *
+   * <p>The default value is {@link ElementOrder#insertion() insertion order}.
+   */
   public <N1 extends N> ValueGraphBuilder<N1, V> nodeOrder(ElementOrder<N1> nodeOrder) {
     ValueGraphBuilder<N1, V> newBuilder = cast();
     newBuilder.nodeOrder = checkNotNull(nodeOrder);
@@ -112,11 +148,45 @@
   }
 
   /**
+   * Specifies the order of iteration for the elements of {@link ValueGraph#edges()}, {@link
+   * ValueGraph#adjacentNodes(Object)}, {@link ValueGraph#predecessors(Object)}, {@link
+   * ValueGraph#successors(Object)} and {@link ValueGraph#incidentEdges(Object)}.
+   *
+   * <p>The default value is {@link ElementOrder#unordered() unordered} for mutable graphs. For
+   * immutable graphs, this value is ignored; they always have a {@link ElementOrder#stable()
+   * stable} order.
+   *
+   * @throws IllegalArgumentException if {@code incidentEdgeOrder} is not either {@code
+   *     ElementOrder.unordered()} or {@code ElementOrder.stable()}.
+   * @since 29.0
+   */
+  public <N1 extends N> ValueGraphBuilder<N1, V> incidentEdgeOrder(
+      ElementOrder<N1> incidentEdgeOrder) {
+    checkArgument(
+        incidentEdgeOrder.type() == ElementOrder.Type.UNORDERED
+            || incidentEdgeOrder.type() == ElementOrder.Type.STABLE,
+        "The given elementOrder (%s) is unsupported. incidentEdgeOrder() only supports"
+            + " ElementOrder.unordered() and ElementOrder.stable().",
+        incidentEdgeOrder);
+    ValueGraphBuilder<N1, V> newBuilder = cast();
+    newBuilder.incidentEdgeOrder = checkNotNull(incidentEdgeOrder);
+    return newBuilder;
+  }
+  /**
    * Returns an empty {@link MutableValueGraph} with the properties of this {@link
    * ValueGraphBuilder}.
    */
   public <N1 extends N, V1 extends V> MutableValueGraph<N1, V1> build() {
-    return new ConfigurableMutableValueGraph<>(this);
+    return new StandardMutableValueGraph<>(this);
+  }
+
+  ValueGraphBuilder<N, V> copy() {
+    ValueGraphBuilder<N, V> newBuilder = new ValueGraphBuilder<>(directed);
+    newBuilder.allowsSelfLoops = allowsSelfLoops;
+    newBuilder.nodeOrder = nodeOrder;
+    newBuilder.expectedNodeCount = expectedNodeCount;
+    newBuilder.incidentEdgeOrder = incidentEdgeOrder;
+    return newBuilder;
   }
 
   @SuppressWarnings("unchecked")
diff --git a/guava/src/com/google/common/hash/AbstractByteHasher.java b/guava/src/com/google/common/hash/AbstractByteHasher.java
index 668320e..48d48c4 100644
--- a/guava/src/com/google/common/hash/AbstractByteHasher.java
+++ b/guava/src/com/google/common/hash/AbstractByteHasher.java
@@ -54,7 +54,7 @@
   protected void update(ByteBuffer b) {
     if (b.hasArray()) {
       update(b.array(), b.arrayOffset() + b.position(), b.remaining());
-      b.position(b.limit());
+      Java8Compatibility.position(b, b.limit());
     } else {
       for (int remaining = b.remaining(); remaining > 0; remaining--) {
         update(b.get());
@@ -67,7 +67,7 @@
     try {
       update(scratch.array(), 0, bytes);
     } finally {
-      scratch.clear();
+      Java8Compatibility.clear(scratch);
     }
     return this;
   }
diff --git a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
index 525ead8..048e6c2 100644
--- a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
+++ b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
@@ -98,7 +98,7 @@
       public Hasher putBytes(ByteBuffer bytes) {
         int pos = bytes.position();
         for (Hasher hasher : hashers) {
-          bytes.position(pos);
+          Java8Compatibility.position(bytes, pos);
           hasher.putBytes(bytes);
         }
         return this;
diff --git a/guava/src/com/google/common/hash/AbstractHasher.java b/guava/src/com/google/common/hash/AbstractHasher.java
index 3452fb3..326aa8d 100644
--- a/guava/src/com/google/common/hash/AbstractHasher.java
+++ b/guava/src/com/google/common/hash/AbstractHasher.java
@@ -73,7 +73,7 @@
   public Hasher putBytes(ByteBuffer b) {
     if (b.hasArray()) {
       putBytes(b.array(), b.arrayOffset() + b.position(), b.remaining());
-      b.position(b.limit());
+      Java8Compatibility.position(b, b.limit());
     } else {
       for (int remaining = b.remaining(); remaining > 0; remaining--) {
         putByte(b.get());
diff --git a/guava/src/com/google/common/hash/AbstractStreamingHasher.java b/guava/src/com/google/common/hash/AbstractStreamingHasher.java
index ae05d1c..67de74b 100644
--- a/guava/src/com/google/common/hash/AbstractStreamingHasher.java
+++ b/guava/src/com/google/common/hash/AbstractStreamingHasher.java
@@ -80,13 +80,13 @@
    * <p>This implementation simply pads with zeros and delegates to {@link #process(ByteBuffer)}.
    */
   protected void processRemaining(ByteBuffer bb) {
-    bb.position(bb.limit()); // move at the end
-    bb.limit(chunkSize + 7); // get ready to pad with longs
+    Java8Compatibility.position(bb, bb.limit()); // move at the end
+    Java8Compatibility.limit(bb, chunkSize + 7); // get ready to pad with longs
     while (bb.position() < chunkSize) {
       bb.putLong(0);
     }
-    bb.limit(chunkSize);
-    bb.flip();
+    Java8Compatibility.limit(bb, chunkSize);
+    Java8Compatibility.flip(bb);
     process(bb);
   }
 
@@ -179,10 +179,10 @@
   @Override
   public final HashCode hash() {
     munch();
-    buffer.flip();
+    Java8Compatibility.flip(buffer);
     if (buffer.remaining() > 0) {
       processRemaining(buffer);
-      buffer.position(buffer.limit());
+      Java8Compatibility.position(buffer, buffer.limit());
     }
     return makeHash();
   }
@@ -203,7 +203,7 @@
   }
 
   private void munch() {
-    buffer.flip();
+    Java8Compatibility.flip(buffer);
     while (buffer.remaining() >= chunkSize) {
       // we could limit the buffer to ensure process() does not read more than
       // chunkSize number of bytes, but we trust the implementations
diff --git a/guava/src/com/google/common/hash/BloomFilter.java b/guava/src/com/google/common/hash/BloomFilter.java
index 97e0f0b..ba493eb 100644
--- a/guava/src/com/google/common/hash/BloomFilter.java
+++ b/guava/src/com/google/common/hash/BloomFilter.java
@@ -177,7 +177,6 @@
    * @since 14.0 (since 11.0 as expectedFalsePositiveProbability())
    */
   public double expectedFpp() {
-    // You down with FPP? (Yeah you know me!) Who's down with FPP? (Every last homie!)
     return Math.pow((double) bits.bitCount() / bitSize(), numHashFunctions);
   }
 
diff --git a/guava/src/com/google/common/hash/BloomFilterStrategies.java b/guava/src/com/google/common/hash/BloomFilterStrategies.java
index d234db1..1b4abea 100644
--- a/guava/src/com/google/common/hash/BloomFilterStrategies.java
+++ b/guava/src/com/google/common/hash/BloomFilterStrategies.java
@@ -151,7 +151,12 @@
     private final LongAddable bitCount;
 
     LockFreeBitArray(long bits) {
-      this(new long[Ints.checkedCast(LongMath.divide(bits, 64, RoundingMode.CEILING))]);
+      checkArgument(bits > 0, "data length is zero!");
+      // Avoid delegating to this(long[]), since AtomicLongArray(long[]) will clone its input and
+      // thus double memory usage.
+      this.data =
+          new AtomicLongArray(Ints.checkedCast(LongMath.divide(bits, 64, RoundingMode.CEILING)));
+      this.bitCount = LongAddables.create();
     }
 
     // Used by serialization
diff --git a/guava/src/com/google/common/hash/Funnel.java b/guava/src/com/google/common/hash/Funnel.java
index 077ef7a..2c6a7b9 100644
--- a/guava/src/com/google/common/hash/Funnel.java
+++ b/guava/src/com/google/common/hash/Funnel.java
@@ -15,6 +15,7 @@
 package com.google.common.hash;
 
 import com.google.common.annotations.Beta;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 
 /**
@@ -41,6 +42,7 @@
  * @since 11.0
  */
 @Beta
+@DoNotMock("Implement with a lambda")
 public interface Funnel<T> extends Serializable {
 
   /**
diff --git a/guava/src/com/google/common/hash/Java8Compatibility.java b/guava/src/com/google/common/hash/Java8Compatibility.java
new file mode 100644
index 0000000..52f71e7
--- /dev/null
+++ b/guava/src/com/google/common/hash/Java8Compatibility.java
@@ -0,0 +1,43 @@
+/*
+ * 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.hash;
+
+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
+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/hash/LittleEndianByteArray.java b/guava/src/com/google/common/hash/LittleEndianByteArray.java
index 91f5737..22ef4f0 100644
--- a/guava/src/com/google/common/hash/LittleEndianByteArray.java
+++ b/guava/src/com/google/common/hash/LittleEndianByteArray.java
@@ -232,16 +232,16 @@
     LittleEndianBytes theGetter = JavaLittleEndianBytes.INSTANCE;
     try {
       /*
-        UnsafeByteArray uses Unsafe.getLong() in an unsupported way, which is known to cause crashes
-        on Android when running in 32-bit mode. For maximum safety, we shouldn't use
-        Unsafe.getLong() at all, but the performance benefit on x86_64 is too great to ignore, so as
-        a compromise, we enable the optimization only on platforms that we specifically know to
-        work.
-
-        In the future, the use of Unsafe.getLong() should be replaced by ByteBuffer.getLong(), which
-        will have an efficient native implementation in JDK 9.
-
-      */
+       * UnsafeByteArray uses Unsafe.getLong() in an unsupported way, which is known to cause
+       * crashes on Android when running in 32-bit mode. For maximum safety, we shouldn't use
+       * Unsafe.getLong() at all, but the performance benefit on x86_64 is too great to ignore, so
+       * as a compromise, we enable the optimization only on platforms that we specifically know to
+       * work.
+       *
+       * In the future, the use of Unsafe.getLong() should be replaced by ByteBuffer.getLong(),
+       * which will have an efficient native implementation in JDK 9.
+       *
+       */
       final String arch = System.getProperty("os.arch");
       if ("amd64".equals(arch)) {
         theGetter =
diff --git a/guava/src/com/google/common/hash/Murmur3_128HashFunction.java b/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
index a365ad8..4cb7adc 100644
--- a/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
+++ b/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
@@ -166,7 +166,7 @@
     }
 
     @Override
-    public HashCode makeHash() {
+    protected HashCode makeHash() {
       h1 ^= length;
       h2 ^= length;
 
diff --git a/guava/src/com/google/common/hash/SipHashFunction.java b/guava/src/com/google/common/hash/SipHashFunction.java
index e3f8db5..6ec8a63 100644
--- a/guava/src/com/google/common/hash/SipHashFunction.java
+++ b/guava/src/com/google/common/hash/SipHashFunction.java
@@ -143,7 +143,7 @@
     }
 
     @Override
-    public HashCode makeHash() {
+    protected HashCode makeHash() {
       // End with a byte encoding the positive integer b mod 256.
       finalM ^= b << 56;
       processM(finalM);
diff --git a/guava/src/com/google/common/io/BaseEncoding.java b/guava/src/com/google/common/io/BaseEncoding.java
index d8d4797..e2b7e00 100644
--- a/guava/src/com/google/common/io/BaseEncoding.java
+++ b/guava/src/com/google/common/io/BaseEncoding.java
@@ -28,13 +28,13 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Ascii;
 import com.google.common.base.Objects;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -772,6 +772,27 @@
         }
 
         @Override
+        public int read(byte[] buf, int off, int len) throws IOException {
+          // Overriding this to work around the fact that InputStream's default implementation of
+          // this method will silently swallow exceptions thrown by the single-byte read() method
+          // (other than on the first call to it), which in this case can cause invalid encoded
+          // strings to not throw an exception.
+          // See https://github.com/google/guava/issues/3542
+          checkPositionIndexes(off, off + len, buf.length);
+
+          int i = off;
+          for (; i < off + len; i++) {
+            int b = read();
+            if (b == -1) {
+              int read = i - off;
+              return read == 0 ? -1 : read;
+            }
+            buf[i] = (byte) b;
+          }
+          return i - off;
+        }
+
+        @Override
         public void close() throws IOException {
           reader.close();
         }
@@ -810,8 +831,8 @@
       return new SeparatedBaseEncoding(this, separator, afterEveryChars);
     }
 
-    private transient @MonotonicNonNull BaseEncoding upperCase;
-    private transient @MonotonicNonNull BaseEncoding lowerCase;
+    @LazyInit private transient @Nullable BaseEncoding upperCase;
+    @LazyInit private transient @Nullable BaseEncoding lowerCase;
 
     @Override
     public BaseEncoding upperCase() {
@@ -1031,12 +1052,12 @@
   @GwtIncompatible // Writer
   static Writer separatingWriter(
       final Writer delegate, final String separator, final int afterEveryChars) {
-    final Appendable seperatingAppendable =
+    final Appendable separatingAppendable =
         separatingAppendable(delegate, separator, afterEveryChars);
     return new Writer() {
       @Override
       public void write(int c) throws IOException {
-        seperatingAppendable.append((char) c);
+        separatingAppendable.append((char) c);
       }
 
       @Override
diff --git a/guava/src/com/google/common/io/ByteProcessor.java b/guava/src/com/google/common/io/ByteProcessor.java
index 23f0e3e..115c735 100644
--- a/guava/src/com/google/common/io/ByteProcessor.java
+++ b/guava/src/com/google/common/io/ByteProcessor.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.IOException;
 
 /**
@@ -29,6 +30,7 @@
  * @since 1.0
  */
 @Beta
+@DoNotMock("Implement it normally")
 @GwtIncompatible
 public interface ByteProcessor<T> {
   /**
diff --git a/guava/src/com/google/common/io/ByteSource.java b/guava/src/com/google/common/io/ByteSource.java
index c60077e..19f3a43 100644
--- a/guava/src/com/google/common/io/ByteSource.java
+++ b/guava/src/com/google/common/io/ByteSource.java
@@ -215,10 +215,7 @@
     }
   }
 
-  /**
-   * Counts the bytes in the given input stream using skip if possible. Returns SKIP_FAILED if the
-   * first call to skip threw, in which case skip may just not be supported.
-   */
+  /** Counts the bytes in the given input stream using skip if possible. */
   private long countBySkipping(InputStream in) throws IOException {
     long count = 0;
     long skipped;
@@ -419,6 +416,11 @@
    * 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
+   * 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.
+   *
    * @since 15.0 (since 14.0 as {@code ByteStreams.asByteSource(byte[])}).
    */
   public static ByteSource wrap(byte[] b) {
@@ -528,7 +530,9 @@
       checkArgument(offset >= 0, "offset (%s) may not be negative", offset);
       checkArgument(length >= 0, "length (%s) may not be negative", length);
       long maxLength = this.length - offset;
-      return ByteSource.this.slice(this.offset + offset, Math.min(length, maxLength));
+      return maxLength <= 0
+          ? ByteSource.empty()
+          : ByteSource.this.slice(this.offset + offset, Math.min(length, maxLength));
     }
 
     @Override
diff --git a/guava/src/com/google/common/io/ByteStreams.java b/guava/src/com/google/common/io/ByteStreams.java
index e6601be..bdb24db 100644
--- a/guava/src/com/google/common/io/ByteStreams.java
+++ b/guava/src/com/google/common/io/ByteStreams.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.checkPositionIndex;
+import static com.google.common.base.Preconditions.checkPositionIndexes;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -39,7 +40,7 @@
 import java.nio.channels.WritableByteChannel;
 import java.util.ArrayDeque;
 import java.util.Arrays;
-import java.util.Deque;
+import java.util.Queue;
 
 /**
  * Provides utility methods for working with byte arrays and I/O streams.
@@ -144,11 +145,11 @@
     ByteBuffer buf = ByteBuffer.wrap(createBuffer());
     long total = 0;
     while (from.read(buf) != -1) {
-      buf.flip();
+      Java8Compatibility.flip(buf);
       while (buf.hasRemaining()) {
         total += to.write(buf);
       }
-      buf.clear();
+      Java8Compatibility.clear(buf);
     }
     return total;
   }
@@ -164,9 +165,9 @@
    * a total combined length of {@code totalLen} bytes) followed by all bytes remaining in the given
    * input stream.
    */
-  private static byte[] toByteArrayInternal(InputStream in, Deque<byte[]> bufs, int totalLen)
+  private static byte[] toByteArrayInternal(InputStream in, Queue<byte[]> bufs, int totalLen)
       throws IOException {
-    // Starting with an 8k buffer, double the size of each sucessive buffer. Buffers are retained
+    // Starting with an 8k buffer, double the size of each successive buffer. Buffers are retained
     // in a deque so that there's no copying between buffers while reading and so all of the bytes
     // in each new allocated buffer are available for reading from the stream.
     for (int bufSize = BUFFER_SIZE;
@@ -195,11 +196,11 @@
     }
   }
 
-  private static byte[] combineBuffers(Deque<byte[]> bufs, int totalLen) {
+  private static byte[] combineBuffers(Queue<byte[]> bufs, int totalLen) {
     byte[] result = new byte[totalLen];
     int remaining = totalLen;
     while (remaining > 0) {
-      byte[] buf = bufs.removeFirst();
+      byte[] buf = bufs.remove();
       int bytesToCopy = Math.min(remaining, buf.length);
       int resultOffset = totalLen - remaining;
       System.arraycopy(buf, 0, result, resultOffset, bytesToCopy);
@@ -252,7 +253,7 @@
     }
 
     // the stream was longer, so read the rest normally
-    Deque<byte[]> bufs = new ArrayDeque<byte[]>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
+    Queue<byte[]> bufs = new ArrayDeque<byte[]>(TO_BYTE_ARRAY_DEQUE_SIZE + 2);
     bufs.add(bytes);
     bufs.add(new byte[] {(byte) b});
     return toByteArrayInternal(in, bufs, bytes.length + 1);
@@ -490,18 +491,18 @@
    * @since 17.0
    */
   @Beta
-  public static ByteArrayDataOutput newDataOutput(ByteArrayOutputStream byteArrayOutputSteam) {
-    return new ByteArrayDataOutputStream(checkNotNull(byteArrayOutputSteam));
+  public static ByteArrayDataOutput newDataOutput(ByteArrayOutputStream byteArrayOutputStream) {
+    return new ByteArrayDataOutputStream(checkNotNull(byteArrayOutputStream));
   }
 
   private static class ByteArrayDataOutputStream implements ByteArrayDataOutput {
 
     final DataOutput output;
-    final ByteArrayOutputStream byteArrayOutputSteam;
+    final ByteArrayOutputStream byteArrayOutputStream;
 
-    ByteArrayDataOutputStream(ByteArrayOutputStream byteArrayOutputSteam) {
-      this.byteArrayOutputSteam = byteArrayOutputSteam;
-      output = new DataOutputStream(byteArrayOutputSteam);
+    ByteArrayDataOutputStream(ByteArrayOutputStream byteArrayOutputStream) {
+      this.byteArrayOutputStream = byteArrayOutputStream;
+      output = new DataOutputStream(byteArrayOutputStream);
     }
 
     @Override
@@ -632,7 +633,7 @@
 
     @Override
     public byte[] toByteArray() {
-      return byteArrayOutputSteam.toByteArray();
+      return byteArrayOutputStream.toByteArray();
     }
   }
 
@@ -816,7 +817,8 @@
    */
   static long skipUpTo(InputStream in, final long n) throws IOException {
     long totalSkipped = 0;
-    byte[] buf = createBuffer();
+    // A buffer is allocated if skipSafely does not skip any bytes.
+    byte[] buf = null;
 
     while (totalSkipped < n) {
       long remaining = n - totalSkipped;
@@ -825,7 +827,13 @@
       if (skipped == 0) {
         // Do a buffered read since skipSafely could return 0 repeatedly, for example if
         // in.available() always returns 0 (the default).
-        int skip = (int) Math.min(remaining, buf.length);
+        int skip = (int) Math.min(remaining, BUFFER_SIZE);
+        if (buf == null) {
+          // Allocate a buffer bounded by the maximum size that can be requested, for
+          // example an array of BUFFER_SIZE is unnecessary when the value of remaining
+          // is smaller.
+          buf = new byte[skip];
+        }
         if ((skipped = in.read(buf, 0, skip)) == -1) {
           // Reached EOF
           break;
@@ -894,6 +902,8 @@
    * @param len an int specifying the number of bytes to read
    * @return the number of bytes read
    * @throws IOException if an I/O error occurs
+   * @throws IndexOutOfBoundsException if {@code off} is negative, if {@code len} is negative, or if
+   *     {@code off + len} is greater than {@code b.length}
    */
   @Beta
   @CanIgnoreReturnValue
@@ -903,8 +913,9 @@
     checkNotNull(in);
     checkNotNull(b);
     if (len < 0) {
-      throw new IndexOutOfBoundsException("len is negative");
+      throw new IndexOutOfBoundsException(String.format("len (%s) cannot be negative", len));
     }
+    checkPositionIndexes(off, off + len, b.length);
     int total = 0;
     while (total < len) {
       int result = in.read(b, off + total, len - total);
diff --git a/guava/src/com/google/common/io/CharStreams.java b/guava/src/com/google/common/io/CharStreams.java
index bc4dd51..dd54253 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 org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with character streams.
@@ -82,10 +83,10 @@
       long total = 0;
       CharBuffer buf = createBuffer();
       while (from.read(buf) != -1) {
-        buf.flip();
+        Java8Compatibility.flip(buf);
         to.append(buf);
         total += buf.remaining();
-        buf.clear();
+        Java8Compatibility.clear(buf);
       }
       return total;
     }
@@ -242,7 +243,7 @@
     CharBuffer buf = createBuffer();
     while ((read = readable.read(buf)) != -1) {
       total += read;
-      buf.clear();
+      Java8Compatibility.clear(buf);
     }
     return total;
   }
@@ -306,14 +307,13 @@
     }
 
     @Override
-    public Writer append(CharSequence csq) {
-      checkNotNull(csq);
+    public Writer append(@Nullable CharSequence csq) {
       return this;
     }
 
     @Override
-    public Writer append(CharSequence csq, int start, int end) {
-      checkPositionIndexes(start, end, csq.length());
+    public Writer append(@Nullable 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/Closer.java b/guava/src/com/google/common/io/Closer.java
index 0c42c8a..82cfcb4 100644
--- a/guava/src/com/google/common/io/Closer.java
+++ b/guava/src/com/google/common/io/Closer.java
@@ -27,7 +27,6 @@
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.logging.Level;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -106,7 +105,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);
-  @MonotonicNonNull private Throwable thrown;
+  private @Nullable Throwable thrown;
 
   @VisibleForTesting
   Closer(Suppressor suppressor) {
@@ -265,9 +264,9 @@
       return addSuppressed != null;
     }
 
-    static final Method addSuppressed = getAddSuppressed();
+    static final Method addSuppressed = addSuppressedMethodOrNull();
 
-    private static Method getAddSuppressed() {
+    private static Method addSuppressedMethodOrNull() {
       try {
         return Throwable.class.getMethod("addSuppressed", Throwable.class);
       } catch (Throwable e) {
diff --git a/guava/src/com/google/common/io/FileBackedOutputStream.java b/guava/src/com/google/common/io/FileBackedOutputStream.java
index 27e3feb..8d8effc 100644
--- a/guava/src/com/google/common/io/FileBackedOutputStream.java
+++ b/guava/src/com/google/common/io/FileBackedOutputStream.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.errorprone.annotations.concurrent.GuardedBy;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -31,6 +32,17 @@
  * An {@link OutputStream} that starts buffering to a byte array, but switches to file buffering
  * once the data reaches a configurable size.
  *
+ * <p>Temporary files created by this stream may live in the local filesystem until either:
+ *
+ * <ul>
+ *   <li>{@link #reset} is called (removing the data in this stream and deleting the file), or...
+ *   <li>this stream (or, more precisely, its {@link #asByteSource} view) is finalized during
+ *       garbage collection, <strong>AND</strong> this stream was not constructed with {@linkplain
+ *       #FileBackedOutputStream(int) the 1-arg constructor} or the {@linkplain
+ *       #FileBackedOutputStream(int, boolean) 2-arg constructor} passing {@code false} in the
+ *       second parameter.
+ * </ul>
+ *
  * <p>This class is thread-safe.
  *
  * @author Chris Nokleberg
@@ -39,13 +51,18 @@
 @Beta
 @GwtIncompatible
 public final class FileBackedOutputStream extends OutputStream {
-
   private final int fileThreshold;
   private final boolean resetOnFinalize;
   private final ByteSource source;
+  @Nullable private final File parentDirectory;
 
+  @GuardedBy("this")
   private OutputStream out;
+
+  @GuardedBy("this")
   private MemoryOutput memory;
+
+  @GuardedBy("this")
   private @Nullable File file;
 
   /** ByteArrayOutputStream that exposes its internals. */
@@ -81,11 +98,17 @@
    *
    * @param fileThreshold the number of bytes before the stream should switch to buffering to a file
    * @param resetOnFinalize if true, the {@link #reset} method will be called when the {@link
-   *     ByteSource} returned by {@link #asByteSource} is finalized
+   *     ByteSource} returned by {@link #asByteSource} is finalized.
    */
   public FileBackedOutputStream(int fileThreshold, boolean resetOnFinalize) {
+    this(fileThreshold, resetOnFinalize, null);
+  }
+
+  private FileBackedOutputStream(
+      int fileThreshold, boolean resetOnFinalize, @Nullable File parentDirectory) {
     this.fileThreshold = fileThreshold;
     this.resetOnFinalize = resetOnFinalize;
+    this.parentDirectory = parentDirectory;
     memory = new MemoryOutput();
     out = memory;
 
@@ -191,9 +214,10 @@
    * Checks if writing {@code len} bytes would go over threshold, and switches to file buffering if
    * so.
    */
+  @GuardedBy("this")
   private void update(int len) throws IOException {
     if (file == null && (memory.getCount() + len > fileThreshold)) {
-      File temp = File.createTempFile("FileBackedOutputStream", null);
+      File temp = File.createTempFile("FileBackedOutputStream", null, parentDirectory);
       if (resetOnFinalize) {
         // Finalizers are not guaranteed to be called on system shutdown;
         // this is insurance.
diff --git a/guava/src/com/google/common/io/Files.java b/guava/src/com/google/common/io/Files.java
index 34e03f6..73eb656 100644
--- a/guava/src/com/google/common/io/Files.java
+++ b/guava/src/com/google/common/io/Files.java
@@ -24,9 +24,9 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import com.google.common.collect.TreeTraverser;
 import com.google.common.graph.SuccessorsFunction;
 import com.google.common.graph.Traverser;
 import com.google.common.hash.HashCode;
@@ -246,7 +246,7 @@
    * @return a string containing all the characters from the file
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(file, charset).read()}. This method is scheduled to be
-   *     removed in January 2019.
+   *     removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -278,7 +278,7 @@
    *     helpful predefined constants
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSink(to, charset).write(from)}. This method is scheduled to be
-   *     removed in January 2019.
+   *     removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -335,7 +335,7 @@
    * @param to the appendable object
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(from, charset).copyTo(to)}. This method is scheduled to
-   *     be removed in January 2019.
+   *     be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -353,7 +353,7 @@
    *     helpful predefined constants
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSink(to, charset, FileWriteMode.APPEND).write(from)}. This
-   *     method is scheduled to be removed in January 2019.
+   *     method is scheduled to be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -398,6 +398,11 @@
    * be exploited to create security vulnerabilities, especially when executable files are to be
    * written into the directory.
    *
+   * <p>Depending on the environmment that this code is run in, the system temporary directory (and
+   * thus the directory this method creates) may be more visible that a program would like - files
+   * written to this directory may be read or overwritten by hostile programs running on the same
+   * machine.
+   *
    * <p>This method assumes that the temporary volume is writable, has free inodes and free blocks,
    * and that it will not be called thousands of times per second.
    *
@@ -406,8 +411,15 @@
    *
    * @return the newly-created directory
    * @throws IllegalStateException if the directory could not be created
+   * @deprecated For Android users, see the <a
+   *     href="https://developer.android.com/training/data-storage" target="_blank">Data and File
+   *     Storage overview</a> to select an appropriate temporary directory (perhaps {@code
+   *     context.getCacheDir()}). For developers on Java 7 or later, use {@link
+   *     java.nio.file.Files#createTempDirectory}, transforming it to a {@link File} using {@link
+   *     java.nio.file.Path#toFile() toFile()} if needed.
    */
   @Beta
+  @Deprecated
   public static File createTempDir() {
     File baseDir = new File(System.getProperty("java.io.tmpdir"));
     @SuppressWarnings("GoodTime") // reading system time without TimeSource
@@ -513,7 +525,7 @@
    * @return the first line, or null if the file is empty
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(file, charset).readFirstLine()}. This method is
-   *     scheduled to be removed in January 2019.
+   *     scheduled to be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -571,7 +583,7 @@
    * @return the output of processing the lines
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asCharSource(file, charset).readLines(callback)}. This method is
-   *     scheduled to be removed in January 2019.
+   *     scheduled to be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -591,7 +603,7 @@
    * @return the result of the byte processor
    * @throws IOException if an I/O error occurs
    * @deprecated Prefer {@code asByteSource(file).read(processor)}. This method is scheduled to be
-   *     removed in January 2019.
+   *     removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -610,7 +622,7 @@
    * @throws IOException if an I/O error occurs
    * @since 12.0
    * @deprecated Prefer {@code asByteSource(file).hash(hashFunction)}. This method is scheduled to
-   *     be removed in January 2019.
+   *     be removed in October 2019.
    */
   @Beta
   @Deprecated
@@ -813,36 +825,6 @@
   }
 
   /**
-   * Returns a {@link TreeTraverser} instance for {@link File} trees.
-   *
-   * <p><b>Warning:</b> {@code File} provides no support for symbolic links, and as such there is no
-   * way to ensure that a symbolic link to a directory is not followed when traversing the tree. In
-   * this case, iterables created by this traverser could contain files that are outside of the
-   * given directory or even be infinite if there is a symbolic link loop.
-   *
-   * @since 15.0
-   * @deprecated The returned {@link TreeTraverser} type is deprecated. Use the replacement method
-   *     {@link #fileTraverser()} instead with the same semantics as this method.
-   */
-  @Deprecated
-  static TreeTraverser<File> fileTreeTraverser() {
-    return FILE_TREE_TRAVERSER;
-  }
-
-  private static final TreeTraverser<File> FILE_TREE_TRAVERSER =
-      new TreeTraverser<File>() {
-        @Override
-        public Iterable<File> children(File file) {
-          return fileTreeChildren(file);
-        }
-
-        @Override
-        public String toString() {
-          return "Files.fileTreeTraverser()";
-        }
-      };
-
-  /**
    * Returns a {@link Traverser} instance for the file and directory tree. The returned traverser
    * starts from a {@link File} and will return all files and directories it encounters.
    *
@@ -873,22 +855,18 @@
       new SuccessorsFunction<File>() {
         @Override
         public Iterable<File> successors(File file) {
-          return fileTreeChildren(file);
+          // check isDirectory() just because it may be faster than listFiles() on a non-directory
+          if (file.isDirectory()) {
+            File[] files = file.listFiles();
+            if (files != null) {
+              return Collections.unmodifiableList(Arrays.asList(files));
+            }
+          }
+
+          return ImmutableList.of();
         }
       };
 
-  private static Iterable<File> fileTreeChildren(File file) {
-    // check isDirectory() just because it may be faster than listFiles() on a non-directory
-    if (file.isDirectory()) {
-      File[] files = file.listFiles();
-      if (files != null) {
-        return Collections.unmodifiableList(Arrays.asList(files));
-      }
-    }
-
-    return Collections.emptyList();
-  }
-
   /**
    * Returns a predicate that returns the result of {@link File#isDirectory} on input files.
    *
diff --git a/guava/src/com/google/common/io/Java8Compatibility.java b/guava/src/com/google/common/io/Java8Compatibility.java
new file mode 100644
index 0000000..62b5c2e
--- /dev/null
+++ b/guava/src/com/google/common/io/Java8Compatibility.java
@@ -0,0 +1,43 @@
+/*
+ * 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.io;
+
+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
+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/io/LineReader.java b/guava/src/com/google/common/io/LineReader.java
index 1ccb4d1..55b659f2 100644
--- a/guava/src/com/google/common/io/LineReader.java
+++ b/guava/src/com/google/common/io/LineReader.java
@@ -70,7 +70,7 @@
   @CanIgnoreReturnValue // to skip a line
   public String readLine() throws IOException {
     while (lines.peek() == null) {
-      cbuf.clear();
+      Java8Compatibility.clear(cbuf);
       // The default implementation of Reader#read(CharBuffer) allocates a
       // temporary char[], so we call Reader#read(char[], int, int) instead.
       int read = (reader != null) ? reader.read(buf, 0, buf.length) : readable.read(cbuf);
diff --git a/guava/src/com/google/common/io/ReaderInputStream.java b/guava/src/com/google/common/io/ReaderInputStream.java
index 9cbca93..eeb64e4 100644
--- a/guava/src/com/google/common/io/ReaderInputStream.java
+++ b/guava/src/com/google/common/io/ReaderInputStream.java
@@ -104,7 +104,7 @@
     encoder.reset();
 
     charBuffer = CharBuffer.allocate(bufferSize);
-    charBuffer.flip();
+    Java8Compatibility.flip(charBuffer);
 
     byteBuffer = ByteBuffer.allocate(bufferSize);
   }
@@ -143,7 +143,7 @@
           return (totalBytesRead > 0) ? totalBytesRead : -1;
         }
         draining = false;
-        byteBuffer.clear();
+        Java8Compatibility.clear(byteBuffer);
       }
 
       while (true) {
@@ -189,8 +189,8 @@
   private static CharBuffer grow(CharBuffer buf) {
     char[] copy = Arrays.copyOf(buf.array(), buf.capacity() * 2);
     CharBuffer bigger = CharBuffer.wrap(copy);
-    bigger.position(buf.position());
-    bigger.limit(buf.limit());
+    Java8Compatibility.position(bigger, buf.position());
+    Java8Compatibility.limit(bigger, buf.limit());
     return bigger;
   }
 
@@ -207,7 +207,7 @@
     if (availableCapacity(charBuffer) == 0) {
       if (charBuffer.position() > 0) {
         // (2) There is room in the buffer. Move existing bytes to the beginning.
-        charBuffer.compact().flip();
+        Java8Compatibility.flip(charBuffer.compact());
       } else {
         // (3) Entire buffer is full, need bigger buffer.
         charBuffer = grow(charBuffer);
@@ -220,7 +220,7 @@
     if (numChars == -1) {
       endOfInput = true;
     } else {
-      charBuffer.limit(limit + numChars);
+      Java8Compatibility.limit(charBuffer, limit + numChars);
     }
   }
 
@@ -235,7 +235,7 @@
    * overflow must be due to a small output buffer.
    */
   private void startDraining(boolean overflow) {
-    byteBuffer.flip();
+    Java8Compatibility.flip(byteBuffer);
     if (overflow && byteBuffer.remaining() == 0) {
       byteBuffer = ByteBuffer.allocate(byteBuffer.capacity() * 2);
     } else {
diff --git a/guava/src/com/google/common/io/Resources.java b/guava/src/com/google/common/io/Resources.java
index 133fad7..d64bf3d 100644
--- a/guava/src/com/google/common/io/Resources.java
+++ b/guava/src/com/google/common/io/Resources.java
@@ -202,6 +202,7 @@
    *
    * @throws IllegalArgumentException if the resource is not found
    */
+  @CanIgnoreReturnValue // being used to check if a resource exists
   public static URL getResource(Class<?> contextClass, String resourceName) {
     URL url = contextClass.getResource(resourceName);
     checkArgument(
diff --git a/guava/src/com/google/common/math/BigDecimalMath.java b/guava/src/com/google/common/math/BigDecimalMath.java
new file mode 100644
index 0000000..b5c23f8
--- /dev/null
+++ b/guava/src/com/google/common/math/BigDecimalMath.java
@@ -0,0 +1,81 @@
+/*
+ * 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.math;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * A class for arithmetic on {@link BigDecimal} that is not covered by its built-in methods.
+ *
+ * @author Louis Wasserman
+ * @since 30.0
+ */
+@GwtIncompatible
+public class BigDecimalMath {
+  private BigDecimalMath() {}
+
+  /**
+   * Returns {@code x}, rounded to a {@code double} with the specified rounding mode. If {@code x}
+   * is precisely representable as a {@code double}, its {@code double} value will be returned;
+   * otherwise, the rounding will choose between the two nearest representable values with {@code
+   * mode}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_DOWN}, {@code HALF_UP}, and {@code HALF_EVEN},
+   * infinite {@code double} values are considered infinitely far away. For example, 2^2000 is not
+   * representable as a double, but {@code roundToDouble(BigDecimal.valueOf(2).pow(2000), HALF_UP)}
+   * will return {@code Double.MAX_VALUE}, not {@code Double.POSITIVE_INFINITY}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_EVEN}, this implementation uses the IEEE 754
+   * default rounding mode: if the two nearest representable values are equally near, the one with
+   * the least significant bit zero is chosen. (In such cases, both of the nearest representable
+   * values are even integers; this method returns the one that is a multiple of a greater power of
+   * two.)
+   *
+   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
+   *     is not precisely representable as a {@code double}
+   * @since 30.0
+   */
+  public static double roundToDouble(BigDecimal x, RoundingMode mode) {
+    return BigDecimalToDoubleRounder.INSTANCE.roundToDouble(x, mode);
+  }
+
+  private static class BigDecimalToDoubleRounder extends ToDoubleRounder<BigDecimal> {
+    static final BigDecimalToDoubleRounder INSTANCE = new BigDecimalToDoubleRounder();
+
+    private BigDecimalToDoubleRounder() {}
+
+    @Override
+    double roundToDoubleArbitrarily(BigDecimal bigDecimal) {
+      return bigDecimal.doubleValue();
+    }
+
+    @Override
+    int sign(BigDecimal bigDecimal) {
+      return bigDecimal.signum();
+    }
+
+    @Override
+    BigDecimal toX(double d, RoundingMode mode) {
+      return new BigDecimal(d);
+    }
+
+    @Override
+    BigDecimal minus(BigDecimal a, BigDecimal b) {
+      return a.subtract(b);
+    }
+  }
+}
diff --git a/guava/src/com/google/common/math/BigIntegerMath.java b/guava/src/com/google/common/math/BigIntegerMath.java
index b0c0766..bf443e9 100644
--- a/guava/src/com/google/common/math/BigIntegerMath.java
+++ b/guava/src/com/google/common/math/BigIntegerMath.java
@@ -21,7 +21,9 @@
 import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
 import static java.math.RoundingMode.CEILING;
 import static java.math.RoundingMode.FLOOR;
+import static java.math.RoundingMode.HALF_DOWN;
 import static java.math.RoundingMode.HALF_EVEN;
+import static java.math.RoundingMode.UNNECESSARY;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -56,7 +58,7 @@
    */
   @Beta
   public static BigInteger ceilingPowerOfTwo(BigInteger x) {
-    return BigInteger.ZERO.setBit(log2(x, RoundingMode.CEILING));
+    return BigInteger.ZERO.setBit(log2(x, CEILING));
   }
 
   /**
@@ -68,7 +70,7 @@
    */
   @Beta
   public static BigInteger floorPowerOfTwo(BigInteger x) {
-    return BigInteger.ZERO.setBit(log2(x, RoundingMode.FLOOR));
+    return BigInteger.ZERO.setBit(log2(x, FLOOR));
   }
 
   /** Returns {@code true} if {@code x} represents a power of two. */
@@ -307,6 +309,59 @@
   }
 
   /**
+   * Returns {@code x}, rounded to a {@code double} with the specified rounding mode. If {@code x}
+   * is precisely representable as a {@code double}, its {@code double} value will be returned;
+   * otherwise, the rounding will choose between the two nearest representable values with {@code
+   * mode}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_DOWN}, {@code HALF_UP}, and {@code HALF_EVEN},
+   * infinite {@code double} values are considered infinitely far away. For example, 2^2000 is not
+   * representable as a double, but {@code roundToDouble(BigInteger.valueOf(2).pow(2000), HALF_UP)}
+   * will return {@code Double.MAX_VALUE}, not {@code Double.POSITIVE_INFINITY}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_EVEN}, this implementation uses the IEEE 754
+   * default rounding mode: if the two nearest representable values are equally near, the one with
+   * the least significant bit zero is chosen. (In such cases, both of the nearest representable
+   * values are even integers; this method returns the one that is a multiple of a greater power of
+   * two.)
+   *
+   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
+   *     is not precisely representable as a {@code double}
+   * @since 30.0
+   */
+  @GwtIncompatible
+  public static double roundToDouble(BigInteger x, RoundingMode mode) {
+    return BigIntegerToDoubleRounder.INSTANCE.roundToDouble(x, mode);
+  }
+
+  @GwtIncompatible
+  private static class BigIntegerToDoubleRounder extends ToDoubleRounder<BigInteger> {
+    static final BigIntegerToDoubleRounder INSTANCE = new BigIntegerToDoubleRounder();
+
+    private BigIntegerToDoubleRounder() {}
+
+    @Override
+    double roundToDoubleArbitrarily(BigInteger bigInteger) {
+      return DoubleUtils.bigToDouble(bigInteger);
+    }
+
+    @Override
+    int sign(BigInteger bigInteger) {
+      return bigInteger.signum();
+    }
+
+    @Override
+    BigInteger toX(double d, RoundingMode mode) {
+      return DoubleMath.roundToBigInteger(d, mode);
+    }
+
+    @Override
+    BigInteger minus(BigInteger a, BigInteger b) {
+      return a.subtract(b);
+    }
+  }
+
+  /**
    * Returns the result of dividing {@code p} by {@code q}, rounding using the specified {@code
    * RoundingMode}.
    *
@@ -432,7 +487,7 @@
     long numeratorAccum = n;
     long denominatorAccum = 1;
 
-    int bits = LongMath.log2(n, RoundingMode.CEILING);
+    int bits = LongMath.log2(n, CEILING);
 
     int numeratorBits = bits;
 
diff --git a/guava/src/com/google/common/math/DoubleUtils.java b/guava/src/com/google/common/math/DoubleUtils.java
index 246bb96..4183195 100644
--- a/guava/src/com/google/common/math/DoubleUtils.java
+++ b/guava/src/com/google/common/math/DoubleUtils.java
@@ -131,11 +131,7 @@
   /** Returns its argument if it is non-negative, zero if it is negative. */
   static double ensureNonNegative(double value) {
     checkArgument(!isNaN(value));
-    if (value > 0.0) {
-      return value;
-    } else {
-      return 0.0;
-    }
+    return Math.max(value, 0.0);
   }
 
   @VisibleForTesting static final long ONE_BITS = 0x3ff0000000000000L;
diff --git a/guava/src/com/google/common/math/LongMath.java b/guava/src/com/google/common/math/LongMath.java
index b16db71..420b48a 100644
--- a/guava/src/com/google/common/math/LongMath.java
+++ b/guava/src/com/google/common/math/LongMath.java
@@ -29,6 +29,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.primitives.Longs;
 import com.google.common.primitives.UnsignedLongs;
 import java.math.BigInteger;
 import java.math.RoundingMode;
@@ -1004,8 +1005,29 @@
       checkNonNegative("n", n);
       return false;
     }
-    if (n == 2 || n == 3 || n == 5 || n == 7 || n == 11 || n == 13) {
-      return true;
+    if (n < 66) {
+      // Encode all primes less than 66 into mask without 0 and 1.
+      long mask =
+          (1L << (2 - 2))
+              | (1L << (3 - 2))
+              | (1L << (5 - 2))
+              | (1L << (7 - 2))
+              | (1L << (11 - 2))
+              | (1L << (13 - 2))
+              | (1L << (17 - 2))
+              | (1L << (19 - 2))
+              | (1L << (23 - 2))
+              | (1L << (29 - 2))
+              | (1L << (31 - 2))
+              | (1L << (37 - 2))
+              | (1L << (41 - 2))
+              | (1L << (43 - 2))
+              | (1L << (47 - 2))
+              | (1L << (53 - 2))
+              | (1L << (59 - 2))
+              | (1L << (61 - 2));
+      // Look up n within the mask.
+      return ((mask >> ((int) n - 2)) & 1) != 0;
     }
 
     if ((SIEVE_30 & (1 << (n % 30))) != 0) {
@@ -1069,10 +1091,10 @@
       @Override
       long mulMod(long a, long b, long m) {
         /*
-         * NOTE(lowasser, 2015-Feb-12): Benchmarks suggest that changing this to
-         * UnsignedLongs.remainder and increasing the threshold to 2^32 doesn't pay for itself, and
-         * adding another enum constant hurts performance further -- I suspect because bimorphic
-         * implementation is a sweet spot for the JVM.
+         * lowasser, 2015-Feb-12: Benchmarks suggest that changing this to UnsignedLongs.remainder
+         * and increasing the threshold to 2^32 doesn't pay for itself, and adding another enum
+         * constant hurts performance further -- I suspect because bimorphic implementation is a
+         * sweet spot for the JVM.
          */
         return (a * b) % m;
       }
@@ -1203,5 +1225,125 @@
     }
   }
 
+  /**
+   * Returns {@code x}, rounded to a {@code double} with the specified rounding mode. If {@code x}
+   * is precisely representable as a {@code double}, its {@code double} value will be returned;
+   * otherwise, the rounding will choose between the two nearest representable values with {@code
+   * mode}.
+   *
+   * <p>For the case of {@link RoundingMode#HALF_EVEN}, this implementation uses the IEEE 754
+   * default rounding mode: if the two nearest representable values are equally near, the one with
+   * the least significant bit zero is chosen. (In such cases, both of the nearest representable
+   * values are even integers; this method returns the one that is a multiple of a greater power of
+   * two.)
+   *
+   * @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
+   *     is not precisely representable as a {@code double}
+   * @since 30.0
+   */
+  @SuppressWarnings("deprecation")
+  @GwtIncompatible
+  public static double roundToDouble(long x, RoundingMode mode) {
+    // Logic adapted from ToDoubleRounder.
+    double roundArbitrarily = (double) x;
+    long roundArbitrarilyAsLong = (long) roundArbitrarily;
+    int cmpXToRoundArbitrarily;
+
+    if (roundArbitrarilyAsLong == Long.MAX_VALUE) {
+      /*
+       * For most values, the conversion from roundArbitrarily to roundArbitrarilyAsLong is
+       * lossless. In that case we can compare x to roundArbitrarily using Longs.compare(x,
+       * roundArbitrarilyAsLong). The exception is for values where the conversion to double rounds
+       * up to give roundArbitrarily equal to 2^63, so the conversion back to long overflows and
+       * roundArbitrarilyAsLong is Long.MAX_VALUE. (This is the only way this condition can occur as
+       * otherwise the conversion back to long pads with zero bits.) In this case we know that
+       * roundArbitrarily > x. (This is important when x == Long.MAX_VALUE ==
+       * roundArbitrarilyAsLong.)
+       */
+      cmpXToRoundArbitrarily = -1;
+    } else {
+      cmpXToRoundArbitrarily = Longs.compare(x, roundArbitrarilyAsLong);
+    }
+
+    switch (mode) {
+      case UNNECESSARY:
+        checkRoundingUnnecessary(cmpXToRoundArbitrarily == 0);
+        return roundArbitrarily;
+      case FLOOR:
+        return (cmpXToRoundArbitrarily >= 0)
+            ? roundArbitrarily
+            : DoubleUtils.nextDown(roundArbitrarily);
+      case CEILING:
+        return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+      case DOWN:
+        if (x >= 0) {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        }
+      case UP:
+        if (x >= 0) {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        }
+      case HALF_DOWN:
+      case HALF_UP:
+      case HALF_EVEN:
+        {
+          long roundFloor;
+          double roundFloorAsDouble;
+          long roundCeiling;
+          double roundCeilingAsDouble;
+
+          if (cmpXToRoundArbitrarily >= 0) {
+            roundFloorAsDouble = roundArbitrarily;
+            roundFloor = roundArbitrarilyAsLong;
+            roundCeilingAsDouble = Math.nextUp(roundArbitrarily);
+            roundCeiling = (long) Math.ceil(roundCeilingAsDouble);
+          } else {
+            roundCeilingAsDouble = roundArbitrarily;
+            roundCeiling = roundArbitrarilyAsLong;
+            roundFloorAsDouble = DoubleUtils.nextDown(roundArbitrarily);
+            roundFloor = (long) Math.floor(roundFloorAsDouble);
+          }
+
+          long deltaToFloor = x - roundFloor;
+          long deltaToCeiling = roundCeiling - x;
+
+          if (roundCeiling == Long.MAX_VALUE) {
+            // correct for Long.MAX_VALUE as discussed above: roundCeilingAsDouble must be 2^63, but
+            // roundCeiling is 2^63-1.
+            deltaToCeiling++;
+          }
+
+          int diff = Longs.compare(deltaToFloor, deltaToCeiling);
+          if (diff < 0) { // closer to floor
+            return roundFloorAsDouble;
+          } else if (diff > 0) { // closer to ceiling
+            return roundCeilingAsDouble;
+          }
+          // halfway between the representable values; do the half-whatever logic
+          switch (mode) {
+            case HALF_EVEN:
+              return ((DoubleUtils.getSignificand(roundFloorAsDouble) & 1L) == 0)
+                  ? roundFloorAsDouble
+                  : roundCeilingAsDouble;
+            case HALF_DOWN:
+              return (x >= 0) ? roundFloorAsDouble : roundCeilingAsDouble;
+            case HALF_UP:
+              return (x >= 0) ? roundCeilingAsDouble : roundFloorAsDouble;
+            default:
+              throw new AssertionError("impossible");
+          }
+        }
+    }
+    throw new AssertionError("impossible");
+  }
+
   private LongMath() {}
 }
diff --git a/guava/src/com/google/common/math/PairedStatsAccumulator.java b/guava/src/com/google/common/math/PairedStatsAccumulator.java
index 967e3f1..a988495 100644
--- a/guava/src/com/google/common/math/PairedStatsAccumulator.java
+++ b/guava/src/com/google/common/math/PairedStatsAccumulator.java
@@ -21,6 +21,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.primitives.Doubles;
 
 /**
  * A mutable object which accumulates paired double values (e.g. points on a plane) and tracks some
@@ -236,12 +237,6 @@
   }
 
   private static double ensureInUnitRange(double value) {
-    if (value >= 1.0) {
-      return 1.0;
-    }
-    if (value <= -1.0) {
-      return -1.0;
-    }
-    return value;
+    return Doubles.constrainToRange(value, -1.0, 1.0);
   }
 }
diff --git a/guava/src/com/google/common/math/Quantiles.java b/guava/src/com/google/common/math/Quantiles.java
index d99c993..7aac58f 100644
--- a/guava/src/com/google/common/math/Quantiles.java
+++ b/guava/src/com/google/common/math/Quantiles.java
@@ -27,7 +27,7 @@
 import com.google.common.primitives.Ints;
 import java.math.RoundingMode;
 import java.util.Collection;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -186,6 +186,7 @@
      * @param indexes the quantile indexes, each of which must be in the inclusive range [0, q] for
      *     q-quantiles; the order of the indexes is unimportant, duplicates will be ignored, and the
      *     set will be snapshotted when this method is called
+     * @throws IllegalArgumentException if {@code indexes} is empty
      */
     public ScaleAndIndexes indexes(int... indexes) {
       return new ScaleAndIndexes(scale, indexes.clone());
@@ -198,6 +199,7 @@
      * @param indexes the quantile indexes, each of which must be in the inclusive range [0, q] for
      *     q-quantiles; the order of the indexes is unimportant, duplicates will be ignored, and the
      *     set will be snapshotted when this method is called
+     * @throws IllegalArgumentException if {@code indexes} is empty
      */
     public ScaleAndIndexes indexes(Collection<Integer> indexes) {
       return new ScaleAndIndexes(scale, Ints.toArray(indexes));
@@ -318,6 +320,7 @@
       for (int index : indexes) {
         checkIndex(index, scale);
       }
+      checkArgument(indexes.length > 0, "Indexes must be a non empty array");
       this.scale = scale;
       this.indexes = indexes;
     }
@@ -328,8 +331,10 @@
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will be
      *     cast to doubles (with any associated lost of precision), and which will not be mutated by
      *     this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(Collection<? extends Number> dataset) {
       return computeInPlace(Doubles.toArray(dataset));
@@ -340,8 +345,10 @@
      *
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will not
      *     be mutated by this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(double... dataset) {
       return computeInPlace(dataset.clone());
@@ -353,8 +360,10 @@
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will be
      *     cast to doubles (with any associated lost of precision), and which will not be mutated by
      *     this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(long... dataset) {
       return computeInPlace(longsToDoubles(dataset));
@@ -365,8 +374,10 @@
      *
      * @param dataset the dataset to do the calculation on, which must be non-empty, which will be
      *     cast to doubles, and which will not be mutated by this call (it is copied instead)
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order they were passed to the {@code
+     *     indexes} method.
      */
     public Map<Integer, Double> compute(int... dataset) {
       return computeInPlace(intsToDoubles(dataset));
@@ -377,13 +388,15 @@
      *
      * @param dataset the dataset to do the calculation on, which must be non-empty, and which will
      *     be arbitrarily reordered by this method call
-     * @return an unmodifiable map of results: the keys will be the specified quantile indexes, and
-     *     the values the corresponding quantile values
+     * @return an unmodifiable, ordered map of results: the keys will be the specified quantile
+     *     indexes, and the values the corresponding quantile values. When iterating, entries in the
+     *     map are ordered by quantile index in the same order that the indexes were passed to the
+     *     {@code indexes} method.
      */
     public Map<Integer, Double> computeInPlace(double... dataset) {
       checkArgument(dataset.length > 0, "Cannot calculate quantiles of an empty dataset");
       if (containsNaN(dataset)) {
-        Map<Integer, Double> nanMap = new HashMap<>();
+        Map<Integer, Double> nanMap = new LinkedHashMap<>();
         for (int index : indexes) {
           nanMap.put(index, NaN);
         }
@@ -422,7 +435,7 @@
       sort(requiredSelections, 0, requiredSelectionsCount);
       selectAllInPlace(
           requiredSelections, 0, requiredSelectionsCount - 1, dataset, 0, dataset.length - 1);
-      Map<Integer, Double> ret = new HashMap<>();
+      Map<Integer, Double> ret = new LinkedHashMap<>();
       for (int i = 0; i < indexes.length; i++) {
         int quotient = quotients[i];
         int remainder = remainders[i];
diff --git a/guava/src/com/google/common/math/Stats.java b/guava/src/com/google/common/math/Stats.java
index 273bb8e..74537a7 100644
--- a/guava/src/com/google/common/math/Stats.java
+++ b/guava/src/com/google/common/math/Stats.java
@@ -32,6 +32,10 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Iterator;
+import java.util.stream.Collector;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -103,7 +107,8 @@
   }
 
   /**
-   * Returns statistics over a dataset containing the given values.
+   * Returns statistics over a dataset containing the given values. The iterator will be completely
+   * consumed by this method.
    *
    * @param values a series of values, which will be converted to {@code double} values (this may
    *     cause loss of precision)
@@ -148,6 +153,78 @@
     return acummulator.snapshot();
   }
 
+  /**
+   * Returns statistics over a dataset containing the given values. The stream will be completely
+   * consumed by this method.
+   *
+   * <p>If you have a {@code Stream<Double>} rather than a {@code DoubleStream}, you should collect
+   * the values using {@link #toStats()} instead.
+   *
+   * @param values a series of values
+   * @since 28.2
+   */
+  public static Stats of(DoubleStream values) {
+    return values
+        .collect(StatsAccumulator::new, StatsAccumulator::add, StatsAccumulator::addAll)
+        .snapshot();
+  }
+
+  /**
+   * Returns statistics over a dataset containing the given values. The stream will be completely
+   * consumed by this method.
+   *
+   * <p>If you have a {@code Stream<Integer>} rather than an {@code IntStream}, you should collect
+   * the values using {@link #toStats()} instead.
+   *
+   * @param values a series of values
+   * @since 28.2
+   */
+  public static Stats of(IntStream values) {
+    return values
+        .collect(StatsAccumulator::new, StatsAccumulator::add, StatsAccumulator::addAll)
+        .snapshot();
+  }
+
+  /**
+   * Returns statistics over a dataset containing the given values. The stream will be completely
+   * consumed by this method.
+   *
+   * <p>If you have a {@code Stream<Long>} rather than a {@code LongStream}, you should collect the
+   * values using {@link #toStats()} instead.
+   *
+   * @param values a series of values, which will be converted to {@code double} values (this may
+   *     cause loss of precision for longs of magnitude over 2^53 (slightly over 9e15))
+   * @since 28.2
+   */
+  public static Stats of(LongStream values) {
+    return values
+        .collect(StatsAccumulator::new, StatsAccumulator::add, StatsAccumulator::addAll)
+        .snapshot();
+  }
+
+  /**
+   * Returns a {@link Collector} which accumulates statistics from a {@link java.util.stream.Stream}
+   * of any type of boxed {@link Number} into a {@link Stats}. Use by calling {@code
+   * boxedNumericStream.collect(toStats())}. The numbers will be converted to {@code double} values
+   * (which may cause loss of precision).
+   *
+   * <p>If you have any of the primitive streams {@code DoubleStream}, {@code IntStream}, or {@code
+   * LongStream}, you should use the factory method {@link #of} instead.
+   *
+   * @since 28.2
+   */
+  public static Collector<Number, StatsAccumulator, Stats> toStats() {
+    return Collector.of(
+        StatsAccumulator::new,
+        (a, x) -> a.add(x.doubleValue()),
+        (l, r) -> {
+          l.addAll(r);
+          return l;
+        },
+        StatsAccumulator::snapshot,
+        Collector.Characteristics.UNORDERED);
+  }
+
   /** Returns the number of values. */
   public long count() {
     return count;
@@ -169,8 +246,8 @@
    * If it contains {@link Double#NEGATIVE_INFINITY} and finite values only or {@link
    * Double#NEGATIVE_INFINITY} only, the result is {@link Double#NEGATIVE_INFINITY}.
    *
-   * <p>If you only want to calculate the mean, use {#meanOf} instead of creating a {@link Stats}
-   * instance.
+   * <p>If you only want to calculate the mean, use {@link #meanOf} instead of creating a {@link
+   * Stats} instance.
    *
    * @throws IllegalStateException if the dataset is empty
    */
@@ -347,11 +424,11 @@
       return false;
     }
     Stats other = (Stats) obj;
-    return (count == other.count)
-        && (doubleToLongBits(mean) == doubleToLongBits(other.mean))
-        && (doubleToLongBits(sumOfSquaresOfDeltas) == doubleToLongBits(other.sumOfSquaresOfDeltas))
-        && (doubleToLongBits(min) == doubleToLongBits(other.min))
-        && (doubleToLongBits(max) == doubleToLongBits(other.max));
+    return count == other.count
+        && doubleToLongBits(mean) == doubleToLongBits(other.mean)
+        && doubleToLongBits(sumOfSquaresOfDeltas) == doubleToLongBits(other.sumOfSquaresOfDeltas)
+        && doubleToLongBits(min) == doubleToLongBits(other.min)
+        && doubleToLongBits(max) == doubleToLongBits(other.max);
   }
 
   /**
diff --git a/guava/src/com/google/common/math/StatsAccumulator.java b/guava/src/com/google/common/math/StatsAccumulator.java
index a3977ca..0670cb1 100644
--- a/guava/src/com/google/common/math/StatsAccumulator.java
+++ b/guava/src/com/google/common/math/StatsAccumulator.java
@@ -23,6 +23,9 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Iterator;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
 
 /**
  * A mutable object which accumulates double values and tracks some basic statistics over all the
@@ -129,6 +132,37 @@
   }
 
   /**
+   * Adds the given values to the dataset. The stream will be completely consumed by this method.
+   *
+   * @param values a series of values
+   * @since 28.2
+   */
+  public void addAll(DoubleStream values) {
+    addAll(values.collect(StatsAccumulator::new, StatsAccumulator::add, StatsAccumulator::addAll));
+  }
+
+  /**
+   * Adds the given values to the dataset. The stream will be completely consumed by this method.
+   *
+   * @param values a series of values
+   * @since 28.2
+   */
+  public void addAll(IntStream values) {
+    addAll(values.collect(StatsAccumulator::new, StatsAccumulator::add, StatsAccumulator::addAll));
+  }
+
+  /**
+   * Adds the given values to the dataset. The stream will be completely consumed by this method.
+   *
+   * @param values a series of values, which will be converted to {@code double} values (this may
+   *     cause loss of precision for longs of magnitude over 2^53 (slightly over 9e15))
+   * @since 28.2
+   */
+  public void addAll(LongStream values) {
+    addAll(values.collect(StatsAccumulator::new, StatsAccumulator::add, StatsAccumulator::addAll));
+  }
+
+  /**
    * Adds the given statistics to the dataset, as if the individual values used to compute the
    * statistics had been added directly.
    */
@@ -136,27 +170,47 @@
     if (values.count() == 0) {
       return;
     }
+    merge(values.count(), values.mean(), values.sumOfSquaresOfDeltas(), values.min(), values.max());
+  }
 
+  /**
+   * Adds the given statistics to the dataset, as if the individual values used to compute the
+   * statistics had been added directly.
+   *
+   * @since 28.2
+   */
+  public void addAll(StatsAccumulator values) {
+    if (values.count() == 0) {
+      return;
+    }
+    merge(values.count(), values.mean(), values.sumOfSquaresOfDeltas(), values.min(), values.max());
+  }
+
+  private void merge(
+      long otherCount,
+      double otherMean,
+      double otherSumOfSquaresOfDeltas,
+      double otherMin,
+      double otherMax) {
     if (count == 0) {
-      count = values.count();
-      mean = values.mean();
-      sumOfSquaresOfDeltas = values.sumOfSquaresOfDeltas();
-      min = values.min();
-      max = values.max();
+      count = otherCount;
+      mean = otherMean;
+      sumOfSquaresOfDeltas = otherSumOfSquaresOfDeltas;
+      min = otherMin;
+      max = otherMax;
     } else {
-      count += values.count();
-      if (isFinite(mean) && isFinite(values.mean())) {
+      count += otherCount;
+      if (isFinite(mean) && isFinite(otherMean)) {
         // This is a generalized version of the calculation in add(double) above.
-        double delta = values.mean() - mean;
-        mean += delta * values.count() / count;
-        sumOfSquaresOfDeltas +=
-            values.sumOfSquaresOfDeltas() + delta * (values.mean() - mean) * values.count();
+        double delta = otherMean - mean;
+        mean += delta * otherCount / count;
+        sumOfSquaresOfDeltas += otherSumOfSquaresOfDeltas + delta * (otherMean - mean) * otherCount;
       } else {
-        mean = calculateNewMeanNonFinite(mean, values.mean());
+        mean = calculateNewMeanNonFinite(mean, otherMean);
         sumOfSquaresOfDeltas = NaN;
       }
-      min = Math.min(min, values.min());
-      max = Math.max(max, values.max());
+      min = Math.min(min, otherMin);
+      max = Math.max(max, otherMax);
     }
   }
 
diff --git a/guava/src/com/google/common/math/ToDoubleRounder.java b/guava/src/com/google/common/math/ToDoubleRounder.java
new file mode 100644
index 0000000..7525e3f
--- /dev/null
+++ b/guava/src/com/google/common/math/ToDoubleRounder.java
@@ -0,0 +1,152 @@
+/*
+ * 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.math;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.math.MathPreconditions.checkRoundingUnnecessary;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.math.RoundingMode;
+
+/**
+ * Helper type to implement rounding {@code X} to a representable {@code double} value according to
+ * a {@link RoundingMode}.
+ */
+@GwtIncompatible
+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,
+   * or the least double greater than or equal to the precise value of x.
+   */
+  abstract double roundToDoubleArbitrarily(X x);
+
+  /** Returns the sign of x: either -1, 0, or 1. */
+  abstract int sign(X x);
+
+  /** Returns d's value as an X, rounded with the specified mode. */
+  abstract X toX(double d, RoundingMode mode);
+
+  /** Returns a - b, guaranteed that both arguments are nonnegative. */
+  abstract X minus(X a, X b);
+
+  /** Rounds {@code x} to a {@code double}. */
+  final double roundToDouble(X x, RoundingMode mode) {
+    checkNotNull(x, "x");
+    checkNotNull(mode, "mode");
+    double roundArbitrarily = roundToDoubleArbitrarily(x);
+    if (Double.isInfinite(roundArbitrarily)) {
+      switch (mode) {
+        case DOWN:
+        case HALF_EVEN:
+        case HALF_DOWN:
+        case HALF_UP:
+          return Double.MAX_VALUE * sign(x);
+        case FLOOR:
+          return (roundArbitrarily == Double.POSITIVE_INFINITY)
+              ? Double.MAX_VALUE
+              : Double.NEGATIVE_INFINITY;
+        case CEILING:
+          return (roundArbitrarily == Double.POSITIVE_INFINITY)
+              ? Double.POSITIVE_INFINITY
+              : -Double.MAX_VALUE;
+        case UP:
+          return roundArbitrarily;
+        case UNNECESSARY:
+          throw new ArithmeticException(x + " cannot be represented precisely as a double");
+      }
+    }
+    X roundArbitrarilyAsX = toX(roundArbitrarily, RoundingMode.UNNECESSARY);
+    int cmpXToRoundArbitrarily = x.compareTo(roundArbitrarilyAsX);
+    switch (mode) {
+      case UNNECESSARY:
+        checkRoundingUnnecessary(cmpXToRoundArbitrarily == 0);
+        return roundArbitrarily;
+      case FLOOR:
+        return (cmpXToRoundArbitrarily >= 0)
+            ? roundArbitrarily
+            : DoubleUtils.nextDown(roundArbitrarily);
+      case CEILING:
+        return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+      case DOWN:
+        if (sign(x) >= 0) {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        }
+      case UP:
+        if (sign(x) >= 0) {
+          return (cmpXToRoundArbitrarily <= 0) ? roundArbitrarily : Math.nextUp(roundArbitrarily);
+        } else {
+          return (cmpXToRoundArbitrarily >= 0)
+              ? roundArbitrarily
+              : DoubleUtils.nextDown(roundArbitrarily);
+        }
+      case HALF_DOWN:
+      case HALF_UP:
+      case HALF_EVEN:
+        {
+          X roundFloor;
+          double roundFloorAsDouble;
+          X roundCeiling;
+          double roundCeilingAsDouble;
+
+          if (cmpXToRoundArbitrarily >= 0) {
+            roundFloorAsDouble = roundArbitrarily;
+            roundFloor = roundArbitrarilyAsX;
+            roundCeilingAsDouble = Math.nextUp(roundArbitrarily);
+            if (roundCeilingAsDouble == Double.POSITIVE_INFINITY) {
+              return roundFloorAsDouble;
+            }
+            roundCeiling = toX(roundCeilingAsDouble, RoundingMode.CEILING);
+          } else {
+            roundCeilingAsDouble = roundArbitrarily;
+            roundCeiling = roundArbitrarilyAsX;
+            roundFloorAsDouble = DoubleUtils.nextDown(roundArbitrarily);
+            if (roundFloorAsDouble == Double.NEGATIVE_INFINITY) {
+              return roundCeilingAsDouble;
+            }
+            roundFloor = toX(roundFloorAsDouble, RoundingMode.FLOOR);
+          }
+
+          X deltaToFloor = minus(x, roundFloor);
+          X deltaToCeiling = minus(roundCeiling, x);
+          int diff = deltaToFloor.compareTo(deltaToCeiling);
+          if (diff < 0) { // closer to floor
+            return roundFloorAsDouble;
+          } else if (diff > 0) { // closer to ceiling
+            return roundCeilingAsDouble;
+          }
+          // halfway between the representable values; do the half-whatever logic
+          switch (mode) {
+            case HALF_EVEN:
+              // roundFloorAsDouble and roundCeilingAsDouble are neighbors, so precisely
+              // one of them should have an even long representation
+              return ((Double.doubleToRawLongBits(roundFloorAsDouble) & 1L) == 0)
+                  ? roundFloorAsDouble
+                  : roundCeilingAsDouble;
+            case HALF_DOWN:
+              return (sign(x) >= 0) ? roundFloorAsDouble : roundCeilingAsDouble;
+            case HALF_UP:
+              return (sign(x) >= 0) ? roundCeilingAsDouble : roundFloorAsDouble;
+            default:
+              throw new AssertionError("impossible");
+          }
+        }
+    }
+    throw new AssertionError("impossible");
+  }
+}
diff --git a/guava/src/com/google/common/net/HttpHeaders.java b/guava/src/com/google/common/net/HttpHeaders.java
index c48cc4a..11a5b50 100644
--- a/guava/src/com/google/common/net/HttpHeaders.java
+++ b/guava/src/com/google/common/net/HttpHeaders.java
@@ -74,6 +74,13 @@
   /** The HTTP {@code Cookie} header field name. */
   public static final String COOKIE = "Cookie";
   /**
+   * The HTTP <a href="https://fetch.spec.whatwg.org/#cross-origin-resource-policy-header">{@code
+   * Cross-Origin-Resource-Policy}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String CROSS_ORIGIN_RESOURCE_POLICY = "Cross-Origin-Resource-Policy";
+  /**
    * The HTTP <a href="https://tools.ietf.org/html/rfc8470">{@code Early-Data}</a> header field
    * name.
    *
@@ -158,12 +165,22 @@
   /**
    * The HTTP <a href="https://www.w3.org/TR/service-workers/#update-algorithm">{@code
    * Service-Worker}</a> header field name.
+   *
+   * @since 20.0
    */
   public static final String SERVICE_WORKER = "Service-Worker";
   /** The HTTP {@code TE} header field name. */
   public static final String TE = "TE";
   /** The HTTP {@code Upgrade} header field name. */
   public static final String UPGRADE = "Upgrade";
+  /**
+   * The HTTP <a href="https://w3c.github.io/webappsec-upgrade-insecure-requests/#preference">{@code
+   * Upgrade-Insecure-Requests}</a> header field name.
+   *
+   * @since 28.1
+   */
+  public static final String UPGRADE_INSECURE_REQUESTS = "Upgrade-Insecure-Requests";
+
   /** The HTTP {@code User-Agent} header field name. */
   public static final String USER_AGENT = "User-Agent";
 
@@ -249,6 +266,27 @@
    * @since 20.0
    */
   public static final String X_WEBKIT_CSP_REPORT_ONLY = "X-WebKit-CSP-Report-Only";
+  /**
+   * The HTTP <a href="https://wicg.github.io/cross-origin-embedder-policy/#COEP">{@code
+   * Cross-Origin-Embedder-Policy}</a> header field name.
+   *
+   * @since 30.0
+   */
+  public static final String CROSS_ORIGIN_EMBEDDER_POLICY = "Cross-Origin-Embedder-Policy";
+  /**
+   * The HTTP <a href="https://wicg.github.io/cross-origin-embedder-policy/#COEP-RO">{@code
+   * Cross-Origin-Embedder-Policy-Report-Only}</a> header field name.
+   *
+   * @since 30.0
+   */
+  public static final String CROSS_ORIGIN_EMBEDDER_POLICY_REPORT_ONLY =
+      "Cross-Origin-Embedder-Policy-Report-Only";
+  /**
+   * The HTTP Cross-Origin-Opener-Policy header field name.
+   *
+   * @since 28.2
+   */
+  public static final String CROSS_ORIGIN_OPENER_POLICY = "Cross-Origin-Opener-Policy";
   /** The HTTP {@code ETag} header field name. */
   public static final String ETAG = "ETag";
   /** The HTTP {@code Expires} header field name. */
@@ -412,36 +450,111 @@
   public static final String PING_TO = "Ping-To";
 
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-Dest}</a> header
-   * field name.
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">{@code
+   * Purpose}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String PURPOSE = "Purpose";
+  /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">{@code
+   * X-Purpose}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String X_PURPOSE = "X-Purpose";
+  /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#As_a_server_admin.2C_can_I_distinguish_prefetch_requests_from_normal_requests.3F">{@code
+   * X-Moz}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String X_MOZ = "X-Moz";
+
+  /**
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua">{@code Sec-CH-UA}</a>
+   * header field name.
+   *
+   * @since 30.0
+   */
+  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
+   * 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
+   * 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
+   * 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
+   * 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
+   * 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
+   * 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://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Dest}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_DEST = "Sec-Fetch-Dest";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-Mode}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Mode}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_MODE = "Sec-Fetch-Mode";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-Site}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Site}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_SITE = "Sec-Fetch-Site";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Fetch-User}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-User}</a>
+   * header field name.
    *
    * @since 27.1
    */
   public static final String SEC_FETCH_USER = "Sec-Fetch-User";
   /**
-   * The HTTP <a href="https://mikewest.github.io/sec-metadata/">{@code Sec-Metadata}</a> header
-   * field name.
+   * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Metadata}</a>
+   * header field name.
    *
    * @since 26.0
    */
@@ -467,4 +580,45 @@
    * @since 25.1
    */
   public static final String SEC_REFERRED_TOKEN_BINDING_ID = "Sec-Referred-Token-Binding-ID";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Accept}</a> header
+   * field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_ACCEPT = "Sec-WebSocket-Accept";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Extensions}</a>
+   * header field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_EXTENSIONS = "Sec-WebSocket-Extensions";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Key}</a> header
+   * field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_KEY = "Sec-WebSocket-Key";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Protocol}</a>
+   * header field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_PROTOCOL = "Sec-WebSocket-Protocol";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc6455">{@code Sec-WebSocket-Version}</a> header
+   * field name.
+   *
+   * @since 28.0
+   */
+  public static final String SEC_WEBSOCKET_VERSION = "Sec-WebSocket-Version";
+  /**
+   * The HTTP <a href="https://tools.ietf.org/html/rfc8586">{@code CDN-Loop}</a> header field name.
+   *
+   * @since 28.0
+   */
+  public static final String CDN_LOOP = "CDN-Loop";
 }
diff --git a/guava/src/com/google/common/net/InetAddresses.java b/guava/src/com/google/common/net/InetAddresses.java
index 930e54d..d0881e8 100644
--- a/guava/src/com/google/common/net/InetAddresses.java
+++ b/guava/src/com/google/common/net/InetAddresses.java
@@ -19,19 +19,18 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.CharMatcher;
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Iterables;
 import com.google.common.hash.Hashing;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Ints;
+import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.List;
 import java.util.Locale;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -101,8 +100,10 @@
 public final class InetAddresses {
   private static final int IPV4_PART_COUNT = 4;
   private static final int IPV6_PART_COUNT = 8;
-  private static final Splitter IPV4_SPLITTER = Splitter.on('.').limit(IPV4_PART_COUNT);
-  private static final Splitter IPV6_SPLITTER = Splitter.on(':').limit(IPV6_PART_COUNT + 2);
+  private static final char IPV4_DELIMITER = '.';
+  private static final char IPV6_DELIMITER = ':';
+  private static final CharMatcher IPV4_DELIMITER_MATCHER = CharMatcher.is(IPV4_DELIMITER);
+  private static final CharMatcher IPV6_DELIMITER_MATCHER = CharMatcher.is(IPV6_DELIMITER);
   private static final Inet4Address LOOPBACK4 = (Inet4Address) forString("127.0.0.1");
   private static final Inet4Address ANY4 = (Inet4Address) forString("0.0.0.0");
 
@@ -130,6 +131,8 @@
    *
    * <p>This deliberately avoids all nameservice lookups (e.g. no DNS).
    *
+   * <p>Anything after a {@code %} in an IPv6 address is ignored (assumed to be a Scope ID).
+   *
    * @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
@@ -157,10 +160,12 @@
     return ipStringToBytes(ipString) != null;
   }
 
+  /** Returns {@code null} if unable to parse into a {@code byte[]}. */
   private static byte @Nullable [] ipStringToBytes(String ipString) {
     // Make a first pass to categorize the characters in this string.
     boolean hasColon = false;
     boolean hasDot = false;
+    int percentIndex = -1;
     for (int i = 0; i < ipString.length(); i++) {
       char c = ipString.charAt(i);
       if (c == '.') {
@@ -170,6 +175,9 @@
           return null; // Colons must not appear after dots.
         }
         hasColon = true;
+      } else if (c == '%') {
+        percentIndex = i;
+        break; // everything after a '%' is ignored (it's a Scope ID): http://superuser.com/a/99753
       } else if (Character.digit(c, 16) == -1) {
         return null; // Everything else must be a decimal or hex digit.
       }
@@ -183,83 +191,107 @@
           return null;
         }
       }
+      if (percentIndex != -1) {
+        ipString = ipString.substring(0, percentIndex);
+      }
       return textToNumericFormatV6(ipString);
     } else if (hasDot) {
+      if (percentIndex != -1) {
+        return null; // Scope IDs are not supported for IPV4
+      }
       return textToNumericFormatV4(ipString);
     }
     return null;
   }
 
   private static byte @Nullable [] textToNumericFormatV4(String ipString) {
-    byte[] bytes = new byte[IPV4_PART_COUNT];
-    int i = 0;
-    try {
-      for (String octet : IPV4_SPLITTER.split(ipString)) {
-        bytes[i++] = parseOctet(octet);
-      }
-    } catch (NumberFormatException ex) {
-      return null;
+    if (IPV4_DELIMITER_MATCHER.countIn(ipString) + 1 != IPV4_PART_COUNT) {
+      return null; // Wrong number of parts
     }
 
-    return i == IPV4_PART_COUNT ? bytes : null;
+    byte[] bytes = new byte[IPV4_PART_COUNT];
+    int start = 0;
+    // Iterate through the parts of the ip string.
+    // Invariant: start is always the beginning of an octet.
+    for (int i = 0; i < IPV4_PART_COUNT; i++) {
+      int end = ipString.indexOf(IPV4_DELIMITER, start);
+      if (end == -1) {
+        end = ipString.length();
+      }
+      try {
+        bytes[i] = parseOctet(ipString, start, end);
+      } catch (NumberFormatException ex) {
+        return null;
+      }
+      start = end + 1;
+    }
+
+    return bytes;
   }
 
   private static byte @Nullable [] textToNumericFormatV6(String ipString) {
-    // An address can have [2..8] colons, and N colons make N+1 parts.
-    List<String> parts = IPV6_SPLITTER.splitToList(ipString);
-    if (parts.size() < 3 || parts.size() > IPV6_PART_COUNT + 1) {
+    // An address can have [2..8] colons.
+    int delimiterCount = IPV6_DELIMITER_MATCHER.countIn(ipString);
+    if (delimiterCount < 2 || delimiterCount > IPV6_PART_COUNT) {
       return null;
     }
-
-    // Disregarding the endpoints, find "::" with nothing in between.
-    // This indicates that a run of zeroes has been skipped.
-    int skipIndex = -1;
-    for (int i = 1; i < parts.size() - 1; i++) {
-      if (parts.get(i).length() == 0) {
-        if (skipIndex >= 0) {
+    int partsSkipped = IPV6_PART_COUNT - (delimiterCount + 1); // estimate; may be modified later
+    boolean hasSkip = false;
+    // Scan for the appearance of ::, to mark a skip-format IPV6 string and adjust the partsSkipped
+    // estimate.
+    for (int i = 0; i < ipString.length() - 1; i++) {
+      if (ipString.charAt(i) == IPV6_DELIMITER && ipString.charAt(i + 1) == IPV6_DELIMITER) {
+        if (hasSkip) {
           return null; // Can't have more than one ::
         }
-        skipIndex = i;
+        hasSkip = true;
+        partsSkipped++; // :: means we skipped an extra part in between the two delimiters.
+        if (i == 0) {
+          partsSkipped++; // Begins with ::, so we skipped the part preceding the first :
+        }
+        if (i == ipString.length() - 2) {
+          partsSkipped++; // Ends with ::, so we skipped the part after the last :
+        }
       }
     }
-
-    int partsHi; // Number of parts to copy from above/before the "::"
-    int partsLo; // Number of parts to copy from below/after the "::"
-    if (skipIndex >= 0) {
-      // If we found a "::", then check if it also covers the endpoints.
-      partsHi = skipIndex;
-      partsLo = parts.size() - skipIndex - 1;
-      if (parts.get(0).length() == 0 && --partsHi != 0) {
-        return null; // ^: requires ^::
-      }
-      if (Iterables.getLast(parts).length() == 0 && --partsLo != 0) {
-        return null; // :$ requires ::$
-      }
-    } else {
-      // Otherwise, allocate the entire address to partsHi. The endpoints
-      // could still be empty, but parseHextet() will check for that.
-      partsHi = parts.size();
-      partsLo = 0;
+    if (ipString.charAt(0) == IPV6_DELIMITER && ipString.charAt(1) != IPV6_DELIMITER) {
+      return null; // ^: requires ^::
+    }
+    if (ipString.charAt(ipString.length() - 1) == IPV6_DELIMITER
+        && ipString.charAt(ipString.length() - 2) != IPV6_DELIMITER) {
+      return null; // :$ requires ::$
+    }
+    if (hasSkip && partsSkipped <= 0) {
+      return null; // :: must expand to at least one '0'
+    }
+    if (!hasSkip && delimiterCount + 1 != IPV6_PART_COUNT) {
+      return null; // Incorrect number of parts
     }
 
-    // If we found a ::, then we must have skipped at least one part.
-    // Otherwise, we must have exactly the right number of parts.
-    int partsSkipped = IPV6_PART_COUNT - (partsHi + partsLo);
-    if (!(skipIndex >= 0 ? partsSkipped >= 1 : partsSkipped == 0)) {
-      return null;
-    }
-
-    // Now parse the hextets into a byte array.
     ByteBuffer rawBytes = ByteBuffer.allocate(2 * IPV6_PART_COUNT);
     try {
-      for (int i = 0; i < partsHi; i++) {
-        rawBytes.putShort(parseHextet(parts.get(i)));
+      // Iterate through the parts of the ip string.
+      // Invariant: start is always the beginning of a hextet, or the second ':' of the skip
+      // sequence "::"
+      int start = 0;
+      if (ipString.charAt(0) == IPV6_DELIMITER) {
+        start = 1;
       }
-      for (int i = 0; i < partsSkipped; i++) {
-        rawBytes.putShort((short) 0);
-      }
-      for (int i = partsLo; i > 0; i--) {
-        rawBytes.putShort(parseHextet(parts.get(parts.size() - i)));
+      while (start < ipString.length()) {
+        int end = ipString.indexOf(IPV6_DELIMITER, start);
+        if (end == -1) {
+          end = ipString.length();
+        }
+        if (ipString.charAt(start) == IPV6_DELIMITER) {
+          // expand zeroes
+          for (int i = 0; i < partsSkipped; i++) {
+            rawBytes.putShort((short) 0);
+          }
+
+        } else {
+          rawBytes.putShort(parseHextet(ipString, start, end));
+        }
+        start = end + 1;
       }
     } catch (NumberFormatException ex) {
       return null;
@@ -280,23 +312,45 @@
     return initialPart + penultimate + ":" + ultimate;
   }
 
-  private static byte parseOctet(String ipPart) {
-    // Note: we already verified that this string contains only hex digits.
-    int octet = Integer.parseInt(ipPart);
+  private static byte parseOctet(String ipString, int start, int end) {
+    // Note: we already verified that this string contains only hex digits, but the string may still
+    // contain non-decimal characters.
+    int length = end - start;
+    if (length <= 0 || length > 3) {
+      throw new NumberFormatException();
+    }
     // Disallow leading zeroes, because no clear standard exists on
     // whether these should be interpreted as decimal or octal.
-    if (octet > 255 || (ipPart.startsWith("0") && ipPart.length() > 1)) {
+    if (length > 1 && ipString.charAt(start) == '0') {
+      throw new NumberFormatException();
+    }
+    int octet = 0;
+    for (int i = start; i < end; i++) {
+      octet *= 10;
+      int digit = Character.digit(ipString.charAt(i), 10);
+      if (digit < 0) {
+        throw new NumberFormatException();
+      }
+      octet += digit;
+    }
+    if (octet > 255) {
       throw new NumberFormatException();
     }
     return (byte) octet;
   }
 
-  private static short parseHextet(String ipPart) {
+  // Parse a hextet out of the ipString from start (inclusive) to end (exclusive)
+  private static short parseHextet(String ipString, int start, int end) {
     // Note: we already verified that this string contains only hex digits.
-    int hextet = Integer.parseInt(ipPart, 16);
-    if (hextet > 0xffff) {
+    int length = end - start;
+    if (length <= 0 || length > 4) {
       throw new NumberFormatException();
     }
+    int hextet = 0;
+    for (int i = start; i < end; i++) {
+      hextet = hextet << 4;
+      hextet |= Character.digit(ipString.charAt(i), 16);
+    }
     return (short) hextet;
   }
 
@@ -810,8 +864,13 @@
    *
    * <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 the upper 64 bits into {@code 224.0.0.0/3} (64 bits into 29
-   * bits).
+   * This function does so by hashing 64 bits of the IPv6 address into {@code 224.0.0.0/3} (64 bits
+   * into 29 bits):
+   *
+   * <ul>
+   *   <li>If the IPv6 address contains an embedded IPv4 address, the function hashes that.
+   *   <li>Otherwise, it hashes the upper 64 bits of the IPv6 address.
+   * </ul>
    *
    * <p>A "coerced" IPv4 address is equivalent to itself.
    *
@@ -848,7 +907,6 @@
     if (hasEmbeddedIPv4ClientAddress(ip6)) {
       addressAsLong = getEmbeddedIPv4ClientAddress(ip6).hashCode();
     } else {
-
       // Just extract the high 64 bits (assuming the rest is user-modifiable).
       addressAsLong = ByteBuffer.wrap(ip6.getAddress(), 0, 8).getLong();
     }
@@ -891,6 +949,19 @@
   }
 
   /**
+   * Returns a BigInteger representing the address.
+   *
+   * <p>Unlike {@code coerceToInteger}, IPv6 addresses are not coerced to IPv4 addresses.
+   *
+   * @param address {@link InetAddress} to convert
+   * @return {@code BigInteger} representation of the address
+   * @since 28.2
+   */
+  public static BigInteger toBigInteger(InetAddress address) {
+    return new BigInteger(1, address.getAddress());
+  }
+
+  /**
    * Returns an Inet4Address having the integer value specified by the argument.
    *
    * @param address {@code int}, the 32bit integer address to be converted
@@ -901,6 +972,71 @@
   }
 
   /**
+   * Returns the {@code Inet4Address} corresponding to a given {@code BigInteger}.
+   *
+   * @param address BigInteger representing the IPv4 address
+   * @return Inet4Address representation of the given BigInteger
+   * @throws IllegalArgumentException if the BigInteger is not between 0 and 2^32-1
+   * @since 28.2
+   */
+  public static Inet4Address fromIPv4BigInteger(BigInteger address) {
+    return (Inet4Address) fromBigInteger(address, false);
+  }
+  /**
+   * Returns the {@code Inet6Address} corresponding to a given {@code BigInteger}.
+   *
+   * @param address BigInteger representing the IPv6 address
+   * @return Inet6Address representation of the given BigInteger
+   * @throws IllegalArgumentException if the BigInteger is not between 0 and 2^128-1
+   * @since 28.2
+   */
+  public static Inet6Address fromIPv6BigInteger(BigInteger address) {
+    return (Inet6Address) fromBigInteger(address, true);
+  }
+
+  /**
+   * Converts a BigInteger to either an IPv4 or IPv6 address. If the IP is IPv4, it must be
+   * constrainted to 32 bits, otherwise it is constrained to 128 bits.
+   *
+   * @param address the address represented as a big integer
+   * @param isIpv6 whether the created address should be IPv4 or IPv6
+   * @return the BigInteger converted to an address
+   * @throws IllegalArgumentException if the BigInteger is not between 0 and maximum value for IPv4
+   *     or IPv6 respectively
+   */
+  private static InetAddress fromBigInteger(BigInteger address, boolean isIpv6) {
+    checkArgument(address.signum() >= 0, "BigInteger must be greater than or equal to 0");
+
+    int numBytes = isIpv6 ? 16 : 4;
+
+    byte[] addressBytes = address.toByteArray();
+    byte[] targetCopyArray = new byte[numBytes];
+
+    int srcPos = Math.max(0, addressBytes.length - numBytes);
+    int copyLength = addressBytes.length - srcPos;
+    int destPos = numBytes - copyLength;
+
+    // Check the extra bytes in the BigInteger are all zero.
+    for (int i = 0; i < srcPos; i++) {
+      if (addressBytes[i] != 0x00) {
+        throw formatIllegalArgumentException(
+            "BigInteger cannot be converted to InetAddress because it has more than %d"
+                + " bytes: %s",
+            numBytes, address);
+      }
+    }
+
+    // Copy the bytes into the least significant positions.
+    System.arraycopy(addressBytes, srcPos, targetCopyArray, destPos, copyLength);
+
+    try {
+      return InetAddress.getByAddress(targetCopyArray);
+    } catch (UnknownHostException impossible) {
+      throw new AssertionError(impossible);
+    }
+  }
+
+  /**
    * Returns an address from a <b>little-endian ordered</b> byte array (the opposite of what {@link
    * InetAddress#getByAddress} expects).
    *
diff --git a/guava/src/com/google/common/net/InternetDomainName.java b/guava/src/com/google/common/net/InternetDomainName.java
index a9a9ead..c541413 100644
--- a/guava/src/com/google/common/net/InternetDomainName.java
+++ b/guava/src/com/google/common/net/InternetDomainName.java
@@ -72,7 +72,7 @@
  * @since 5.0
  */
 @Beta
-@GwtCompatible
+@GwtCompatible(emulated = true)
 @Immutable
 public final class InternetDomainName {
 
@@ -237,8 +237,13 @@
 
   private static final CharMatcher DASH_MATCHER = CharMatcher.anyOf("-_");
 
+  private static final CharMatcher DIGIT_MATCHER = CharMatcher.inRange('0', '9');
+
+  private static final CharMatcher LETTER_MATCHER =
+      CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'));
+
   private static final CharMatcher PART_CHAR_MATCHER =
-      CharMatcher.javaLetterOrDigit().or(DASH_MATCHER);
+      DIGIT_MATCHER.or(LETTER_MATCHER).or(DASH_MATCHER);
 
   /**
    * Helper method for {@link #validateSyntax(List)}. Validates that one part of a domain name is
@@ -261,7 +266,7 @@
      * GWT claims to support java.lang.Character's char-classification methods, but it actually only
      * works for ASCII. So for now, assume any non-ASCII characters are valid. The only place this
      * seems to be documented is here:
-     * http://osdir.com/ml/GoogleWebToolkitContributors/2010-03/msg00178.html
+     * https://groups.google.com/d/topic/google-web-toolkit-contributors/1UEzsryq1XI
      *
      * <p>ASCII characters in the part are expected to be valid per RFC 1035, with underscore also
      * being allowed due to widespread practice.
@@ -287,7 +292,7 @@
      * address like 127.0.0.1 from looking like a valid domain name.
      */
 
-    if (isFinalPart && CharMatcher.digit().matches(part.charAt(0))) {
+    if (isFinalPart && DIGIT_MATCHER.matches(part.charAt(0))) {
       return false;
     }
 
diff --git a/guava/src/com/google/common/net/MediaType.java b/guava/src/com/google/common/net/MediaType.java
index 9025980..f52f24e 100644
--- a/guava/src/com/google/common/net/MediaType.java
+++ b/guava/src/com/google/common/net/MediaType.java
@@ -55,8 +55,8 @@
  * type or subtype value. A media type may not have wildcard type with a declared subtype. The
  * {@code *} character has no special meaning as part of a parameter. All values for type, subtype,
  * parameter attributes or parameter values must be valid according to RFCs <a
- * href="http://www.ietf.org/rfc/rfc2045.txt">2045</a> and <a
- * href="http://www.ietf.org/rfc/rfc2046.txt">2046</a>.
+ * href="https://tools.ietf.org/html/rfc2045">2045</a> and <a
+ * href="https://tools.ietf.org/html/rfc2046">2046</a>.
  *
  * <p>All portions of the media type that are case-insensitive (type, subtype, parameter attributes)
  * are normalized to lowercase. The value of the {@code charset} parameter is normalized to
@@ -101,6 +101,7 @@
   private static final String IMAGE_TYPE = "image";
   private static final String TEXT_TYPE = "text";
   private static final String VIDEO_TYPE = "video";
+  private static final String FONT_TYPE = "font";
 
   private static final String WILDCARD = "*";
 
@@ -141,6 +142,13 @@
   public static final MediaType ANY_VIDEO_TYPE = createConstant(VIDEO_TYPE, WILDCARD);
   public static final MediaType ANY_APPLICATION_TYPE = createConstant(APPLICATION_TYPE, WILDCARD);
 
+  /**
+   * Wildcard matching any "font" top-level media type.
+   *
+   * @since 30.0
+   */
+  public static final MediaType ANY_FONT_TYPE = createConstant(FONT_TYPE, WILDCARD);
+
   /* text types */
   public static final MediaType CACHE_MANIFEST_UTF_8 =
       createConstantUtf8(TEXT_TYPE, "cache-manifest");
@@ -189,6 +197,7 @@
    */
   public static final MediaType VTT_UTF_8 = createConstantUtf8(TEXT_TYPE, "vtt");
 
+  /* image types */
   /**
    * <a href="https://en.wikipedia.org/wiki/BMP_file_format">Bitmap file format</a> ({@code bmp}
    * files).
@@ -242,6 +251,20 @@
    */
   public static final MediaType WEBP = createConstant(IMAGE_TYPE, "webp");
 
+  /**
+   * <a href="https://www.iana.org/assignments/media-types/image/heif">HEIF image format</a>.
+   *
+   * @since 28.1
+   */
+  public static final MediaType HEIF = createConstant(IMAGE_TYPE, "heif");
+
+  /**
+   * <a href="https://tools.ietf.org/html/rfc3745">JP2K image format</a>.
+   *
+   * @since 28.1
+   */
+  public static final MediaType JP2K = createConstant(IMAGE_TYPE, "jp2");
+
   /* audio types */
   public static final MediaType MP4_AUDIO = createConstant(AUDIO_TYPE, "mp4");
   public static final MediaType MPEG_AUDIO = createConstant(AUDIO_TYPE, "mpeg");
@@ -426,6 +449,14 @@
    */
   public static final MediaType APPLICATION_BINARY = createConstant(APPLICATION_TYPE, "binary");
 
+  /**
+   * Media type for the <a href="https://tools.ietf.org/html/rfc7946">GeoJSON Format</a>, a
+   * geospatial data interchange format based on JSON.
+   *
+   * @since 28.0
+   */
+  public static final MediaType GEO_JSON = createConstant(APPLICATION_TYPE, "geo+json");
+
   public static final MediaType GZIP = createConstant(APPLICATION_TYPE, "x-gzip");
 
   /**
@@ -515,6 +546,18 @@
   public static final MediaType MICROSOFT_WORD = createConstant(APPLICATION_TYPE, "msword");
 
   /**
+   * Media type for <a
+   * href="https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP">Dynamic Adaptive
+   * Streaming over HTTP (DASH)</a>. This is <a
+   * href="https://www.iana.org/assignments/media-types/application/dash+xml">registered</a> with
+   * the IANA.
+   *
+   * @since 28.2
+   */
+  public static final MediaType MEDIA_PRESENTATION_DESCRIPTION =
+      createConstant(APPLICATION_TYPE, "dash+xml");
+
+  /**
    * WASM applications. For more information see <a href="https://webassembly.org/">the Web Assembly
    * overview</a>.
    *
@@ -560,6 +603,17 @@
       createConstant(APPLICATION_TYPE, "vnd.oasis.opendocument.spreadsheet");
   public static final MediaType OPENDOCUMENT_TEXT =
       createConstant(APPLICATION_TYPE, "vnd.oasis.opendocument.text");
+
+  /**
+   * <a href="https://tools.ietf.org/id/draft-ellermann-opensearch-01.html">OpenSearch</a>
+   * Description files are XML files that describe how a website can be used as a search engine by
+   * consumers (e.g. web browsers).
+   *
+   * @since 28.2
+   */
+  public static final MediaType OPENSEARCH_DESCRIPTION_UTF_8 =
+      createConstantUtf8(APPLICATION_TYPE, "opensearchdescription+xml");
+
   public static final MediaType PDF = createConstant(APPLICATION_TYPE, "pdf");
   public static final MediaType POSTSCRIPT = createConstant(APPLICATION_TYPE, "postscript");
 
@@ -583,10 +637,9 @@
   public static final MediaType RTF_UTF_8 = createConstantUtf8(APPLICATION_TYPE, "rtf");
 
   /**
-   * SFNT fonts (which includes <a href="http://en.wikipedia.org/wiki/TrueType/">TrueType</a> and <a
-   * href="http://en.wikipedia.org/wiki/OpenType/">OpenType</a> fonts). This is <a
-   * href="http://www.iana.org/assignments/media-types/application/font-sfnt">registered</a> with
-   * the IANA.
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares {@link #FONT_SFNT
+   * font/sfnt} to be the correct media type for SFNT, but this may be necessary in certain
+   * situations for compatibility.
    *
    * @since 17.0
    */
@@ -619,18 +672,18 @@
   public static final MediaType TAR = createConstant(APPLICATION_TYPE, "x-tar");
 
   /**
-   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF) <a
-   * href="http://www.w3.org/TR/WOFF/">defined</a> by the W3C. This is <a
-   * href="http://www.iana.org/assignments/media-types/application/font-woff">registered</a> with
-   * the IANA.
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares {@link #FONT_WOFF
+   * font/woff} to be the correct media type for WOFF, but this may be necessary in certain
+   * situations for compatibility.
    *
    * @since 17.0
    */
   public static final MediaType WOFF = createConstant(APPLICATION_TYPE, "font-woff");
 
   /**
-   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF)
-   * version 2 <a href="https://www.w3.org/TR/WOFF2/">defined</a> by the W3C.
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares {@link #FONT_WOFF2
+   * font/woff2} to be the correct media type for WOFF2, but this may be necessary in certain
+   * situations for compatibility.
    *
    * @since 20.0
    */
@@ -650,6 +703,62 @@
 
   public static final MediaType ZIP = createConstant(APPLICATION_TYPE, "zip");
 
+  /* font types */
+
+  /**
+   * A collection of font outlines as defined by <a href="https://tools.ietf.org/html/rfc8081">RFC
+   * 8081</a>.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_COLLECTION = createConstant(FONT_TYPE, "collection");
+
+  /**
+   * <a href="https://en.wikipedia.org/wiki/OpenType">Open Type Font Format</a> (OTF) as defined by
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a>.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_OTF = createConstant(FONT_TYPE, "otf");
+
+  /**
+   * <a href="https://en.wikipedia.org/wiki/SFNT">Spline or Scalable Font Format</a> (SFNT). <a
+   * href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares this to be the correct media
+   * type for SFNT, but {@link #SFNT application/font-sfnt} may be necessary in certain situations
+   * for compatibility.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_SFNT = createConstant(FONT_TYPE, "sfnt");
+
+  /**
+   * <a href="https://en.wikipedia.org/wiki/TrueType">True Type Font Format</a> (TTF) as defined by
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a>.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_TTF = createConstant(FONT_TYPE, "ttf");
+
+  /**
+   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF). <a
+   * href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares this to be the correct media
+   * type for SFNT, but {@link #WOFF application/font-woff} may be necessary in certain situations
+   * for compatibility.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_WOFF = createConstant(FONT_TYPE, "woff");
+
+  /**
+   * <a href="http://en.wikipedia.org/wiki/Web_Open_Font_Format">Web Open Font Format</a> (WOFF2).
+   * <a href="https://tools.ietf.org/html/rfc8081">RFC 8081</a> declares this to be the correct
+   * media type for SFNT, but {@link #WOFF2 application/font-woff2} may be necessary in certain
+   * situations for compatibility.
+   *
+   * @since 30.0
+   */
+  public static final MediaType FONT_WOFF2 = createConstant(FONT_TYPE, "woff2");
+
   private final String type;
   private final String subtype;
   private final ImmutableListMultimap<String, String> parameters;
@@ -887,6 +996,15 @@
   }
 
   /**
+   * Creates a media type with the "font" type and the given subtype.
+   *
+   * @throws IllegalArgumentException if subtype is invalid
+   */
+  static MediaType createFontType(String subtype) {
+    return create(FONT_TYPE, subtype);
+  }
+
+  /**
    * Creates a media type with the "image" type and the given subtype.
    *
    * @throws IllegalArgumentException if subtype is invalid
@@ -915,10 +1033,13 @@
 
   private static String normalizeToken(String token) {
     checkArgument(TOKEN_MATCHER.matchesAllOf(token));
+    checkArgument(!token.isEmpty());
     return Ascii.toLowerCase(token);
   }
 
   private static String normalizeParameterValue(String attribute, String value) {
+    checkNotNull(value); // for GWT
+    checkArgument(ascii().matchesAllOf(value), "parameter values must be ASCII: %s", value);
     return CHARSET_ATTRIBUTE.equals(attribute) ? Ascii.toLowerCase(value) : value;
   }
 
@@ -1066,7 +1187,9 @@
               new Function<String, String>() {
                 @Override
                 public String apply(String value) {
-                  return TOKEN_MATCHER.matchesAllOf(value) ? value : escapeAndQuote(value);
+                  return (TOKEN_MATCHER.matchesAllOf(value) && !value.isEmpty())
+                      ? value
+                      : escapeAndQuote(value);
                 }
               });
       PARAMETER_JOINER.appendTo(builder, quotedParameters.entries());
diff --git a/guava/src/com/google/common/net/PercentEscaper.java b/guava/src/com/google/common/net/PercentEscaper.java
index a931a52..554d04d 100644
--- a/guava/src/com/google/common/net/PercentEscaper.java
+++ b/guava/src/com/google/common/net/PercentEscaper.java
@@ -64,7 +64,7 @@
 
   /**
    * An array of flags where for any {@code char c} if {@code safeOctets[c]} is true then {@code c}
-   * should remain unmodified in the output. If {@code c > safeOctets.length} then it should be
+   * should remain unmodified in the output. If {@code c >= safeOctets.length} then it should be
    * escaped.
    */
   private final boolean[] safeOctets;
diff --git a/guava/src/com/google/common/primitives/Doubles.java b/guava/src/com/google/common/primitives/Doubles.java
index b318ef7..0ef1b74 100644
--- a/guava/src/com/google/common/primitives/Doubles.java
+++ b/guava/src/com/google/common/primitives/Doubles.java
@@ -18,6 +18,7 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static com.google.common.base.Strings.lenientFormat;
 import static java.lang.Double.NEGATIVE_INFINITY;
 import static java.lang.Double.POSITIVE_INFINITY;
 
@@ -48,7 +49,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
-public final class Doubles {
+public final class Doubles extends DoublesMethodsForWeb {
   private Doubles() {}
 
   /**
@@ -209,6 +210,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static double min(double... array) {
     checkArgument(array.length > 0);
     double min = array[0];
@@ -227,6 +230,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static double max(double... array) {
     checkArgument(array.length > 0);
     double max = array[0];
@@ -251,8 +256,13 @@
    */
   @Beta
   public static double constrainToRange(double value, double min, double max) {
-    checkArgument(min <= max, "min (%s) must be less than or equal to max (%s)", min, max);
-    return Math.min(Math.max(value, min), max);
+    // avoid auto-boxing by not using Preconditions.checkArgument(); see Guava issue 3984
+    // Reject NaN by testing for the good case (min <= max) instead of the bad (min > max).
+    if (min <= max) {
+      return Math.min(Math.max(value, min), max);
+    }
+    throw new IllegalArgumentException(
+        lenientFormat("min (%s) must be less than or equal to max (%s)", min, max));
   }
 
   /**
@@ -694,6 +704,7 @@
    * @param string the string representation of a {@code double} value
    * @return the floating point value represented by {@code string}, or {@code null} if {@code
    *     string} has a length of zero or cannot be parsed as a {@code double} value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 14.0
    */
   @Beta
diff --git a/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java b/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
new file mode 100644
index 0000000..04d9651
--- /dev/null
+++ b/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Doubles}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+abstract class DoublesMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/Floats.java b/guava/src/com/google/common/primitives/Floats.java
index 826dede..fd5363b 100644
--- a/guava/src/com/google/common/primitives/Floats.java
+++ b/guava/src/com/google/common/primitives/Floats.java
@@ -18,6 +18,7 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static com.google.common.base.Strings.lenientFormat;
 import static java.lang.Float.NEGATIVE_INFINITY;
 import static java.lang.Float.POSITIVE_INFINITY;
 
@@ -46,7 +47,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
-public final class Floats {
+public final class Floats extends FloatsMethodsForWeb {
   private Floats() {}
 
   /**
@@ -204,6 +205,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static float min(float... array) {
     checkArgument(array.length > 0);
     float min = array[0];
@@ -222,6 +225,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static float max(float... array) {
     checkArgument(array.length > 0);
     float max = array[0];
@@ -246,8 +251,13 @@
    */
   @Beta
   public static float constrainToRange(float value, float min, float max) {
-    checkArgument(min <= max, "min (%s) must be less than or equal to max (%s)", min, max);
-    return Math.min(Math.max(value, min), max);
+    // avoid auto-boxing by not using Preconditions.checkArgument(); see Guava issue 3984
+    // Reject NaN by testing for the good case (min <= max) instead of the bad (min > max).
+    if (min <= max) {
+      return Math.min(Math.max(value, min), max);
+    }
+    throw new IllegalArgumentException(
+        lenientFormat("min (%s) must be less than or equal to max (%s)", min, max));
   }
 
   /**
@@ -646,6 +656,7 @@
    * @param string the string representation of a {@code float} value
    * @return the floating point value represented by {@code string}, or {@code null} if {@code
    *     string} has a length of zero or cannot be parsed as a {@code float} value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 14.0
    */
   @Beta
diff --git a/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java b/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
new file mode 100644
index 0000000..acdb42f
--- /dev/null
+++ b/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Floats}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+abstract class FloatsMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/ImmutableDoubleArray.java b/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
index f2111cb..9d0f05c 100644
--- a/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
+++ b/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
@@ -294,9 +294,7 @@
     private void ensureRoomFor(int numberToAdd) {
       int newCount = count + numberToAdd; // TODO(kevinb): check overflow now?
       if (newCount > array.length) {
-        double[] newArray = new double[expandedCapacity(array.length, newCount)];
-        System.arraycopy(array, 0, newArray, 0, count);
-        this.array = newArray;
+        array = Arrays.copyOf(array, expandedCapacity(array.length, newCount));
       }
     }
 
diff --git a/guava/src/com/google/common/primitives/ImmutableIntArray.java b/guava/src/com/google/common/primitives/ImmutableIntArray.java
index 6d1e8a0..643e609 100644
--- a/guava/src/com/google/common/primitives/ImmutableIntArray.java
+++ b/guava/src/com/google/common/primitives/ImmutableIntArray.java
@@ -291,9 +291,7 @@
     private void ensureRoomFor(int numberToAdd) {
       int newCount = count + numberToAdd; // TODO(kevinb): check overflow now?
       if (newCount > array.length) {
-        int[] newArray = new int[expandedCapacity(array.length, newCount)];
-        System.arraycopy(array, 0, newArray, 0, count);
-        this.array = newArray;
+        array = Arrays.copyOf(array, expandedCapacity(array.length, newCount));
       }
     }
 
diff --git a/guava/src/com/google/common/primitives/ImmutableLongArray.java b/guava/src/com/google/common/primitives/ImmutableLongArray.java
index 280afd0..dde8f80 100644
--- a/guava/src/com/google/common/primitives/ImmutableLongArray.java
+++ b/guava/src/com/google/common/primitives/ImmutableLongArray.java
@@ -293,9 +293,7 @@
     private void ensureRoomFor(int numberToAdd) {
       int newCount = count + numberToAdd; // TODO(kevinb): check overflow now?
       if (newCount > array.length) {
-        long[] newArray = new long[expandedCapacity(array.length, newCount)];
-        System.arraycopy(array, 0, newArray, 0, count);
-        this.array = newArray;
+        array = Arrays.copyOf(array, expandedCapacity(array.length, newCount));
       }
     }
 
diff --git a/guava/src/com/google/common/primitives/Ints.java b/guava/src/com/google/common/primitives/Ints.java
index ae4111a..ad8c8c1 100644
--- a/guava/src/com/google/common/primitives/Ints.java
+++ b/guava/src/com/google/common/primitives/Ints.java
@@ -21,6 +21,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Converter;
 import java.io.Serializable;
 import java.util.AbstractList;
@@ -44,8 +45,8 @@
  * @author Kevin Bourrillion
  * @since 1.0
  */
-@GwtCompatible
-public final class Ints {
+@GwtCompatible(emulated = true)
+public final class Ints extends IntsMethodsForWeb {
   private Ints() {}
 
   /**
@@ -220,6 +221,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static int min(int... array) {
     checkArgument(array.length > 0);
     int min = array[0];
@@ -239,6 +242,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static int max(int... array) {
     checkArgument(array.length > 0);
     int max = array[0];
@@ -704,6 +709,7 @@
    * @param string the string representation of an integer value
    * @return the integer value represented by {@code string}, or {@code null} if {@code string} has
    *     a length of zero or cannot be parsed as an integer value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 11.0
    */
   @Beta
@@ -728,6 +734,7 @@
    *     {@code string} has a length of zero or cannot be parsed as an integer value
    * @throws IllegalArgumentException if {@code radix < Character.MIN_RADIX} or {@code radix >
    *     Character.MAX_RADIX}
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 19.0
    */
   @Beta
diff --git a/guava/src/com/google/common/primitives/IntsMethodsForWeb.java b/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
new file mode 100644
index 0000000..cb87bd2
--- /dev/null
+++ b/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Ints}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+abstract class IntsMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/Longs.java b/guava/src/com/google/common/primitives/Longs.java
index 830543f..e496f00 100644
--- a/guava/src/com/google/common/primitives/Longs.java
+++ b/guava/src/com/google/common/primitives/Longs.java
@@ -330,10 +330,10 @@
     static {
       byte[] result = new byte[128];
       Arrays.fill(result, (byte) -1);
-      for (int i = 0; i <= 9; i++) {
+      for (int i = 0; i < 10; i++) {
         result['0' + i] = (byte) i;
       }
-      for (int i = 0; i <= 26; i++) {
+      for (int i = 0; i < 26; i++) {
         result['A' + i] = (byte) (10 + i);
         result['a' + i] = (byte) (10 + i);
       }
@@ -359,6 +359,7 @@
    * @param string the string representation of a long value
    * @return the long value represented by {@code string}, or {@code null} if {@code string} has a
    *     length of zero or cannot be parsed as a long value
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 14.0
    */
   @Beta
@@ -383,6 +384,7 @@
    *     {@code string} has a length of zero or cannot be parsed as a long value
    * @throws IllegalArgumentException if {@code radix < Character.MIN_RADIX} or {@code radix >
    *     Character.MAX_RADIX}
+   * @throws NullPointerException if {@code string} is {@code null}
    * @since 19.0
    */
   @Beta
diff --git a/guava/src/com/google/common/primitives/Platform.java b/guava/src/com/google/common/primitives/Platform.java
new file mode 100644
index 0000000..1273c04
--- /dev/null
+++ b/guava/src/com/google/common/primitives/Platform.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/** Methods factored out so that they can be emulated differently in GWT. */
+@GwtCompatible(emulated = true)
+final class Platform {
+  private static final java.util.logging.Logger logger =
+      java.util.logging.Logger.getLogger(Platform.class.getName());
+
+  static void checkGwtRpcEnabled() {
+    String propertyName = "guava.gwt.emergency_reenable_rpc";
+
+    if (!Boolean.parseBoolean(System.getProperty(propertyName, "false"))) {
+      throw new UnsupportedOperationException(
+          com.google.common.base.Strings.lenientFormat(
+              "We are removing GWT-RPC support for Guava types. You can temporarily reenable"
+                  + " support by setting the system property %s to true. For more about system"
+                  + " properties, see %s. For more about Guava's GWT-RPC support, see %s.",
+              propertyName,
+              "https://stackoverflow.com/q/5189914/28465",
+              "https://groups.google.com/d/msg/guava-announce/zHZTFg7YF3o/rQNnwdHeEwAJ"));
+    }
+    logger.log(
+        java.util.logging.Level.WARNING,
+        "Later in 2020, we will remove GWT-RPC support for Guava types. You are seeing this"
+            + " 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/Shorts.java b/guava/src/com/google/common/primitives/Shorts.java
index e0e727e..fa480dd 100644
--- a/guava/src/com/google/common/primitives/Shorts.java
+++ b/guava/src/com/google/common/primitives/Shorts.java
@@ -44,7 +44,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
-public final class Shorts {
+public final class Shorts extends ShortsMethodsForWeb {
   private Shorts() {}
 
   /**
@@ -218,6 +218,8 @@
    *     the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static short min(short... array) {
     checkArgument(array.length > 0);
     short min = array[0];
@@ -237,6 +239,8 @@
    *     in the array
    * @throws IllegalArgumentException if {@code array} is empty
    */
+  @GwtIncompatible(
+      "Available in GWT! Annotation is to avoid conflict with GWT specialization of base class.")
   public static short max(short... array) {
     checkArgument(array.length > 0);
     short max = array[0];
diff --git a/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java b/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
new file mode 100644
index 0000000..c362768
--- /dev/null
+++ b/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
@@ -0,0 +1,24 @@
+/*
+ * 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.primitives;
+
+import com.google.common.annotations.GwtCompatible;
+
+/**
+ * Holder for web specializations of methods of {@code Shorts}. Intended to be empty for regular
+ * version.
+ */
+@GwtCompatible(emulated = true)
+abstract class ShortsMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/UnsignedBytes.java b/guava/src/com/google/common/primitives/UnsignedBytes.java
index f252423..4275f8a 100644
--- a/guava/src/com/google/common/primitives/UnsignedBytes.java
+++ b/guava/src/com/google/common/primitives/UnsignedBytes.java
@@ -121,11 +121,11 @@
   }
 
   /**
-   * Returns the least value present in {@code array}.
+   * Returns the least value present in {@code array}, treating values as unsigned.
    *
    * @param array a <i>nonempty</i> array of {@code byte} values
    * @return the value present in {@code array} that is less than or equal to every other value in
-   *     the array
+   *     the array according to {@link #compare}
    * @throws IllegalArgumentException if {@code array} is empty
    */
   public static byte min(byte... array) {
@@ -141,11 +141,11 @@
   }
 
   /**
-   * Returns the greatest value present in {@code array}.
+   * Returns the greatest value present in {@code array}, treating values as unsigned.
    *
    * @param array a <i>nonempty</i> array of {@code byte} values
    * @return the value present in {@code array} that is greater than or equal to every other value
-   *     in the array
+   *     in the array according to {@link #compare}
    * @throws IllegalArgumentException if {@code array} is empty
    */
   public static byte max(byte... array) {
diff --git a/guava/src/com/google/common/reflect/ClassPath.java b/guava/src/com/google/common/reflect/ClassPath.java
index fe8a6d2..c4f9d0f 100644
--- a/guava/src/com/google/common/reflect/ClassPath.java
+++ b/guava/src/com/google/common/reflect/ClassPath.java
@@ -46,7 +46,7 @@
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.Map.Entry;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.jar.Attributes;
@@ -178,19 +178,21 @@
    */
   @Beta
   public static class ResourceInfo {
+    private final File file;
     private final String resourceName;
 
     final ClassLoader loader;
 
-    static ResourceInfo of(String resourceName, ClassLoader loader) {
+    static ResourceInfo of(File file, String resourceName, ClassLoader loader) {
       if (resourceName.endsWith(CLASS_FILE_NAME_EXTENSION)) {
-        return new ClassInfo(resourceName, loader);
+        return new ClassInfo(file, resourceName, loader);
       } else {
-        return new ResourceInfo(resourceName, loader);
+        return new ResourceInfo(file, resourceName, loader);
       }
     }
 
-    ResourceInfo(String resourceName, ClassLoader loader) {
+    ResourceInfo(File file, String resourceName, ClassLoader loader) {
+      this.file = checkNotNull(file);
       this.resourceName = checkNotNull(resourceName);
       this.loader = checkNotNull(loader);
     }
@@ -239,6 +241,11 @@
       return resourceName;
     }
 
+    /** Returns the file that includes this resource. */
+    final File getFile() {
+      return file;
+    }
+
     @Override
     public int hashCode() {
       return resourceName.hashCode();
@@ -269,8 +276,8 @@
   public static final class ClassInfo extends ResourceInfo {
     private final String className;
 
-    ClassInfo(String resourceName, ClassLoader loader) {
-      super(resourceName, loader);
+    ClassInfo(File file, String resourceName, ClassLoader loader) {
+      super(file, resourceName, loader);
       this.className = getClassName(resourceName);
     }
 
@@ -296,7 +303,7 @@
         String innerClassName = className.substring(lastDollarSign + 1);
         // local and anonymous classes are prefixed with number (1,2,3...), anonymous classes are
         // entirely numeric whereas local classes have the user supplied name as a suffix
-        return CharMatcher.digit().trimLeadingFrom(innerClassName);
+        return CharMatcher.inRange('0', '9').trimLeadingFrom(innerClassName);
       }
       String packageName = getPackageName();
       if (packageName.isEmpty()) {
@@ -346,11 +353,11 @@
   abstract static class Scanner {
 
     // We only scan each file once independent of the classloader that resource might be associated
-    // with.
-    private final Set<File> scannedUris = Sets.newHashSet();
+    // with. Use concurrent set so that subclasses can be thread-safe.
+    private final Set<File> scannedUris = Sets.newConcurrentHashSet();
 
     public final void scan(ClassLoader classloader) throws IOException {
-      for (Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
+      for (Map.Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
         scan(entry.getKey(), entry.getValue());
       }
     }
@@ -362,13 +369,13 @@
       }
     }
 
-    /** Called when a directory is scanned for resource files. */
-    protected abstract void scanDirectory(ClassLoader loader, File directory) throws IOException;
+    /**
+     * Called each time a resource (uniqueness not guaranteed if the class path includes redundant
+     * entries)
+     */
+    protected abstract void scanResource(ResourceInfo resource) throws IOException;
 
-    /** Called when a jar file is scanned for resource entries. */
-    protected abstract void scanJarFile(ClassLoader loader, JarFile file) throws IOException;
-
-    private void scanFrom(File file, ClassLoader classloader) throws IOException {
+    protected void scanFrom(File file, ClassLoader classloader) throws IOException {
       try {
         if (!file.exists()) {
           return;
@@ -499,35 +506,20 @@
     static URL getClassPathEntry(File jarFile, String path) throws MalformedURLException {
       return new URL(jarFile.toURI().toURL(), path);
     }
-  }
 
-  @VisibleForTesting
-  static final class DefaultScanner extends Scanner {
-    private final SetMultimap<ClassLoader, String> resources =
-        MultimapBuilder.hashKeys().linkedHashSetValues().build();
-
-    ImmutableSet<ResourceInfo> getResources() {
-      ImmutableSet.Builder<ResourceInfo> builder = ImmutableSet.builder();
-      for (Entry<ClassLoader, String> entry : resources.entries()) {
-        builder.add(ResourceInfo.of(entry.getValue(), entry.getKey()));
-      }
-      return builder.build();
-    }
-
-    @Override
-    protected void scanJarFile(ClassLoader classloader, JarFile file) {
+    @VisibleForTesting
+    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
       Enumeration<JarEntry> entries = file.entries();
       while (entries.hasMoreElements()) {
         JarEntry entry = entries.nextElement();
         if (entry.isDirectory() || entry.getName().equals(JarFile.MANIFEST_NAME)) {
           continue;
         }
-        resources.get(classloader).add(entry.getName());
+        scanResource(ResourceInfo.of(new File(file.getName()), entry.getName(), classloader));
       }
     }
 
-    @Override
-    protected void scanDirectory(ClassLoader classloader, File directory) throws IOException {
+    private void scanDirectory(ClassLoader classloader, File directory) throws IOException {
       Set<File> currentPath = new HashSet<>();
       currentPath.add(directory.getCanonicalFile());
       scanDirectory(directory, classloader, "", currentPath);
@@ -565,7 +557,7 @@
         } else {
           String resourceName = packagePrefix + name;
           if (!resourceName.equals(JarFile.MANIFEST_NAME)) {
-            resources.get(classloader).add(resourceName);
+            scanResource(ResourceInfo.of(f, resourceName, classloader));
           }
         }
       }
@@ -573,6 +565,21 @@
   }
 
   @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
+    protected void scanResource(ResourceInfo resource) {
+      resources.put(resource.loader, resource);
+    }
+  }
+
+  @VisibleForTesting
   static String getClassName(String filename) {
     int classNameEnd = filename.length() - CLASS_FILE_NAME_EXTENSION.length();
     return filename.substring(0, classNameEnd).replace('/', '.');
diff --git a/guava/src/com/google/common/reflect/Parameter.java b/guava/src/com/google/common/reflect/Parameter.java
index d916310..8065920 100644
--- a/guava/src/com/google/common/reflect/Parameter.java
+++ b/guava/src/com/google/common/reflect/Parameter.java
@@ -94,7 +94,7 @@
   // @Override on JDK8
   @Override
   public Annotation[] getDeclaredAnnotations() {
-    return annotations.toArray(new Annotation[annotations.size()]);
+    return annotations.toArray(new Annotation[0]);
   }
 
   /** @since 18.0 */
diff --git a/guava/src/com/google/common/reflect/TypeToInstanceMap.java b/guava/src/com/google/common/reflect/TypeToInstanceMap.java
index d4097c6..443b258 100644
--- a/guava/src/com/google/common/reflect/TypeToInstanceMap.java
+++ b/guava/src/com/google/common/reflect/TypeToInstanceMap.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
@@ -39,6 +40,7 @@
  * @since 13.0
  */
 @Beta
+@DoNotMock("Use ImmutableTypeToInstanceMap or MutableTypeToInstanceMap")
 public interface TypeToInstanceMap<B> extends Map<TypeToken<? extends B>, B> {
 
   /**
diff --git a/guava/src/com/google/common/reflect/TypeToken.java b/guava/src/com/google/common/reflect/TypeToken.java
index c1dc5e2..88deff3 100644
--- a/guava/src/com/google/common/reflect/TypeToken.java
+++ b/guava/src/com/google/common/reflect/TypeToken.java
@@ -46,7 +46,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -104,10 +103,10 @@
   private final Type runtimeType;
 
   /** Resolver for resolving parameter and field types with {@link #runtimeType} as context. */
-  private transient @MonotonicNonNull TypeResolver invariantTypeResolver;
+  private transient @Nullable TypeResolver invariantTypeResolver;
 
   /** Resolver for resolving covariant types with {@link #runtimeType} as context. */
-  private transient @MonotonicNonNull TypeResolver covariantTypeResolver;
+  private transient @Nullable TypeResolver covariantTypeResolver;
 
   /**
    * Constructs a new type token of {@code T}.
@@ -653,7 +652,7 @@
    */
   public class TypeSet extends ForwardingSet<TypeToken<? super T>> implements Serializable {
 
-    private transient @MonotonicNonNull ImmutableSet<TypeToken<? super T>> types;
+    private transient @Nullable ImmutableSet<TypeToken<? super T>> types;
 
     TypeSet() {}
 
@@ -699,7 +698,7 @@
   private final class InterfaceSet extends TypeSet {
 
     private final transient TypeSet allTypes;
-    private transient @MonotonicNonNull ImmutableSet<TypeToken<? super T>> interfaces;
+    private transient @Nullable ImmutableSet<TypeToken<? super T>> interfaces;
 
     InterfaceSet(TypeSet allTypes) {
       this.allTypes = allTypes;
@@ -752,7 +751,7 @@
 
   private final class ClassSet extends TypeSet {
 
-    private transient @MonotonicNonNull ImmutableSet<TypeToken<? super T>> classes;
+    private transient @Nullable ImmutableSet<TypeToken<? super T>> classes;
 
     @Override
     protected Set<TypeToken<? super T>> delegate() {
@@ -1207,9 +1206,9 @@
   }
 
   private TypeToken<? extends T> getSubtypeFromLowerBounds(Class<?> subclass, Type[] lowerBounds) {
-    for (Type lowerBound : lowerBounds) {
+    if (lowerBounds.length > 0) {
       @SuppressWarnings("unchecked") // T's lower bound is <? extends T>
-      TypeToken<? extends T> bound = (TypeToken<? extends T>) of(lowerBound);
+      TypeToken<? extends T> bound = (TypeToken<? extends T>) of(lowerBounds[0]);
       // Java supports only one lowerbound anyway.
       return bound.getSubtype(subclass);
     }
diff --git a/guava/src/com/google/common/reflect/Types.java b/guava/src/com/google/common/reflect/Types.java
index 5babaa0..42a1f78 100644
--- a/guava/src/com/google/common/reflect/Types.java
+++ b/guava/src/com/google/common/reflect/Types.java
@@ -348,6 +348,12 @@
    * TypeResolver#resolveType} will not be able to call {@code getAnnotatedBounds()} on it, but that
    * should hopefully be rare.
    *
+   * <p>TODO(b/147144588): We are currently also missing the methods inherited from {@link
+   * AnnotatedElement}, which {@code TypeVariable} began to extend only in Java 8. Those methods
+   * refer only to types present in Java 7, so we could implement them in {@code TypeVariableImpl}
+   * today. (We could probably then make {@code TypeVariableImpl} implement {@code AnnotatedElement}
+   * so that we get partial compile-time checking.)
+   *
    * <p>This workaround should be removed at a distant future time when we no longer support Java
    * versions earlier than 8.
    */
@@ -511,7 +517,7 @@
   }
 
   private static Type[] toArray(Collection<Type> types) {
-    return types.toArray(new Type[types.size()]);
+    return types.toArray(new Type[0]);
   }
 
   private static Iterable<Type> filterUpperBounds(Iterable<Type> bounds) {
@@ -588,7 +594,14 @@
           return (String) getTypeName.invoke(type);
         } catch (NoSuchMethodException e) {
           throw new AssertionError("Type.getTypeName should be available in Java 8");
-        } catch (InvocationTargetException | IllegalAccessException e) {
+          /*
+           * Do not merge the 2 catch blocks below. javac would infer a type of
+           * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of
+           * Android don't *seem* to mind, but there might be edge cases of which we're unaware.)
+           */
+        } catch (InvocationTargetException e) {
+          throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
           throw new RuntimeException(e);
         }
       }
diff --git a/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java b/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
index 3193dc2..850e310 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
@@ -21,6 +21,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
+import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
+import com.google.common.util.concurrent.internal.InternalFutures;
 import com.google.errorprone.annotations.ForOverride;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -70,10 +72,9 @@
     ListenableFuture<? extends V> localInputFuture = inputFuture;
     Class<X> localExceptionType = exceptionType;
     F localFallback = fallback;
-    if (localInputFuture == null
-        | localExceptionType == null
-        | localFallback == null
-        | isCancelled()) {
+    if (localInputFuture == null | localExceptionType == null | localFallback == null
+        // This check, unlike all the others, is a volatile read
+        || isCancelled()) {
       return;
     }
     inputFuture = null;
@@ -82,9 +83,25 @@
     V sourceResult = null;
     Throwable throwable = null;
     try {
-      sourceResult = getDone(localInputFuture);
+      if (localInputFuture instanceof InternalFutureFailureAccess) {
+        throwable =
+            InternalFutures.tryInternalFastPathGetFailure(
+                (InternalFutureFailureAccess) localInputFuture);
+      }
+      if (throwable == null) {
+        sourceResult = getDone(localInputFuture);
+      }
     } catch (ExecutionException e) {
-      throwable = checkNotNull(e.getCause());
+      throwable = e.getCause();
+      if (throwable == null) {
+        throwable =
+            new NullPointerException(
+                "Future type "
+                    + localInputFuture.getClass()
+                    + " threw "
+                    + e.getClass()
+                    + " without a cause");
+      }
     } catch (Throwable e) { // this includes cancellation exception
       throwable = e;
     }
diff --git a/guava/src/com/google/common/util/concurrent/AbstractCheckedFuture.java b/guava/src/com/google/common/util/concurrent/AbstractCheckedFuture.java
deleted file mode 100644
index 5242ca6..0000000
--- a/guava/src/com/google/common/util/concurrent/AbstractCheckedFuture.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.util.concurrent;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.GwtIncompatible;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A delegating wrapper around a {@link ListenableFuture} that adds support for the {@link
- * #checkedGet()} and {@link #checkedGet(long, TimeUnit)} methods.
- *
- * @author Sven Mawson
- * @since 1.0
- * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
- *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
- *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
- *     Additionally, it has a surprising policy about which exceptions to map and which to leave
- *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
- *     use, possibly specializing them to the particular exception type they use. We recommend that
- *     most people use {@code ListenableFuture} and perform any exception wrapping themselves. This
- *     class is scheduled for removal from Guava in January 2019.
- */
-// TODO(b/72241575): Remove by 2019-01
-@Beta
-@Deprecated
-@GwtIncompatible
-public abstract class AbstractCheckedFuture<V, X extends Exception>
-    extends ForwardingListenableFuture.SimpleForwardingListenableFuture<V>
-    implements CheckedFuture<V, X> {
-  /** Constructs an {@code AbstractCheckedFuture} that wraps a delegate. */
-  protected AbstractCheckedFuture(ListenableFuture<V> delegate) {
-    super(delegate);
-  }
-
-  /**
-   * Translates from an {@link InterruptedException}, {@link CancellationException} or {@link
-   * ExecutionException} thrown by {@code get} to an exception of type {@code X} to be thrown by
-   * {@code checkedGet}. Subclasses must implement this method.
-   *
-   * <p>If {@code e} is an {@code InterruptedException}, the calling {@code checkedGet} method has
-   * already restored the interrupt after catching the exception. If an implementation of {@link
-   * #mapException(Exception)} wishes to swallow the interrupt, it can do so by calling {@link
-   * Thread#interrupted()}.
-   *
-   * <p>Subclasses may choose to throw, rather than return, a subclass of {@code RuntimeException}
-   * to allow creating a CheckedFuture that throws both checked and unchecked exceptions.
-   */
-  // We might like @ForOverride here, but some subclasses invoke this from their get() methods.
-  protected abstract X mapException(Exception e);
-
-  /**
-   * {@inheritDoc}
-   *
-   * <p>This implementation calls {@link #get()} and maps that method's standard exceptions to
-   * instances of type {@code X} using {@link #mapException}.
-   *
-   * <p>In addition, if {@code get} throws an {@link InterruptedException}, this implementation will
-   * set the current thread's interrupt status before calling {@code mapException}.
-   *
-   * @throws X if {@link #get()} throws an {@link InterruptedException}, {@link
-   *     CancellationException}, or {@link ExecutionException}
-   */
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet() throws X {
-    try {
-      return get();
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      throw mapException(e);
-    } catch (CancellationException | ExecutionException e) {
-      throw mapException(e);
-    }
-  }
-
-  /**
-   * {@inheritDoc}
-   *
-   * <p>This implementation calls {@link #get(long, TimeUnit)} and maps that method's standard
-   * exceptions (excluding {@link TimeoutException}, which is propagated) to instances of type
-   * {@code X} using {@link #mapException}.
-   *
-   * <p>In addition, if {@code get} throws an {@link InterruptedException}, this implementation will
-   * set the current thread's interrupt status before calling {@code mapException}.
-   *
-   * @throws X if {@link #get()} throws an {@link InterruptedException}, {@link
-   *     CancellationException}, or {@link ExecutionException}
-   */
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet(long timeout, TimeUnit unit) throws TimeoutException, X {
-    try {
-      return get(timeout, unit);
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      throw mapException(e);
-    } catch (CancellationException | ExecutionException e) {
-      throw mapException(e);
-    }
-  }
-}
diff --git a/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java b/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
index f92200a..1bee501 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
@@ -18,6 +18,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.time.Duration;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -32,7 +33,6 @@
  * @author Jesse Wilson
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractExecutionThreadService implements Service {
   private static final Logger logger =
@@ -140,7 +140,14 @@
    * Invoked to request the service to stop.
    *
    * <p>By default this method does nothing.
+   *
+   * <p>Currently, this method is invoked while holding a lock. If an implementation of this method
+   * blocks, it can prevent this service from changing state. If you need to performing a blocking
+   * operation in order to trigger shutdown, consider instead registering a listener and
+   * implementing {@code stopping}. Note, however, that {@code stopping} does not run at exactly the
+   * same times as {@code triggerShutdown}.
    */
+  @Beta
   protected void triggerShutdown() {}
 
   /**
@@ -211,6 +218,12 @@
     delegate.awaitRunning();
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitRunning(Duration timeout) throws TimeoutException {
+    Service.super.awaitRunning(timeout);
+  }
+
   /** @since 15.0 */
   @Override
   public final void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException {
@@ -223,6 +236,12 @@
     delegate.awaitTerminated();
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitTerminated(Duration timeout) throws TimeoutException {
+    Service.super.awaitTerminated(timeout);
+  }
+
   /** @since 15.0 */
   @Override
   public final void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException {
diff --git a/guava/src/com/google/common/util/concurrent/AbstractFuture.java b/guava/src/com/google/common/util/concurrent/AbstractFuture.java
index 808243f..06feb5a 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractFuture.java
@@ -16,10 +16,13 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Throwables.throwIfUnchecked;
+import static java.lang.Integer.toHexString;
+import static java.lang.System.identityHashCode;
 import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.base.Strings;
 import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
 import com.google.common.util.concurrent.internal.InternalFutures;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -68,9 +71,20 @@
     implements ListenableFuture<V> {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
-  private static final boolean GENERATE_CANCELLATION_CAUSES =
-      Boolean.parseBoolean(
-          System.getProperty("guava.concurrent.generate_cancellation_cause", "false"));
+  private static final boolean GENERATE_CANCELLATION_CAUSES;
+
+  static {
+    // System.getProperty may throw if the security policy does not permit access.
+    boolean generateCancellationCauses;
+    try {
+      generateCancellationCauses =
+          Boolean.parseBoolean(
+              System.getProperty("guava.concurrent.generate_cancellation_cause", "false"));
+    } catch (SecurityException e) {
+      generateCancellationCauses = false;
+    }
+    GENERATE_CANCELLATION_CAUSES = generateCancellationCauses;
+  }
 
   /**
    * Tag interface marking trusted subclasses. This enables some optimizations. The implementation
@@ -417,7 +431,7 @@
           node.setNext(oldHead);
           if (ATOMIC_HELPER.casWaiters(this, oldHead, node)) {
             while (true) {
-              LockSupport.parkNanos(this, remainingNanos);
+              OverflowAvoidingLockSupport.parkNanos(this, remainingNanos);
               // Check interruption first, if we woke up due to interruption we need to honor that.
               if (Thread.interrupted()) {
                 removeWaiter(node);
@@ -583,6 +597,9 @@
    * #wasInterrupted} as necessary. This ensures that the work is done even if the future is
    * cancelled without a call to {@code cancel}, such as by calling {@code
    * setFuture(cancelledFuture)}.
+   *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
    */
   @CanIgnoreReturnValue
   @Override
@@ -603,7 +620,7 @@
       while (true) {
         if (ATOMIC_HELPER.casValue(abstractFuture, localValue, valueToSet)) {
           rValue = true;
-          // We call interuptTask before calling complete(), which is consistent with
+          // We call interruptTask before calling complete(), which is consistent with
           // FutureTask
           if (mayInterruptIfRunning) {
             abstractFuture.interruptTask();
@@ -716,6 +733,9 @@
    * yet. That result, though not yet known, cannot be overridden by a call to a {@code set*}
    * method, only by a call to {@link #cancel}.
    *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
+   *
    * @param value the value to be used as the result
    * @return true if the attempt was accepted, completing the {@code Future}
    */
@@ -738,6 +758,9 @@
    * known yet. That result, though not yet known, cannot be overridden by a call to a {@code set*}
    * method, only by a call to {@link #cancel}.
    *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
+   *
    * @param throwable the exception to be used as the failed result
    * @return true if the attempt was accepted, completing the {@code Future}
    */
@@ -772,12 +795,14 @@
    * invoke the {@link #interruptTask} method, and the {@link #wasInterrupted} method will not
    * return {@code true}.
    *
+   * <p>Beware of completing a future while holding a lock. Its listeners may do slow work or
+   * acquire other locks, risking deadlocks.
+   *
    * @param future the future to delegate to
    * @return true if the attempt was accepted, indicating that the {@code Future} was not previously
    *     cancelled or set.
    * @since 19.0
    */
-  @Beta
   @CanIgnoreReturnValue
   protected boolean setFuture(ListenableFuture<? extends V> future) {
     checkNotNull(future);
@@ -999,8 +1024,7 @@
    * @since 27.0
    */
   @Override
-  @Nullable
-  protected final Throwable tryInternalFastPathGetFailure() {
+  protected final @Nullable Throwable tryInternalFastPathGetFailure() {
     if (this instanceof Trusted) {
       Object obj = value;
       if (obj instanceof Failure) {
@@ -1059,29 +1083,20 @@
   // TODO(user): move parts into a default method on ListenableFuture?
   @Override
   public String toString() {
-    StringBuilder builder = new StringBuilder().append(super.toString()).append("[status=");
+    // TODO(cpovirk): Presize to something plausible?
+    StringBuilder builder = new StringBuilder();
+    if (getClass().getName().startsWith("com.google.common.util.concurrent.")) {
+      builder.append(getClass().getSimpleName());
+    } else {
+      builder.append(getClass().getName());
+    }
+    builder.append('@').append(toHexString(identityHashCode(this))).append("[status=");
     if (isCancelled()) {
       builder.append("CANCELLED");
     } else if (isDone()) {
       addDoneString(builder);
     } else {
-      String pendingDescription;
-      try {
-        pendingDescription = pendingToString();
-      } catch (RuntimeException e) {
-        // Don't call getMessage or toString() on the exception, in case the exception thrown by the
-        // subclass is implemented with bugs similar to the subclass.
-        pendingDescription = "Exception thrown from implementation: " + e.getClass();
-      }
-      // The future may complete during or before the call to getPendingToString, so we use null
-      // as a signal that we should try checking if the future is done again.
-      if (pendingDescription != null && !pendingDescription.isEmpty()) {
-        builder.append("PENDING, info=[").append(pendingDescription).append("]");
-      } else if (isDone()) {
-        addDoneString(builder);
-      } else {
-        builder.append("PENDING");
-      }
+      addPendingString(builder); // delegates to addDoneString if future completes mid-way
     }
     return builder.append("]").toString();
   }
@@ -1089,14 +1104,12 @@
   /**
    * Provide a human-readable explanation of why this future has not yet completed.
    *
-   * @return null if an explanation cannot be provided because the future is done.
+   * @return null if an explanation cannot be provided (e.g. because the future is done).
    * @since 23.0
    */
   protected @Nullable String pendingToString() {
-    Object localValue = value;
-    if (localValue instanceof SetFuture) {
-      return "setFuture=[" + userObjectToString(((SetFuture) localValue).future) + "]";
-    } else if (this instanceof ScheduledFuture) {
+    // TODO(diamondm) consider moving this into addPendingString so it's always in the output
+    if (this instanceof ScheduledFuture) {
       return "remaining delay=["
           + ((ScheduledFuture) this).getDelay(TimeUnit.MILLISECONDS)
           + " ms]";
@@ -1104,10 +1117,47 @@
     return null;
   }
 
+  private void addPendingString(StringBuilder builder) {
+    // Capture current builder length so it can be truncated if this future ends up completing while
+    // the toString is being calculated
+    int truncateLength = builder.length();
+
+    builder.append("PENDING");
+
+    Object localValue = value;
+    if (localValue instanceof SetFuture) {
+      builder.append(", setFuture=[");
+      appendUserObject(builder, ((SetFuture) localValue).future);
+      builder.append("]");
+    } else {
+      String pendingDescription;
+      try {
+        pendingDescription = Strings.emptyToNull(pendingToString());
+      } catch (RuntimeException | StackOverflowError e) {
+        // Don't call getMessage or toString() on the exception, in case the exception thrown by the
+        // subclass is implemented with bugs similar to the subclass.
+        pendingDescription = "Exception thrown from implementation: " + e.getClass();
+      }
+      if (pendingDescription != null) {
+        builder.append(", info=[").append(pendingDescription).append("]");
+      }
+    }
+
+    // The future may complete while calculating the toString, so we check once more to see if the
+    // future is done
+    if (isDone()) {
+      // Truncate anything that was appended before realizing this future is done
+      builder.delete(truncateLength, builder.length());
+      addDoneString(builder);
+    }
+  }
+
   private void addDoneString(StringBuilder builder) {
     try {
       V value = getUninterruptibly(this);
-      builder.append("SUCCESS, result=[").append(userObjectToString(value)).append("]");
+      builder.append("SUCCESS, result=[");
+      appendResultObject(builder, value);
+      builder.append("]");
     } catch (ExecutionException e) {
       builder.append("FAILURE, cause=[").append(e.getCause()).append("]");
     } catch (CancellationException e) {
@@ -1117,16 +1167,41 @@
     }
   }
 
-  /** Helper for printing user supplied objects into our toString method. */
-  private String userObjectToString(Object o) {
-    // This is some basic recursion detection for when people create cycles via set/setFuture
-    // This is however only partial protection though since it only detects self loops.  We could
-    // detect arbitrary cycles using a thread local or possibly by catching StackOverflowExceptions
-    // but this should be a good enough solution (it is also what jdk collections do in these cases)
-    if (o == this) {
-      return "this future";
+  /**
+   * Any object can be the result of a Future, and not every object has a reasonable toString()
+   * 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) {
+    if (o == null) {
+      builder.append("null");
+    } else if (o == this) {
+      builder.append("this future");
+    } else {
+      builder
+          .append(o.getClass().getName())
+          .append("@")
+          .append(Integer.toHexString(System.identityHashCode(o)));
     }
-    return String.valueOf(o);
+  }
+
+  /** Helper for printing user supplied objects into our toString method. */
+  private void appendUserObject(StringBuilder builder, 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
+    // what jdk collections do in these cases)
+    try {
+      if (o == this) {
+        builder.append("this future");
+      } else {
+        builder.append(o);
+      }
+    } catch (RuntimeException | StackOverflowError e) {
+      // Don't call getMessage or toString() on the exception, in case the exception thrown by the
+      // user object is implemented with bugs similar to the user object.
+      builder.append("Exception thrown from implementation: ").append(e.getClass());
+    }
   }
 
   /**
diff --git a/guava/src/com/google/common/util/concurrent/AbstractIdleService.java b/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
index 4df45a3..b49db7a 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
@@ -14,11 +14,11 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.j2objc.annotations.WeakOuter;
+import java.time.Duration;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -31,7 +31,6 @@
  * @author Chris Nokleberg
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractIdleService implements Service {
 
@@ -165,6 +164,12 @@
     delegate.awaitRunning();
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitRunning(Duration timeout) throws TimeoutException {
+    Service.super.awaitRunning(timeout);
+  }
+
   /** @since 15.0 */
   @Override
   public final void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException {
@@ -177,6 +182,12 @@
     delegate.awaitTerminated();
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitTerminated(Duration timeout) throws TimeoutException {
+    Service.super.awaitTerminated(timeout);
+  }
+
   /** @since 15.0 */
   @Override
   public final void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException {
diff --git a/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java b/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
index 43ee496..a7a342a 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
@@ -16,14 +16,15 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
 import com.google.j2objc.annotations.WeakOuter;
+import java.time.Duration;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -35,7 +36,6 @@
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -95,7 +95,6 @@
  * @author Luke Sandberg
  * @since 11.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractScheduledService implements Service {
   private static final Logger logger = Logger.getLogger(AbstractScheduledService.class.getName());
@@ -120,6 +119,20 @@
      * @param initialDelay the time to delay first execution
      * @param delay the delay between the termination of one execution and the commencement of the
      *     next
+     * @since 28.0
+     */
+    public static Scheduler newFixedDelaySchedule(Duration initialDelay, Duration delay) {
+      return newFixedDelaySchedule(
+          toNanosSaturated(initialDelay), toNanosSaturated(delay), TimeUnit.NANOSECONDS);
+    }
+
+    /**
+     * Returns a {@link Scheduler} that schedules the task using the {@link
+     * ScheduledExecutorService#scheduleWithFixedDelay} method.
+     *
+     * @param initialDelay the time to delay first execution
+     * @param delay the delay between the termination of one execution and the commencement of the
+     *     next
      * @param unit the time unit of the initialDelay and delay parameters
      */
     @SuppressWarnings("GoodTime") // should accept a java.time.Duration
@@ -142,6 +155,19 @@
      *
      * @param initialDelay the time to delay first execution
      * @param period the period between successive executions of the task
+     * @since 28.0
+     */
+    public static Scheduler newFixedRateSchedule(Duration initialDelay, Duration period) {
+      return newFixedRateSchedule(
+          toNanosSaturated(initialDelay), toNanosSaturated(period), TimeUnit.NANOSECONDS);
+    }
+
+    /**
+     * Returns a {@link Scheduler} that schedules the task using the {@link
+     * ScheduledExecutorService#scheduleAtFixedRate} method.
+     *
+     * @param initialDelay the time to delay first execution
+     * @param period the period between successive executions of the task
      * @param unit the time unit of the initialDelay and period parameters
      */
     @SuppressWarnings("GoodTime") // should accept a java.time.Duration
@@ -173,8 +199,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.
-    @MonotonicNonNull private volatile Future<?> runningTask;
-    @MonotonicNonNull private volatile ScheduledExecutorService executorService;
+    private volatile @Nullable Future<?> runningTask;
+    private volatile @Nullable 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.
@@ -415,6 +441,12 @@
     delegate.awaitRunning();
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitRunning(Duration timeout) throws TimeoutException {
+    Service.super.awaitRunning(timeout);
+  }
+
   /** @since 15.0 */
   @Override
   public final void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException {
@@ -427,6 +459,12 @@
     delegate.awaitTerminated();
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitTerminated(Duration timeout) throws TimeoutException {
+    Service.super.awaitTerminated(timeout);
+  }
+
   /** @since 15.0 */
   @Override
   public final void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException {
@@ -441,7 +479,6 @@
    * @author Luke Sandberg
    * @since 11.0
    */
-  @Beta
   public abstract static class CustomScheduler extends Scheduler {
 
     /** A callable class that can reschedule itself using a {@link CustomScheduler}. */
@@ -567,7 +604,6 @@
      * @author Luke Sandberg
      * @since 11.0
      */
-    @Beta
     protected static final class Schedule {
 
       private final long delay;
diff --git a/guava/src/com/google/common/util/concurrent/AbstractService.java b/guava/src/com/google/common/util/concurrent/AbstractService.java
index 3a15f2a..f5d38ed 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractService.java
@@ -32,6 +32,7 @@
 import com.google.errorprone.annotations.ForOverride;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
 import com.google.j2objc.annotations.WeakOuter;
+import java.time.Duration;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -47,7 +48,6 @@
  * @author Luke Sandberg
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
 public abstract class AbstractService implements Service {
   private static final ListenerCallQueue.Event<Listener> STARTING_EVENT =
@@ -216,7 +216,7 @@
    *
    * <p>If {@link #stopAsync} is called on a {@link State#STARTING} service, this method is not
    * invoked immediately. Instead, it will be deferred until after the service is {@link
-   * State#RUNNING}. Services that need to cancel startup work can override {#link #doCancelStart}.
+   * State#RUNNING}. Services that need to cancel startup work can override {@link #doCancelStart}.
    */
   @ForOverride
   protected abstract void doStop();
@@ -235,6 +235,7 @@
    *
    * @since 27.0
    */
+  @Beta
   @ForOverride
   protected void doCancelStart() {}
 
@@ -305,6 +306,12 @@
     }
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitRunning(Duration timeout) throws TimeoutException {
+    Service.super.awaitRunning(timeout);
+  }
+
   @Override
   public final void awaitRunning(long timeout, TimeUnit unit) throws TimeoutException {
     if (monitor.enterWhenUninterruptibly(hasReachedRunning, timeout, unit)) {
@@ -332,6 +339,12 @@
     }
   }
 
+  /** @since 28.0 */
+  @Override
+  public final void awaitTerminated(Duration timeout) throws TimeoutException {
+    Service.super.awaitTerminated(timeout);
+  }
+
   @Override
   public final void awaitTerminated(long timeout, TimeUnit unit) throws TimeoutException {
     if (monitor.enterWhenUninterruptibly(isStopped, timeout, unit)) {
diff --git a/guava/src/com/google/common/util/concurrent/AggregateFuture.java b/guava/src/com/google/common/util/concurrent/AggregateFuture.java
index 4326845..596a5ae 100644
--- a/guava/src/com/google/common/util/concurrent/AggregateFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AggregateFuture.java
@@ -16,8 +16,11 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.util.concurrent.AggregateFuture.ReleaseResourcesReason.ALL_INPUT_FUTURES_PROCESSED;
+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.logging.Level.SEVERE;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableCollection;
@@ -26,265 +29,303 @@
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * A future made up of a collection of sub-futures.
+ * A future whose value is derived from a collection of input futures.
  *
  * @param <InputT> the type of the individual inputs
  * @param <OutputT> the type of the output (i.e. this) future
  */
 @GwtCompatible
-abstract class AggregateFuture<InputT, OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
+abstract class AggregateFuture<InputT, OutputT> extends AggregateFutureState<OutputT> {
   private static final Logger logger = Logger.getLogger(AggregateFuture.class.getName());
 
+  /**
+   * The input futures. After {@link #init}, this field is read only by {@link #afterDone()} (to
+   * propagate cancellation) and {@link #toString()}. To access the futures' <i>values</i>, {@code
+   * AggregateFuture} attaches listeners that hold references to one or more inputs. And in the case
+   * of {@link CombinedFuture}, the user-supplied callback usually has its own references to inputs.
+   */
   /*
    * 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 RunningState runningState;
+  private @Nullable ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
+
+  private final boolean allMustSucceed;
+  private final boolean collectsValues;
+
+  AggregateFuture(
+      ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures,
+      boolean allMustSucceed,
+      boolean collectsValues) {
+    super(futures.size());
+    this.futures = checkNotNull(futures);
+    this.allMustSucceed = allMustSucceed;
+    this.collectsValues = collectsValues;
+  }
 
   @Override
   protected final void afterDone() {
     super.afterDone();
-    RunningState localRunningState = runningState;
-    if (localRunningState != null) {
-      // Let go of the memory held by the running state
-      this.runningState = null;
-      ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures =
-          localRunningState.futures;
+
+    ImmutableCollection<? extends Future<?>> localFutures = futures;
+    releaseResources(OUTPUT_FUTURE_DONE); // nulls out `futures`
+
+    if (isCancelled() & localFutures != null) {
       boolean wasInterrupted = wasInterrupted();
-
-      if (wasInterrupted) {
-        localRunningState.interruptTask();
-      }
-
-      if (isCancelled() & futures != null) {
-        for (ListenableFuture<?> future : futures) {
-          future.cancel(wasInterrupted);
-        }
+      for (Future<?> future : localFutures) {
+        future.cancel(wasInterrupted);
       }
     }
+    /*
+     * We don't call clearSeenExceptions() until processCompleted(). Prior to that, it may be needed
+     * again if some outstanding input fails.
+     */
   }
 
   @Override
-  protected String pendingToString() {
-    RunningState localRunningState = runningState;
-    if (localRunningState == null) {
-      return null;
-    }
-    ImmutableCollection<? extends ListenableFuture<? extends InputT>> localFutures =
-        localRunningState.futures;
+  protected final String pendingToString() {
+    ImmutableCollection<? extends Future<?>> localFutures = futures;
     if (localFutures != null) {
-      return "futures=[" + localFutures + "]";
+      return "futures=" + localFutures;
     }
-    return null;
+    return super.pendingToString();
   }
 
-  /** Must be called at the end of each sub-class's constructor. */
-  final void init(RunningState runningState) {
-    this.runningState = runningState;
-    runningState.init();
-  }
-
-  abstract class RunningState extends AggregateFutureState implements Runnable {
-    private ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
-    private final boolean allMustSucceed;
-    private final boolean collectsValues;
-
-    RunningState(
-        ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures,
-        boolean allMustSucceed,
-        boolean collectsValues) {
-      super(futures.size());
-      this.futures = checkNotNull(futures);
-      this.allMustSucceed = allMustSucceed;
-      this.collectsValues = collectsValues;
-    }
-
-    /* Used in the !allMustSucceed case so we don't have to instantiate a listener. */
-    @Override
-    public final void run() {
-      decrementCountAndMaybeComplete();
-    }
-
-    /**
-     * The "real" initialization; we can't put this in the constructor because, in the case where
-     * futures are already complete, we would not initialize the subclass before calling {@link
-     * #handleOneInputDone}. As this is called after the subclass is constructed, we're guaranteed
-     * to have properly initialized the subclass.
-     */
-    private void init() {
-      // Corner case: List is empty.
-      if (futures.isEmpty()) {
-        handleAllCompleted();
-        return;
-      }
-
-      // NOTE: If we ever want to use a custom executor here, have a look at CombinedFuture as we'll
-      // need to handle RejectedExecutionException
-
-      if (allMustSucceed) {
-        // We need fail fast, so we have to keep track of which future failed so we can propagate
-        // the exception immediately
-
-        // Register a listener on each Future in the list to update the state of this future.
-        // Note that if all the futures on the list are done prior to completing this loop, the last
-        // call to addListener() will callback to setOneValue(), transitively call our cleanup
-        // listener, and set this.futures to null.
-        // This is not actually a problem, since the foreach only needs this.futures to be non-null
-        // at the beginning of the loop.
-        int i = 0;
-        for (final ListenableFuture<? extends InputT> listenable : futures) {
-          final int index = i++;
-          listenable.addListener(
-              new Runnable() {
-                @Override
-                public void run() {
-                  try {
-                    handleOneInputDone(index, listenable);
-                  } finally {
-                    decrementCountAndMaybeComplete();
-                  }
-                }
-              },
-              directExecutor());
-        }
-      } else {
-        // We'll only call the callback when all futures complete, regardless of whether some failed
-        // Hold off on calling setOneValue until all complete, so we can share the same listener
-        for (ListenableFuture<? extends InputT> listenable : futures) {
-          listenable.addListener(this, directExecutor());
-        }
-      }
-    }
-
-    /**
-     * Fails this future with the given Throwable if {@link #allMustSucceed} is true. Also, logs the
-     * throwable if it is an {@link Error} or if {@link #allMustSucceed} is {@code true}, the
-     * throwable did not cause this future to fail, and it is the first time we've seen that
-     * particular Throwable.
-     */
-    private void handleException(Throwable throwable) {
-      checkNotNull(throwable);
-
-      boolean completedWithFailure = false;
-      boolean firstTimeSeeingThisException = true;
-      if (allMustSucceed) {
-        // As soon as the first one fails, throw the exception up.
-        // The result of all other inputs is then ignored.
-        completedWithFailure = setException(throwable);
-        if (completedWithFailure) {
-          releaseResourcesAfterFailure();
-        } else {
-          // Go up the causal chain to see if we've already seen this cause; if we have, even if
-          // it's wrapped by a different exception, don't log it.
-          firstTimeSeeingThisException = addCausalChain(getOrInitSeenExceptions(), throwable);
-        }
-      }
-
-      // | and & used because it's faster than the branch required for || and &&
-      if (throwable instanceof Error
-          | (allMustSucceed & !completedWithFailure & firstTimeSeeingThisException)) {
-        String message =
-            (throwable instanceof Error)
-                ? "Input Future failed with Error"
-                : "Got more than one input Future failure. Logging failures after the first";
-        logger.log(Level.SEVERE, message, throwable);
-      }
-    }
-
-    @Override
-    final void addInitialException(Set<Throwable> seen) {
-      if (!isCancelled()) {
-        // TODO(cpovirk): Think about whether we could/should use Verify to check this.
-        boolean unused = addCausalChain(seen, tryInternalFastPathGetFailure());
-      }
-    }
-
-    /** Handles the input at the given index completing. */
-    private void handleOneInputDone(int index, Future<? extends InputT> future) {
-      // The only cases in which this Future should already be done are (a) if it was cancelled or
-      // (b) if an input failed and we propagated that immediately because of allMustSucceed.
-      checkState(
-          allMustSucceed || !isDone() || isCancelled(),
-          "Future was done before all dependencies completed");
-
-      try {
-        checkState(future.isDone(), "Tried to set value from future which is not done");
-        if (allMustSucceed) {
-          if (future.isCancelled()) {
-            // clear running state prior to cancelling children, this sets our own state but lets
-            // the input futures keep running as some of them may be used elsewhere.
-            runningState = null;
-            cancel(false);
-          } else {
-            // We always get the result so that we can have fail-fast, even if we don't collect
-            InputT result = getDone(future);
-            if (collectsValues) {
-              collectOneValue(allMustSucceed, index, result);
-            }
-          }
-        } else if (collectsValues && !future.isCancelled()) {
-          collectOneValue(allMustSucceed, index, getDone(future));
-        }
-      } catch (ExecutionException e) {
-        handleException(e.getCause());
-      } catch (Throwable t) {
-        handleException(t);
-      }
-    }
-
-    private void decrementCountAndMaybeComplete() {
-      int newRemaining = decrementRemainingAndGet();
-      checkState(newRemaining >= 0, "Less than 0 remaining futures");
-      if (newRemaining == 0) {
-        processCompleted();
-      }
-    }
-
-    private void processCompleted() {
-      // Collect the values if (a) our output requires collecting them and (b) we haven't been
-      // collecting them as we go. (We've collected them as we go only if we needed to fail fast)
-      if (collectsValues & !allMustSucceed) {
-        int i = 0;
-        for (ListenableFuture<? extends InputT> listenable : futures) {
-          handleOneInputDone(i++, listenable);
-        }
-      }
+  /**
+   * Must be called at the end of each subclass's constructor. This method performs the "real"
+   * initialization; we can't put this in the constructor because, in the case where futures are
+   * already complete, we would not initialize the subclass before calling {@link
+   * #collectValueFromNonCancelledFuture}. As this is called after the subclass is constructed,
+   * we're guaranteed to have properly initialized the subclass.
+   */
+  final void init() {
+    // Corner case: List is empty.
+    if (futures.isEmpty()) {
       handleAllCompleted();
+      return;
     }
 
-    /**
-     * Listeners implicitly keep a reference to {@link RunningState} as they're inner classes, so we
-     * free resources here as well for the allMustSucceed=true case (i.e. when a future fails, we
-     * immediately release resources we no longer need); additionally, the future will release its
-     * reference to {@link RunningState}, which should free all associated memory when all the
-     * futures complete and the listeners are released.
-     *
-     * <p>TODO(user): Write tests for memory retention
-     */
-    @ForOverride
-    @OverridingMethodsMustInvokeSuper
-    void releaseResourcesAfterFailure() {
-      this.futures = null;
+    // NOTE: If we ever want to use a custom executor here, have a look at CombinedFuture as we'll
+    // need to handle RejectedExecutionException
+
+    if (allMustSucceed) {
+      // We need fail fast, so we have to keep track of which future failed so we can propagate
+      // the exception immediately
+
+      // Register a listener on each Future in the list to update the state of this future.
+      // Note that if all the futures on the list are done prior to completing this loop, the last
+      // call to addListener() will callback to setOneValue(), transitively call our cleanup
+      // listener, and set this.futures to null.
+      // This is not actually a problem, since the foreach only needs this.futures to be non-null
+      // at the beginning of the loop.
+      int i = 0;
+      for (final ListenableFuture<? extends InputT> future : futures) {
+        final int index = i++;
+        future.addListener(
+            new Runnable() {
+              @Override
+              public void run() {
+                try {
+                  if (future.isCancelled()) {
+                    // Clear futures prior to cancelling children. This sets our own state but lets
+                    // the input futures keep running, as some of them may be used elsewhere.
+                    futures = null;
+                    cancel(false);
+                  } else {
+                    collectValueFromNonCancelledFuture(index, future);
+                  }
+                } finally {
+                  /*
+                   * "null" means: There is no need to access `futures` again during
+                   * `processCompleted` because we're reading each value during a call to
+                   * handleOneInputDone.
+                   */
+                  decrementCountAndMaybeComplete(null);
+                }
+              }
+            },
+            directExecutor());
+      }
+    } else {
+      /*
+       * We'll call the user callback or collect the values only when all inputs complete,
+       * regardless of whether some failed. This lets us avoid calling expensive methods like
+       * Future.get() when we don't need to (specifically, for whenAllComplete().call*()), and it
+       * lets all futures share the same listener.
+       *
+       * We store `localFutures` inside the listener because `this.futures` might be nulled out by
+       * the time the listener runs for the final future -- at which point we need to check all
+       * inputs for exceptions *if* we're collecting values. If we're not, then the listener doesn't
+       * need access to the futures again, so we can just pass `null`.
+       *
+       * TODO(b/112550045): Allocating a single, cheaper listener is (I think) only an optimization.
+       * If we make some other optimizations, this one will no longer be necessary. The optimization
+       * could actually hurt in some cases, as it forces us to keep all inputs in memory until the
+       * final input completes.
+       */
+      final ImmutableCollection<? extends Future<? extends InputT>> localFutures =
+          collectsValues ? futures : null;
+      Runnable listener =
+          new Runnable() {
+            @Override
+            public void run() {
+              decrementCountAndMaybeComplete(localFutures);
+            }
+          };
+      for (ListenableFuture<? extends InputT> future : futures) {
+        future.addListener(listener, directExecutor());
+      }
     }
-
-    /**
-     * Called only if {@code collectsValues} is true.
-     *
-     * <p>If {@code allMustSucceed} is true, called as each future completes; otherwise, called for
-     * each future when all futures complete.
-     */
-    abstract void collectOneValue(boolean allMustSucceed, int index, @Nullable InputT returnValue);
-
-    abstract void handleAllCompleted();
-
-    void interruptTask() {}
   }
 
+  /**
+   * Fails this future with the given Throwable if {@link #allMustSucceed} is true. Also, logs the
+   * throwable if it is an {@link Error} or if {@link #allMustSucceed} is {@code true}, the
+   * throwable did not cause this future to fail, and it is the first time we've seen that
+   * particular Throwable.
+   */
+  private void handleException(Throwable throwable) {
+    checkNotNull(throwable);
+
+    if (allMustSucceed) {
+      // As soon as the first one fails, make that failure the result of the output future.
+      // The results of all other inputs are then ignored (except for logging any failures).
+      boolean completedWithFailure = setException(throwable);
+      if (!completedWithFailure) {
+        // Go up the causal chain to see if we've already seen this cause; if we have, even if
+        // it's wrapped by a different exception, don't log it.
+        boolean firstTimeSeeingThisException = addCausalChain(getOrInitSeenExceptions(), throwable);
+        if (firstTimeSeeingThisException) {
+          log(throwable);
+          return;
+        }
+      }
+    }
+
+    /*
+     * TODO(cpovirk): Should whenAllComplete().call*() log errors, too? Currently, it doesn't call
+     * handleException() at all.
+     */
+    if (throwable instanceof Error) {
+      /*
+       * TODO(cpovirk): Do we really want to log this if we called setException(throwable) and it
+       * returned true? This was intentional (CL 46470009), but it seems odd compared to how we
+       * normally handle Error.
+       *
+       * Similarly, do we really want to log the same Error more than once?
+       */
+      log(throwable);
+    }
+  }
+
+  private static void log(Throwable throwable) {
+    String message =
+        (throwable instanceof Error)
+            ? "Input Future failed with Error"
+            : "Got more than one input Future failure. Logging failures after the first";
+    logger.log(SEVERE, message, throwable);
+  }
+
+  @Override
+  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());
+    }
+  }
+
+  /**
+   * Collects the result (success or failure) of one input future. The input must not have been
+   * cancelled. For details on when this is called, see {@link #collectOneValue}.
+   */
+  private void collectValueFromNonCancelledFuture(int index, Future<? extends InputT> future) {
+    try {
+      // We get the result, even if collectOneValue is a no-op, so that we can fail fast.
+      collectOneValue(index, getDone(future));
+    } catch (ExecutionException e) {
+      handleException(e.getCause());
+    } catch (Throwable t) {
+      handleException(t);
+    }
+  }
+
+  private void decrementCountAndMaybeComplete(
+      @Nullable
+          ImmutableCollection<? extends Future<? extends InputT>>
+              futuresIfNeedToCollectAtCompletion) {
+    int newRemaining = decrementRemainingAndGet();
+    checkState(newRemaining >= 0, "Less than 0 remaining futures");
+    if (newRemaining == 0) {
+      processCompleted(futuresIfNeedToCollectAtCompletion);
+    }
+  }
+
+  private void processCompleted(
+      @Nullable
+          ImmutableCollection<? extends Future<? extends InputT>>
+              futuresIfNeedToCollectAtCompletion) {
+    if (futuresIfNeedToCollectAtCompletion != null) {
+      int i = 0;
+      for (Future<? extends InputT> future : futuresIfNeedToCollectAtCompletion) {
+        if (!future.isCancelled()) {
+          collectValueFromNonCancelledFuture(i, future);
+        }
+        i++;
+      }
+    }
+    clearSeenExceptions();
+    handleAllCompleted();
+    /*
+     * Null out fields, including some used in handleAllCompleted() above (like
+     * `CollectionFuture.values`). This might be a no-op: If this future completed during
+     * handleAllCompleted(), they will already have been nulled out. But in the case of
+     * whenAll*().call*(), this future may be pending until the callback runs -- or even longer in
+     * the case of callAsync(), which waits for the callback's returned future to complete.
+     */
+    releaseResources(ALL_INPUT_FUTURES_PROCESSED);
+  }
+
+  /**
+   * Clears fields that are no longer needed after this future has completed -- or at least all its
+   * inputs have completed (more precisely, after {@link #handleAllCompleted()} has been called).
+   * Often called multiple times (that is, both when the inputs complete and when the output
+   * completes).
+   *
+   * <p>This is similar to our proposed {@code afterCommit} method but not quite the same. See the
+   * description of CL 265462958.
+   */
+  // TODO(user): Write more tests for memory retention.
+  @ForOverride
+  @OverridingMethodsMustInvokeSuper
+  void releaseResources(ReleaseResourcesReason reason) {
+    checkNotNull(reason);
+    /*
+     * All elements of `futures` are completed, or this future has already completed and read
+     * `futures` into a local variable (in preparation for propagating cancellation to them). In
+     * either case, no one needs to read `futures` for cancellation purposes later. (And
+     * cancellation purposes are the main reason to access `futures`, as discussed in its docs.)
+     */
+    this.futures = null;
+  }
+
+  enum ReleaseResourcesReason {
+    OUTPUT_FUTURE_DONE,
+    ALL_INPUT_FUTURES_PROCESSED,
+  }
+
+  /**
+   * 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 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) {
     for (; t != null; t = t.getCause()) {
diff --git a/guava/src/com/google/common/util/concurrent/AggregateFutureState.java b/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
index 040d813..f8398d8 100644
--- a/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
+++ b/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
@@ -37,9 +37,9 @@
  */
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
-abstract class AggregateFutureState {
+abstract class AggregateFutureState<OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
   // Lazily initialized the first time we see an exception; not released until all the input futures
-  // & this future completes. Released when the future releases the reference to the running state
+  // have completed and we have processed them all.
   private volatile Set<Throwable> seenExceptions = null;
 
   private volatile int remaining;
@@ -89,12 +89,27 @@
      * Thread2: calls setException(), which returns false, CASes seenExceptions to its exception,
      * and wrongly believes that its exception is new (leading it to logging it when it shouldn't)
      *
-     * Our solution is for threads to CAS seenExceptions from null to a Set population with _the
+     * Our solution is for threads to CAS seenExceptions from null to a Set populated with _the
      * initial exception_, no matter which thread does the work. This ensures that seenExceptions
      * always contains not just the current thread's exception but also the initial thread's.
      */
     Set<Throwable> seenExceptionsLocal = seenExceptions;
     if (seenExceptionsLocal == null) {
+      // TODO(cpovirk): Should we use a simpler (presumably cheaper) data structure?
+      /*
+       * Using weak references here could let us release exceptions earlier, but:
+       *
+       * 1. On Android, querying a WeakReference blocks if the GC is doing an otherwise-concurrent
+       * pass.
+       *
+       * 2. We would probably choose to compare exceptions using == instead of equals() (for
+       * consistency with how weak references are cleared). That's a behavior change -- arguably the
+       * removal of a feature.
+       *
+       * Fortunately, exceptions rarely contain references to expensive resources.
+       */
+
+      //
       seenExceptionsLocal = newConcurrentHashSet();
       /*
        * Other handleException() callers may see this as soon as we publish it. We need to populate
@@ -122,6 +137,10 @@
     return ATOMIC_HELPER.decrementAndGetRemainingCount(this);
   }
 
+  final void clearSeenExceptions() {
+    seenExceptions = null;
+  }
+
   private abstract static class AtomicHelper {
     /** Atomic compare-and-set of the {@link AggregateFutureState#seenExceptions} field. */
     abstract void compareAndSetSeenExceptions(
@@ -169,8 +188,7 @@
     @Override
     int decrementAndGetRemainingCount(AggregateFutureState state) {
       synchronized (state) {
-        state.remaining--;
-        return state.remaining;
+        return --state.remaining;
       }
     }
   }
diff --git a/guava/src/com/google/common/util/concurrent/AtomicDouble.java b/guava/src/com/google/common/util/concurrent/AtomicDouble.java
index 42d6656..8f881dd 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicDouble.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicDouble.java
@@ -29,7 +29,7 @@
  * cannot be used as a replacement for a {@link Double}. However, this class does extend {@code
  * Number} to allow uniform access by tools and utilities that deal with numerically-based classes.
  *
- * <p><a name="bitEquals"></a>This class compares primitive {@code double} values in methods such as
+ * <p><a id="bitEquals"></a>This class compares primitive {@code double} values in methods such as
  * {@link #compareAndSet} by comparing their bitwise representation using {@link
  * Double#doubleToRawLongBits}, which differs from both the primitive double {@code ==} operator and
  * from {@link Double#equals}, as if implemented by:
@@ -44,10 +44,8 @@
  *
  * <p>It is possible to write a more scalable updater, at the cost of giving up strict atomicity.
  * See for example <a
- * href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/DoubleAdder.html">
- * DoubleAdder</a> and <a
- * href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/DoubleMaxUpdater.html">
- * DoubleMaxUpdater</a>.
+ * href="http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java.base/java/util/concurrent/atomic/DoubleAdder.html">
+ * DoubleAdder</a>.
  *
  * @author Doug Lea
  * @author Martin Buchholz
diff --git a/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java b/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
index c583957..5c4baa1 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
@@ -26,7 +26,7 @@
  * java.util.concurrent.atomic} package specification for description of the properties of atomic
  * variables.
  *
- * <p><a name="bitEquals"></a>This class compares primitive {@code double} values in methods such as
+ * <p><a id="bitEquals"></a>This class compares primitive {@code double} values in methods such as
  * {@link #compareAndSet} by comparing their bitwise representation using {@link
  * Double#doubleToRawLongBits}, which differs from both the primitive double {@code ==} operator and
  * from {@link Double#equals}, as if implemented by:
diff --git a/guava/src/com/google/common/util/concurrent/AtomicLongMap.java b/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
index b466c85..b80ef2e 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.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A map containing {@code long} values that can be atomically updated. While writes to a
@@ -262,7 +262,7 @@
     return map.values().stream().mapToLong(Long::longValue).sum();
   }
 
-  private transient @MonotonicNonNull Map<K, Long> asMap;
+  private transient @Nullable 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/Callables.java b/guava/src/com/google/common/util/concurrent/Callables.java
index e470afa..747ffa7 100644
--- a/guava/src/com/google/common/util/concurrent/Callables.java
+++ b/guava/src/com/google/common/util/concurrent/Callables.java
@@ -129,9 +129,10 @@
   /** Tries to set name of the given {@link Thread}, returns true if successful. */
   @GwtIncompatible // threads
   private static boolean trySetName(final String threadName, Thread currentThread) {
-    // In AppEngine, this will always fail. Should we test for that explicitly using
-    // MoreExecutors.isAppEngine? More generally, is there a way to see if we have the modifyThread
-    // permission without catching an exception?
+    /*
+     * setName should usually succeed, but the security manager can prohibit it. Is there a way to
+     * see if we have the modifyThread permission without catching an exception?
+     */
     try {
       currentThread.setName(threadName);
       return true;
diff --git a/guava/src/com/google/common/util/concurrent/CheckedFuture.java b/guava/src/com/google/common/util/concurrent/CheckedFuture.java
deleted file mode 100644
index b39a670..0000000
--- a/guava/src/com/google/common/util/concurrent/CheckedFuture.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.util.concurrent;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.GwtCompatible;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A {@code CheckedFuture} is a {@link ListenableFuture} that includes versions of the {@code get}
- * methods that can throw a checked exception. This makes it easier to create a future that executes
- * logic which can throw an exception.
- *
- * <p><b>Warning:</b> We recommend against using {@code CheckedFuture} in new projects. {@code
- * CheckedFuture} is difficult to build libraries atop. {@code CheckedFuture} ports of methods like
- * {@link Futures#transformAsync} have historically had bugs, and some of these bugs are necessary,
- * unavoidable consequences of the {@code CheckedFuture} API. Additionally, {@code CheckedFuture}
- * encourages users to take exceptions from one thread and rethrow them in another, producing
- * confusing stack traces.
- *
- * <p>A common implementation is {@link Futures#immediateCheckedFuture}.
- *
- * <p>Implementations of this interface must adapt the exceptions thrown by {@code Future#get()}:
- * {@link CancellationException}, {@link ExecutionException} and {@link InterruptedException} into
- * the type specified by the {@code X} type parameter.
- *
- * <p>This interface also extends the ListenableFuture interface to allow listeners to be added.
- * This allows the future to be used as a normal {@link Future} or as an asynchronous callback
- * mechanism as needed. This allows multiple callbacks to be registered for a particular task, and
- * the future will guarantee execution of all listeners when the task completes.
- *
- * <p>For a simpler alternative to CheckedFuture, consider accessing Future values with {@link
- * Futures#getChecked(Future, Class) Futures.getChecked()}.
- *
- * @author Sven Mawson
- * @since 1.0
- * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
- *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
- *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
- *     Additionally, it has a surprising policy about which exceptions to map and which to leave
- *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
- *     use, possibly specializing them to the particular exception type they use. We recommend that
- *     most people use {@code ListenableFuture} and perform any exception wrapping themselves. This
- *     class is scheduled for removal from Guava in January 2019.
- */
-// TODO(b/72241575): Remove by 2019-01
-@Beta
-@CanIgnoreReturnValue
-@Deprecated
-@GwtCompatible
-public interface CheckedFuture<V, X extends Exception> extends ListenableFuture<V> {
-
-  /**
-   * Exception checking version of {@link Future#get()} that will translate {@link
-   * InterruptedException}, {@link CancellationException} and {@link ExecutionException} into
-   * application-specific exceptions.
-   *
-   * @return the result of executing the future.
-   * @throws X on interruption, cancellation or execution exceptions.
-   */
-  V checkedGet() throws X;
-
-  /**
-   * Exception checking version of {@link Future#get(long, TimeUnit)} that will translate {@link
-   * InterruptedException}, {@link CancellationException} and {@link ExecutionException} into
-   * application-specific exceptions. On timeout this method throws a normal {@link
-   * TimeoutException}.
-   *
-   * @return the result of executing the future.
-   * @throws TimeoutException if retrieving the result timed out.
-   * @throws X on interruption, cancellation or execution exceptions.
-   */
-  V checkedGet(long timeout, TimeUnit unit) throws TimeoutException, X;
-}
diff --git a/guava/src/com/google/common/util/concurrent/ClosingFuture.java b/guava/src/com/google/common/util/concurrent/ClosingFuture.java
new file mode 100644
index 0000000..d4c9265
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/ClosingFuture.java
@@ -0,0 +1,2196 @@
+/*
+ * Copyright (C) 2017 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 com.google.common.base.Functions.constant;
+import static com.google.common.base.MoreObjects.toStringHelper;
+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.Lists.asList;
+import static com.google.common.util.concurrent.ClosingFuture.State.CLOSED;
+import static com.google.common.util.concurrent.ClosingFuture.State.CLOSING;
+import static com.google.common.util.concurrent.ClosingFuture.State.OPEN;
+import static com.google.common.util.concurrent.ClosingFuture.State.SUBSUMED;
+import static com.google.common.util.concurrent.ClosingFuture.State.WILL_CLOSE;
+import static com.google.common.util.concurrent.ClosingFuture.State.WILL_CREATE_VALUE_AND_CLOSER;
+import static com.google.common.util.concurrent.Futures.getDone;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static com.google.common.util.concurrent.Futures.nonCancellationPropagating;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.logging.Level.FINER;
+import static java.util.logging.Level.SEVERE;
+import static java.util.logging.Level.WARNING;
+
+import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.AsyncCombiningCallable;
+import com.google.common.util.concurrent.ClosingFuture.Combiner.CombiningCallable;
+import com.google.common.util.concurrent.Futures.FutureCombiner;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
+import com.google.j2objc.annotations.RetainedWith;
+import java.io.Closeable;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Logger;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/**
+ * A step in a pipeline of an asynchronous computation. When the last step in the computation is
+ * complete, some objects captured during the computation are closed.
+ *
+ * <p>A pipeline of {@code ClosingFuture}s is a tree of steps. Each step represents either an
+ * asynchronously-computed intermediate value, or else an exception that indicates the failure or
+ * cancellation of the operation so far. The only way to extract the value or exception from a step
+ * is by declaring that step to be the last step of the pipeline. Nevertheless, we refer to the
+ * "value" of a successful step or the "result" (value or exception) of any step.
+ *
+ * <ol>
+ *   <li>A pipeline starts at its leaf step (or steps), which is created from either a callable
+ *       block or a {@link ListenableFuture}.
+ *   <li>Each other step is derived from one or more input steps. At each step, zero or more objects
+ *       can be captured for later closing.
+ *   <li>There is one last step (the root of the tree), from which you can extract the final result
+ *       of the computation. After that result is available (or the computation fails), all objects
+ *       captured by any of the steps in the pipeline are closed.
+ * </ol>
+ *
+ * <h3>Starting a pipeline</h3>
+ *
+ * Start a {@code ClosingFuture} pipeline {@linkplain #submit(ClosingCallable, Executor) from a
+ * callable block} that may capture objects for later closing. To start a pipeline from a {@link
+ * ListenableFuture} that doesn't create resources that should be closed later, you can use {@link
+ * #from(ListenableFuture)} instead.
+ *
+ * <h3>Derived steps</h3>
+ *
+ * A {@code ClosingFuture} step can be derived from one or more input {@code ClosingFuture} steps in
+ * ways similar to {@link FluentFuture}s:
+ *
+ * <ul>
+ *   <li>by transforming the value from a successful input step,
+ *   <li>by catching the exception from a failed input step, or
+ *   <li>by combining the results of several input steps.
+ * </ul>
+ *
+ * Each derivation can capture the next value or any intermediate objects for later closing.
+ *
+ * <p>A step can be the input to at most one derived step. Once you transform its value, catch its
+ * exception, or combine it with others, you cannot do anything else with it, including declare it
+ * to be the last step of the pipeline.
+ *
+ * <h4>Transforming</h4>
+ *
+ * To derive the next step by asynchronously applying a function to an input step's value, call
+ * {@link #transform(ClosingFunction, Executor)} or {@link #transformAsync(AsyncClosingFunction,
+ * Executor)} on the input step.
+ *
+ * <h4>Catching</h4>
+ *
+ * To derive the next step from a failed input step, call {@link #catching(Class, ClosingFunction,
+ * Executor)} or {@link #catchingAsync(Class, AsyncClosingFunction, Executor)} on the input step.
+ *
+ * <h4>Combining</h4>
+ *
+ * To derive a {@code ClosingFuture} from two or more input steps, pass the input steps to {@link
+ * #whenAllComplete(Iterable)} or {@link #whenAllSucceed(Iterable)} or its overloads.
+ *
+ * <h3>Cancelling</h3>
+ *
+ * Any step in a pipeline can be {@linkplain #cancel(boolean) cancelled}, even after another step
+ * has been derived, with the same semantics as cancelling a {@link Future}. In addition, a
+ * successfully cancelled step will immediately start closing all objects captured for later closing
+ * by it and by its input steps.
+ *
+ * <h3>Ending a pipeline</h3>
+ *
+ * Each {@code ClosingFuture} pipeline must be ended. To end a pipeline, decide whether you want to
+ * close the captured objects automatically or manually.
+ *
+ * <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.
+ *
+ * <pre>{@code
+ * FluentFuture<UserName> userName =
+ *     ClosingFuture.submit(
+ *             closer -> closer.eventuallyClose(database.newTransaction(), closingExecutor),
+ *             executor)
+ *         .transformAsync((closer, transaction) -> transaction.queryClosingFuture("..."), executor)
+ *         .transform((closer, result) -> result.get("userName"), directExecutor())
+ *         .catching(DBException.class, e -> "no user", directExecutor())
+ *         .finishToFuture();
+ * }</pre>
+ *
+ * In this example, when the {@code userName} {@link Future} is done, the transaction and the query
+ * result cursor will both be closed, even if the operation is cancelled or fails.
+ *
+ * <h4>Manually closing</h4>
+ *
+ * If you want to close the captured objects manually, after you've used the final result, call
+ * {@link #finishToValueAndCloser(ValueAndCloserConsumer, Executor)} to get an object that holds the
+ * final result. You then call {@link ValueAndCloser#closeAsync()} to close the captured objects.
+ *
+ * <pre>{@code
+ *     ClosingFuture.submit(
+ *             closer -> closer.eventuallyClose(database.newTransaction(), closingExecutor),
+ *             executor)
+ *     .transformAsync((closer, transaction) -> transaction.queryClosingFuture("..."), executor)
+ *     .transform((closer, result) -> result.get("userName"), directExecutor())
+ *     .catching(DBException.class, e -> "no user", directExecutor())
+ *     .finishToValueAndCloser(
+ *         valueAndCloser -> this.userNameValueAndCloser = valueAndCloser, executor);
+ *
+ * // later
+ * try { // get() will throw if the operation failed or was cancelled.
+ *   UserName userName = userNameValueAndCloser.get();
+ *   // do something with userName
+ * } finally {
+ *   userNameValueAndCloser.closeAsync();
+ * }
+ * }</pre>
+ *
+ * In this example, when {@code userNameValueAndCloser.closeAsync()} is called, the transaction and
+ * the query result cursor will both be closed, even if the operation is cancelled or fails.
+ *
+ * <p>Note that if you don't call {@code closeAsync()}, the captured objects will not be closed. The
+ * automatic-closing approach described above is safer.
+ *
+ * @param <V> the type of the value of this step
+ * @since 30.0
+ */
+// TODO(dpb): Consider reusing one CloseableList for the entire pipeline, modulo combinations.
+@Beta // @Beta for one release.
+@DoNotMock("Use ClosingFuture.from(Futures.immediate*Future)")
+// TODO(dpb): GWT compatibility.
+public final class ClosingFuture<V> {
+
+  private static final Logger logger = Logger.getLogger(ClosingFuture.class.getName());
+
+  /**
+   * An object that can capture objects to be closed later, when a {@link ClosingFuture} pipeline is
+   * done.
+   */
+  public static final class DeferredCloser {
+    @RetainedWith private final CloseableList list;
+
+    DeferredCloser(CloseableList list) {
+      this.list = list;
+    }
+
+    /**
+     * Captures an object to be closed when a {@link ClosingFuture} pipeline is done.
+     *
+     * <p>For users of the {@code -jre} flavor of Guava, the object can be any {@code
+     * AutoCloseable}. For users of the {@code -android} flavor, the object must be a {@code
+     * Closeable}. (For more about the flavors, see <a
+     * href="https://github.com/google/guava#adding-guava-to-your-build">Adding Guava to your
+     * build</a>.)
+     *
+     * <p>Be careful when targeting an older SDK than you are building against (most commonly when
+     * building for Android): Ensure that any object you pass implements the interface not just in
+     * your current SDK version but also at the oldest version you support. For example, <a
+     * href="https://developer.android.com/sdk/api_diff/16/">API Level 16</a> is the first version
+     * in which {@code Cursor} is {@code Closeable}. To support older versions, pass a wrapper
+     * {@code Closeable} with a method reference like {@code cursor::close}.
+     *
+     * <p>Note that this method is still binary-compatible between flavors because the erasure of
+     * its parameter type is {@code Object}, not {@code AutoCloseable} or {@code Closeable}.
+     *
+     * @param closeable the object to be closed (see notes above)
+     * @param closingExecutor the object will be closed on this executor
+     * @return the first argument
+     */
+    @CanIgnoreReturnValue
+    public <C extends @Nullable Object & @Nullable AutoCloseable> C eventuallyClose(
+        C closeable, Executor closingExecutor) {
+      checkNotNull(closingExecutor);
+      if (closeable != null) {
+        list.add(closeable, closingExecutor);
+      }
+      return closeable;
+    }
+  }
+
+  /**
+   * An operation that computes a result.
+   *
+   * @param <V> the type of the result
+   */
+  @FunctionalInterface
+  public interface ClosingCallable<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.
+     */
+    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
+   */
+  @FunctionalInterface
+  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.
+     *
+     * <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.
+     */
+    U apply(DeferredCloser closer, T input) throws Exception;
+  }
+
+  /**
+   * A function from an input to a {@link ClosingFuture} of a result.
+   *
+   * @param <T> the type of the input to the function
+   * @param <U> the type of the result of the function
+   */
+  @FunctionalInterface
+  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.
+     *
+     * <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<U> apply(DeferredCloser closer, T input) throws Exception;
+  }
+
+  /**
+   * An object that holds the final result of an asynchronous {@link ClosingFuture} operation and
+   * allows the user to close all the closeable objects that were captured during it for later
+   * closing.
+   *
+   * <p>The asynchronous operation will have completed before this object is created.
+   *
+   * @param <V> the type of the value of a successful operation
+   * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
+   */
+  public static final class ValueAndCloser<V> {
+
+    private final ClosingFuture<? extends V> closingFuture;
+
+    ValueAndCloser(ClosingFuture<? extends V> closingFuture) {
+      this.closingFuture = checkNotNull(closingFuture);
+    }
+
+    /**
+     * Returns the final value of the associated {@link ClosingFuture}, or throws an exception as
+     * {@link Future#get()} would.
+     *
+     * <p>Because the asynchronous operation has already completed, this method is synchronous and
+     * returns immediately.
+     *
+     * @throws CancellationException if the computation was cancelled
+     * @throws ExecutionException if the computation threw an exception
+     */
+    @Nullable
+    public V get() throws ExecutionException {
+      return getDone(closingFuture.future);
+    }
+
+    /**
+     * Starts closing all closeable objects captured during the {@link ClosingFuture}'s asynchronous
+     * operation on the {@link Executor}s specified by calls to {@link
+     * DeferredCloser#eventuallyClose(Closeable, Executor)}.
+     *
+     * <p>If any such calls specified {@link MoreExecutors#directExecutor()}, those objects will be
+     * closed synchronously.
+     *
+     * <p>Idempotent: objects will be closed at most once.
+     */
+    public void closeAsync() {
+      closingFuture.close();
+    }
+  }
+
+  /**
+   * Represents an operation that accepts a {@link ValueAndCloser} for the last step in a {@link
+   * ClosingFuture} pipeline.
+   *
+   * @param <V> the type of the final value of a successful pipeline
+   * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
+   */
+  @FunctionalInterface
+  public interface ValueAndCloserConsumer<V> {
+
+    /** Accepts a {@link ValueAndCloser} for the last step in a {@link ClosingFuture} pipeline. */
+    void accept(ValueAndCloser<V> valueAndCloser);
+  }
+
+  /**
+   * 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
+   */
+  public static <V> 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 with a {@link ListenableFuture}.
+   *
+   * <p>{@code future}'s value will not be closed when the pipeline is done even if {@code V}
+   * 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) {
+    return new ClosingFuture<V>(future);
+  }
+
+  /**
+   * Starts a {@link ClosingFuture} pipeline with a {@link ListenableFuture}.
+   *
+   * <p>If {@code future} succeeds, its value will be closed (using {@code closingExecutor)} when
+   * the pipeline is done, even if the pipeline is canceled or fails.
+   *
+   * <p>Cancelling the pipeline will not cancel {@code future}, so that the pipeline can access its
+   * value in order to close it.
+   *
+   * @param future the future to create the {@code ClosingFuture} from. For discussion of the
+   *     future's result type {@code C}, see {@link DeferredCloser#eventuallyClose(Closeable,
+   *     Executor)}.
+   * @param closingExecutor the future's result will be closed on this executor
+   * @deprecated Creating {@link Future}s of closeable types is dangerous in general because the
+   *     underlying value may never be closed if the {@link Future} is canceled after its operation
+   *     begins. Consider replacing code that creates {@link ListenableFuture}s of closeable types,
+   *     including those that pass them to this method, with {@link #submit(ClosingCallable,
+   *     Executor)} in order to ensure that resources do not leak. Or, to start a pipeline with a
+   *     {@link ListenableFuture} that doesn't create values that should be closed, use {@link
+   *     ClosingFuture#from}.
+   */
+  @Deprecated
+  public static <C extends @Nullable Object & @Nullable AutoCloseable>
+      ClosingFuture<C> eventuallyClosing(
+          ListenableFuture<C> future, final Executor closingExecutor) {
+    checkNotNull(closingExecutor);
+    final ClosingFuture<C> closingFuture = new ClosingFuture<>(nonCancellationPropagating(future));
+    Futures.addCallback(
+        future,
+        new FutureCallback<@Nullable AutoCloseable>() {
+          @Override
+          public void onSuccess(@Nullable AutoCloseable result) {
+            closingFuture.closeables.closer.eventuallyClose(result, closingExecutor);
+          }
+
+          @Override
+          public void onFailure(Throwable t) {}
+        },
+        directExecutor());
+    return closingFuture;
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline.
+   *
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
+   *     the {@code futures}, or if any has already been {@linkplain #finishToFuture() finished}
+   */
+  public static Combiner whenAllComplete(Iterable<? extends ClosingFuture<?>> futures) {
+    return new Combiner(false, futures);
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline.
+   *
+   * @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 Combiner whenAllComplete(
+      ClosingFuture<?> future1, ClosingFuture<?>... moreFutures) {
+    return whenAllComplete(asList(future1, moreFutures));
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline, assuming they
+   * all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
+   *     the {@code futures}, or if any has already been {@linkplain #finishToFuture() finished}
+   */
+  public static Combiner whenAllSucceed(Iterable<? extends ClosingFuture<?>> futures) {
+    return new Combiner(true, futures);
+  }
+
+  /**
+   * Starts specifying how to combine two {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner2<>(future1, future2);
+  }
+
+  /**
+   * Starts specifying how to combine three {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner3<>(future1, future2, future3);
+  }
+
+  /**
+   * Starts specifying how to combine four {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner4<>(future1, future2, future3, future4);
+  }
+
+  /**
+   * Starts specifying how to combine five {@link ClosingFuture}s into a single pipeline, assuming
+   * they all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * <p>Calling this method allows you to use lambdas or method references typed with the types of
+   * the input {@link ClosingFuture}s.
+   *
+   * @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) {
+    return new Combiner5<>(future1, future2, future3, future4, future5);
+  }
+
+  /**
+   * Starts specifying how to combine {@link ClosingFuture}s into a single pipeline, assuming they
+   * all succeed. If any fail, the resulting pipeline will fail.
+   *
+   * @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 Combiner whenAllSucceed(
+      ClosingFuture<?> future1,
+      ClosingFuture<?> future2,
+      ClosingFuture<?> future3,
+      ClosingFuture<?> future4,
+      ClosingFuture<?> future5,
+      ClosingFuture<?> future6,
+      ClosingFuture<?>... moreFutures) {
+    return whenAllSucceed(
+        FluentIterable.of(future1, future2, future3, future4, future5, future6)
+            .append(moreFutures));
+  }
+
+  private final AtomicReference<State> state = new AtomicReference<>(OPEN);
+  private final CloseableList closeables = new CloseableList();
+  private final FluentFuture<V> future;
+
+  private ClosingFuture(ListenableFuture<V> future) {
+    this.future = FluentFuture.from(future);
+  }
+
+  private ClosingFuture(final ClosingCallable<V> callable, Executor executor) {
+    checkNotNull(callable);
+    TrustedListenableFutureTask<V> task =
+        TrustedListenableFutureTask.create(
+            new Callable<V>() {
+              @Override
+              public V call() throws Exception {
+                return callable.call(closeables.closer);
+              }
+
+              @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
+   * be thrown by calling {@code finishToFuture().get()} if this were the last step. Calling {@code
+   * cancel()} on the returned future has no effect on the {@code ClosingFuture} pipeline.
+   *
+   * <p>{@code statusFuture} differs from most methods on {@code ClosingFuture}: You can make calls
+   * to {@code statusFuture} <i>in addition to</i> the call you make to {@link #finishToFuture()} or
+   * a derivation method <i>on the same instance</i>. This is important because calling {@code
+   * statusFuture} alone does not provide a way to close the pipeline.
+   */
+  public ListenableFuture<?> statusFuture() {
+    return nonCancellationPropagating(future.transform(constant(null), directExecutor()));
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * to its value. The function can use a {@link DeferredCloser} to capture objects to be closed
+   * when the pipeline is done.
+   *
+   * <p>If this {@code ClosingFuture} fails, the function will not be called, and the derived {@code
+   * ClosingFuture} will be equivalent to this one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}.
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * ClosingFuture<List<Row>> rowsFuture =
+   *     queryFuture.transform((closer, result) -> result.getRows(), executor);
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param function transforms the value of this step to the value of the derived step
+   * @param executor executor to run the function in
+   * @return the derived step
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from this
+   *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
+   *     finished}
+   */
+  public <U> ClosingFuture<U> transform(
+      final ClosingFunction<? super V, U> function, Executor executor) {
+    checkNotNull(function);
+    AsyncFunction<V, U> applyFunction =
+        new AsyncFunction<V, U>() {
+          @Override
+          public ListenableFuture<U> apply(V input) throws Exception {
+            return closeables.applyClosingFunction(function, input);
+          }
+
+          @Override
+          public String toString() {
+            return function.toString();
+          }
+        };
+    // TODO(dpb): Switch to future.transformSync when that exists (passing a throwing function).
+    return derive(future.transformAsync(applyFunction, executor));
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * that returns a {@code ClosingFuture} to its value. The function can use a {@link
+   * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+   * captured by the returned {@link ClosingFuture}).
+   *
+   * <p>If this {@code ClosingFuture} succeeds, the derived one will be equivalent to the one
+   * returned by the function.
+   *
+   * <p>If this {@code ClosingFuture} fails, the function will not be called, and the derived {@code
+   * ClosingFuture} will be equivalent to this one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}. But if the exception is thrown after the function creates a {@code
+   * ClosingFuture}, then none of the closeable objects in that {@code ClosingFuture} will be
+   * closed.
+   *
+   * <p>Usage guidelines for this method:
+   *
+   * <ul>
+   *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+   *       {@code ClosingFuture}. If possible, prefer calling {@link #transform(ClosingFunction,
+   *       Executor)} instead, with a function that returns the next value directly.
+   *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor) closer.eventuallyClose()}
+   *       for every closeable object this step creates in order to capture it for later closing.
+   *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+   *       ClosingFuture} call {@link #from(ListenableFuture)}.
+   *   <li>In case this step doesn't create new closeables, you can adapt an API that returns a
+   *       {@link ListenableFuture} to return a {@code ClosingFuture} by wrapping it with a call to
+   *       {@link #withoutCloser(AsyncFunction)}
+   * </ul>
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * // Result.getRowsClosingFuture() returns a ClosingFuture.
+   * ClosingFuture<List<Row>> rowsFuture =
+   *     queryFuture.transformAsync((closer, result) -> result.getRowsClosingFuture(), executor);
+   *
+   * // Result.writeRowsToOutputStreamFuture() returns a ListenableFuture that resolves to the
+   * // number of written rows. openOutputFile() returns a FileOutputStream (which implements
+   * // Closeable).
+   * ClosingFuture<Integer> rowsFuture2 =
+   *     queryFuture.transformAsync(
+   *         (closer, result) -> {
+   *           FileOutputStream fos = closer.eventuallyClose(openOutputFile(), closingExecutor);
+   *           return ClosingFuture.from(result.writeRowsToOutputStreamFuture(fos));
+   *      },
+   *      executor);
+   *
+   * // Result.getRowsFuture() returns a ListenableFuture (no new closeables are created).
+   * ClosingFuture<List<Row>> rowsFuture3 =
+   *     queryFuture.transformAsync(withoutCloser(Result::getRowsFuture), executor);
+   *
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   * (Specifically, {@code directExecutor} functions should avoid heavyweight operations inside
+   * {@code AsyncClosingFunction.apply}. Any heavyweight operations should occur in other threads
+   * responsible for completing the returned {@code ClosingFuture}.)
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param function transforms the value of this step to a {@code ClosingFuture} with the value of
+   *     the derived step
+   * @param executor executor to run the function in
+   * @return the derived step
+   * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from this
+   *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
+   *     finished}
+   */
+  public <U> ClosingFuture<U> transformAsync(
+      final AsyncClosingFunction<? super V, U> function, Executor executor) {
+    checkNotNull(function);
+    AsyncFunction<V, U> applyFunction =
+        new AsyncFunction<V, U>() {
+          @Override
+          public ListenableFuture<U> apply(V input) throws Exception {
+            return closeables.applyAsyncClosingFunction(function, input);
+          }
+
+          @Override
+          public String toString() {
+            return function.toString();
+          }
+        };
+    return derive(future.transformAsync(applyFunction, executor));
+  }
+
+  /**
+   * Returns an {@link AsyncClosingFunction} that applies an {@link AsyncFunction} to an input,
+   * ignoring the DeferredCloser and returning a {@code ClosingFuture} derived from the returned
+   * {@link ListenableFuture}.
+   *
+   * <p>Use this method to pass a transformation to {@link #transformAsync(AsyncClosingFunction,
+   * Executor)} or to {@link #catchingAsync(Class, AsyncClosingFunction, Executor)} as long as it
+   * meets these conditions:
+   *
+   * <ul>
+   *   <li>It does not need to capture any {@link Closeable} objects by calling {@link
+   *       DeferredCloser#eventuallyClose(Closeable, Executor)}.
+   *   <li>It returns a {@link ListenableFuture}.
+   * </ul>
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * // Result.getRowsFuture() returns a ListenableFuture.
+   * ClosingFuture<List<Row>> rowsFuture =
+   *     queryFuture.transformAsync(withoutCloser(Result::getRowsFuture), executor);
+   * }</pre>
+   *
+   * @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) {
+    checkNotNull(function);
+    return new AsyncClosingFunction<V, U>() {
+      @Override
+      public ClosingFuture<U> apply(DeferredCloser closer, V input) throws Exception {
+        return ClosingFuture.from(function.apply(input));
+      }
+    };
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * to its exception if it is an instance of a given exception type. The function can use a {@link
+   * DeferredCloser} to capture objects to be closed when the pipeline is done.
+   *
+   * <p>If this {@code ClosingFuture} succeeds or fails with a different exception type, the
+   * function will not be called, and the derived {@code ClosingFuture} will be equivalent to this
+   * one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}.
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * ClosingFuture<QueryResult> queryFuture =
+   *     queryFuture.catching(
+   *         QueryException.class, (closer, x) -> Query.emptyQueryResult(), executor);
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
+   *     type is matched against this step's exception. "This step's exception" means the cause of
+   *     the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself. To avoid hiding bugs and other unrecoverable errors, callers should
+   *     prefer more specific types, avoiding {@code Throwable.class} in particular.
+   * @param fallback the function to be called if this step fails with the expected exception type.
+   *     The function's argument is this step's exception. "This step's exception" means the cause
+   *     of the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself.
+   * @param executor the executor that runs {@code fallback} if the input fails
+   */
+  public <X extends Throwable> ClosingFuture<V> catching(
+      Class<X> exceptionType, ClosingFunction<? super X, ? extends V> fallback, Executor executor) {
+    return catchingMoreGeneric(exceptionType, fallback, executor);
+  }
+
+  // Avoids generic type capture inconsistency problems where |? extends V| is incompatible with V.
+  private <X extends Throwable, W extends V> ClosingFuture<V> catchingMoreGeneric(
+      Class<X> exceptionType, final ClosingFunction<? super X, W> fallback, Executor executor) {
+    checkNotNull(fallback);
+    AsyncFunction<X, W> applyFallback =
+        new AsyncFunction<X, W>() {
+          @Override
+          public ListenableFuture<W> apply(X exception) throws Exception {
+            return closeables.applyClosingFunction(fallback, exception);
+          }
+
+          @Override
+          public String toString() {
+            return fallback.toString();
+          }
+        };
+    // TODO(dpb): Switch to future.catchingSync when that exists (passing a throwing function).
+    return derive(future.catchingAsync(exceptionType, applyFallback, executor));
+  }
+
+  /**
+   * Returns a new {@code ClosingFuture} pipeline step derived from this one by applying a function
+   * that returns a {@code ClosingFuture} to its exception if it is an instance of a given exception
+   * type. The function can use a {@link DeferredCloser} to capture objects to be closed when the
+   * pipeline is done (other than those captured by the returned {@link ClosingFuture}).
+   *
+   * <p>If this {@code ClosingFuture} fails with an exception of the given type, the derived {@code
+   * ClosingFuture} will be equivalent to the one returned by the function.
+   *
+   * <p>If this {@code ClosingFuture} succeeds or fails with a different exception type, the
+   * function will not be called, and the derived {@code ClosingFuture} will be equivalent to this
+   * one.
+   *
+   * <p>If the function throws an exception, that exception is used as the result of the derived
+   * {@code ClosingFuture}. But if the exception is thrown after the function creates a {@code
+   * ClosingFuture}, then none of the closeable objects in that {@code ClosingFuture} will be
+   * closed.
+   *
+   * <p>Usage guidelines for this method:
+   *
+   * <ul>
+   *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+   *       {@code ClosingFuture}. If possible, prefer calling {@link #catching(Class,
+   *       ClosingFunction, Executor)} instead, with a function that returns the next value
+   *       directly.
+   *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor) closer.eventuallyClose()}
+   *       for every closeable object this step creates in order to capture it for later closing.
+   *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+   *       ClosingFuture} call {@link #from(ListenableFuture)}.
+   *   <li>In case this step doesn't create new closeables, you can adapt an API that returns a
+   *       {@link ListenableFuture} to return a {@code ClosingFuture} by wrapping it with a call to
+   *       {@link #withoutCloser(AsyncFunction)}
+   * </ul>
+   *
+   * <p>Example usage:
+   *
+   * <pre>{@code
+   * // Fall back to a secondary input stream in case of IOException.
+   * ClosingFuture<InputStream> inputFuture =
+   *     firstInputFuture.catchingAsync(
+   *         IOException.class, (closer, x) -> secondaryInputStreamClosingFuture(), executor);
+   * }
+   * }</pre>
+   *
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener} documentation. All its warnings
+   * about heavyweight listeners are also applicable to heavyweight functions passed to this method.
+   * (Specifically, {@code directExecutor} functions should avoid heavyweight operations inside
+   * {@code AsyncClosingFunction.apply}. Any heavyweight operations should occur in other threads
+   * responsible for completing the returned {@code ClosingFuture}.)
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, or any other derivation method on
+   * this {@code ClosingFuture}.
+   *
+   * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
+   *     type is matched against this step's exception. "This step's exception" means the cause of
+   *     the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself. To avoid hiding bugs and other unrecoverable errors, callers should
+   *     prefer more specific types, avoiding {@code Throwable.class} in particular.
+   * @param fallback the function to be called if this step fails with the expected exception type.
+   *     The function's argument is this step's exception. "This step's exception" means the cause
+   *     of the {@link ExecutionException} thrown by {@link Future#get()} on the {@link Future}
+   *     underlying this step or, if {@code get()} throws a different kind of exception, that
+   *     exception itself.
+   * @param executor the executor that runs {@code fallback} if the input fails
+   */
+  // TODO(dpb): Should this do something special if the function throws CancellationException or
+  // ExecutionException?
+  public <X extends Throwable> ClosingFuture<V> catchingAsync(
+      Class<X> exceptionType,
+      AsyncClosingFunction<? super X, ? extends V> fallback,
+      Executor executor) {
+    return catchingAsyncMoreGeneric(exceptionType, fallback, executor);
+  }
+
+  // Avoids generic type capture inconsistency problems where |? extends V| is incompatible with V.
+  private <X extends Throwable, W extends V> ClosingFuture<V> catchingAsyncMoreGeneric(
+      Class<X> exceptionType,
+      final AsyncClosingFunction<? super X, W> fallback,
+      Executor executor) {
+    checkNotNull(fallback);
+    AsyncFunction<X, W> asyncFunction =
+        new AsyncFunction<X, W>() {
+          @Override
+          public ListenableFuture<W> apply(X exception) throws Exception {
+            return closeables.applyAsyncClosingFunction(fallback, exception);
+          }
+
+          @Override
+          public String toString() {
+            return fallback.toString();
+          }
+        };
+    return derive(future.catchingAsync(exceptionType, asyncFunction, executor));
+  }
+
+  /**
+   * 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.
+   *
+   * <p>After calling this method, you may not call {@link
+   * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, this method, or any other
+   * derivation method on this {@code ClosingFuture}.
+   *
+   * @return a {@link Future} that represents the final value or exception of the pipeline
+   */
+  public FluentFuture<V> finishToFuture() {
+    if (compareAndUpdateState(OPEN, WILL_CLOSE)) {
+      logger.log(FINER, "will close {0}", this);
+      future.addListener(
+          new Runnable() {
+            @Override
+            public void run() {
+              checkAndUpdateState(WILL_CLOSE, CLOSING);
+              close();
+              checkAndUpdateState(CLOSING, CLOSED);
+            }
+          },
+          directExecutor());
+    } else {
+      switch (state.get()) {
+        case SUBSUMED:
+          throw new IllegalStateException(
+              "Cannot call finishToFuture() after deriving another step");
+
+        case WILL_CREATE_VALUE_AND_CLOSER:
+          throw new IllegalStateException(
+              "Cannot call finishToFuture() after calling finishToValueAndCloser()");
+
+        case WILL_CLOSE:
+        case CLOSING:
+        case CLOSED:
+          throw new IllegalStateException("Cannot call finishToFuture() twice");
+
+        case OPEN:
+          throw new AssertionError();
+      }
+    }
+    return future;
+  }
+
+  /**
+   * Marks this step as the last step in the {@code ClosingFuture} pipeline. When this step is done,
+   * {@code receiver} will be called with an object that contains the result of the operation. The
+   * receiver can store the {@link ValueAndCloser} outside the receiver for later synchronous use.
+   *
+   * <p>After calling this method, you may not call {@link #finishToFuture()}, this method again, or
+   * any other derivation method on this {@code ClosingFuture}.
+   *
+   * @param consumer a callback whose method will be called (using {@code executor}) when this
+   *     operation is done
+   */
+  public void finishToValueAndCloser(
+      final ValueAndCloserConsumer<? super V> consumer, Executor executor) {
+    checkNotNull(consumer);
+    if (!compareAndUpdateState(OPEN, WILL_CREATE_VALUE_AND_CLOSER)) {
+      switch (state.get()) {
+        case SUBSUMED:
+          throw new IllegalStateException(
+              "Cannot call finishToValueAndCloser() after deriving another step");
+
+        case WILL_CLOSE:
+        case CLOSING:
+        case CLOSED:
+          throw new IllegalStateException(
+              "Cannot call finishToValueAndCloser() after calling finishToFuture()");
+
+        case WILL_CREATE_VALUE_AND_CLOSER:
+          throw new IllegalStateException("Cannot call finishToValueAndCloser() twice");
+
+        case OPEN:
+          break;
+      }
+      throw new AssertionError(state);
+    }
+    future.addListener(
+        new Runnable() {
+          @Override
+          public void run() {
+            provideValueAndCloser(consumer, ClosingFuture.this);
+          }
+        },
+        executor);
+  }
+
+  private static <C, V extends C> void provideValueAndCloser(
+      ValueAndCloserConsumer<C> consumer, ClosingFuture<V> closingFuture) {
+    consumer.accept(new ValueAndCloser<C>(closingFuture));
+  }
+
+  /**
+   * Attempts to cancel execution of this step. This attempt will fail if the step has already
+   * completed, has already been cancelled, or could not be cancelled for some other reason. If
+   * successful, and this step has not started when {@code cancel} is called, this step should never
+   * run.
+   *
+   * <p>If successful, causes the objects captured by this step (if already started) and its input
+   * step(s) for later closing to be closed on their respective {@link Executor}s. If any such calls
+   * specified {@link MoreExecutors#directExecutor()}, those objects will be closed synchronously.
+   *
+   * @param mayInterruptIfRunning {@code true} if the thread executing this task should be
+   *     interrupted; otherwise, in-progress tasks are allowed to complete, but the step will be
+   *     cancelled regardless
+   * @return {@code false} if the step could not be cancelled, typically because it has already
+   *     completed normally; {@code true} otherwise
+   */
+  @CanIgnoreReturnValue
+  public boolean cancel(boolean mayInterruptIfRunning) {
+    logger.log(FINER, "cancelling {0}", this);
+    boolean cancelled = future.cancel(mayInterruptIfRunning);
+    if (cancelled) {
+      close();
+    }
+    return cancelled;
+  }
+
+  private void close() {
+    logger.log(FINER, "closing {0}", this);
+    closeables.close();
+  }
+
+  private <U> ClosingFuture<U> derive(FluentFuture<U> future) {
+    ClosingFuture<U> derived = new ClosingFuture<>(future);
+    becomeSubsumedInto(derived.closeables);
+    return derived;
+  }
+
+  private void becomeSubsumedInto(CloseableList otherCloseables) {
+    checkAndUpdateState(OPEN, SUBSUMED);
+    otherCloseables.add(closeables, directExecutor());
+  }
+
+  /**
+   * An object that can return the value of the {@link ClosingFuture}s that are passed to {@link
+   * #whenAllComplete(Iterable)} or {@link #whenAllSucceed(Iterable)}.
+   *
+   * <p>Only for use by a {@link CombiningCallable} or {@link AsyncCombiningCallable} object.
+   */
+  public static final class Peeker {
+    private final ImmutableList<ClosingFuture<?>> futures;
+    private volatile boolean beingCalled;
+
+    private Peeker(ImmutableList<ClosingFuture<?>> futures) {
+      this.futures = checkNotNull(futures);
+    }
+
+    /**
+     * Returns the value of {@code closingFuture}.
+     *
+     * @throws ExecutionException if {@code closingFuture} is a failed step
+     * @throws CancellationException if the {@code closingFuture}'s future was cancelled
+     * @throws IllegalArgumentException if {@code closingFuture} is not one of the futures passed to
+     *     {@link #whenAllComplete(Iterable)} or {@link #whenAllComplete(Iterable)}
+     * @throws IllegalStateException if called outside of a call to {@link
+     *     CombiningCallable#call(DeferredCloser, Peeker)} or {@link
+     *     AsyncCombiningCallable#call(DeferredCloser, Peeker)}
+     */
+    public final <D extends @Nullable Object> D getDone(ClosingFuture<D> closingFuture)
+        throws ExecutionException {
+      checkState(beingCalled);
+      checkArgument(futures.contains(closingFuture));
+      return Futures.getDone(closingFuture.future);
+    }
+
+    private <V extends @Nullable Object> V call(
+        CombiningCallable<V> combiner, CloseableList closeables) throws Exception {
+      beingCalled = true;
+      CloseableList newCloseables = new CloseableList();
+      try {
+        return combiner.call(newCloseables.closer, this);
+      } finally {
+        closeables.add(newCloseables, directExecutor());
+        beingCalled = false;
+      }
+    }
+
+    private <V extends @Nullable Object> FluentFuture<V> callAsync(
+        AsyncCombiningCallable<V> combiner, CloseableList closeables) throws Exception {
+      beingCalled = true;
+      CloseableList newCloseables = new CloseableList();
+      try {
+        ClosingFuture<V> closingFuture = combiner.call(newCloseables.closer, this);
+        closingFuture.becomeSubsumedInto(closeables);
+        return closingFuture.future;
+      } finally {
+        closeables.add(newCloseables, directExecutor());
+        beingCalled = false;
+      }
+    }
+  }
+
+  /**
+   * A builder of a {@link ClosingFuture} step that is derived from more than one input step.
+   *
+   * <p>See {@link #whenAllComplete(Iterable)} and {@link #whenAllSucceed(Iterable)} for how to
+   * instantiate this class.
+   *
+   * <p>Example:
+   *
+   * <pre>{@code
+   * final ClosingFuture<BufferedReader> file1ReaderFuture = ...;
+   * final ClosingFuture<BufferedReader> file2ReaderFuture = ...;
+   * ListenableFuture<Integer> numberOfDifferentLines =
+   *       ClosingFuture.whenAllSucceed(file1ReaderFuture, file2ReaderFuture)
+   *           .call(
+   *               (closer, peeker) -> {
+   *                 BufferedReader file1Reader = peeker.getDone(file1ReaderFuture);
+   *                 BufferedReader file2Reader = peeker.getDone(file2ReaderFuture);
+   *                 return countDifferentLines(file1Reader, file2Reader);
+   *               },
+   *               executor)
+   *           .closing(executor);
+   * }</pre>
+   */
+  // TODO(cpovirk): Use simple name instead of fully qualified after we stop building with JDK 8.
+  @com.google.errorprone.annotations.DoNotMock(
+      "Use ClosingFuture.whenAllSucceed() or .whenAllComplete() instead.")
+  public static class Combiner {
+
+    private final CloseableList closeables = new CloseableList();
+
+    /**
+     * An operation that returns a result and may throw an exception.
+     *
+     * @param <V> the type of the result
+     */
+    @FunctionalInterface
+    public interface CombiningCallable<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.
+       *
+       * @param peeker used to get the value of any of the input futures
+       */
+      V call(DeferredCloser closer, Peeker peeker) throws Exception;
+    }
+
+    /**
+     * An operation that returns a {@link ClosingFuture} result and may throw an exception.
+     *
+     * @param <V> the type of the result
+     */
+    @FunctionalInterface
+    public interface AsyncCombiningCallable<V extends @Nullable Object> {
+      /**
+       * Computes a {@link ClosingFuture} 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.
+       *
+       * @param peeker used to get the value of any of the input futures
+       */
+      ClosingFuture<V> call(DeferredCloser closer, Peeker peeker) throws Exception;
+    }
+
+    private final boolean allMustSucceed;
+    protected final ImmutableList<ClosingFuture<?>> inputs;
+
+    private Combiner(boolean allMustSucceed, Iterable<? extends ClosingFuture<?>> inputs) {
+      this.allMustSucceed = allMustSucceed;
+      this.inputs = ImmutableList.copyOf(inputs);
+      for (ClosingFuture<?> input : inputs) {
+        input.becomeSubsumedInto(closeables);
+      }
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by a {@link #whenAllSucceed} method and any of the inputs
+     * fail, so will the returned step.
+     *
+     * <p>If the combiningCallable throws a {@code CancellationException}, the pipeline will be
+     * cancelled.
+     *
+     * <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(
+        final CombiningCallable<V> combiningCallable, Executor executor) {
+      Callable<V> callable =
+          new Callable<V>() {
+            @Override
+            public V call() throws Exception {
+              return new Peeker(inputs).call(combiningCallable, closeables);
+            }
+
+            @Override
+            public String toString() {
+              return combiningCallable.toString();
+            }
+          };
+      ClosingFuture<V> derived = new ClosingFuture<>(futureCombiner().call(callable, executor));
+      derived.closeables.add(closeables, directExecutor());
+      return derived;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by a {@link #whenAllSucceed} method and any of the inputs
+     * fail, so will the returned step.
+     *
+     * <p>If the combiningCallable throws a {@code CancellationException}, the pipeline will be
+     * cancelled.
+     *
+     * <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.
+     *
+     * <p>If the combiningCallable throws any other exception, it will be used as the failure of the
+     * derived step.
+     *
+     * <p>If an exception is thrown after the combiningCallable creates a {@code ClosingFuture},
+     * then none of the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <V> ClosingFuture<V> callAsync(
+        final AsyncCombiningCallable<V> combiningCallable, Executor executor) {
+      AsyncCallable<V> asyncCallable =
+          new AsyncCallable<V>() {
+            @Override
+            public ListenableFuture<V> call() throws Exception {
+              return new Peeker(inputs).callAsync(combiningCallable, closeables);
+            }
+
+            @Override
+            public String toString() {
+              return combiningCallable.toString();
+            }
+          };
+      ClosingFuture<V> derived =
+          new ClosingFuture<>(futureCombiner().callAsync(asyncCallable, executor));
+      derived.closeables.add(closeables, directExecutor());
+      return derived;
+    }
+
+    private FutureCombiner<Object> futureCombiner() {
+      return allMustSucceed
+          ? Futures.whenAllSucceed(inputFutures())
+          : Futures.whenAllComplete(inputFutures());
+    }
+
+    private static final Function<ClosingFuture<?>, FluentFuture<?>> INNER_FUTURE =
+        new Function<ClosingFuture<?>, FluentFuture<?>>() {
+          @Override
+          public FluentFuture<?> apply(ClosingFuture<?> future) {
+            return future.future;
+          }
+        };
+
+    private ImmutableList<FluentFuture<?>> inputFutures() {
+      return FluentIterable.from(inputs).transform(INNER_FUTURE).toList();
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine two {@link
+   * ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture)} to start this
+   * combination.
+   *
+   * @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 @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
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    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.
+       *
+       * <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.
+       */
+      U apply(DeferredCloser closer, V1 value1, V2 value2) throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the two futures
+     * passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    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.
+       *
+       * <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<U> apply(DeferredCloser closer, V1 value1, V2 value2) throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+
+    private Combiner2(ClosingFuture<V1> future1, ClosingFuture<V2> future2) {
+      super(true, ImmutableList.of(future1, future2));
+      this.future1 = future1;
+      this.future2 = future2;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture)} and
+     * any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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 @Nullable Object> ClosingFuture<U> call(
+        final ClosingFunction2<V1, V2, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(closer, peeker.getDone(future1), peeker.getDone(future2));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture)} and
+     * any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction2<V1, V2, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(closer, peeker.getDone(future1), peeker.getDone(future2));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine three
+   * {@link ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+   * ClosingFuture)} to start this combination.
+   *
+   * @param <V1> the type returned by the first future
+   * @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 @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
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    public interface ClosingFunction3<
+        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.
+       *
+       * <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.
+       */
+      U apply(DeferredCloser closer, V1 value1, V2 value2, V3 v3) throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the three
+     * futures passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    public interface AsyncClosingFunction3<
+        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.
+       *
+       * <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<U> apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3)
+          throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+    private final ClosingFuture<V3> future3;
+
+    private Combiner3(
+        ClosingFuture<V1> future1, ClosingFuture<V2> future2, ClosingFuture<V3> future3) {
+      super(true, ImmutableList.of(future1, future2, future3));
+      this.future1 = future1;
+      this.future2 = future2;
+      this.future3 = future3;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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 @Nullable Object> ClosingFuture<U> call(
+        final ClosingFunction3<V1, V2, V3, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction3<V1, V2, V3, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine four
+   * {@link ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+   * ClosingFuture)} to start this combination.
+   *
+   * @param <V1> the type returned by the first future
+   * @param <V2> the type returned by the second future
+   * @param <V3> the type returned by the third future
+   * @param <V4> the type returned by the fourth future
+   */
+  public static final class Combiner4<
+          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
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    public interface ClosingFunction4<
+        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.
+       *
+       * <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.
+       */
+      U apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4) throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the four
+     * futures passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+     * ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    public interface AsyncClosingFunction4<
+        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.
+       *
+       * <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<U> apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4)
+          throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+    private final ClosingFuture<V3> future3;
+    private final ClosingFuture<V4> future4;
+
+    private Combiner4(
+        ClosingFuture<V1> future1,
+        ClosingFuture<V2> future2,
+        ClosingFuture<V3> future3,
+        ClosingFuture<V4> future4) {
+      super(true, ImmutableList.of(future1, future2, future3, future4));
+      this.future1 = future1;
+      this.future2 = future2;
+      this.future3 = future3;
+      this.future4 = future4;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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 @Nullable Object> ClosingFuture<U> call(
+        final ClosingFunction4<V1, V2, V3, V4, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction4<V1, V2, V3, V4, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  /**
+   * A generic {@link Combiner} that lets you use a lambda or method reference to combine five
+   * {@link ClosingFuture}s. Use {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+   * ClosingFuture, ClosingFuture)} to start this combination.
+   *
+   * @param <V1> the type returned by the first future
+   * @param <V2> the type returned by the second future
+   * @param <V3> the type returned by the third future
+   * @param <V4> the type returned by the fourth future
+   * @param <V5> the type returned by the fifth future
+   */
+  public static final class Combiner5<
+          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
+     * {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture, ClosingFuture,
+     * ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @param <V5> the type returned by the fifth future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    public interface ClosingFunction5<
+        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.
+       *
+       * <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.
+       */
+      U apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4, V5 value5)
+          throws Exception;
+    }
+
+    /**
+     * A function that returns a {@link ClosingFuture} when applied to the values of the five
+     * futures passed to {@link #whenAllSucceed(ClosingFuture, ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture)}.
+     *
+     * @param <V1> the type returned by the first future
+     * @param <V2> the type returned by the second future
+     * @param <V3> the type returned by the third future
+     * @param <V4> the type returned by the fourth future
+     * @param <V5> the type returned by the fifth future
+     * @param <U> the type returned by the function
+     */
+    @FunctionalInterface
+    public interface AsyncClosingFunction5<
+        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.
+       *
+       * <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<U> apply(
+          DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4, V5 value5)
+          throws Exception;
+    }
+
+    private final ClosingFuture<V1> future1;
+    private final ClosingFuture<V2> future2;
+    private final ClosingFuture<V3> future3;
+    private final ClosingFuture<V4> future4;
+    private final ClosingFuture<V5> future5;
+
+    private Combiner5(
+        ClosingFuture<V1> future1,
+        ClosingFuture<V2> future2,
+        ClosingFuture<V3> future3,
+        ClosingFuture<V4> future4,
+        ClosingFuture<V5> future5) {
+      super(true, ImmutableList.of(future1, future2, future3, future4, future5));
+      this.future1 = future1;
+      this.future2 = future2;
+      this.future3 = future3;
+      this.future4 = future4;
+      this.future5 = future5;
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * combining function to their values. The function can use a {@link DeferredCloser} to capture
+     * objects to be closed when the pipeline is done.
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the
+     * returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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 @Nullable Object> ClosingFuture<U> call(
+        final ClosingFunction5<V1, V2, V3, V4, V5, U> function, Executor executor) {
+      return call(
+          new CombiningCallable<U>() {
+            @Override
+            public U call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4),
+                  peeker.getDone(future5));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+
+    /**
+     * Returns a new {@code ClosingFuture} pipeline step derived from the inputs by applying a
+     * {@code ClosingFuture}-returning function to their values. The function can use a {@link
+     * DeferredCloser} to capture objects to be closed when the pipeline is done (other than those
+     * captured by the returned {@link ClosingFuture}).
+     *
+     * <p>If this combiner was returned by {@link #whenAllSucceed(ClosingFuture, ClosingFuture,
+     * ClosingFuture, ClosingFuture, ClosingFuture)} and any of the inputs fail, so will the
+     * returned step.
+     *
+     * <p>If the function throws a {@code CancellationException}, the pipeline will be cancelled.
+     *
+     * <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.
+     *
+     * <p>If the function throws any other exception, it will be used as the failure of the derived
+     * step.
+     *
+     * <p>If an exception is thrown after the function creates a {@code ClosingFuture}, then none of
+     * the closeable objects in that {@code ClosingFuture} will be closed.
+     *
+     * <p>Usage guidelines for this method:
+     *
+     * <ul>
+     *   <li>Use this method only when calling an API that returns a {@link ListenableFuture} or a
+     *       {@code ClosingFuture}. If possible, prefer calling {@link #call(CombiningCallable,
+     *       Executor)} instead, with a function that returns the next value directly.
+     *   <li>Call {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     *       closer.eventuallyClose()} for every closeable object this step creates in order to
+     *       capture it for later closing.
+     *   <li>Return a {@code ClosingFuture}. To turn a {@link ListenableFuture} into a {@code
+     *       ClosingFuture} call {@link #from(ListenableFuture)}.
+     * </ul>
+     *
+     * <p>The same warnings about doing heavyweight operations within {@link
+     * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
+     */
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
+        final AsyncClosingFunction5<V1, V2, V3, V4, V5, U> function, Executor executor) {
+      return callAsync(
+          new AsyncCombiningCallable<U>() {
+            @Override
+            public ClosingFuture<U> call(DeferredCloser closer, Peeker peeker) throws Exception {
+              return function.apply(
+                  closer,
+                  peeker.getDone(future1),
+                  peeker.getDone(future2),
+                  peeker.getDone(future3),
+                  peeker.getDone(future4),
+                  peeker.getDone(future5));
+            }
+
+            @Override
+            public String toString() {
+              return function.toString();
+            }
+          },
+          executor);
+    }
+  }
+
+  @Override
+  public String toString() {
+    // TODO(dpb): Better toString, in the style of Futures.transform etc.
+    return toStringHelper(this).add("state", state.get()).addValue(future).toString();
+  }
+
+  @Override
+  protected void finalize() {
+    if (state.get().equals(OPEN)) {
+      logger.log(SEVERE, "Uh oh! An open ClosingFuture has leaked and will close: {0}", this);
+      FluentFuture<V> unused = finishToFuture();
+    }
+  }
+
+  private static void closeQuietly(final AutoCloseable closeable, Executor executor) {
+    if (closeable == null) {
+      return;
+    }
+    try {
+      executor.execute(
+          new Runnable() {
+            @Override
+            public void run() {
+              try {
+                closeable.close();
+              } catch (Exception e) {
+                logger.log(WARNING, "thrown by close()", e);
+              }
+            }
+          });
+    } catch (RejectedExecutionException e) {
+      if (logger.isLoggable(WARNING)) {
+        logger.log(
+            WARNING, String.format("while submitting close to %s; will close inline", executor), e);
+      }
+      closeQuietly(closeable, directExecutor());
+    }
+  }
+
+  private void checkAndUpdateState(State oldState, State newState) {
+    checkState(
+        compareAndUpdateState(oldState, newState),
+        "Expected state to be %s, but it was %s",
+        oldState,
+        newState);
+  }
+
+  private boolean compareAndUpdateState(State oldState, State newState) {
+    return state.compareAndSet(oldState, newState);
+  }
+
+  // TODO(dpb): Should we use a pair of ArrayLists instead of an IdentityHashMap?
+  private static final class CloseableList extends IdentityHashMap<AutoCloseable, Executor>
+      implements Closeable {
+    private final DeferredCloser closer = new DeferredCloser(this);
+    private volatile boolean closed;
+    private volatile CountDownLatch whenClosed;
+
+    <V, U> ListenableFuture<U> applyClosingFunction(
+        ClosingFunction<? super V, U> transformation, V input) throws Exception {
+      // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
+      CloseableList newCloseables = new CloseableList();
+      try {
+        return immediateFuture(transformation.apply(newCloseables.closer, input));
+      } finally {
+        add(newCloseables, directExecutor());
+      }
+    }
+
+    <V, U> FluentFuture<U> applyAsyncClosingFunction(
+        AsyncClosingFunction<V, U> transformation, V input) throws Exception {
+      // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
+      CloseableList newCloseables = new CloseableList();
+      try {
+        ClosingFuture<U> closingFuture = transformation.apply(newCloseables.closer, input);
+        closingFuture.becomeSubsumedInto(newCloseables);
+        return closingFuture.future;
+      } finally {
+        add(newCloseables, directExecutor());
+      }
+    }
+
+    @Override
+    public void close() {
+      if (closed) {
+        return;
+      }
+      synchronized (this) {
+        if (closed) {
+          return;
+        }
+        closed = true;
+      }
+      for (Map.Entry<AutoCloseable, Executor> entry : entrySet()) {
+        closeQuietly(entry.getKey(), entry.getValue());
+      }
+      clear();
+      if (whenClosed != null) {
+        whenClosed.countDown();
+      }
+    }
+
+    void add(@Nullable AutoCloseable closeable, Executor executor) {
+      checkNotNull(executor);
+      if (closeable == null) {
+        return;
+      }
+      synchronized (this) {
+        if (!closed) {
+          put(closeable, executor);
+          return;
+        }
+      }
+      closeQuietly(closeable, executor);
+    }
+
+    /**
+     * Returns a latch that reaches zero when this objects' deferred closeables have been closed.
+     */
+    CountDownLatch whenClosedCountDown() {
+      if (closed) {
+        return new CountDownLatch(0);
+      }
+      synchronized (this) {
+        if (closed) {
+          return new CountDownLatch(0);
+        }
+        checkState(whenClosed == null);
+        return whenClosed = new CountDownLatch(1);
+      }
+    }
+  }
+
+  /**
+   * Returns an object that can be used to wait until this objects' deferred closeables have all had
+   * {@link Runnable}s that close them submitted to each one's closing {@link Executor}.
+   */
+  @VisibleForTesting
+  CountDownLatch whenClosedCountDown() {
+    return closeables.whenClosedCountDown();
+  }
+
+  /** The state of a {@link CloseableList}. */
+  enum State {
+    /** The {@link CloseableList} has not been subsumed or closed. */
+    OPEN,
+
+    /**
+     * The {@link CloseableList} has been subsumed into another. It may not be closed or subsumed
+     * into any other.
+     */
+    SUBSUMED,
+
+    /**
+     * Some {@link ListenableFuture} has a callback attached that will close the {@link
+     * CloseableList}, but it has not yet run. The {@link CloseableList} may not be subsumed.
+     */
+    WILL_CLOSE,
+
+    /**
+     * The callback that closes the {@link CloseableList} is running, but it has not completed. The
+     * {@link CloseableList} may not be subsumed.
+     */
+    CLOSING,
+
+    /** The {@link CloseableList} has been closed. It may not be further subsumed. */
+    CLOSED,
+
+    /**
+     * {@link ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)} has been
+     * called. The step may not be further subsumed, nor may {@link #finishToFuture()} be called.
+     */
+    WILL_CREATE_VALUE_AND_CLOSER,
+  }
+}
diff --git a/guava/src/com/google/common/util/concurrent/CollectionFuture.java b/guava/src/com/google/common/util/concurrent/CollectionFuture.java
index b1412d8..9f0aa64 100644
--- a/guava/src/com/google/common/util/concurrent/CollectionFuture.java
+++ b/guava/src/com/google/common/util/concurrent/CollectionFuture.java
@@ -14,98 +14,95 @@
 
 package com.google.common.util.concurrent;
 
-import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.Lists.newArrayListWithCapacity;
 import static java.util.Collections.unmodifiableList;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.util.List;
+import java.util.concurrent.Future;
 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> {
+  /*
+   * 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;
 
-  abstract class CollectionFutureRunningState extends RunningState {
-    private List<Optional<V>> values;
+  CollectionFuture(
+      ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
+      boolean allMustSucceed) {
+    super(futures, allMustSucceed, true);
 
-    CollectionFutureRunningState(
-        ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
-        boolean allMustSucceed) {
-      super(futures, allMustSucceed, true);
+    List<Present<V>> values =
+        futures.isEmpty()
+            ? ImmutableList.<Present<V>>of()
+            : Lists.<Present<V>>newArrayListWithCapacity(futures.size());
 
-      this.values =
-          futures.isEmpty()
-              ? ImmutableList.<Optional<V>>of()
-              : Lists.<Optional<V>>newArrayListWithCapacity(futures.size());
-
-      // Populate the results list with null initially.
-      for (int i = 0; i < futures.size(); ++i) {
-        values.add(null);
-      }
+    // Populate the results list with null initially.
+    for (int i = 0; i < futures.size(); ++i) {
+      values.add(null);
     }
 
-    @Override
-    final void collectOneValue(boolean allMustSucceed, int index, @Nullable V returnValue) {
-      List<Optional<V>> localValues = values;
-
-      if (localValues != null) {
-        localValues.set(index, Optional.fromNullable(returnValue));
-      } else {
-        // Some other future failed or has been cancelled, causing this one to also be cancelled or
-        // have an exception set. This should only happen if allMustSucceed is true or if the output
-        // itself has been cancelled.
-        checkState(
-            allMustSucceed || isCancelled(), "Future was done before all dependencies completed");
-      }
-    }
-
-    @Override
-    final void handleAllCompleted() {
-      List<Optional<V>> localValues = values;
-      if (localValues != null) {
-        set(combine(localValues));
-      } else {
-        checkState(isDone());
-      }
-    }
-
-    @Override
-    void releaseResourcesAfterFailure() {
-      super.releaseResourcesAfterFailure();
-      this.values = null;
-    }
-
-    abstract C combine(List<Optional<V>> values);
+    this.values = values;
   }
 
+  @Override
+  final void collectOneValue(int index, @Nullable V returnValue) {
+    List<Present<V>> localValues = values;
+    if (localValues != null) {
+      localValues.set(index, new Present<>(returnValue));
+    }
+  }
+
+  @Override
+  final void handleAllCompleted() {
+    List<Present<V>> localValues = values;
+    if (localValues != null) {
+      set(combine(localValues));
+    }
+  }
+
+  @Override
+  void releaseResources(ReleaseResourcesReason reason) {
+    super.releaseResources(reason);
+    this.values = null;
+  }
+
+  abstract C combine(List<Present<V>> values);
+
   /** Used for {@link Futures#allAsList} and {@link Futures#successfulAsList}. */
   static final class ListFuture<V> extends CollectionFuture<V, List<V>> {
     ListFuture(
         ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
         boolean allMustSucceed) {
-      init(new ListFutureRunningState(futures, allMustSucceed));
+      super(futures, allMustSucceed);
+      init();
     }
 
-    private final class ListFutureRunningState extends CollectionFutureRunningState {
-      ListFutureRunningState(
-          ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
-          boolean allMustSucceed) {
-        super(futures, allMustSucceed);
+    @Override
+    public List<V> combine(List<Present<V>> values) {
+      List<V> result = newArrayListWithCapacity(values.size());
+      for (Present<V> element : values) {
+        result.add(element != null ? element.value : null);
       }
+      return unmodifiableList(result);
+    }
+  }
 
-      @Override
-      public List<V> combine(List<Optional<V>> values) {
-        List<V> result = newArrayListWithCapacity(values.size());
-        for (Optional<V> element : values) {
-          result.add(element != null ? element.orNull() : null);
-        }
-        return unmodifiableList(result);
-      }
+  /** The result of a successful {@code Future}. */
+  private static final class Present<V> {
+    V value;
+
+    Present(V value) {
+      this.value = value;
     }
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/CombinedFuture.java b/guava/src/com/google/common/util/concurrent/CombinedFuture.java
index 7755e0e..b8b0e2c 100644
--- a/guava/src/com/google/common/util/concurrent/CombinedFuture.java
+++ b/guava/src/com/google/common/util/concurrent/CombinedFuture.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.util.concurrent.AggregateFuture.ReleaseResourcesReason.OUTPUT_FUTURE_DONE;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableCollection;
@@ -30,16 +30,16 @@
 /** Aggregate future that computes its value by calling a callable. */
 @GwtCompatible
 final class CombinedFuture<V> extends AggregateFuture<Object, V> {
+  private CombinedFutureInterruptibleTask<?> task;
+
   CombinedFuture(
       ImmutableCollection<? extends ListenableFuture<?>> futures,
       boolean allMustSucceed,
       Executor listenerExecutor,
       AsyncCallable<V> callable) {
-    init(
-        new CombinedFutureRunningState(
-            futures,
-            allMustSucceed,
-            new AsyncCallableInterruptibleTask(callable, listenerExecutor)));
+    super(futures, allMustSucceed, false);
+    this.task = new AsyncCallableInterruptibleTask(callable, listenerExecutor);
+    init();
   }
 
   CombinedFuture(
@@ -47,56 +47,50 @@
       boolean allMustSucceed,
       Executor listenerExecutor,
       Callable<V> callable) {
-    init(
-        new CombinedFutureRunningState(
-            futures, allMustSucceed, new CallableInterruptibleTask(callable, listenerExecutor)));
+    super(futures, allMustSucceed, false);
+    this.task = new CallableInterruptibleTask(callable, listenerExecutor);
+    init();
   }
 
-  private final class CombinedFutureRunningState extends RunningState {
-    private CombinedFutureInterruptibleTask task;
+  @Override
+  void collectOneValue(int index, @Nullable Object returnValue) {}
 
-    CombinedFutureRunningState(
-        ImmutableCollection<? extends ListenableFuture<?>> futures,
-        boolean allMustSucceed,
-        CombinedFutureInterruptibleTask task) {
-      super(futures, allMustSucceed, false);
-      this.task = task;
+  @Override
+  void handleAllCompleted() {
+    CombinedFutureInterruptibleTask<?> localTask = task;
+    if (localTask != null) {
+      localTask.execute();
     }
+  }
 
-    @Override
-    void collectOneValue(boolean allMustSucceed, int index, @Nullable Object returnValue) {}
-
-    @Override
-    void handleAllCompleted() {
-      CombinedFutureInterruptibleTask localTask = task;
-      if (localTask != null) {
-        localTask.execute();
-      } else {
-        checkState(isDone());
-      }
-    }
-
-    @Override
-    void releaseResourcesAfterFailure() {
-      super.releaseResourcesAfterFailure();
+  @Override
+  void releaseResources(ReleaseResourcesReason reason) {
+    super.releaseResources(reason);
+    /*
+     * If the output future is done, then it won't need to interrupt the task later, so it can clear
+     * its reference to it.
+     *
+     * If the output future is *not* done, then the task field will be cleared after the task runs
+     * or after the output future is done, whichever comes first.
+     */
+    if (reason == OUTPUT_FUTURE_DONE) {
       this.task = null;
     }
+  }
 
-    @Override
-    void interruptTask() {
-      CombinedFutureInterruptibleTask localTask = task;
-      if (localTask != null) {
-        localTask.interruptTask();
-      }
+  @Override
+  protected void interruptTask() {
+    CombinedFutureInterruptibleTask<?> localTask = task;
+    if (localTask != null) {
+      localTask.interruptTask();
     }
   }
 
   @WeakOuter
   private abstract class CombinedFutureInterruptibleTask<T> extends InterruptibleTask<T> {
     private final Executor listenerExecutor;
-    boolean thrownByExecute = true;
 
-    public CombinedFutureInterruptibleTask(Executor listenerExecutor) {
+    CombinedFutureInterruptibleTask(Executor listenerExecutor) {
       this.listenerExecutor = checkNotNull(listenerExecutor);
     }
 
@@ -109,21 +103,32 @@
       try {
         listenerExecutor.execute(this);
       } catch (RejectedExecutionException e) {
-        if (thrownByExecute) {
-          setException(e);
-        }
+        CombinedFuture.this.setException(e);
       }
     }
 
     @Override
     final void afterRanInterruptibly(T result, Throwable error) {
+      /*
+       * The future no longer needs to interrupt this task, so it no longer needs a reference to it.
+       *
+       * TODO(cpovirk): It might be nice for our InterruptibleTask subclasses to null out their
+       *  `callable` fields automatically. That would make it less important for us to null out the
+       * reference to `task` here (though it's still nice to do so in case our reference to the
+       * executor keeps it alive). Ideally, nulling out `callable` would be the responsibility of
+       * InterruptibleTask itself so that its other subclasses also benefit. (Handling `callable` in
+       * InterruptibleTask itself might also eliminate some of the existing boilerplate for, e.g.,
+       * pendingToString().)
+       */
+      CombinedFuture.this.task = null;
+
       if (error != null) {
         if (error instanceof ExecutionException) {
-          setException(error.getCause());
+          CombinedFuture.this.setException(error.getCause());
         } else if (error instanceof CancellationException) {
           cancel(false);
         } else {
-          setException(error);
+          CombinedFuture.this.setException(error);
         }
       } else {
         setValue(result);
@@ -138,14 +143,13 @@
       extends CombinedFutureInterruptibleTask<ListenableFuture<V>> {
     private final AsyncCallable<V> callable;
 
-    public AsyncCallableInterruptibleTask(AsyncCallable<V> callable, Executor listenerExecutor) {
+    AsyncCallableInterruptibleTask(AsyncCallable<V> callable, Executor listenerExecutor) {
       super(listenerExecutor);
       this.callable = checkNotNull(callable);
     }
 
     @Override
     ListenableFuture<V> runInterruptibly() throws Exception {
-      thrownByExecute = false;
       ListenableFuture<V> result = callable.call();
       return checkNotNull(
           result,
@@ -156,7 +160,7 @@
 
     @Override
     void setValue(ListenableFuture<V> value) {
-      setFuture(value);
+      CombinedFuture.this.setFuture(value);
     }
 
     @Override
@@ -169,14 +173,13 @@
   private final class CallableInterruptibleTask extends CombinedFutureInterruptibleTask<V> {
     private final Callable<V> callable;
 
-    public CallableInterruptibleTask(Callable<V> callable, Executor listenerExecutor) {
+    CallableInterruptibleTask(Callable<V> callable, Executor listenerExecutor) {
       super(listenerExecutor);
       this.callable = checkNotNull(callable);
     }
 
     @Override
     V runInterruptibly() throws Exception {
-      thrownByExecute = false;
       return callable.call();
     }
 
diff --git a/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java b/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
index 88929b6..f589e08 100644
--- a/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
+++ b/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
@@ -15,11 +15,13 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.util.concurrent.ExecutionSequencer.RunningState.CANCELLED;
 import static com.google.common.util.concurrent.ExecutionSequencer.RunningState.NOT_RUN;
 import static com.google.common.util.concurrent.ExecutionSequencer.RunningState.STARTED;
 import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
 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 com.google.common.annotations.Beta;
@@ -28,13 +30,50 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
- * Serializes execution of a set of operations. This class guarantees that a submitted callable will
- * not be called before previously submitted callables (and any {@code Future}s returned from them)
- * have completed.
+ * Serializes execution of tasks, somewhat like an "asynchronous {@code synchronized} block." Each
+ * {@linkplain #submit enqueued} callable will not be submitted to its associated executor until the
+ * previous callable has returned -- and, if the previous callable was an {@link AsyncCallable}, not
+ * until the {@code Future} it returned is {@linkplain Future#isDone done} (successful, failed, or
+ * cancelled).
  *
- * <p>This class implements a superset of the behavior of {@link
- * MoreExecutors#newSequentialExecutor}. If your tasks all run on the same underlying executor and
- * don't need to wait for {@code Future}s returned from {@code AsyncCallable}s, use it instead.
+ * <p>This class has limited support for cancellation and other "early completion":
+ *
+ * <ul>
+ *   <li>While calls to {@code submit} and {@code submitAsync} return a {@code Future} that can be
+ *       cancelled, cancellation never propagates to a task that has started to run -- neither to
+ *       the callable itself nor to any {@code Future} returned by an {@code AsyncCallable}.
+ *       (However, cancellation can prevent an <i>unstarted</i> task from running.) Therefore, the
+ *       next task will wait for any running callable (or pending {@code Future} returned by an
+ *       {@code AsyncCallable}) to complete, without interrupting it (and without calling {@code
+ *       cancel} on the {@code Future}). So beware: <i>Even if you cancel every precededing {@code
+ *       Future} returned by this class, the next task may still have to wait.</i>.
+ *   <li>Once an {@code AsyncCallable} returns a {@code Future}, this class considers that task to
+ *       be "done" as soon as <i>that</i> {@code Future} completes in any way. Notably, a {@code
+ *       Future} is "completed" even if it is cancelled while its underlying work continues on a
+ *       thread, an RPC, etc. The {@code Future} is also "completed" if it fails "early" -- for
+ *       example, if the deadline expires on a {@code Future} returned from {@link
+ *       Futures#withTimeout} while the {@code Future} it wraps continues its underlying work. So
+ *       beware: <i>Your {@code AsyncCallable} should not complete its {@code Future} until it is
+ *       safe for the next task to start.</i>
+ * </ul>
+ *
+ * <p>An additional limitation: this class serializes execution of <i>tasks</i> but not any
+ * <i>listeners</i> of those tasks.
+ *
+ * <p>This class is similar to {@link MoreExecutors#newSequentialExecutor}. This class is different
+ * in a few ways:
+ *
+ * <ul>
+ *   <li>Each task may be associated with a different executor.
+ *   <li>Tasks may be of type {@code AsyncCallable}.
+ *   <li>Running tasks <i>cannot</i> be interrupted. (Note that {@code newSequentialExecutor} does
+ *       not return {@code Future} objects, so it doesn't support interruption directly, either.
+ *       However, utilities that <i>use</i> that executor have the ability to interrupt tasks
+ *       running on it. This class, by contrast, does not expose an {@code Executor} API.)
+ * </ul>
+ *
+ * <p>If you don't need the features of this class, you may prefer {@code newSequentialExecutor} for
+ * its simplicity and ability to accommodate interruption.
  *
  * @since 26.0
  */
@@ -48,15 +87,47 @@
     return new ExecutionSequencer();
   }
 
-  enum RunningState {
-    NOT_RUN,
-    CANCELLED,
-    STARTED,
-  }
-
   /** This reference acts as a pointer tracking the head of a linked list of ListenableFutures. */
-  private final AtomicReference<ListenableFuture<Object>> ref =
-      new AtomicReference<>(immediateFuture(null));
+  private final AtomicReference<ListenableFuture<Void>> ref =
+      new AtomicReference<>(immediateVoidFuture());
+
+  private ThreadConfinedTaskQueue latestTaskQueue = new ThreadConfinedTaskQueue();
+
+  /**
+   * This object is unsafely published, but avoids problematic races by relying exclusively on the
+   * identity equality of its Thread field so that the task field is only accessed by a single
+   * thread.
+   */
+  private static final class ThreadConfinedTaskQueue {
+    /**
+     * This field is only used for identity comparisons with the current thread. Field assignments
+     * are atomic, but do not provide happens-before ordering; however:
+     *
+     * <ul>
+     *   <li>If this field's value == currentThread, we know that it's up to date, because write
+     *       operations in a thread always happen-before subsequent read operations in the same
+     *       thread
+     *   <li>If this field's value == null because of unsafe publication, we know that it isn't the
+     *       object associated with our thread, because if it was the publication wouldn't have been
+     *       unsafe and we'd have seen our thread as the value. This state is also why a new
+     *       ThreadConfinedTaskQueue object must be created for each inline execution, because
+     *       observing a null thread does not mean the object is safe to reuse.
+     *   <li>If this field's value is some other thread object, we know that it's not our thread.
+     *   <li>If this field's value == null because it originally belonged to another thread and that
+     *       thread cleared it, we still know that it's not associated with our thread
+     *   <li>If this field's value == null because it was associated with our thread and was
+     *       cleared, we know that we're not executing inline any more
+     * </ul>
+     *
+     * 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;
+    /** Only used by the thread associated with this object */
+    Runnable nextTask;
+    /** Only used by the thread associated with this object */
+    Executor nextExecutor;
+  }
 
   /**
    * Enqueues a task to run when the previous task (if any) completes.
@@ -67,6 +138,7 @@
    */
   public <T> ListenableFuture<T> submit(final Callable<T> callable, Executor executor) {
     checkNotNull(callable);
+    checkNotNull(executor);
     return submitAsync(
         new AsyncCallable<T>() {
           @Override
@@ -92,12 +164,13 @@
   public <T> ListenableFuture<T> submitAsync(
       final AsyncCallable<T> callable, final Executor executor) {
     checkNotNull(callable);
-    final AtomicReference<RunningState> runningState = new AtomicReference<>(NOT_RUN);
+    checkNotNull(executor);
+    final TaskNonReentrantExecutor taskExecutor = new TaskNonReentrantExecutor(executor, this);
     final AsyncCallable<T> task =
         new AsyncCallable<T>() {
           @Override
           public ListenableFuture<T> call() throws Exception {
-            if (!runningState.compareAndSet(NOT_RUN, STARTED)) {
+            if (!taskExecutor.trySetStarted()) {
               return immediateCancelledFuture();
             }
             return callable.call();
@@ -119,20 +192,13 @@
      * have completed - namely after oldFuture is done, and taskFuture has either completed or been
      * cancelled before the callable started execution.
      */
-    final SettableFuture<Object> newFuture = SettableFuture.create();
+    final SettableFuture<Void> newFuture = SettableFuture.create();
 
-    final ListenableFuture<?> oldFuture = ref.getAndSet(newFuture);
+    final ListenableFuture<Void> oldFuture = ref.getAndSet(newFuture);
 
     // Invoke our task once the previous future completes.
-    final ListenableFuture<T> taskFuture =
-        Futures.submitAsync(
-            task,
-            new Executor() {
-              @Override
-              public void execute(Runnable runnable) {
-                oldFuture.addListener(runnable, executor);
-              }
-            });
+    final TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
+    oldFuture.addListener(taskFuture, taskExecutor);
 
     final ListenableFuture<T> outputFuture = Futures.nonCancellationPropagating(taskFuture);
 
@@ -144,15 +210,39 @@
         new Runnable() {
           @Override
           public void run() {
-            if (taskFuture.isDone()
-                // If this CAS succeeds, we know that the provided callable will never be invoked,
-                // so when oldFuture completes it is safe to allow the next submitted task to
-                // proceed.
-                || (outputFuture.isCancelled() && runningState.compareAndSet(NOT_RUN, CANCELLED))) {
+            if (taskFuture.isDone()) {
               // Since the value of oldFuture can only ever be immediateFuture(null) or setFuture of
               // a future that eventually came from immediateFuture(null), this doesn't leak
               // throwables or completion values.
               newFuture.setFuture(oldFuture);
+            } else if (outputFuture.isCancelled() && taskExecutor.trySetCancelled()) {
+              // If this CAS succeeds, we know that the provided callable will never be invoked,
+              // so when oldFuture completes it is safe to allow the next submitted task to
+              // proceed. Doing this immediately here lets the next task run without waiting for
+              // the cancelled task's executor to run the noop AsyncCallable.
+              //
+              // ---
+              //
+              // If the CAS fails, the provided callable already started running (or it is about
+              // to). Our contract promises:
+              //
+              // 1. not to execute a new callable until the old one has returned
+              //
+              // If we were to cancel taskFuture, that would let the next task start while the old
+              // one is still running.
+              //
+              // Now, maybe we could tweak our implementation to not start the next task until the
+              // callable actually completes. (We could detect completion in our wrapper
+              // `AsyncCallable task`.) However, our contract also promises:
+              //
+              // 2. not to cancel any Future the user returned from an AsyncCallable
+              //
+              // We promise this because, once we cancel that Future, we would no longer be able to
+              // tell when any underlying work it is doing is done. Thus, we might start a new task
+              // while that underlying work is still running.
+              //
+              // So that is why we cancel only in the case of CAS success.
+              taskFuture.cancel(false);
             }
           }
         };
@@ -164,4 +254,163 @@
 
     return outputFuture;
   }
+
+  enum RunningState {
+    NOT_RUN,
+    CANCELLED,
+    STARTED,
+  }
+
+  /**
+   * This class helps avoid a StackOverflowError when large numbers of tasks are submitted with
+   * {@link MoreExecutors#directExecutor}. Normally, when the first future completes, all the other
+   * tasks would be called recursively. Here, we detect that the delegate executor is executing
+   * inline, and maintain a queue to dispatch tasks iteratively. There is one instance of this class
+   * per call to submit() or submitAsync(), and each instance supports only one call to execute().
+   *
+   * <p>This class would certainly be simpler and easier to reason about if it were built with
+   * ThreadLocal; however, ThreadLocal is not well optimized for the case where the ThreadLocal is
+   * non-static, and is initialized/removed frequently - this causes churn in the Thread specific
+   * hashmaps. Using a static ThreadLocal to avoid that overhead would mean that different
+   * ExecutionSequencer objects interfere with each other, which would be undesirable, in addition
+   * to increasing the memory footprint of every thread that interacted with it. In order to release
+   * entries in thread-specific maps when the ThreadLocal object itself is no longer referenced,
+   * ThreadLocal is usually implemented with a WeakReference, which can have negative performance
+   * 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 {
+
+    /**
+     * Used to update and read the latestTaskQueue field. Set to null once the runnable has been run
+     * or queued.
+     */
+    ExecutionSequencer sequencer;
+
+    /**
+     * Executor the task was set to run on. Set to null when the task has been queued, run, or
+     * cancelled.
+     */
+    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;
+
+    /** Thread that called execute(). Set in execute, cleared when delegate.execute() returns. */
+    Thread submitting;
+
+    private TaskNonReentrantExecutor(Executor delegate, ExecutionSequencer sequencer) {
+      super(NOT_RUN);
+      this.delegate = delegate;
+      this.sequencer = sequencer;
+    }
+
+    @Override
+    public void execute(Runnable task) {
+      // If this operation was successfully cancelled already, calling the runnable will be a noop.
+      // This also avoids a race where if outputFuture is cancelled, it will call taskFuture.cancel,
+      // which will call newFuture.setFuture(oldFuture), to allow the next task in the queue to run
+      // without waiting for the user's executor to run our submitted Runnable. However, this can
+      // interact poorly with the reentrancy-avoiding behavior of this executor - when the operation
+      // before the cancelled future completes, it will synchronously complete both the newFuture
+      // from the cancelled operation and its own. This can cause one runnable to queue two tasks,
+      // breaking the invariant this method relies on to iteratively run the next task after the
+      // previous one completes.
+      if (get() == RunningState.CANCELLED) {
+        delegate = null;
+        sequencer = null;
+        return;
+      }
+      submitting = Thread.currentThread();
+      try {
+        ThreadConfinedTaskQueue submittingTaskQueue = 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
+          // can't know without submitting something to the executor) so queue to run iteratively.
+          // Task must be null, since each execution on this executor can only produce one more
+          // execution.
+          checkState(submittingTaskQueue.nextTask == null);
+          submittingTaskQueue.nextTask = task;
+          submittingTaskQueue.nextExecutor = delegate;
+          delegate = null;
+        } else {
+          Executor localDelegate = delegate;
+          delegate = null;
+          this.task = task;
+          localDelegate.execute(this);
+        }
+      } finally {
+        // Important to null this out here - if we did *not* execute inline, we might still
+        // run() on the same thread that called execute() - such as in a thread pool, and think
+        // that it was happening inline. As a side benefit, avoids holding on to the Thread object
+        // longer than necessary.
+        submitting = null;
+      }
+    }
+
+    @SuppressWarnings("ShortCircuitBoolean")
+    @Override
+    public void run() {
+      Thread currentThread = Thread.currentThread();
+      if (currentThread != submitting) {
+        Runnable localTask = task;
+        task = null;
+        localTask.run();
+        return;
+      }
+      // Executor called reentrantly! Make sure that further calls don't overflow stack. Further
+      // reentrant calls will see that their current thread is the same as the one set in
+      // latestTaskQueue, and queue rather than calling execute() directly.
+      ThreadConfinedTaskQueue executingTaskQueue = new ThreadConfinedTaskQueue();
+      executingTaskQueue.thread = currentThread;
+      // 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
+      // one execute() call to another instance from the same ExecutionSequencer, we know by
+      // induction that the task that launched this one must not have added any other runnables to
+      // that thread's queue, and thus we cannot be replacing a TaskAndThread object that would
+      // 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;
+      sequencer = null;
+      try {
+        Runnable localTask = task;
+        task = null;
+        localTask.run();
+        // Now check if our task attempted to reentrantly execute the next task.
+        Runnable queuedTask;
+        Executor queuedExecutor;
+        // Intentionally using non-short-circuit operator
+        while ((queuedTask = executingTaskQueue.nextTask) != null
+            & (queuedExecutor = executingTaskQueue.nextExecutor) != null) {
+          executingTaskQueue.nextTask = null;
+          executingTaskQueue.nextExecutor = null;
+          queuedExecutor.execute(queuedTask);
+        }
+      } finally {
+        // Null out the thread field, so that we don't leak a reference to Thread, and so that
+        // future `thread == currentThread()` calls from this thread don't incorrectly queue instead
+        // of executing. Don't null out the latestTaskQueue field, because the work done here
+        // may have scheduled more operations on another thread, and if those operations then
+        // trigger reentrant calls that thread will have updated the latestTaskQueue field, and
+        // we'd be interfering with their operation.
+        executingTaskQueue.thread = null;
+      }
+    }
+
+    private boolean trySetStarted() {
+      return compareAndSet(NOT_RUN, STARTED);
+    }
+
+    private boolean trySetCancelled() {
+      return compareAndSet(NOT_RUN, CANCELLED);
+    }
+  }
 }
diff --git a/guava/src/com/google/common/util/concurrent/FluentFuture.java b/guava/src/com/google/common/util/concurrent/FluentFuture.java
index c7d7955..88696ea 100644
--- a/guava/src/com/google/common/util/concurrent/FluentFuture.java
+++ b/guava/src/com/google/common/util/concurrent/FluentFuture.java
@@ -14,11 +14,16 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Function;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
+import java.time.Duration;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ScheduledExecutorService;
@@ -45,7 +50,7 @@
  * debugging, and cancellation. Examples of frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <h4>{@link java.util.concurrent.CompletableFuture} / {@link java.util.concurrent.CompletionStage}
@@ -67,6 +72,7 @@
  * @since 23.0
  */
 @Beta
+@DoNotMock("Use FluentFuture.from(Futures.immediate*Future) or SettableFuture")
 @GwtCompatible(emulated = true)
 public abstract class FluentFuture<V> extends GwtFluentFutureCatchingSpecialization<V> {
 
@@ -127,6 +133,17 @@
   }
 
   /**
+   * Simply returns its argument.
+   *
+   * @deprecated no need to use this
+   * @since 28.0
+   */
+  @Deprecated
+  public static <V> FluentFuture<V> from(FluentFuture<V> future) {
+    return checkNotNull(future);
+  }
+
+  /**
    * Returns a {@code Future} whose result is taken from this {@code Future} or, if this {@code
    * Future} fails with the given {@code exceptionType}, from the result provided by the {@code
    * fallback}. {@link Function#apply} is not invoked until the primary input has failed, so if the
@@ -240,6 +257,22 @@
    * ({@code this}) will be cancelled and interrupted.
    *
    * @param timeout when to time out the future
+   * @param scheduledExecutor The executor service to enforce the timeout.
+   * @since 28.0
+   */
+  @GwtIncompatible // ScheduledExecutorService
+  public final FluentFuture<V> withTimeout(
+      Duration timeout, ScheduledExecutorService scheduledExecutor) {
+    return withTimeout(toNanosSaturated(timeout), TimeUnit.NANOSECONDS, scheduledExecutor);
+  }
+
+  /**
+   * Returns a future that delegates to this future but will finish early (via a {@link
+   * TimeoutException} wrapped in an {@link ExecutionException}) if the specified timeout expires.
+   * If the timeout expires, not only will the output future finish, but also the input future
+   * ({@code this}) will be cancelled and interrupted.
+   *
+   * @param timeout when to time out the future
    * @param unit the time unit of the time parameter
    * @param scheduledExecutor The executor service to enforce the timeout.
    */
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingCheckedFuture.java b/guava/src/com/google/common/util/concurrent/ForwardingCheckedFuture.java
deleted file mode 100644
index 75d9ce8..0000000
--- a/guava/src/com/google/common/util/concurrent/ForwardingCheckedFuture.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2011 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.Beta;
-import com.google.common.annotations.GwtIncompatible;
-import com.google.common.base.Preconditions;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A future which forwards all its method calls to another future. Subclasses should override one or
- * more methods to modify the behavior of the backing future as desired per the <a href=
- * "http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>.
- *
- * <p>Most subclasses can simply extend {@link SimpleForwardingCheckedFuture}.
- *
- * @param <V> The result type returned by this Future's {@code get} method
- * @param <X> The type of the Exception thrown by the Future's {@code checkedGet} method
- * @author Anthony Zana
- * @since 9.0
- * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
- *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
- *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
- *     Additionally, it has a surprising policy about which exceptions to map and which to leave
- *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
- *     use, possibly specializing them to the particular exception type they use. We recommend that
- *     most people use {@code ListenableFuture} and perform any exception wrapping themselves. This
- *     class is scheduled for removal from Guava in January 2019.
- */
-// TODO(b/72241575): Remove by 2019-01
-@Beta
-@Deprecated
-@GwtIncompatible
-public abstract class ForwardingCheckedFuture<V, X extends Exception>
-    extends ForwardingListenableFuture<V> implements CheckedFuture<V, X> {
-
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet() throws X {
-    return delegate().checkedGet();
-  }
-
-  @CanIgnoreReturnValue
-  @Override
-  public V checkedGet(long timeout, TimeUnit unit) throws TimeoutException, X {
-    return delegate().checkedGet(timeout, unit);
-  }
-
-  @Override
-  protected abstract CheckedFuture<V, X> delegate();
-
-  // TODO(cpovirk): Use Standard Javadoc form for SimpleForwarding*
-  /**
-   * A simplified version of {@link ForwardingCheckedFuture} where subclasses can pass in an already
-   * constructed {@link CheckedFuture} as the delegate.
-   *
-   * @since 9.0
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This class is scheduled for removal from Guava in October 2018.
-   */
-  @Beta
-  @Deprecated
-  public abstract static class SimpleForwardingCheckedFuture<V, X extends Exception>
-      extends ForwardingCheckedFuture<V, X> {
-    private final CheckedFuture<V, X> delegate;
-
-    protected SimpleForwardingCheckedFuture(CheckedFuture<V, X> delegate) {
-      this.delegate = Preconditions.checkNotNull(delegate);
-    }
-
-    @Override
-    protected final CheckedFuture<V, X> delegate() {
-      return delegate;
-    }
-  }
-}
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java b/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
index fce638f..984fd68 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
@@ -70,4 +70,9 @@
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate.get(timeout, unit);
   }
+
+  @Override
+  public String toString() {
+    return delegate.toString();
+  }
 }
diff --git a/guava/src/com/google/common/util/concurrent/Futures.java b/guava/src/com/google/common/util/concurrent/Futures.java
index dc2f104..6bad226 100644
--- a/guava/src/com/google/common/util/concurrent/Futures.java
+++ b/guava/src/com/google/common/util/concurrent/Futures.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+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;
 
@@ -28,11 +29,11 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.CollectionFuture.ListFuture;
 import com.google.common.util.concurrent.ImmediateFuture.ImmediateCancelledFuture;
-import com.google.common.util.concurrent.ImmediateFuture.ImmediateFailedCheckedFuture;
 import com.google.common.util.concurrent.ImmediateFuture.ImmediateFailedFuture;
-import com.google.common.util.concurrent.ImmediateFuture.ImmediateSuccessfulCheckedFuture;
-import com.google.common.util.concurrent.ImmediateFuture.ImmediateSuccessfulFuture;
+import com.google.common.util.concurrent.internal.InternalFutureFailureAccess;
+import com.google.common.util.concurrent.internal.InternalFutures;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.time.Duration;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -40,6 +41,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -60,7 +62,7 @@
  * monitoring, debugging, and cancellation. Examples of frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <p>If you do chain your operations manually, you may want to use {@link FluentFuture}.
@@ -121,77 +123,29 @@
   private Futures() {}
 
   /**
-   * Creates a {@link CheckedFuture} out of a normal {@link ListenableFuture} and a {@link Function}
-   * that maps from {@link Exception} instances into the appropriate checked type.
-   *
-   * <p><b>Warning:</b> We recommend against using {@code CheckedFuture} in new projects. {@code
-   * CheckedFuture} is difficult to build libraries atop. {@code CheckedFuture} ports of methods
-   * like {@link Futures#transformAsync} have historically had bugs, and some of these bugs are
-   * necessary, unavoidable consequences of the {@code CheckedFuture} API. Additionally, {@code
-   * CheckedFuture} encourages users to take exceptions from one thread and rethrow them in another,
-   * producing confusing stack traces.
-   *
-   * <p>The given mapping function will be applied to an {@link InterruptedException}, a {@link
-   * CancellationException}, or an {@link ExecutionException}. See {@link Future#get()} for details
-   * on the exceptions thrown.
-   *
-   * @since 9.0 (source-compatible since 1.0)
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This method is scheduled for removal from Guava in January 2019.
-   */
-  // TODO(b/72241575): Remove by 2019-01
-  @Beta
-  @Deprecated
-  @GwtIncompatible // TODO
-  public static <V, X extends Exception> CheckedFuture<V, X> makeChecked(
-      ListenableFuture<V> future, Function<? super Exception, X> mapper) {
-    return new MappingCheckedFuture<>(checkNotNull(future), mapper);
-  }
-
-  /**
    * Creates a {@code ListenableFuture} which has its value set immediately upon construction. The
    * 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) {
     if (value == null) {
-      // This cast is safe because null is assignable to V for all V (i.e. it is covariant)
-      @SuppressWarnings({"unchecked", "rawtypes"})
-      ListenableFuture<V> typedNull = (ListenableFuture) ImmediateSuccessfulFuture.NULL;
+      // This cast is safe because null is assignable to V for all V (i.e. it is bivariant)
+      @SuppressWarnings("unchecked")
+      ListenableFuture<V> typedNull = (ListenableFuture<V>) ImmediateFuture.NULL;
       return typedNull;
     }
-    return new ImmediateSuccessfulFuture<V>(value);
+    return new ImmediateFuture<>(value);
   }
 
   /**
-   * Returns a {@code CheckedFuture} which has its value set immediately upon construction.
+   * Returns a successful {@code ListenableFuture<Void>}. This method is equivalent to {@code
+   * immediateFuture(null)} except that it is restricted to produce futures of type {@code Void}.
    *
-   * <p>The returned {@code Future} can't be cancelled, and its {@code isDone()} method always
-   * returns {@code true}. Calling {@code get()} or {@code checkedGet()} will immediately return the
-   * provided value.
-   *
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This method is scheduled for removal from Guava in January 2019.
+   * @since 29.0
    */
-  // TODO(b/72241893): Remove by 2019-01
-  @Beta
-  @Deprecated
-  @GwtIncompatible // TODO
-  public static <V, X extends Exception> CheckedFuture<V, X> immediateCheckedFuture(
-      @Nullable V value) {
-    return new ImmediateSuccessfulCheckedFuture<>(value);
+  @SuppressWarnings("unchecked")
+  public static ListenableFuture<Void> immediateVoidFuture() {
+    return (ListenableFuture<Void>) ImmediateFuture.NULL;
   }
 
   /**
@@ -217,30 +171,30 @@
   }
 
   /**
-   * Returns a {@code CheckedFuture} which has an exception set immediately upon construction.
+   * Executes {@code callable} on the specified {@code executor}, returning a {@code Future}.
    *
-   * <p>The returned {@code Future} can't be cancelled, and its {@code isDone()} method always
-   * returns {@code true}. Calling {@code get()} will immediately throw the provided {@code
-   * Exception} wrapped in an {@code ExecutionException}, and calling {@code checkedGet()} will
-   * throw the provided exception itself.
-   *
-   * @deprecated {@link CheckedFuture} cannot properly support the chained operations that are the
-   *     primary goal of {@link ListenableFuture}. {@code CheckedFuture} also encourages users to
-   *     rethrow exceptions from one thread in another thread, producing misleading stack traces.
-   *     Additionally, it has a surprising policy about which exceptions to map and which to leave
-   *     untouched. Guava users who want a {@code CheckedFuture} can fork the classes for their own
-   *     use, possibly specializing them to the particular exception type they use. We recommend
-   *     that most people use {@code ListenableFuture} and perform any exception wrapping
-   *     themselves. This method is scheduled for removal from Guava in January 2019.
+   * @throws RejectedExecutionException if the task cannot be scheduled for execution
+   * @since 28.2
    */
-  // TODO(b/72241500): Remove by 2019-01
   @Beta
-  @Deprecated
-  @GwtIncompatible // TODO
-  public static <V, X extends Exception> CheckedFuture<V, X> immediateFailedCheckedFuture(
-      X exception) {
-    checkNotNull(exception);
-    return new ImmediateFailedCheckedFuture<>(exception);
+  public static <O> ListenableFuture<O> submit(Callable<O> callable, Executor executor) {
+    TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
+    executor.execute(task);
+    return task;
+  }
+
+  /**
+   * Executes {@code runnable} on the specified {@code executor}, returning a {@code Future} that
+   * will complete after execution.
+   *
+   * @throws RejectedExecutionException if the task cannot be scheduled for execution
+   * @since 28.2
+   */
+  @Beta
+  public static ListenableFuture<Void> submit(Runnable runnable, Executor executor) {
+    TrustedListenableFutureTask<Void> task = TrustedListenableFutureTask.create(runnable, null);
+    executor.execute(task);
+    return task;
   }
 
   /**
@@ -260,6 +214,19 @@
    * Schedules {@code callable} on the specified {@code executor}, returning a {@code Future}.
    *
    * @throws RejectedExecutionException if the task cannot be scheduled for execution
+   * @since 28.0
+   */
+  @Beta
+  @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
+  public static <O> ListenableFuture<O> scheduleAsync(
+      AsyncCallable<O> callable, Duration delay, ScheduledExecutorService executorService) {
+    return scheduleAsync(callable, toNanosSaturated(delay), TimeUnit.NANOSECONDS, executorService);
+  }
+
+  /**
+   * Schedules {@code callable} on the specified {@code executor}, returning a {@code Future}.
+   *
+   * @throws RejectedExecutionException if the task cannot be scheduled for execution
    * @since 23.0
    */
   @Beta
@@ -304,9 +271,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method.
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * @param input the primary input {@code Future}
    * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
@@ -371,11 +336,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method. (Specifically, {@code directExecutor} functions should avoid
-   * heavyweight operations inside {@code AsyncFunction.apply}. Any heavyweight operations should
-   * occur in other threads responsible for completing the returned {@code Future}.)
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * @param input the primary input {@code Future}
    * @param exceptionType the exception type that triggers use of {@code fallback}. The exception
@@ -409,6 +370,24 @@
    *
    * @param delegate The future to delegate to.
    * @param time when to timeout the future
+   * @param scheduledExecutor The executor service to enforce the timeout.
+   * @since 28.0
+   */
+  @Beta
+  @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
+  public static <V> ListenableFuture<V> withTimeout(
+      ListenableFuture<V> delegate, Duration time, ScheduledExecutorService scheduledExecutor) {
+    return withTimeout(delegate, toNanosSaturated(time), TimeUnit.NANOSECONDS, scheduledExecutor);
+  }
+
+  /**
+   * Returns a future that delegates to another but will finish early (via a {@link
+   * TimeoutException} wrapped in an {@link ExecutionException}) if the specified duration expires.
+   *
+   * <p>The delegate future is interrupted and cancelled if it times out.
+   *
+   * @param delegate The future to delegate to.
+   * @param time when to timeout the future
    * @param unit the time unit of the time parameter
    * @param scheduledExecutor The executor service to enforce the timeout.
    * @since 19.0
@@ -443,11 +422,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method. (Specifically, {@code directExecutor} functions should avoid
-   * heavyweight operations inside {@code AsyncFunction.apply}. Any heavyweight operations should
-   * occur in other threads responsible for completing the returned {@code Future}.)
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * <p>The returned {@code Future} attempts to keep its cancellation state in sync with that of the
    * input future and that of the future returned by the chain function. That is, if the returned
@@ -483,9 +458,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * functions passed to this method.
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * <p>The returned {@code Future} attempts to keep its cancellation state in sync with that of the
    * input future. That is, if the returned {@code Future} is cancelled, it will attempt to cancel
@@ -578,6 +551,9 @@
    *
    * <p>The list of results is in the same order as the input list.
    *
+   * <p>This differs from {@link #successfulAsList(ListenableFuture[])} in that it will return a
+   * failed future if any of the items fails.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures, and if any of the
    * provided futures fails or is canceled, this one is, too.
    *
@@ -597,6 +573,9 @@
    *
    * <p>The list of results is in the same order as the input list.
    *
+   * <p>This differs from {@link #successfulAsList(Iterable)} in that it will return a failed future
+   * if any of the items fails.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures, and if any of the
    * provided futures fails or is canceled, this one is, too.
    *
@@ -614,6 +593,8 @@
    * Creates a {@link FutureCombiner} that processes the completed futures whether or not they're
    * successful.
    *
+   * <p>Any failures from the input futures will not be propagated to the returned future.
+   *
    * @since 20.0
    */
   @Beta
@@ -626,6 +607,8 @@
    * Creates a {@link FutureCombiner} that processes the completed futures whether or not they're
    * successful.
    *
+   * <p>Any failures from the input futures will not be propagated to the returned future.
+   *
    * @since 20.0
    */
   @Beta
@@ -818,6 +801,11 @@
    * {@code null} (which is indistinguishable from the future having a successful value of {@code
    * null}).
    *
+   * <p>The list of results is in the same order as the input list.
+   *
+   * <p>This differs from {@link #allAsList(ListenableFuture[])} in that it's tolerant of failed
+   * futures for any of the items, representing them as {@code null} in the result list.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures.
    *
    * @param futures futures to combine
@@ -838,6 +826,11 @@
    * {@code null} (which is indistinguishable from the future having a successful value of {@code
    * null}).
    *
+   * <p>The list of results is in the same order as the input list.
+   *
+   * <p>This differs from {@link #allAsList(Iterable)} in that it's tolerant of failed futures for
+   * any of the items, representing them as {@code null} in the result list.
+   *
    * <p>Canceling this future will attempt to cancel all the component futures.
    *
    * @param futures futures to combine
@@ -1014,6 +1007,11 @@
    * callbacks, but any callback added through this method is guaranteed to be called once the
    * computation is complete.
    *
+   * <p>Exceptions thrown by a {@code callback} will be propagated up to the executor. Any exception
+   * thrown during {@code Executor.execute} (e.g., a {@code RejectedExecutionException} or an
+   * exception thrown by {@linkplain MoreExecutors#directExecutor direct execution}) will be caught
+   * and logged.
+   *
    * <p>Example:
    *
    * <pre>{@code
@@ -1031,9 +1029,7 @@
    * }</pre>
    *
    * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
-   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
-   * documentation. All its warnings about heavyweight listeners are also applicable to heavyweight
-   * callbacks passed to this method.
+   * the warnings the {@link MoreExecutors#directExecutor} documentation.
    *
    * <p>For a more general interface to attach a completion listener to a {@code Future}, see {@link
    * ListenableFuture#addListener addListener}.
@@ -1063,6 +1059,14 @@
 
     @Override
     public void run() {
+      if (future instanceof InternalFutureFailureAccess) {
+        Throwable failure =
+            InternalFutures.tryInternalFastPathGetFailure((InternalFutureFailureAccess) future);
+        if (failure != null) {
+          callback.onFailure(failure);
+          return;
+        }
+      }
       final V value;
       try {
         value = getDone(future);
@@ -1210,6 +1214,57 @@
    * @throws CancellationException if {@code get} throws a {@code CancellationException}
    * @throws IllegalArgumentException if {@code exceptionClass} extends {@code RuntimeException} or
    *     does not have a suitable constructor
+   * @since 28.0
+   */
+  @Beta
+  @CanIgnoreReturnValue
+  @GwtIncompatible // reflection
+  public static <V, X extends Exception> V getChecked(
+      Future<V> future, Class<X> exceptionClass, Duration timeout) throws X {
+    return getChecked(future, exceptionClass, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Returns the result of {@link Future#get(long, TimeUnit)}, converting most exceptions to a new
+   * instance of the given checked exception type. This reduces boilerplate for a common use of
+   * {@code Future} in which it is unnecessary to programmatically distinguish between exception
+   * types or to extract other information from the exception instance.
+   *
+   * <p>Exceptions from {@code Future.get} are treated as follows:
+   *
+   * <ul>
+   *   <li>Any {@link ExecutionException} has its <i>cause</i> wrapped in an {@code X} if the cause
+   *       is a checked exception, an {@link UncheckedExecutionException} if the cause is a {@code
+   *       RuntimeException}, or an {@link ExecutionError} if the cause is an {@code Error}.
+   *   <li>Any {@link InterruptedException} is wrapped in an {@code X} (after restoring the
+   *       interrupt).
+   *   <li>Any {@link TimeoutException} is wrapped in an {@code X}.
+   *   <li>Any {@link CancellationException} is propagated untouched, as is any other {@link
+   *       RuntimeException} (though {@code get} implementations are discouraged from throwing such
+   *       exceptions).
+   * </ul>
+   *
+   * <p>The overall principle is to continue to treat every checked exception as a checked
+   * exception, every unchecked exception as an unchecked exception, and every error as an error. In
+   * addition, the cause of any {@code ExecutionException} is wrapped in order to ensure that the
+   * new stack trace matches that of the current thread.
+   *
+   * <p>Instances of {@code exceptionClass} are created by choosing an arbitrary public constructor
+   * that accepts zero or more arguments, all of type {@code String} or {@code Throwable}
+   * (preferring constructors with at least one {@code String}) and calling the constructor via
+   * reflection. If the exception did not already have a cause, one is set by calling {@link
+   * Throwable#initCause(Throwable)} on it. If no such constructor exists, an {@code
+   * IllegalArgumentException} is thrown.
+   *
+   * @throws X if {@code get} throws any checked exception except for an {@code ExecutionException}
+   *     whose cause is not itself a checked exception
+   * @throws UncheckedExecutionException if {@code get} throws an {@code ExecutionException} with a
+   *     {@code RuntimeException} as its cause
+   * @throws ExecutionError if {@code get} throws an {@code ExecutionException} with an {@code
+   *     Error} as its cause
+   * @throws CancellationException if {@code get} throws a {@code CancellationException}
+   * @throws IllegalArgumentException if {@code exceptionClass} extends {@code RuntimeException} or
+   *     does not have a suitable constructor
    * @since 19.0 (in 10.0 as {@code get} and with different parameter order)
    */
   @Beta
@@ -1289,25 +1344,4 @@
    * If you think you would use this method, let us know. You might also also look into the
    * Fork-Join framework: http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
    */
-
-  /**
-   * A checked future that uses a function to map from exceptions to the appropriate checked type.
-   */
-  @GwtIncompatible // TODO
-  private static class MappingCheckedFuture<V, X extends Exception>
-      extends AbstractCheckedFuture<V, X> {
-
-    final Function<? super Exception, X> mapper;
-
-    MappingCheckedFuture(ListenableFuture<V> delegate, Function<? super Exception, X> mapper) {
-      super(delegate);
-
-      this.mapper = checkNotNull(mapper);
-    }
-
-    @Override
-    protected X mapException(Exception e) {
-      return mapper.apply(e);
-    }
-  }
 }
diff --git a/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java b/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
index fce8546..2365040 100644
--- a/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
+++ b/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
@@ -36,7 +36,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.checkerframework.checker.nullness.qual.Nullable;
-import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
 
 /** Static methods used to implement {@link Futures#getChecked(Future, Class)}. */
 @GwtIncompatible
diff --git a/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java b/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
new file mode 100644
index 0000000..b557ac6
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
@@ -0,0 +1,17 @@
+/*
+ * 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 f53e35b..7bee37d 100644
--- a/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
@@ -17,7 +17,6 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.annotations.GwtIncompatible;
 import com.google.common.util.concurrent.AbstractFuture.TrustedFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
@@ -26,11 +25,20 @@
 import java.util.logging.Logger;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
-/** Implementations of {@code Futures.immediate*}. */
-@GwtCompatible(emulated = true)
-abstract class ImmediateFuture<V> implements ListenableFuture<V> {
+/** Implementation of {@link Futures#immediateFuture}. */
+@GwtCompatible
+// 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);
+
   private static final Logger log = Logger.getLogger(ImmediateFuture.class.getName());
 
+  private final @Nullable V value;
+
+  ImmediateFuture(@Nullable V value) {
+    this.value = value;
+  }
+
   @Override
   public void addListener(Runnable listener, Executor executor) {
     checkNotNull(listener, "Runnable was null.");
@@ -52,8 +60,11 @@
     return false;
   }
 
+  // TODO(lukes): Consider throwing InterruptedException when appropriate.
   @Override
-  public abstract V get() throws ExecutionException;
+  public V get() {
+    return value;
+  }
 
   @Override
   public V get(long timeout, TimeUnit unit) throws ExecutionException {
@@ -71,57 +82,10 @@
     return true;
   }
 
-  static class ImmediateSuccessfulFuture<V> extends ImmediateFuture<V> {
-    static final ImmediateSuccessfulFuture<Object> NULL = new ImmediateSuccessfulFuture<>(null);
-    private final @Nullable V value;
-
-    ImmediateSuccessfulFuture(@Nullable V value) {
-      this.value = value;
-    }
-
-    // TODO(lukes): Consider throwing InterruptedException when appropriate.
-    @Override
-    public V get() {
-      return value;
-    }
-
-    @Override
-    public String toString() {
-      // Behaviour analogous to AbstractFuture#toString().
-      return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
-    }
-  }
-
-  @GwtIncompatible // TODO
-  static class ImmediateSuccessfulCheckedFuture<V, X extends Exception> extends ImmediateFuture<V>
-      implements CheckedFuture<V, X> {
-    private final @Nullable V value;
-
-    ImmediateSuccessfulCheckedFuture(@Nullable V value) {
-      this.value = value;
-    }
-
-    @Override
-    public V get() {
-      return value;
-    }
-
-    @Override
-    public V checkedGet() {
-      return value;
-    }
-
-    @Override
-    public V checkedGet(long timeout, TimeUnit unit) {
-      checkNotNull(unit);
-      return value;
-    }
-
-    @Override
-    public String toString() {
-      // Behaviour analogous to AbstractFuture#toString().
-      return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
-    }
+  @Override
+  public String toString() {
+    // Behaviour analogous to AbstractFuture#toString().
+    return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
   }
 
   static final class ImmediateFailedFuture<V> extends TrustedFuture<V> {
@@ -135,36 +99,4 @@
       cancel(false);
     }
   }
-
-  @GwtIncompatible // TODO
-  static class ImmediateFailedCheckedFuture<V, X extends Exception> extends ImmediateFuture<V>
-      implements CheckedFuture<V, X> {
-    private final X thrown;
-
-    ImmediateFailedCheckedFuture(X thrown) {
-      this.thrown = thrown;
-    }
-
-    @Override
-    public V get() throws ExecutionException {
-      throw new ExecutionException(thrown);
-    }
-
-    @Override
-    public V checkedGet() throws X {
-      throw thrown;
-    }
-
-    @Override
-    public V checkedGet(long timeout, TimeUnit unit) throws X {
-      checkNotNull(unit);
-      throw thrown;
-    }
-
-    @Override
-    public String toString() {
-      // Behaviour analogous to AbstractFuture#toString().
-      return super.toString() + "[status=FAILURE, cause=[" + thrown + "]]";
-    }
-  }
 }
diff --git a/guava/src/com/google/common/util/concurrent/Internal.java b/guava/src/com/google/common/util/concurrent/Internal.java
new file mode 100644
index 0000000..8f83823
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/Internal.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 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;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.time.Duration;
+
+/** This class is for {@code com.google.common.util.concurrent} use only! */
+@GwtIncompatible // java.time.Duration
+final class Internal {
+
+  /**
+   * Returns the number of nanoseconds of the given duration without throwing or overflowing.
+   *
+   * <p>Instead of throwing {@link ArithmeticException}, this method silently saturates to either
+   * {@link Long#MAX_VALUE} or {@link Long#MIN_VALUE}. This behavior can be useful when decomposing
+   * a duration in order to call a legacy API which requires a {@code long, TimeUnit} pair.
+   */
+  static long toNanosSaturated(Duration duration) {
+    // Using a try/catch seems lazy, but the catch block will rarely get invoked (except for
+    // durations longer than approximately +/- 292 years).
+    try {
+      return duration.toNanos();
+    } catch (ArithmeticException tooBig) {
+      return duration.isNegative() ? Long.MIN_VALUE : Long.MAX_VALUE;
+    }
+  }
+
+  private Internal() {}
+}
diff --git a/guava/src/com/google/common/util/concurrent/ListenableFuture.java b/guava/src/com/google/common/util/concurrent/ListenableFuture.java
index 862ff2a..98e31ed 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -14,6 +14,7 @@
 
 package com.google.common.util.concurrent;
 
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
@@ -40,7 +41,7 @@
  * frameworks include:
  *
  * <ul>
- *   <li><a href="http://google.github.io/dagger/producers.html">Dagger Producers</a>
+ *   <li><a href="https://dagger.dev/producers.html">Dagger Producers</a>
  * </ul>
  *
  * <p>The main purpose of {@link #addListener addListener} is to support this chaining. You will
@@ -98,6 +99,7 @@
  * @author Nishant Thakkar
  * @since 1.0
  */
+@DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
 public interface ListenableFuture<V> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
@@ -112,20 +114,10 @@
    * thrown by {@linkplain MoreExecutors#directExecutor direct execution}) will be caught and
    * logged.
    *
-   * <p>Note: For fast, lightweight listeners that would be safe to execute in any thread, consider
-   * {@link MoreExecutors#directExecutor}. Otherwise, avoid it. Heavyweight {@code directExecutor}
-   * listeners can cause problems, and these problems can be difficult to reproduce because they
-   * depend on timing. For example:
-   *
-   * <ul>
-   *   <li>The listener may be executed by the caller of {@code addListener}. That caller may be a
-   *       UI thread or other latency-sensitive thread. This can harm UI responsiveness.
-   *   <li>The listener may be executed by the thread that completes this {@code Future}. That
-   *       thread may be an internal system thread such as an RPC network thread. Blocking that
-   *       thread may stall progress of the whole system. It may even cause a deadlock.
-   *   <li>The listener may delay other listeners, even listeners that are not themselves {@code
-   *       directExecutor} listeners.
-   * </ul>
+   * <p>Note: If your listener is lightweight -- and will not cause stack overflow by completing
+   * more futures or adding more {@code directExecutor()} listeners inline -- consider {@link
+   * MoreExecutors#directExecutor}. Otherwise, avoid it: See the warnings on the docs for {@code
+   * directExecutor}.
    *
    * <p>This is the most general listener interface. For common operations performed using
    * listeners, see {@link Futures}. For a simplified but general listener interface, see {@link
diff --git a/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java b/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
index ee7e861..eccc4d3 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
@@ -14,10 +14,17 @@
 
 package com.google.common.util.concurrent;
 
+import static java.lang.Math.min;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -80,6 +87,20 @@
     executionList.add(listener, exec);
   }
 
+  @CanIgnoreReturnValue
+  @Override
+  public V get(long timeout, TimeUnit unit)
+      throws TimeoutException, InterruptedException, ExecutionException {
+
+    long timeoutNanos = unit.toNanos(timeout);
+    if (timeoutNanos <= OverflowAvoidingLockSupport.MAX_NANOSECONDS_THRESHOLD) {
+      return super.get(timeout, unit);
+    }
+    // Waiting 68 years should be enough for any program.
+    return super.get(
+        min(timeoutNanos, OverflowAvoidingLockSupport.MAX_NANOSECONDS_THRESHOLD), NANOSECONDS);
+  }
+
   /** Internal implementation detail used to invoke the listeners. */
   @Override
   protected void done() {
diff --git a/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java b/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
index e684d71..469eb67 100644
--- a/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -31,6 +32,9 @@
  * @author Chris Povirk
  * @since 10.0
  */
+@DoNotMock(
+    "Use TestingExecutors.sameThreadScheduledExecutor, or wrap a real Executor from "
+        + "java.util.concurrent.Executors with MoreExecutors.listeningDecorator")
 @GwtIncompatible
 public interface ListeningExecutorService extends ExecutorService {
   /**
diff --git a/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java b/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
index 959a2fc..6410e83 100644
--- a/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
@@ -14,7 +14,10 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
+
 import com.google.common.annotations.GwtIncompatible;
+import java.time.Duration;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -36,17 +39,57 @@
   @Override
   ListenableScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);
 
+  /**
+   * Duration-based overload of {@link #schedule(Runnable, long, TimeUnit)}.
+   *
+   * @since 29.0
+   */
+  default ListenableScheduledFuture<?> schedule(Runnable command, Duration delay) {
+    return schedule(command, toNanosSaturated(delay), TimeUnit.NANOSECONDS);
+  }
+
   /** @since 15.0 (previously returned ScheduledFuture) */
   @Override
   <V> 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) {
+    return schedule(callable, toNanosSaturated(delay), TimeUnit.NANOSECONDS);
+  }
+
   /** @since 15.0 (previously returned ScheduledFuture) */
   @Override
   ListenableScheduledFuture<?> scheduleAtFixedRate(
       Runnable command, long initialDelay, long period, TimeUnit unit);
 
+  /**
+   * Duration-based overload of {@link #scheduleAtFixedRate(Runnable, long, long, TimeUnit)}.
+   *
+   * @since 29.0
+   */
+  default ListenableScheduledFuture<?> scheduleAtFixedRate(
+      Runnable command, Duration initialDelay, Duration period) {
+    return scheduleAtFixedRate(
+        command, toNanosSaturated(initialDelay), toNanosSaturated(period), TimeUnit.NANOSECONDS);
+  }
+
   /** @since 15.0 (previously returned ScheduledFuture) */
   @Override
   ListenableScheduledFuture<?> scheduleWithFixedDelay(
       Runnable command, long initialDelay, long delay, TimeUnit unit);
+
+  /**
+   * Duration-based overload of {@link #scheduleWithFixedDelay(Runnable, long, long, TimeUnit)}.
+   *
+   * @since 29.0
+   */
+  default ListenableScheduledFuture<?> scheduleWithFixedDelay(
+      Runnable command, Duration initialDelay, Duration delay) {
+    return scheduleWithFixedDelay(
+        command, toNanosSaturated(initialDelay), 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 8dee646..dcdd7b6 100644
--- a/guava/src/com/google/common/util/concurrent/Monitor.java
+++ b/guava/src/com/google/common/util/concurrent/Monitor.java
@@ -15,11 +15,14 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.primitives.Longs;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
 import com.google.j2objc.annotations.Weak;
+import java.time.Duration;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
@@ -385,6 +388,16 @@
    * Enters this monitor. Blocks at most the given time.
    *
    * @return whether the monitor was entered
+   * @since 28.0
+   */
+  public boolean enter(Duration time) {
+    return enter(toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Enters this monitor. Blocks at most the given time.
+   *
+   * @return whether the monitor was entered
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean enter(long time, TimeUnit unit) {
@@ -425,6 +438,17 @@
    *
    * @return whether the monitor was entered
    * @throws InterruptedException if interrupted while waiting
+   * @since 28.0
+   */
+  public boolean enterInterruptibly(Duration time) throws InterruptedException {
+    return enterInterruptibly(toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Enters this monitor. Blocks at most the given time, and may be interrupted.
+   *
+   * @return whether the monitor was entered
+   * @throws InterruptedException if interrupted while waiting
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean enterInterruptibly(long time, TimeUnit unit) throws InterruptedException {
@@ -475,6 +499,19 @@
    *
    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
    * @throws InterruptedException if interrupted while waiting
+   * @since 28.0
+   */
+  public boolean enterWhen(Guard guard, Duration time) throws InterruptedException {
+    return enterWhen(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Enters this monitor when the guard is satisfied. Blocks at most the given time, including both
+   * the time to acquire the lock and the time to wait for the guard to be satisfied, and may be
+   * interrupted.
+   *
+   * @return whether the monitor was entered, which guarantees that the guard is now satisfied
+   * @throws InterruptedException if interrupted while waiting
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean enterWhen(Guard guard, long time, TimeUnit unit) throws InterruptedException {
@@ -555,6 +592,17 @@
    * the time to acquire the lock and the time to wait for the guard to be satisfied.
    *
    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
+   * @since 28.0
+   */
+  public boolean enterWhenUninterruptibly(Guard guard, Duration time) {
+    return enterWhenUninterruptibly(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Enters this monitor when the guard is satisfied. Blocks at most the given time, including both
+   * the time to acquire the lock and the time to wait for the guard to be satisfied.
+   *
+   * @return whether the monitor was entered, which guarantees that the guard is now satisfied
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean enterWhenUninterruptibly(Guard guard, long time, TimeUnit unit) {
@@ -645,6 +693,17 @@
    * lock, but does not wait for the guard to be satisfied.
    *
    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
+   * @since 28.0
+   */
+  public boolean enterIf(Guard guard, Duration time) {
+    return enterIf(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Enters this monitor if the guard is satisfied. Blocks at most the given time acquiring the
+   * lock, but does not wait for the guard to be satisfied.
+   *
+   * @return whether the monitor was entered, which guarantees that the guard is now satisfied
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean enterIf(Guard guard, long time, TimeUnit unit) {
@@ -694,6 +753,17 @@
    * lock, but does not wait for the guard to be satisfied, and may be interrupted.
    *
    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
+   * @since 28.0
+   */
+  public boolean enterIfInterruptibly(Guard guard, Duration time) throws InterruptedException {
+    return enterIfInterruptibly(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Enters this monitor if the guard is satisfied. Blocks at most the given time acquiring the
+   * lock, but does not wait for the guard to be satisfied, and may be interrupted.
+   *
+   * @return whether the monitor was entered, which guarantees that the guard is now satisfied
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean enterIfInterruptibly(Guard guard, long time, TimeUnit unit)
@@ -764,6 +834,18 @@
    *
    * @return whether the guard is now satisfied
    * @throws InterruptedException if interrupted while waiting
+   * @since 28.0
+   */
+  public boolean waitFor(Guard guard, Duration time) throws InterruptedException {
+    return waitFor(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Waits for the guard to be satisfied. Waits at most the given time, and may be interrupted. May
+   * be called only by a thread currently occupying this monitor.
+   *
+   * @return whether the guard is now satisfied
+   * @throws InterruptedException if interrupted while waiting
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean waitFor(Guard guard, long time, TimeUnit unit) throws InterruptedException {
@@ -798,6 +880,17 @@
    * thread currently occupying this monitor.
    *
    * @return whether the guard is now satisfied
+   * @since 28.0
+   */
+  public boolean waitForUninterruptibly(Guard guard, Duration time) {
+    return waitForUninterruptibly(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Waits for the guard to be satisfied. Waits at most the given time. May be called only by a
+   * thread currently occupying this monitor.
+   *
+   * @return whether the guard is now satisfied
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean waitForUninterruptibly(Guard guard, long time, TimeUnit unit) {
@@ -938,9 +1031,7 @@
    */
   private static long toSafeNanos(long time, TimeUnit unit) {
     long timeoutNanos = unit.toNanos(time);
-    return (timeoutNanos <= 0L)
-        ? 0L
-        : (timeoutNanos > (Long.MAX_VALUE / 4) * 3) ? (Long.MAX_VALUE / 4) * 3 : timeoutNanos;
+    return Longs.constrainToRange(timeoutNanos, 0L, (Long.MAX_VALUE / 4) * 3);
   }
 
   /**
diff --git a/guava/src/com/google/common/util/concurrent/MoreExecutors.java b/guava/src/com/google/common/util/concurrent/MoreExecutors.java
index 86ea0ee..bc258ae 100644
--- a/guava/src/com/google/common/util/concurrent/MoreExecutors.java
+++ b/guava/src/com/google/common/util/concurrent/MoreExecutors.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -29,6 +30,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
 import java.lang.reflect.InvocationTargetException;
+import java.time.Duration;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -47,13 +49,12 @@
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 /**
  * Factory and utility methods for {@link java.util.concurrent.Executor}, {@link ExecutorService},
- * and {@link ThreadFactory}.
+ * and {@link java.util.concurrent.ThreadFactory}.
  *
  * @author Eric Fellheimer
  * @author Kyle Littlefield
@@ -74,6 +75,27 @@
    * @param executor the executor to modify to make sure it exits when the application is finished
    * @param terminationTimeout how long to wait for the executor to finish before terminating the
    *     JVM
+   * @return an unmodifiable version of the input which will not hang the JVM
+   * @since 28.0
+   */
+  @Beta
+  @GwtIncompatible // TODO
+  public static ExecutorService getExitingExecutorService(
+      ThreadPoolExecutor executor, Duration terminationTimeout) {
+    return getExitingExecutorService(
+        executor, toNanosSaturated(terminationTimeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Converts the given ThreadPoolExecutor into an ExecutorService that exits when the application
+   * is complete. It does so by using daemon threads and adding a shutdown hook to wait for their
+   * completion.
+   *
+   * <p>This is mainly for fixed thread pools. See {@link Executors#newFixedThreadPool(int)}.
+   *
+   * @param executor the executor to modify to make sure it exits when the application is finished
+   * @param terminationTimeout how long to wait for the executor to finish before terminating the
+   *     JVM
    * @param timeUnit unit of time for the time parameter
    * @return an unmodifiable version of the input which will not hang the JVM
    */
@@ -114,6 +136,27 @@
    * @param executor the executor to modify to make sure it exits when the application is finished
    * @param terminationTimeout how long to wait for the executor to finish before terminating the
    *     JVM
+   * @return an unmodifiable version of the input which will not hang the JVM
+   * @since 28.0
+   */
+  @Beta
+  @GwtIncompatible // java.time.Duration
+  public static ScheduledExecutorService getExitingScheduledExecutorService(
+      ScheduledThreadPoolExecutor executor, Duration terminationTimeout) {
+    return getExitingScheduledExecutorService(
+        executor, toNanosSaturated(terminationTimeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Converts the given ScheduledThreadPoolExecutor into a ScheduledExecutorService that exits when
+   * the application is complete. It does so by using daemon threads and adding a shutdown hook to
+   * wait for their completion.
+   *
+   * <p>This is mainly for fixed thread pools. See {@link Executors#newScheduledThreadPool(int)}.
+   *
+   * @param executor the executor to modify to make sure it exits when the application is finished
+   * @param terminationTimeout how long to wait for the executor to finish before terminating the
+   *     JVM
    * @param timeUnit unit of time for the time parameter
    * @return an unmodifiable version of the input which will not hang the JVM
    */
@@ -155,6 +198,23 @@
    * @param service ExecutorService which uses daemon threads
    * @param terminationTimeout how long to wait for the executor to finish before terminating the
    *     JVM
+   * @since 28.0
+   */
+  @Beta
+  @GwtIncompatible // java.time.Duration
+  public static void addDelayedShutdownHook(ExecutorService service, Duration terminationTimeout) {
+    addDelayedShutdownHook(service, toNanosSaturated(terminationTimeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Add a shutdown hook to wait for thread completion in the given {@link ExecutorService service}.
+   * This is useful if the given service uses daemon threads, and we want to keep the JVM from
+   * exiting immediately on shutdown, instead giving these daemon threads a chance to terminate
+   * normally.
+   *
+   * @param service ExecutorService which uses daemon threads
+   * @param terminationTimeout how long to wait for the executor to finish before terminating the
+   *     JVM
    * @param timeUnit unit of time for the time parameter
    */
   @Beta
@@ -340,10 +400,11 @@
 
   /**
    * Creates an executor service that runs each task in the thread that invokes {@code
-   * execute/submit}, as in {@link CallerRunsPolicy} This applies both to individually submitted
-   * tasks and to collections of tasks submitted via {@code invokeAll} or {@code invokeAny}. In the
-   * latter case, tasks will run serially on the calling thread. Tasks are run to completion before
-   * a {@code Future} is returned to the caller (unless the executor has been shutdown).
+   * execute/submit}, as in {@code ThreadPoolExecutor.CallerRunsPolicy}. This applies both to
+   * individually submitted tasks and to collections of tasks submitted via {@code invokeAll} or
+   * {@code invokeAny}. In the latter case, tasks will run serially on the calling thread. Tasks are
+   * run to completion before a {@code Future} is returned to the caller (unless the executor has
+   * been shutdown).
    *
    * <p>Although all tasks are immediately executed in the thread that submitted the task, this
    * {@code ExecutorService} imposes a small locking overhead on each task submission in order to
@@ -370,7 +431,33 @@
 
   /**
    * Returns an {@link Executor} that runs each task in the thread that invokes {@link
-   * Executor#execute execute}, as in {@link CallerRunsPolicy}.
+   * Executor#execute execute}, as in {@code ThreadPoolExecutor.CallerRunsPolicy}.
+   *
+   * <p>This executor is appropriate for tasks that are lightweight and not deeply chained.
+   * Inappropriate {@code directExecutor} usage can cause problems, and these problems can be
+   * difficult to reproduce because they depend on timing. For example:
+   *
+   * <ul>
+   *   <li>A call like {@code future.transform(function, directExecutor())} may execute the function
+   *       immediately in the thread that is calling {@code transform}. (This specific case happens
+   *       if the future is already completed.) If {@code transform} call was made from a UI thread
+   *       or other latency-sensitive thread, a heavyweight function can harm responsiveness.
+   *   <li>If the task will be executed later, consider which thread will trigger the execution --
+   *       since that thread will execute the task inline. If the thread is a shared system thread
+   *       like an RPC network thread, a heavyweight task can stall progress of the whole system or
+   *       even deadlock it.
+   *   <li>If many tasks will be triggered by the same event, one heavyweight task may delay other
+   *       tasks -- even tasks that are not themselves {@code directExecutor} tasks.
+   *   <li>If many such tasks are chained together (such as with {@code
+   *       future.transform(...).transform(...).transform(...)....}), they may overflow the stack.
+   *       (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.)
+   * </ul>
+   *
+   * Additionally, beware of executing tasks with {@code directExecutor} while holding a lock. Since
+   * the task you submit to the executor (or any other arbitrary work the executor does) may do slow
+   * work or acquire other locks, you risk deadlocks.
    *
    * <p>This instance is equivalent to:
    *
@@ -639,6 +726,20 @@
    * An implementation of {@link ExecutorService#invokeAny} for {@link ListeningExecutorService}
    * implementations.
    */
+  @GwtIncompatible static <T> T invokeAnyImpl(
+      ListeningExecutorService executorService,
+      Collection<? extends Callable<T>> tasks,
+      boolean timed,
+      Duration timeout)
+      throws InterruptedException, ExecutionException, TimeoutException {
+    return invokeAnyImpl(
+        executorService, tasks, timed, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * An implementation of {@link ExecutorService#invokeAny} for {@link ListeningExecutorService}
+   * implementations.
+   */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   @GwtIncompatible static <T> T invokeAnyImpl(
       ListeningExecutorService executorService,
@@ -739,15 +840,17 @@
   /**
    * Returns a default thread factory used to create new threads.
    *
-   * <p>On AppEngine, returns {@code ThreadManager.currentRequestThreadFactory()}. Otherwise,
-   * returns {@link Executors#defaultThreadFactory()}.
+   * <p>When running on AppEngine with access to <a
+   * href="https://cloud.google.com/appengine/docs/standard/java/javadoc/">AppEngine legacy
+   * APIs</a>, this method returns {@code ThreadManager.currentRequestThreadFactory()}. Otherwise,
+   * it returns {@link Executors#defaultThreadFactory()}.
    *
    * @since 14.0
    */
   @Beta
   @GwtIncompatible // concurrency
   public static ThreadFactory platformThreadFactory() {
-    if (!isAppEngine()) {
+    if (!isAppEngineWithApiClasses()) {
       return Executors.defaultThreadFactory();
     }
     try {
@@ -755,7 +858,16 @@
           Class.forName("com.google.appengine.api.ThreadManager")
               .getMethod("currentRequestThreadFactory")
               .invoke(null);
-    } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException e) {
+      /*
+       * Do not merge the 3 catch blocks below. javac would infer a type of
+       * ReflectiveOperationException, which Animal Sniffer would reject. (Old versions of Android
+       * don't *seem* to mind, but there might be edge cases of which we're unaware.)
+       */
+    } catch (IllegalAccessException e) {
+      throw new RuntimeException("Couldn't invoke ThreadManager.currentRequestThreadFactory", e);
+    } catch (ClassNotFoundException e) {
+      throw new RuntimeException("Couldn't invoke ThreadManager.currentRequestThreadFactory", e);
+    } catch (NoSuchMethodException e) {
       throw new RuntimeException("Couldn't invoke ThreadManager.currentRequestThreadFactory", e);
     } catch (InvocationTargetException e) {
       throw Throwables.propagate(e.getCause());
@@ -763,11 +875,16 @@
   }
 
   @GwtIncompatible // TODO
-  private static boolean isAppEngine() {
+  private static boolean isAppEngineWithApiClasses() {
     if (System.getProperty("com.google.appengine.runtime.environment") == null) {
       return false;
     }
     try {
+      Class.forName("com.google.appengine.api.utils.SystemProperty");
+    } catch (ClassNotFoundException e) {
+      return false;
+    }
+    try {
       // If the current environment is null, we're not inside AppEngine.
       return Class.forName("com.google.apphosting.api.ApiProxy")
               .getMethod("getCurrentEnvironment")
@@ -824,10 +941,6 @@
   static Executor renamingDecorator(final Executor executor, final Supplier<String> nameSupplier) {
     checkNotNull(executor);
     checkNotNull(nameSupplier);
-    if (isAppEngine()) {
-      // AppEngine doesn't support thread renaming, so don't even try
-      return executor;
-    }
     return new Executor() {
       @Override
       public void execute(Runnable command) {
@@ -853,10 +966,6 @@
       final ExecutorService service, final Supplier<String> nameSupplier) {
     checkNotNull(service);
     checkNotNull(nameSupplier);
-    if (isAppEngine()) {
-      // AppEngine doesn't support thread renaming, so don't even try.
-      return service;
-    }
     return new WrappingExecutorService(service) {
       @Override
       protected <T> Callable<T> wrapTask(Callable<T> callable) {
@@ -887,10 +996,6 @@
       final ScheduledExecutorService service, final Supplier<String> nameSupplier) {
     checkNotNull(service);
     checkNotNull(nameSupplier);
-    if (isAppEngine()) {
-      // AppEngine doesn't support thread renaming, so don't even try.
-      return service;
-    }
     return new WrappingScheduledExecutorService(service) {
       @Override
       protected <T> Callable<T> wrapTask(Callable<T> callable) {
@@ -923,6 +1028,36 @@
    *
    * @param service the {@code ExecutorService} to shut down
    * @param timeout the maximum time to wait for the {@code ExecutorService} to terminate
+   * @return {@code true} if the {@code ExecutorService} was terminated successfully, {@code false}
+   *     if the call timed out or was interrupted
+   * @since 28.0
+   */
+  @Beta
+  @CanIgnoreReturnValue
+  @GwtIncompatible // java.time.Duration
+  public static boolean shutdownAndAwaitTermination(ExecutorService service, Duration timeout) {
+    return shutdownAndAwaitTermination(service, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Shuts down the given executor service gradually, first disabling new submissions and later, if
+   * necessary, cancelling remaining tasks.
+   *
+   * <p>The method takes the following steps:
+   *
+   * <ol>
+   *   <li>calls {@link ExecutorService#shutdown()}, disabling acceptance of new submitted tasks.
+   *   <li>awaits executor service termination for half of the specified timeout.
+   *   <li>if the timeout expires, it calls {@link ExecutorService#shutdownNow()}, cancelling
+   *       pending tasks and interrupting running tasks.
+   *   <li>awaits executor service termination for the other half of the specified timeout.
+   * </ol>
+   *
+   * <p>If, at any step of the process, the calling thread is interrupted, the method calls {@link
+   * ExecutorService#shutdownNow()} and returns.
+   *
+   * @param service the {@code ExecutorService} to shut down
+   * @param timeout the maximum time to wait for the {@code ExecutorService} to terminate
    * @param unit the time unit of the timeout argument
    * @return {@code true} if the {@code ExecutorService} was terminated successfully, {@code false}
    *     if the call timed out or was interrupted
@@ -969,26 +1104,12 @@
       return delegate;
     }
     return new Executor() {
-      boolean thrownFromDelegate = true;
-
       @Override
-      public void execute(final Runnable command) {
+      public void execute(Runnable command) {
         try {
-          delegate.execute(
-              new Runnable() {
-                @Override
-                public void run() {
-                  thrownFromDelegate = false;
-                  command.run();
-                }
-              });
+          delegate.execute(command);
         } catch (RejectedExecutionException e) {
-          if (thrownFromDelegate) {
-            // wrap exception?
-            future.setException(e);
-          }
-          // otherwise it must have been thrown from a transitive call and the delegate runnable
-          // should have handled it.
+          future.setException(e);
         }
       }
     };
diff --git a/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java b/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
new file mode 100644
index 0000000..aa07abf
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
@@ -0,0 +1,37 @@
+/*
+ * 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.util.concurrent;
+
+import static java.lang.Math.min;
+
+import java.util.concurrent.locks.LockSupport;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/**
+ * 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.
+ */
+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) {
+    // 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/RateLimiter.java b/guava/src/com/google/common/util/concurrent/RateLimiter.java
index 2a2ae9d..ec041d4 100644
--- a/guava/src/com/google/common/util/concurrent/RateLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/RateLimiter.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static java.lang.Math.max;
 import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
@@ -27,9 +28,10 @@
 import com.google.common.util.concurrent.SmoothRateLimiter.SmoothBursty;
 import com.google.common.util.concurrent.SmoothRateLimiter.SmoothWarmingUp;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.time.Duration;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A rate limiter. Conceptually, a rate limiter distributes permits at a configurable rate. Each
@@ -92,7 +94,6 @@
 // would mean a maximum rate of "1MB/s", which might be small in some cases.
 @Beta
 @GwtIncompatible
-@SuppressWarnings("GoodTime") // lots of violations - also how should we model a rate?
 public abstract class RateLimiter {
   /**
    * Creates a {@code RateLimiter} with the specified stable throughput, given as "permits per
@@ -155,10 +156,39 @@
    *     permits become available per second
    * @param warmupPeriod the duration of the period where the {@code RateLimiter} ramps up its rate,
    *     before reaching its stable (maximum) rate
+   * @throws IllegalArgumentException if {@code permitsPerSecond} is negative or zero or {@code
+   *     warmupPeriod} is negative
+   * @since 28.0
+   */
+  public static RateLimiter create(double permitsPerSecond, Duration warmupPeriod) {
+    return create(permitsPerSecond, toNanosSaturated(warmupPeriod), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Creates a {@code RateLimiter} with the specified stable throughput, given as "permits per
+   * second" (commonly referred to as <i>QPS</i>, queries per second), and a <i>warmup period</i>,
+   * during which the {@code RateLimiter} smoothly ramps up its rate, until it reaches its maximum
+   * rate at the end of the period (as long as there are enough requests to saturate it). Similarly,
+   * if the {@code RateLimiter} is left <i>unused</i> for a duration of {@code warmupPeriod}, it
+   * will gradually return to its "cold" state, i.e. it will go through the same warming up process
+   * as when it was first created.
+   *
+   * <p>The returned {@code RateLimiter} is intended for cases where the resource that actually
+   * fulfills the requests (e.g., a remote server) needs "warmup" time, rather than being
+   * immediately accessed at the stable (maximum) rate.
+   *
+   * <p>The returned {@code RateLimiter} starts in a "cold" state (i.e. the warmup period will
+   * follow), and if it is left unused for long enough, it will return to that state.
+   *
+   * @param permitsPerSecond the rate of the returned {@code RateLimiter}, measured in how many
+   *     permits become available per second
+   * @param warmupPeriod the duration of the period where the {@code RateLimiter} ramps up its rate,
+   *     before reaching its stable (maximum) rate
    * @param unit the time unit of the warmupPeriod argument
    * @throws IllegalArgumentException if {@code permitsPerSecond} is negative or zero or {@code
    *     warmupPeriod} is negative
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public static RateLimiter create(double permitsPerSecond, long warmupPeriod, TimeUnit unit) {
     checkArgument(warmupPeriod >= 0, "warmupPeriod must not be negative: %s", warmupPeriod);
     return create(
@@ -184,7 +214,7 @@
   private final SleepingStopwatch stopwatch;
 
   // Can't be initialized in the constructor because mocks don't call the constructor.
-  @MonotonicNonNull private volatile Object mutexDoNotUseDirectly;
+  private volatile @Nullable Object mutexDoNotUseDirectly;
 
   private Object mutex() {
     Object mutex = mutexDoNotUseDirectly;
@@ -293,6 +323,22 @@
    * specified {@code timeout}, or returns {@code false} immediately (without waiting) if the permit
    * would not have been granted before the timeout expired.
    *
+   * <p>This method is equivalent to {@code tryAcquire(1, timeout)}.
+   *
+   * @param timeout the maximum time to wait for the permit. Negative values are treated as zero.
+   * @return {@code true} if the permit was acquired, {@code false} otherwise
+   * @throws IllegalArgumentException if the requested number of permits is negative or zero
+   * @since 28.0
+   */
+  public boolean tryAcquire(Duration timeout) {
+    return tryAcquire(1, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Acquires a permit from this {@code RateLimiter} if it can be obtained without exceeding the
+   * specified {@code timeout}, or returns {@code false} immediately (without waiting) if the permit
+   * would not have been granted before the timeout expired.
+   *
    * <p>This method is equivalent to {@code tryAcquire(1, timeout, unit)}.
    *
    * @param timeout the maximum time to wait for the permit. Negative values are treated as zero.
@@ -300,6 +346,7 @@
    * @return {@code true} if the permit was acquired, {@code false} otherwise
    * @throws IllegalArgumentException if the requested number of permits is negative or zero
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean tryAcquire(long timeout, TimeUnit unit) {
     return tryAcquire(1, timeout, unit);
   }
@@ -338,10 +385,26 @@
    *
    * @param permits the number of permits to acquire
    * @param timeout the maximum time to wait for the permits. Negative values are treated as zero.
+   * @return {@code true} if the permits were acquired, {@code false} otherwise
+   * @throws IllegalArgumentException if the requested number of permits is negative or zero
+   * @since 28.0
+   */
+  public boolean tryAcquire(int permits, Duration timeout) {
+    return tryAcquire(permits, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Acquires the given number of permits from this {@code RateLimiter} if it can be obtained
+   * without exceeding the specified {@code timeout}, or returns {@code false} immediately (without
+   * waiting) if the permits would not have been granted before the timeout expired.
+   *
+   * @param permits the number of permits to acquire
+   * @param timeout the maximum time to wait for the permits. Negative values are treated as zero.
    * @param unit the time unit of the timeout argument
    * @return {@code true} if the permits were acquired, {@code false} otherwise
    * @throws IllegalArgumentException if the requested number of permits is negative or zero
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public boolean tryAcquire(int permits, long timeout, TimeUnit unit) {
     long timeoutMicros = max(unit.toMicros(timeout), 0);
     checkPermits(permits);
diff --git a/guava/src/com/google/common/util/concurrent/SequentialExecutor.java b/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
index 3493339..5604175 100644
--- a/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
+++ b/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
@@ -19,11 +19,12 @@
 import static com.google.common.util.concurrent.SequentialExecutor.WorkerRunningState.QUEUED;
 import static com.google.common.util.concurrent.SequentialExecutor.WorkerRunningState.QUEUING;
 import static com.google.common.util.concurrent.SequentialExecutor.WorkerRunningState.RUNNING;
+import static java.lang.System.identityHashCode;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
-import com.google.j2objc.annotations.WeakOuter;
+import com.google.j2objc.annotations.RetainedWith;
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.concurrent.Executor;
@@ -79,7 +80,7 @@
   @GuardedBy("queue")
   private long workerRunCount = 0;
 
-  private final QueueWorker worker = new QueueWorker();
+  @RetainedWith private final QueueWorker worker = new QueueWorker();
 
   /** Use {@link MoreExecutors#newSequentialExecutor} */
   SequentialExecutor(Executor executor) {
@@ -119,6 +120,11 @@
             public void run() {
               task.run();
             }
+
+            @Override
+            public String toString() {
+              return task.toString();
+            }
           };
       queue.add(submittedTask);
       workerRunningState = QUEUING;
@@ -163,8 +169,9 @@
   }
 
   /** Worker that runs tasks from {@link #queue} until it is empty. */
-  @WeakOuter
   private final class QueueWorker implements Runnable {
+    Runnable task;
+
     @Override
     public void run() {
       try {
@@ -196,7 +203,6 @@
       boolean hasSetRunning = false;
       try {
         while (true) {
-          Runnable task;
           synchronized (queue) {
             // Choose whether this thread will run or not after acquiring the lock on the first
             // iteration
@@ -227,6 +233,8 @@
             task.run();
           } catch (RuntimeException e) {
             log.log(Level.SEVERE, "Exception while executing runnable " + task, e);
+          } finally {
+            task = null;
           }
         }
       } finally {
@@ -238,5 +246,20 @@
         }
       }
     }
+
+    @SuppressWarnings("GuardedBy")
+    @Override
+    public String toString() {
+      Runnable currentlyRunning = task;
+      if (currentlyRunning != null) {
+        return "SequentialExecutorWorker{running=" + currentlyRunning + "}";
+      }
+      return "SequentialExecutorWorker{state=" + workerRunningState + "}";
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "SequentialExecutor@" + identityHashCode(this) + "{" + executor + "}";
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/Service.java b/guava/src/com/google/common/util/concurrent/Service.java
index 40dbd56..3c4c476 100644
--- a/guava/src/com/google/common/util/concurrent/Service.java
+++ b/guava/src/com/google/common/util/concurrent/Service.java
@@ -14,9 +14,12 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
+import java.time.Duration;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -51,7 +54,7 @@
  * @author Luke Sandberg
  * @since 9.0 (in 1.0 as {@code com.google.common.base.Service})
  */
-@Beta
+@DoNotMock("Create an AbstractIdleService")
 @GwtIncompatible
 public interface Service {
   /**
@@ -99,6 +102,21 @@
    * than the given time.
    *
    * @param timeout the maximum time to wait
+   * @throws TimeoutException if the service has not reached the given state within the deadline
+   * @throws IllegalStateException if the service reaches a state from which it is not possible to
+   *     enter the {@link State#RUNNING RUNNING} state. e.g. if the {@code state} is {@code
+   *     State#TERMINATED} when this method is called then this will throw an IllegalStateException.
+   * @since 28.0
+   */
+  default void awaitRunning(Duration timeout) throws TimeoutException {
+    awaitRunning(toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Waits for the {@link Service} to reach the {@linkplain State#RUNNING running state} for no more
+   * than the given time.
+   *
+   * @param timeout the maximum time to wait
    * @param unit the time unit of the timeout argument
    * @throws TimeoutException if the service has not reached the given state within the deadline
    * @throws IllegalStateException if the service reaches a state from which it is not possible to
@@ -122,6 +140,19 @@
    * terminated} or {@link Service.State#FAILED failed}) for no more than the given time.
    *
    * @param timeout the maximum time to wait
+   * @throws TimeoutException if the service has not reached the given state within the deadline
+   * @throws IllegalStateException if the service {@linkplain State#FAILED fails}.
+   * @since 28.0
+   */
+  default void awaitTerminated(Duration timeout) throws TimeoutException {
+    awaitTerminated(toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Waits for the {@link Service} to reach a terminal state (either {@link Service.State#TERMINATED
+   * terminated} or {@link Service.State#FAILED failed}) for no more than the given time.
+   *
+   * @param timeout the maximum time to wait
    * @param unit the time unit of the timeout argument
    * @throws TimeoutException if the service has not reached the given state within the deadline
    * @throws IllegalStateException if the service {@linkplain State#FAILED fails}.
@@ -173,7 +204,6 @@
    *
    * @since 9.0 (in 1.0 as {@code com.google.common.base.Service.State})
    */
-  @Beta // should come out of Beta when Service does
   enum State {
     /** A service in this state is inactive. It does minimal work and consumes minimal resources. */
     NEW {
@@ -241,7 +271,6 @@
    * @author Luke Sandberg
    * @since 15.0 (present as an interface in 13.0)
    */
-  @Beta // should come out of Beta when Service does
   abstract class Listener {
     /**
      * Called when the service transitions from {@linkplain State#NEW NEW} to {@linkplain
diff --git a/guava/src/com/google/common/util/concurrent/ServiceManager.java b/guava/src/com/google/common/util/concurrent/ServiceManager.java
index a87bf8d..e5b468f 100644
--- a/guava/src/com/google/common/util/concurrent/ServiceManager.java
+++ b/guava/src/com/google/common/util/concurrent/ServiceManager.java
@@ -21,6 +21,7 @@
 import static com.google.common.base.Predicates.in;
 import static com.google.common.base.Predicates.instanceOf;
 import static com.google.common.base.Predicates.not;
+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.Service.State.FAILED;
 import static com.google.common.util.concurrent.Service.State.NEW;
@@ -30,7 +31,6 @@
 import static com.google.common.util.concurrent.Service.State.TERMINATED;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Function;
 import com.google.common.base.MoreObjects;
@@ -39,7 +39,6 @@
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.google.common.collect.Lists;
@@ -54,6 +53,7 @@
 import com.google.errorprone.annotations.concurrent.GuardedBy;
 import com.google.j2objc.annotations.WeakOuter;
 import java.lang.ref.WeakReference;
+import java.time.Duration;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
@@ -119,9 +119,8 @@
  * @author Luke Sandberg
  * @since 14.0
  */
-@Beta
 @GwtIncompatible
-public final class ServiceManager {
+public final class ServiceManager implements ServiceManagerBridge {
   private static final Logger logger = Logger.getLogger(ServiceManager.class.getName());
   private static final ListenerCallQueue.Event<Listener> HEALTHY_EVENT =
       new ListenerCallQueue.Event<Listener>() {
@@ -157,7 +156,6 @@
    * @author Luke Sandberg
    * @since 15.0 (present as an interface in 14.0)
    */
-  @Beta // Should come out of Beta when ServiceManager does
   public abstract static class Listener {
     /**
      * Called when the service initially becomes healthy.
@@ -243,8 +241,9 @@
    * during {@code Executor.execute} (e.g., a {@code RejectedExecutionException}) will be caught and
    * logged.
    *
-   * <p>For fast, lightweight listeners that would be safe to execute in any thread, consider
-   * calling {@link #addListener(Listener)}.
+   * <p>When selecting an executor, note that {@code directExecutor} is dangerous in some cases. See
+   * the discussion in the {@link ListenableFuture#addListener ListenableFuture.addListener}
+   * documentation.
    *
    * @param listener the listener to run when the manager changes state
    * @param executor the executor in which the listeners callback methods will be run.
@@ -254,26 +253,6 @@
   }
 
   /**
-   * Registers a {@link Listener} to be run when this {@link ServiceManager} changes state. The
-   * listener will not have previous state changes replayed, so it is suggested that listeners are
-   * added before any of the managed services are {@linkplain Service#startAsync started}.
-   *
-   * <p>{@code addListener} guarantees execution ordering across calls to a given listener but not
-   * across calls to multiple listeners. Specifically, a given listener will have its callbacks
-   * invoked in the same order as the underlying service enters those states. Additionally, at most
-   * one of the listener's callbacks will execute at once. However, multiple listeners' callbacks
-   * may execute concurrently, and listeners may execute in an order different from the one in which
-   * they were registered.
-   *
-   * <p>RuntimeExceptions thrown by a listener will be caught and logged.
-   *
-   * @param listener the listener to run when the manager changes state
-   */
-  public void addListener(Listener listener) {
-    state.addListener(listener, directExecutor());
-  }
-
-  /**
    * Initiates service {@linkplain Service#startAsync startup} on all the services being managed. It
    * is only valid to call this method if all of the services are {@linkplain State#NEW new}.
    *
@@ -320,6 +299,21 @@
    * reached the {@linkplain State#RUNNING running} state.
    *
    * @param timeout the maximum time to wait
+   * @throws TimeoutException if not all of the services have finished starting within the deadline
+   * @throws IllegalStateException if the service manager reaches a state from which it cannot
+   *     become {@linkplain #isHealthy() healthy}.
+   * @since 28.0
+   */
+  public void awaitHealthy(Duration timeout) throws TimeoutException {
+    awaitHealthy(toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Waits for the {@link ServiceManager} to become {@linkplain #isHealthy() healthy} for no more
+   * than the given time. The manager will become healthy after all the component services have
+   * reached the {@linkplain State#RUNNING running} state.
+   *
+   * @param timeout the maximum time to wait
    * @param unit the time unit of the timeout argument
    * @throws TimeoutException if not all of the services have finished starting within the deadline
    * @throws IllegalStateException if the service manager reaches a state from which it cannot
@@ -359,6 +353,19 @@
    * terminated} or {@linkplain Service.State#FAILED failed}.
    *
    * @param timeout the maximum time to wait
+   * @throws TimeoutException if not all of the services have stopped within the deadline
+   * @since 28.0
+   */
+  public void awaitStopped(Duration timeout) throws TimeoutException {
+    awaitStopped(toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Waits for the all the services to reach a terminal state for no more than the given time. After
+   * this method returns all services will either be {@linkplain Service.State#TERMINATED
+   * terminated} or {@linkplain Service.State#FAILED failed}.
+   *
+   * @param timeout the maximum time to wait
    * @param unit the time unit of the timeout argument
    * @throws TimeoutException if not all of the services have stopped within the deadline
    */
@@ -387,8 +394,11 @@
    *
    * <p>N.B. This snapshot is guaranteed to be consistent, i.e. the set of states returned will
    * correspond to a point in time view of the services.
+   *
+   * @since 29.0 (present with return type {@code ImmutableMultimap} since 14.0)
    */
-  public ImmutableMultimap<State, Service> servicesByState() {
+  @Override
+  public ImmutableSetMultimap<State, Service> servicesByState() {
     return state.servicesByState();
   }
 
@@ -592,7 +602,7 @@
       }
     }
 
-    ImmutableMultimap<State, Service> servicesByState() {
+    ImmutableSetMultimap<State, Service> servicesByState() {
       ImmutableSetMultimap.Builder<State, Service> builder = ImmutableSetMultimap.builder();
       monitor.enter();
       try {
diff --git a/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java b/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
new file mode 100644
index 0000000..a9300a6
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
@@ -0,0 +1,31 @@
+/*
+ * 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.util.concurrent;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.util.concurrent.Service.State;
+
+/**
+ * Superinterface of {@link ServiceManager} to introduce a bridge method for {@code
+ * servicesByState()}, to ensure binary compatibility with older Guava versions that specified
+ * {@code servicesByState()} to return {@code ImmutableMultimap}.
+ */
+@GwtIncompatible
+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 b8e9491..a0f4732 100644
--- a/guava/src/com/google/common/util/concurrent/SettableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/SettableFuture.java
@@ -14,7 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -54,7 +53,6 @@
     return super.setException(throwable);
   }
 
-  @Beta
   @CanIgnoreReturnValue
   @Override
   public boolean setFuture(ListenableFuture<? extends V> future) {
diff --git a/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java b/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
index 938040b..9d0b81b 100644
--- a/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
@@ -113,8 +113,7 @@
     return interfaceType.cast(object);
   }
 
-  private
-  <T> T callWithTimeout(
+  private <T> T callWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit, boolean amInterruptible)
       throws Exception {
     checkNotNull(callable);
diff --git a/guava/src/com/google/common/util/concurrent/TimeLimiter.java b/guava/src/com/google/common/util/concurrent/TimeLimiter.java
index 1c0d9c7..600c6cf 100644
--- a/guava/src/com/google/common/util/concurrent/TimeLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/TimeLimiter.java
@@ -14,9 +14,13 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotMock;
+import java.time.Duration;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -30,8 +34,8 @@
  * @since 1.0
  */
 @Beta
+@DoNotMock("Use FakeTimeLimiter")
 @GwtIncompatible
-@SuppressWarnings("GoodTime") // should have java.time.Duration overloads
 public interface TimeLimiter {
 
   /**
@@ -75,9 +79,53 @@
    * @throws IllegalArgumentException if {@code interfaceType} is a regular class, enum, or
    *     annotation type, rather than an interface
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   <T> T newProxy(T target, Class<T> interfaceType, long timeoutDuration, TimeUnit timeoutUnit);
 
   /**
+   * Returns an instance of {@code interfaceType} that delegates all method calls to the {@code
+   * target} object, enforcing the specified time limit on each call. This time-limited delegation
+   * is also performed for calls to {@link Object#equals}, {@link Object#hashCode}, and {@link
+   * Object#toString}.
+   *
+   * <p>If the target method call finishes before the limit is reached, the return value or
+   * exception is propagated to the caller exactly as-is. If, on the other hand, the time limit is
+   * reached, the proxy will attempt to abort the call to the target, and will throw an {@link
+   * UncheckedTimeoutException} to the caller.
+   *
+   * <p>It is important to note that the primary purpose of the proxy object is to return control to
+   * the caller when the timeout elapses; aborting the target method call is of secondary concern.
+   * The particular nature and strength of the guarantees made by the proxy is
+   * implementation-dependent. However, it is important that each of the methods on the target
+   * object behaves appropriately when its thread is interrupted.
+   *
+   * <p>For example, to return the value of {@code target.someMethod()}, but substitute {@code
+   * DEFAULT_VALUE} if this method call takes over 50 ms, you can use this code:
+   *
+   * <pre>
+   *   TimeLimiter limiter = . . .;
+   *   TargetType proxy = limiter.newProxy(target, TargetType.class, Duration.ofMillis(50));
+   *   try {
+   *     return proxy.someMethod();
+   *   } catch (UncheckedTimeoutException e) {
+   *     return DEFAULT_VALUE;
+   *   }
+   * </pre>
+   *
+   * @param target the object to proxy
+   * @param interfaceType the interface you wish the returned proxy to implement
+   * @param timeout the maximum length of time that callers are willing to wait on each method call
+   *     to the proxy
+   * @return a time-limiting proxy
+   * @throws IllegalArgumentException if {@code interfaceType} is a regular class, enum, or
+   *     annotation type, rather than an interface
+   * @since 28.0
+   */
+  default <T> T newProxy(T target, Class<T> interfaceType, Duration timeout) {
+    return newProxy(target, interfaceType, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
    * Invokes a specified Callable, timing out after the specified time limit. If the target method
    * call finishes before the limit is reached, the return value or a wrapped exception is
    * propagated. If, on the other hand, the time limit is reached, we attempt to abort the call to
@@ -94,6 +142,7 @@
    * @throws ExecutionError if {@code callable} throws an {@code Error}
    * @since 22.0
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   @CanIgnoreReturnValue
   <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, InterruptedException, ExecutionException;
@@ -104,6 +153,28 @@
    * propagated. If, on the other hand, the time limit is reached, we attempt to abort the call to
    * the target, and throw a {@link TimeoutException} to the caller.
    *
+   * @param callable the Callable to execute
+   * @param timeout the maximum length of time to wait
+   * @return the result returned by the Callable
+   * @throws TimeoutException if the time limit is reached
+   * @throws InterruptedException if the current thread was interrupted during execution
+   * @throws ExecutionException if {@code callable} throws a checked exception
+   * @throws UncheckedExecutionException if {@code callable} throws a {@code RuntimeException}
+   * @throws ExecutionError if {@code callable} throws an {@code Error}
+   * @since 28.0
+   */
+  @CanIgnoreReturnValue
+  default <T> T callWithTimeout(Callable<T> callable, Duration timeout)
+      throws TimeoutException, InterruptedException, ExecutionException {
+    return callWithTimeout(callable, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes a specified Callable, timing out after the specified time limit. If the target method
+   * call finishes before the limit is reached, the return value or a wrapped exception is
+   * propagated. If, on the other hand, the time limit is reached, we attempt to abort the call to
+   * the target, and throw a {@link TimeoutException} to the caller.
+   *
    * <p>The difference with {@link #callWithTimeout(Callable, long, TimeUnit)} is that this method
    * will ignore interrupts on the current thread.
    *
@@ -117,12 +188,38 @@
    * @throws ExecutionError if {@code callable} throws an {@code Error}
    * @since 22.0
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   @CanIgnoreReturnValue
   <T> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, ExecutionException;
 
   /**
+   * Invokes a specified Callable, timing out after the specified time limit. If the target method
+   * call finishes before the limit is reached, the return value or a wrapped exception is
+   * propagated. If, on the other hand, the time limit is reached, we attempt to abort the call to
+   * the target, and throw a {@link TimeoutException} to the caller.
+   *
+   * <p>The difference with {@link #callWithTimeout(Callable, Duration)} is that this method will
+   * ignore interrupts on the current thread.
+   *
+   * @param callable the Callable to execute
+   * @param timeout the maximum length of time to wait
+   * @return the result returned by the Callable
+   * @throws TimeoutException if the time limit is reached
+   * @throws ExecutionException if {@code callable} throws a checked exception
+   * @throws UncheckedExecutionException if {@code callable} throws a {@code RuntimeException}
+   * @throws ExecutionError if {@code callable} throws an {@code Error}
+   * @since 28.0
+   */
+  @CanIgnoreReturnValue
+  default <T> T callUninterruptiblyWithTimeout(Callable<T> callable, Duration timeout)
+      throws TimeoutException, ExecutionException {
+    return callUninterruptiblyWithTimeout(
+        callable, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
    * Invokes a specified Runnable, timing out after the specified time limit. If the target method
    * run finishes before the limit is reached, this method returns or a wrapped exception is
    * propagated. If, on the other hand, the time limit is reached, we attempt to abort the run, and
@@ -137,6 +234,7 @@
    * @throws ExecutionError if {@code runnable} throws an {@code Error}
    * @since 22.0
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   void runWithTimeout(Runnable runnable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, InterruptedException;
 
@@ -146,6 +244,25 @@
    * propagated. If, on the other hand, the time limit is reached, we attempt to abort the run, and
    * throw a {@link TimeoutException} to the caller.
    *
+   * @param runnable the Runnable to execute
+   * @param timeout the maximum length of time to wait
+   * @throws TimeoutException if the time limit is reached
+   * @throws InterruptedException if the current thread was interrupted during execution
+   * @throws UncheckedExecutionException if {@code runnable} throws a {@code RuntimeException}
+   * @throws ExecutionError if {@code runnable} throws an {@code Error}
+   * @since 28.0
+   */
+  default void runWithTimeout(Runnable runnable, Duration timeout)
+      throws TimeoutException, InterruptedException {
+    runWithTimeout(runnable, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes a specified Runnable, timing out after the specified time limit. If the target method
+   * run finishes before the limit is reached, this method returns or a wrapped exception is
+   * propagated. If, on the other hand, the time limit is reached, we attempt to abort the run, and
+   * throw a {@link TimeoutException} to the caller.
+   *
    * <p>The difference with {@link #runWithTimeout(Runnable, long, TimeUnit)} is that this method
    * will ignore interrupts on the current thread.
    *
@@ -157,6 +274,28 @@
    * @throws ExecutionError if {@code runnable} throws an {@code Error}
    * @since 22.0
    */
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   void runUninterruptiblyWithTimeout(Runnable runnable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException;
+
+  /**
+   * Invokes a specified Runnable, timing out after the specified time limit. If the target method
+   * run finishes before the limit is reached, this method returns or a wrapped exception is
+   * propagated. If, on the other hand, the time limit is reached, we attempt to abort the run, and
+   * throw a {@link TimeoutException} to the caller.
+   *
+   * <p>The difference with {@link #runWithTimeout(Runnable, Duration)} is that this method will
+   * ignore interrupts on the current thread.
+   *
+   * @param runnable the Runnable to execute
+   * @param timeout the maximum length of time to wait
+   * @throws TimeoutException if the time limit is reached
+   * @throws UncheckedExecutionException if {@code runnable} throws a {@code RuntimeException}
+   * @throws ExecutionError if {@code runnable} throws an {@code Error}
+   * @since 28.0
+   */
+  default void runUninterruptiblyWithTimeout(Runnable runnable, Duration timeout)
+      throws TimeoutException {
+    runUninterruptiblyWithTimeout(runnable, 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 d09b24e..af30d1f 100644
--- a/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
+++ b/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
@@ -117,15 +117,21 @@
       } else {
         try {
           ScheduledFuture<?> timer = timeoutFuture.timer;
-          String message = "Timed out";
-          if (timer != null) {
-            long overDelayMs = Math.abs(timer.getDelay(TimeUnit.MILLISECONDS));
-            if (overDelayMs > 10) { // Not all timing drift is worth reporting
-              message += " (timeout delayed by " + overDelayMs + " ms after scheduled time)";
-            }
-          }
           timeoutFuture.timer = null; // Don't include already elapsed delay in delegate.toString()
-          timeoutFuture.setException(new TimeoutFutureException(message + ": " + delegate));
+          String message = "Timed out";
+          // This try-finally block ensures that we complete the timeout future, even if attempting
+          // to produce the message throws (probably StackOverflowError from delegate.toString())
+          try {
+            if (timer != null) {
+              long overDelayMs = Math.abs(timer.getDelay(TimeUnit.MILLISECONDS));
+              if (overDelayMs > 10) { // Not all timing drift is worth reporting
+                message += " (timeout delayed by " + overDelayMs + " ms after scheduled time)";
+              }
+            }
+            message += ": " + delegate;
+          } finally {
+            timeoutFuture.setException(new TimeoutFutureException(message));
+          }
         } finally {
           delegate.cancel(true);
         }
diff --git a/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java b/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
index 6e8abba..c0c2600 100644
--- a/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
+++ b/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
@@ -65,7 +65,6 @@
     @Override
     public void uncaughtException(Thread t, Throwable e) {
       try {
-        // cannot use FormattingLogger due to a dependency loop
         logger.log(
             SEVERE, String.format(Locale.ROOT, "Caught an exception in %s.  Shutting down.", t), e);
       } catch (Throwable errorInLogging) {
diff --git a/guava/src/com/google/common/util/concurrent/Uninterruptibles.java b/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
index de14c1b..0ce6f1a 100644
--- a/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
+++ b/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
@@ -14,21 +14,27 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.base.Verify.verify;
+import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
+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 java.time.Duration;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
 
 /**
  * Utilities for treating interruptible operations as uninterruptible. In all cases, if a thread is
@@ -67,6 +73,19 @@
   /**
    * Invokes {@code latch.}{@link CountDownLatch#await(long, TimeUnit) await(timeout, unit)}
    * uninterruptibly.
+   *
+   * @since 28.0
+   */
+  @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
+  @GwtIncompatible // concurrency
+  @Beta
+  public static boolean awaitUninterruptibly(CountDownLatch latch, Duration timeout) {
+    return awaitUninterruptibly(latch, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code latch.}{@link CountDownLatch#await(long, TimeUnit) await(timeout, unit)}
+   * uninterruptibly.
    */
   @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
   @GwtIncompatible // concurrency
@@ -97,6 +116,18 @@
    * Invokes {@code condition.}{@link Condition#await(long, TimeUnit) await(timeout, unit)}
    * uninterruptibly.
    *
+   * @since 28.0
+   */
+  @GwtIncompatible // concurrency
+  @Beta
+  public static boolean awaitUninterruptibly(Condition condition, Duration timeout) {
+    return awaitUninterruptibly(condition, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code condition.}{@link Condition#await(long, TimeUnit) await(timeout, unit)}
+   * uninterruptibly.
+   *
    * @since 23.6
    */
   @GwtIncompatible // concurrency
@@ -145,6 +176,18 @@
   /**
    * Invokes {@code unit.}{@link TimeUnit#timedJoin(Thread, long) timedJoin(toJoin, timeout)}
    * uninterruptibly.
+   *
+   * @since 28.0
+   */
+  @GwtIncompatible // concurrency
+  @Beta
+  public static void joinUninterruptibly(Thread toJoin, Duration timeout) {
+    joinUninterruptibly(toJoin, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code unit.}{@link TimeUnit#timedJoin(Thread, long) timedJoin(toJoin, timeout)}
+   * uninterruptibly.
    */
   @GwtIncompatible // concurrency
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
@@ -223,6 +266,33 @@
    * @throws ExecutionException if the computation threw an exception
    * @throws CancellationException if the computation was cancelled
    * @throws TimeoutException if the wait timed out
+   * @since 28.0
+   */
+  @CanIgnoreReturnValue
+  @GwtIncompatible // java.time.Duration
+  @Beta
+  public static <V> V getUninterruptibly(Future<V> future, Duration timeout)
+      throws ExecutionException, TimeoutException {
+    return getUninterruptibly(future, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code future.}{@link Future#get(long, TimeUnit) get(timeout, unit)} uninterruptibly.
+   *
+   * <p>Similar methods:
+   *
+   * <ul>
+   *   <li>To retrieve a result from a {@code Future} that is already done, use {@link
+   *       Futures#getDone Futures.getDone}.
+   *   <li>To treat {@link InterruptedException} uniformly with other exceptions, use {@link
+   *       Futures#getChecked(Future, Class, long, TimeUnit) Futures.getChecked}.
+   *   <li>To get uninterruptibility and remove checked exceptions, use {@link
+   *       Futures#getUnchecked}.
+   * </ul>
+   *
+   * @throws ExecutionException if the computation threw an exception
+   * @throws CancellationException if the computation was cancelled
+   * @throws TimeoutException if the wait timed out
    */
   @CanIgnoreReturnValue
   @GwtIncompatible // TODO
@@ -297,6 +367,18 @@
   }
 
   // TODO(user): Support Sleeper somehow (wrapper or interface method)?
+  /**
+   * Invokes {@code unit.}{@link TimeUnit#sleep(long) sleep(sleepFor)} uninterruptibly.
+   *
+   * @since 28.0
+   */
+  @GwtIncompatible // concurrency
+  @Beta
+  public static void sleepUninterruptibly(Duration sleepFor) {
+    sleepUninterruptibly(toNanosSaturated(sleepFor), TimeUnit.NANOSECONDS);
+  }
+
+  // TODO(user): Support Sleeper somehow (wrapper or interface method)?
   /** Invokes {@code unit.}{@link TimeUnit#sleep(long) sleep(sleepFor)} uninterruptibly. */
   @GwtIncompatible // concurrency
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
@@ -326,6 +408,18 @@
    * Invokes {@code semaphore.}{@link Semaphore#tryAcquire(int, long, TimeUnit) tryAcquire(1,
    * timeout, unit)} uninterruptibly.
    *
+   * @since 28.0
+   */
+  @GwtIncompatible // concurrency
+  @Beta
+  public static boolean tryAcquireUninterruptibly(Semaphore semaphore, Duration timeout) {
+    return tryAcquireUninterruptibly(semaphore, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code semaphore.}{@link Semaphore#tryAcquire(int, long, TimeUnit) tryAcquire(1,
+   * timeout, unit)} uninterruptibly.
+   *
    * @since 18.0
    */
   @GwtIncompatible // concurrency
@@ -339,6 +433,20 @@
    * Invokes {@code semaphore.}{@link Semaphore#tryAcquire(int, long, TimeUnit) tryAcquire(permits,
    * timeout, unit)} uninterruptibly.
    *
+   * @since 28.0
+   */
+  @GwtIncompatible // concurrency
+  @Beta
+  public static boolean tryAcquireUninterruptibly(
+      Semaphore semaphore, int permits, Duration timeout) {
+    return tryAcquireUninterruptibly(
+        semaphore, permits, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code semaphore.}{@link Semaphore#tryAcquire(int, long, TimeUnit) tryAcquire(permits,
+   * timeout, unit)} uninterruptibly.
+   *
    * @since 18.0
    */
   @GwtIncompatible // concurrency
@@ -366,6 +474,104 @@
     }
   }
 
+  /**
+   * Invokes {@code lock.}{@link Lock#tryLock(long, TimeUnit) tryLock(timeout, unit)}
+   * uninterruptibly.
+   *
+   * @since 30.0
+   */
+  @GwtIncompatible // concurrency
+  @Beta
+  public static boolean tryLockUninterruptibly(Lock lock, Duration timeout) {
+    return tryLockUninterruptibly(lock, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code lock.}{@link Lock#tryLock(long, TimeUnit) tryLock(timeout, unit)}
+   * uninterruptibly.
+   *
+   * @since 30.0
+   */
+  @GwtIncompatible // concurrency
+  @SuppressWarnings("GoodTime") // should accept a java.time.Duration
+  public static boolean tryLockUninterruptibly(Lock lock, long timeout, TimeUnit unit) {
+    boolean interrupted = false;
+    try {
+      long remainingNanos = unit.toNanos(timeout);
+      long end = System.nanoTime() + remainingNanos;
+
+      while (true) {
+        try {
+          return lock.tryLock(remainingNanos, NANOSECONDS);
+        } catch (InterruptedException e) {
+          interrupted = true;
+          remainingNanos = end - System.nanoTime();
+        }
+      }
+    } finally {
+      if (interrupted) {
+        Thread.currentThread().interrupt();
+      }
+    }
+  }
+
+  /**
+   * Invokes {@code executor.}{@link ExecutorService#awaitTermination(long, TimeUnit)
+   * awaitTermination(long, TimeUnit)} uninterruptibly with no timeout.
+   *
+   * @since 30.0
+   */
+  @Beta
+  @GwtIncompatible // concurrency
+  public static void awaitTerminationUninterruptibly(ExecutorService executor) {
+    // TODO(cpovirk): We could optimize this to avoid calling nanoTime() at all.
+    verify(awaitTerminationUninterruptibly(executor, Long.MAX_VALUE, NANOSECONDS));
+  }
+
+  /**
+   * Invokes {@code executor.}{@link ExecutorService#awaitTermination(long, TimeUnit)
+   * awaitTermination(long, TimeUnit)} uninterruptibly.
+   *
+   * @since 30.0
+   */
+  @Beta
+  @GwtIncompatible // concurrency
+  public static boolean awaitTerminationUninterruptibly(
+      ExecutorService executor, Duration timeout) {
+    return awaitTerminationUninterruptibly(executor, toNanosSaturated(timeout), NANOSECONDS);
+  }
+
+  /**
+   * Invokes {@code executor.}{@link ExecutorService#awaitTermination(long, TimeUnit)
+   * awaitTermination(long, TimeUnit)} uninterruptibly.
+   *
+   * @since 30.0
+   */
+  @Beta
+  @GwtIncompatible // concurrency
+  @SuppressWarnings("GoodTime")
+  public static boolean awaitTerminationUninterruptibly(
+      ExecutorService executor, long timeout, TimeUnit unit) {
+    boolean interrupted = false;
+    try {
+      long remainingNanos = unit.toNanos(timeout);
+      long end = System.nanoTime() + remainingNanos;
+
+      while (true) {
+        try {
+          return executor.awaitTermination(remainingNanos, NANOSECONDS);
+        } catch (InterruptedException e) {
+          interrupted = true;
+          remainingNanos = end - System.nanoTime();
+        }
+      }
+    } finally {
+      if (interrupted) {
+        Thread.currentThread().interrupt();
+      }
+    }
+  }
+
   // TODO(user): Add support for waitUninterruptibly.
 
   private Uninterruptibles() {}
diff --git a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
index 6cc6d68..475cabb 100644
--- a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
+++ b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
@@ -23,15 +23,14 @@
 import com.google.common.collect.ImmutableMap;
 
 /**
- * <b>Do not use this class directly. For access to public-suffix information,
- * use {@link com.google.common.net.InternetDomainName}.</b>
+ * <b>Do not use this class directly. For access to public-suffix information, use {@link
+ * com.google.common.net.InternetDomainName}.</b>
  *
- * A generated static class containing public members which provide domain
- * name patterns used in determining whether a given domain name is an
- * effective top-level domain (public suffix).
+ * <p>A generated static class containing public members which provide domain name patterns used in
+ * 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}.
+ * <p>Because this class is used in GWT, the data members are stored in a space-efficient manner.
+ * {@see TrieParser}.
  *
  * @since 16.0
  */
@@ -42,22 +41,23 @@
 
   /** 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?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?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??i&ma?nofelet?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??h&od?skihs??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??g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri????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?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?c&c,inimod??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?irga??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??opbf9bbgm--nx?s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&hrats?lc!.&snduolc,ysrab,?smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??779tbp--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,??0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc?tnamys??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!s?w??v!.&gro?lim?mo&c?n,?ten?ude?vog??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,?h&d3tbgm--nx?p?t??i!.&ased?bew?ca?enoz,hcs?lim?o&c!.topsgolb,?g??ro?sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.topsgolb,?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,l??uolc!.&drayknil,ropav,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,?artxe??sla??i!ffo??n&a&d?iler?nif?rus&e?ni!efil?srelevart????eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,brb-ni,decalpb,e&daregtmueart,mohsnd,nihcamyek,?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,??p&h21,iog:ol,,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,??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?rots?yov??dod?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???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,,??g&ro?s-raegelif,?myn,noitatsksid,o&bmoy,c?t&nigol,poh,??p&ion,j-raegelif,ohbew,?r&aegelif,ofsnd,?s&dym,ndd,ti??t&en?s&acdnuos,ohon,??u&a-raegelif,de??v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??o&cnal?htathgir?rhc??w??n!goloc?i&lno!.ysrab,?w??o!.knilemoh,hp?latipac?ts&der?e&gdirb?rif???z!.amil,??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?taeht?u&ces?sni?t&inruf?necca??za???s!.&a?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f?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!.&n&eyb,oyc,?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?617upk--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?5&7vtse--nx?mzt5--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?oc?ten???i&a?v??k!.&gro?lim?moc?ten?ude?vog???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&eman?gro?hcs?i!bom??lim?moc!.topsgolb,?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&ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,tneimip,z,?d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolcarfniarodef,?e&a,cin-yrev-si,grofpeh,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,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,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,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,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??lim?moc?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??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?moc?o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&dnala?iki,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!.&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!.&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?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??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?reve?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!ten!.oc,doof???s!.&myn,topsgolb,??t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??oc!.&e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?pi-on,topsgolb,vres-hn,ysrab,??shn?ten?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?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?mon,oc?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???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?oof???c?mt??e&d?hs?wyenoh??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,retsulc-gnitsoh,topsgolb,?b?o??o&a?btuf?l?o&c!.ed,?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&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!.topsgolb,c!bew??dretsma?e&rts?t??fma?rirhs?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!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,irfa,?g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?remacytirucesym,s,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,ottad,?g,ildts.ipa,uhnnylf,?c&amytirucesemoh,d-morf,esyrcs,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,?i-morf,m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&hr,panqym:-&ahpla,ved,?,smetsystuo,ved&j,pw,??wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,nneve.&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&ihcec,uzanoppanex,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,??omer-sndnyd,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats&-swennwot,mocpw,?ksndd,robsikrow,?o&fgp,lb&-sndnyd,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,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,row-&sndnyd,ta-sndnyd,?u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am-sndnyd,?luf-ytnuob:.a&hpla,teb,?,ru-&elpmis,taen,?ssukoreh,?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,eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,ollabtib,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&anis:piv,,esaberif,k1,lortnocduolc,roetem:.ue,,tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&divorpnwo,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,tn&ecysrab,iap-a-si,uh-a-si,?vres&-s&ndnyd,pvtsaf,?inim,nmad,?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&ila&nyd,snd,?nymsd,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&itilitu3,lahw-eht-sevas,mag-otni-si,tyskciuq,?i&ht2tniop,paelgoog,?k&-morf,aerf-ten,colbpohsym,?m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?r&ac-otni-si,etsohmaerd,?s&e&l-rof-slles,rtca-na-si,?ibodym,?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,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,inuemoh,obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,lerottad,wetag-llawerif,?dnacsekil,filten,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m?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&eb&merun?nr&ats?eun???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!raw??ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?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?po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?gro?lim?mo&c?n,?ten?ude???i!.&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?i&hsaf?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&ia&il?m??nhojcs?pe?scire??t&ron?sob???p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op??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,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?gro?ipym,lim?m&o&c!.topsgolb,?n??rif?udon,?ofni?piv-og,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,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?ia?n!am?ib???hwsohw?i!.&8302,aminifed,b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&noitacilppa,ropav,?rd,??e&civedniser,egipa,sufxob,t&isnoehtnap,newtu,??gnigatsniser.secived,k&orgn,ramytefasresworb,?m&oc?udon,?nyded,ppa&-arusah,cs,enalpkcab,?r&eniatnoceruza,ial.sppa,?s&codehtdaer,pparevelc,tacdnas,?t&enotorp,i&belet,detfihs,kecaps,?raedon.egats,sudgniht.&cersid.tsuc,dorp.tsuc,gnitset.tsuc,ved.tsuc,??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,?ofni?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??hgi&erf?l&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!.&gro?moc?ten???t!.&gro?lim?moc?sulpnpv,ten?ude?vog??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?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!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??topsgolb,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???leh?m!ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&arusah,nur:.a,,tibelet,??ra&a?hs??u&ekam?llag?org!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?pom?t&at?s!ivom?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?mi?sb??c&ba?er?js?sp?te??d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?ni??g&el!.&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,??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??et?i&b?dar?ecam?r??rp?t&a?erpoir???p&m!e?t??ooc?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??u&anam?j?m???t&am?e&n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?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?of????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???it&norf?rac??k&col?o&p?rb???l&aed?ffeahcs?syrhc??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,cidessa?drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?rianiretev?sserp??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?opsgolb,r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?m&oc?yn,?t&en?opsgolb,?ude?vog???h!.&eman?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&cs?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?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?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?korbdal?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??gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&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??ud??o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&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!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!.&21k?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,?pion,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???xt!.&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?gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?ph21,ro?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!i??nnocu?rid!.lenaptsaf,txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?g&aip?rat??id?k&circ?ram??n!.&6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,nab-eht-ni,?e&cnarusnihtlaehezitavirp,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?nozdop,rehurht,s,tis-repparcs,zamkcar,?f&aeletis,ehc-a-si,?g&nitsohnnylf,olbevres,?k&eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??mac&asac,ih,?n&a&f&agp,lhn,?ibed,?dcduabkcalb,i,pv-ni,?o&c-morf,jodsnd,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,hbew,?paduolc,tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc,?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&ceffeym,e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,sixetnod,?u&h,nyd,r,?x&inuemoh,spym,unilemoh,?y&awetag-llawerif,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?gro?lim?mo&c?n,?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??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?rpatsiv??opud?uocsid??o&b?cs?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??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!.&duolcp,etiseerf,flah,sseccaduolc,??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??civ?dlq?sat?t&ca?n??wsn???vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e?iab??e!.&dcym,enozgniebllew,noitatsksid,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!.&eni&esrem,m,?mon,tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca?eniram,g&bc,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m??moc,natsegad,onijym,pp,ri&b,midalv,?s&ar,itym,?t&en,ni?opsgolb,set??ude?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!.&gro?moc?ten?ude???ykuyr??v&b?c!.topsgolb,?ed?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?mon,o&c?g??ro?snduolc,ualeb???r!.&ca?lim?moc?oc?t&en?ni??ude?v&og?uog???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!t??c!.&hta,ofni,vog???e&d&an?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??lp?p!ila??rot?ssin?wdaorb??b!.&fo?lim?m&oc!.topsgolb,?yn,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.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!.&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?i&bom?maf!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?ledif?n&ifx?ummoc!.bdnevar,??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&oc?yn,?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.&duolc,motsuc,??oc,topsgolb,??d!.&gro?lop?moc?ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,??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??λε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур?тйас?фр?юе?յահ?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?يطسلف??ه&ارمه?يدوعسلا??وكمارا?ي&بظوبا?ليابوم??ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ンョシッァフ?业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?宝珠?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?行工?表手?販通?车汽众大?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
+      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??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур?тйас?фр?юе?յահ?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
 
   /**
-   * If a hostname is not a key in the EXCLUDE map, and if removing its
-   * leftmost component results in a name which is a key in this map, it is a
-   * public suffix.
+   * If a hostname is not a key in the EXCLUDE map, and if removing its leftmost component results
+   * in a name which is a key in this map, it is a public suffix.
    */
   public static final ImmutableMap<String, PublicSuffixType> UNDER =
-      TrieParser.parseTrie("ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?scitats,??e&b.lrusnart,d.ecapsrebu,noz.notirt,t&atse.etupmoc,is.hsmroftalp,?y??gp?h&k?s.mroftalp,trae.sppad:.zzb,,?jf?k&c?f?rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&mme0,s&tnemelepiuq,wanozama.&1-etupmoc,ble,etupmoc,??tneyoj.snc,??nc.moc.swanozama.&ble,etupmoc,?o&c.pato,i.&solots,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n??r&b.mon?e??sw.rosivda,t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.cimonotpyrc,?u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??zyx.tibelet,?");
+      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,??");
 
   /**
-   * The elements in this map would pass the UNDER test, but are known not to
-   * be public suffixes and are thus excluded from consideration. Since it
-   * refers to elements in UNDER of the same type, the type is actually not
-   * important here. The map is simply used for consistency reasons.
+   * The elements in this map would pass the UNDER test, but are known not to be public suffixes and
+   * are thus excluded from consideration. Since it refers to elements in UNDER of the same type,
+   * the type is actually not important here. The map is simply used for consistency reasons.
    */
   public static final ImmutableMap<String, PublicSuffixType> EXCLUDED =
-      TrieParser.parseTrie("kc.www?pj.&a&mahokoy.ytic?yogan.ytic??ebok.ytic?i&adnes.ytic?kasawak.ytic??oroppas.ytic?uhsuykatik.ytic???");
+      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???");
 }
diff --git a/pom.xml b/pom.xml
index c098117..df7f411 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,23 +4,21 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>org.sonatype.oss</groupId>
-    <artifactId>oss-parent</artifactId>
-    <version>9</version>
-  </parent>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-parent</artifactId>
-  <version>27.1-jre</version>
+  <version>30.0-jre</version>
   <packaging>pom</packaging>
   <name>Guava Maven Parent</name>
+  <description>Parent for guava artifacts</description>
   <url>https://github.com/google/guava</url>
   <properties>
     <!-- Override this with -Dtest.include="**/SomeTest.java" on the CLI -->
     <test.include>%regex[.*.class]</test.include>
-    <truth.version>0.42</truth.version>
-    <animal.sniffer.version>1.17</animal.sniffer.version>
-    <maven-javadoc-plugin.version>3.0.1</maven-javadoc-plugin.version>
+    <truth.version>1.0</truth.version>
+    <animal.sniffer.version>1.18</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>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <issueManagement>
     <system>GitHub Issues</system>
@@ -29,14 +27,11 @@
   <inceptionYear>2010</inceptionYear>
   <licenses>
     <license>
-      <name>The Apache Software License, Version 2.0</name>
+      <name>Apache License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
       <distribution>repo</distribution>
     </license>
   </licenses>
-  <prerequisites>
-    <maven>3.0.3</maven>
-  </prerequisites>
   <scm>
     <connection>scm:git:https://github.com/google/guava.git</connection>
     <developerConnection>scm:git:git@github.com:google/guava.git</developerConnection>
@@ -76,6 +71,7 @@
         <directory>src</directory>
         <excludes>
           <exclude>**/*.java</exclude>
+          <exclude>**/*.sw*</exclude>
         </excludes>
       </resource>
     </resources>
@@ -89,6 +85,28 @@
     </testResources>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>enforce-versions</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireMavenVersion>
+                  <version>3.0.5</version>
+                </requireMavenVersion>
+                <requireJavaVersion>
+                  <version>1.8.0</version>
+                </requireJavaVersion>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <artifactId>maven-javadoc-plugin</artifactId>
         <version>${maven-javadoc-plugin.version}</version>
       </plugin>
@@ -97,7 +115,7 @@
       <plugins>
         <plugin>
           <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.8.0</version>
+          <version>3.8.1</version>
           <configuration>
             <source>1.8</source>
             <target>1.8</target>
@@ -105,16 +123,11 @@
         </plugin>
         <plugin>
           <artifactId>maven-jar-plugin</artifactId>
-          <version>3.0.2</version>
-          <configuration>
-            <excludes>
-              <exclude>**/ForceGuavaCompilation*</exclude>
-            </excludes>
-          </configuration>
+          <version>3.2.0</version>
         </plugin>
         <plugin>
           <artifactId>maven-source-plugin</artifactId>
-          <version>2.1.2</version>
+          <version>${maven-source-plugin.version}</version>
           <executions>
             <execution>
               <id>attach-sources</id>
@@ -122,17 +135,13 @@
               <goals><goal>jar</goal></goals>
             </execution>
           </executions>
-          <configuration>
-            <excludes>
-              <exclude>**/ForceGuavaCompilation*</exclude>
-            </excludes>
-          </configuration>
         </plugin>
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>animal-sniffer-maven-plugin</artifactId>
           <version>${animal.sniffer.version}</version>
           <configuration>
+            <annotations>com.google.common.util.concurrent.IgnoreJRERequirement</annotations>
             <signature>
               <groupId>org.codehaus.mojo.signature</groupId>
               <artifactId>java18</artifactId>
@@ -175,7 +184,7 @@
         </plugin>
         <plugin>
           <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.10</version>
+          <version>3.1.1</version>
         </plugin>
         <plugin>
           <artifactId>maven-antrun-plugin</artifactId>
@@ -204,10 +213,25 @@
             <argLine>-Xmx1536M -Duser.language=hi -Duser.country=IN</argLine>
           </configuration>
         </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-enforcer-plugin</artifactId>
+          <version>3.0.0-M2</version>
+        </plugin>
       </plugins>
     </pluginManagement>
   </build>
   <distributionManagement>
+    <snapshotRepository>
+      <id>sonatype-nexus-snapshots</id>
+      <name>Sonatype Nexus Snapshots</name>
+      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+    </snapshotRepository>
+    <repository>
+      <id>sonatype-nexus-staging</id>
+      <name>Nexus Release Repository</name>
+      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+    </repository>
     <site>
       <id>guava-site</id>
       <name>Guava Documentation Site</name>
@@ -224,22 +248,22 @@
       <dependency>
         <groupId>org.checkerframework</groupId>
         <artifactId>checker-qual</artifactId>
-        <version>2.5.2</version>
+        <version>3.5.0</version>
       </dependency>
       <dependency>
         <groupId>com.google.errorprone</groupId>
         <artifactId>error_prone_annotations</artifactId>
-        <version>2.2.0</version>
+        <version>2.3.4</version>
       </dependency>
       <dependency>
         <groupId>com.google.j2objc</groupId>
         <artifactId>j2objc-annotations</artifactId>
-        <version>1.1</version>
+        <version>1.3</version>
       </dependency>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.12</version>
+        <version>4.13</version>
         <scope>test</scope>
       </dependency>
       <dependency>
@@ -301,4 +325,53 @@
       </dependency>
     </dependencies>
   </dependencyManagement>
+  <profiles>
+    <profile>
+        <id>sonatype-oss-release</id>
+        <build>
+          <plugins>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-source-plugin</artifactId>
+              <version>${maven-source-plugin.version}</version>
+              <executions>
+                <execution>
+                  <id>attach-sources</id>
+                  <goals>
+                    <goal>jar-no-fork</goal>
+                  </goals>
+                </execution>
+              </executions>
+            </plugin>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-javadoc-plugin</artifactId>
+              <version>${maven-javadoc-plugin.version}</version>
+                <executions>
+                  <execution>
+                    <id>attach-javadocs</id>
+                    <goals>
+                      <goal>jar</goal>
+                    </goals>
+                </execution>
+              </executions>
+            </plugin>
+            <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-gpg-plugin</artifactId>
+              <version>1.6</version>
+              <executions>
+                <execution>
+                  <id>sign-artifacts</id>
+                  <phase>verify</phase>
+                  <goals>
+                    <goal>sign</goal>
+                  </goals>
+                </execution>
+              </executions>
+            </plugin>
+          </plugins>
+      </build>
+    </profile>
+  </profiles>
 </project>
diff --git a/refactorings/TraverserRewrite.java b/refactorings/TraverserRewrite.java
index deeda6e..74e0684 100644
--- a/refactorings/TraverserRewrite.java
+++ b/refactorings/TraverserRewrite.java
@@ -24,6 +24,7 @@
  * Refaster rules to rewrite usages of {@code com.google.common.collect.TreeTraverser} in terms of
  * {@code com.google.common.graph.Traverser}.
  */
+@SuppressWarnings("DefaultPackage")
 public class TraverserRewrite {
   abstract class TreeTraverserPreOrder<N> {
     @Placeholder
diff --git a/util/deploy_snapshot.sh b/util/deploy_snapshot.sh
index c783974..2eaea17 100755
--- a/util/deploy_snapshot.sh
+++ b/util/deploy_snapshot.sh
@@ -10,7 +10,7 @@
 }
 
 if [ "$TRAVIS_REPO_SLUG" == "google/guava" ] && \
-   [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && \
+   [ "$TRAVIS_JDK_VERSION" == "openjdk8" ] && \
    [ "$TRAVIS_PULL_REQUEST" == "false" ] && \
    [ "$TRAVIS_BRANCH" == "master" ]; then
   echo "Publishing Maven snapshot..."
diff --git a/util/print_surefire_reports.sh b/util/print_surefire_reports.sh
index bf4e39c..611505a 100755
--- a/util/print_surefire_reports.sh
+++ b/util/print_surefire_reports.sh
@@ -4,7 +4,7 @@
 
 # Ignore passing tests.
 files=($(
-  grep -e 'failures=.[^0]' -e 'errors=.[^0]' */target/surefire-reports/*.xml -l |
+  grep -e 'failures=.[^0]' -e 'errors=.[^0]' {android/,}*/target/surefire-reports/*.xml -l |
     sed -e 's/TEST-//; s/.xml$//'))
 
 for file in "${files[@]}"; do
diff --git a/util/update_snapshot_docs.sh b/util/update_snapshot_docs.sh
index dfe4b89..14202e1 100755
--- a/util/update_snapshot_docs.sh
+++ b/util/update_snapshot_docs.sh
@@ -5,7 +5,7 @@
 set -e -u
 
 if [ "$TRAVIS_REPO_SLUG" == "google/guava" ] && \
-   [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ] && \
+   [ "$TRAVIS_JDK_VERSION" == "openjdk8" ] && \
    [ "$TRAVIS_PULL_REQUEST" == "false" ] && \
    [ "$TRAVIS_BRANCH" == "master" ]; then
   echo "Publishing Javadoc and JDiff..."