Snap for 8730993 from 5f22c8444dbd3d29182cf083697153fe90560ad6 to mainline-tzdata3-release

Change-Id: I3988b4ea82f653818533410acc1c1eb57cb5af4a
diff --git a/.gitignore b/.gitignore
index cba2583..686e727 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
 *.iml
 .gradle
 /.idea/libraries
-/.idea/libraries-with-intellij-classes.xml
 /.idea/modules.xml
 /.idea/workspace.xml
 /.idea/runConfigurations
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 7b95057..63de93b 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -2,37 +2,6 @@
   <profile version="1.0">
     <option name="myName" value="Project Default" />
     <inspection_tool class="GroovyAssignabilityCheck" enabled="false" level="WARNING" enabled_by_default="false" />
-    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
-      <option name="TOP_LEVEL_CLASS_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="INNER_CLASS_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="METHOD_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
-        </value>
-      </option>
-      <option name="FIELD_OPTIONS">
-        <value>
-          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
-          <option name="REQUIRED_TAGS" value="" />
-        </value>
-      </option>
-      <option name="IGNORE_DEPRECATED" value="false" />
-      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
-      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
-      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
-      <option name="myAdditionalJavadocTags" value="hide" />
-    </inspection_tool>
     <inspection_tool class="KotlinUnusedImport" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="LoopToCallChain" enabled="false" level="INFO" enabled_by_default="false" />
     <inspection_tool class="RedundantSemicolon" enabled="true" level="ERROR" enabled_by_default="true" />
diff --git a/.idea/misc.xml b/.idea/misc.xml
index b3becf1..8c572d5 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -10,16 +10,16 @@
           <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
           <item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
           <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
-          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
-          <item index="5" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
-          <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
-          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
-          <item index="8" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
-          <item index="9" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
-          <item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
-          <item index="11" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
-          <item index="12" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
-          <item index="13" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
+          <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
+          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
+          <item index="9" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
+          <item index="10" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
+          <item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
+          <item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
+          <item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
         </list>
       </value>
     </option>
@@ -30,21 +30,21 @@
           <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
           <item index="2" class="java.lang.String" itemvalue="javax.validation.constraints.NotNull" />
           <item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
-          <item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
-          <item index="5" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
-          <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
-          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
-          <item index="8" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
-          <item index="9" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
-          <item index="10" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
-          <item index="11" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
-          <item index="12" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
-          <item index="13" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="4" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
+          <item index="5" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
+          <item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
+          <item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
+          <item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
+          <item index="9" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
+          <item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
+          <item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
+          <item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
+          <item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
         </list>
       </value>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11 (3)" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/classes" />
   </component>
 </project>
\ No newline at end of file
diff --git a/Android.bp b/Android.bp
index d573be9..921deaf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -24,8 +24,6 @@
     ],
     java_resource_dirs: ["src/main/resources/"],
     static_libs: [
-        "jsr305",
-        "jsr330",
         "kotlin-reflect",
         "metalava-tools-common-m2-deps",
         "metalava-gradle-plugin-deps",
diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md
deleted file mode 100644
index 4dbd80a..0000000
--- a/COMPATIBILITY.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# Compatibility
-
-As stated in the README, one of Metalava's core functions is that it
-can diff two versions of an API to determine compatibility. But what
-does that word "compatibility" mean? This document details the definitions
-Metalava maintainers have adopted then uses those definitions to outline
-the specific compatibility that Metalava strives to uphold.
-
-The inspiration for this comes from the [Evolving Java Based APIs series](https://wiki.eclipse.org/Evolving_Java-based_APIs)
-in the Eclipse Wiki.
-
-## Binary Compatibility
-
-Binary compatibility is when **existing binaries correctly link with an updated library at load time**.
-
-An example of a binary incompatibility is deleting a public method.
-
-Metalava strives to prevent 100% of binary incompatible changes when performing
-compatibility checks. In the context of semantic versioning, incompatibilities are only allowed at
-major version bumps or by special exemption during certain later stages of release.
-
-## Source Compatibility
-
-Source compatibility is when **existing source compiles against an updated library without compile time errors**.
-
-Examples of source incompatibilities are adding an enum value in Kotlin (due to exhaustive when checks) or
-changing the name of a parameter.
-
-Metalava warns or blocks on many forms of source incompatibility; however, 100% enforcement is not a goal.
-about source compatibility than binary compatibility. Some forms of source incompatibility are simple to fix
-and very difficult to avoid; therefore source compatibility is not considered a hard requirement for API Compatibility.
-
-## Runtime Compatibility
-
-Runtime compatibility is when **existing valid interactions with an updated library do not trigger unexpected exceptions at runtime**.
-
-An example of runtime incompatibility is changing a method from nullable to non-null.
-
-Runtime incompatibility is impossible to enforce with tooling, but is nice to have. Therefore Metalava strives
-to prevent runtime incompatibility with it's checks, but cannot provide any assurances about it.
-
-## API Contract Compatibility
-
-
-API Contract Compatibility is when **existing client code is not invalidated by the new API**.
-
-API compatibility is most strongly enforceable with Binary compatibility. Unfortunately,
-it is extremely difficult to fully automate the detection of all Api Contract incompatibilities. For example,
-if a method documents that it returns a non-empty list, then the comment changes to state that it allows
-the return of an empty list, that breaks the API contract.
-
-Metalava strives to maintain API Contract Compatibility as fully as possible.
-
diff --git a/FORMAT.md b/FORMAT.md
index 41626c2..4e7e515 100644
--- a/FORMAT.md
+++ b/FORMAT.md
@@ -449,6 +449,7 @@
 
 ```
    method public void setTitleTextColor(@android.annotation.ColorInt int);
+   method public void setTitleTextColor(@android.support.annotation.ColorInt int);
    method public void setTitleTextColor(@androidx.annotation.ColorInt int);
 ```
 
diff --git a/OWNERS b/OWNERS
index 29a6ff1..27e3c6a 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,6 +2,4 @@
 jeffrygaston@google.com
 asfalcone@google.com
 alanv@google.com
-aurimas@google.com
-emberrose@google.com
-sjgilbert@google.com
+aurimas@google.com
\ No newline at end of file
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
deleted file mode 100644
index 7ca382a..0000000
--- a/PREUPLOAD.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-[Hook Scripts]
-ktlint_hook = ${REPO_ROOT}/tools/metalava/gradlew -q -p ${REPO_ROOT}/tools/metalava --continue :ktlint --configuration-cache
-
-[Builtin Hooks]
-commit_msg_changeid_field = true
-commit_msg_test_field = true
diff --git a/README.md b/README.md
index 397de8d..9092685 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,24 @@
 # Metalava
 
-Metalava is a metadata generator intended for JVM type projects. The main
-users of this tool are Android Platform and AndroidX libraries, however this
-tool also works on non-Android libraries.
+(Also known as "doclava2", but deliberately not named doclava2 since crucially
+it does not generate docs; it's intended only for **meta**data extraction and
+generation.)
 
-Metalava has many features related to API management. Some examples of the most
-commonly used ones are:
+Metalava is a metadata generator intended for the Android source tree, used for
+a number of purposes:
 
-* Allows extracting the API (into signature text files, into stub API files
-  which in turn get compiled into android.jar, the Android SDK library) and
+* Allow extracting the API (into signature text files, into stub API files
+  (which in turn get compiled into android.jar, the Android SDK library) and
   more importantly to hide code intended to be implementation only, driven by
-  javadoc comments like @hide, @doconly, @removed, etc, as well as various
+  javadoc comments like @hide, @$doconly, @removed, etc, as well as various
   annotations.
 
 * Extracting source level annotations into external annotations file (such as
   the typedef annotations, which cannot be stored in the SDK as .class level
-  annotations) to ship alongside the Android SDK and used by Android Lint.
+  annotations).
 
 * Diffing versions of the API and determining whether a newer version is
-  compatible with the older version. (See [COMPATIBILITY.md](COMPATIBILITY.md))
+  compatible with the older version.
 
 ## Building and running
 
@@ -29,29 +29,11 @@
     $ cd tools/metalava
     $ ./gradlew
 
-It puts build artifacts in `../../out/metalava/`.
+This builds a binary distribution in `../../out/host/common/install/metalava/bin/metalava`.
 
-To run the metalava executable:
+To run metalava:
 
-### Through Gradle 
-
-To list all the options:
-
-    $ ./gradlew run
-
-To run it with specific arguments:
-
-    $ ./gradlew run --args="--api path/to/api.txt"
-
-### Through distribution artifact
-
-First build it with:
-
-    $ ./gradlew installDist
-
-Then run it with:
-
-    $ ../../out/metalava/install/metalava/bin/metalava
+    $ ../../out/host/common/install/metalava/bin/metalava
                     _        _
      _ __ ___   ___| |_ __ _| | __ ___   ____ _
     | '_ ` _ \ / _ \ __/ _` | |/ _` \ \ / / _` |
@@ -73,8 +55,25 @@
 
 (*output truncated*)
 
+Metalava has a new command line syntax, but it also understands the doclava1
+flags and translates them on the fly. Flags that are ignored are listed on the
+command line. If metalava is dropped into an Android framework build for
+example, you'll see something like this (unless running with --quiet) :
+
+    metalava: Ignoring javadoc-related doclava1 flag -J-Xmx1600m
+    metalava: Ignoring javadoc-related doclava1 flag -J-XX:-OmitStackTraceInFastThrow
+    metalava: Ignoring javadoc-related doclava1 flag -XDignore.symbol.file
+    metalava: Ignoring javadoc-related doclava1 flag -doclet
+    metalava: Ignoring javadoc-related doclava1 flag -docletpath
+    metalava: Ignoring javadoc-related doclava1 flag -templatedir
+    metalava: Ignoring javadoc-related doclava1 flag -htmldir
+    ...
+
 ## Features
 
+* Compatibility with doclava1: in compat mode, metalava spits out the same
+  signature files for the framework as doclava1.
+
 * Ability to read in an existing android.jar file instead of from source, which
   means we can regenerate signature files etc for older versions according to
   new formats (e.g. to fix past errors in doclava, such as annotation instance
@@ -85,7 +84,7 @@
   annotations. This isn't just merged at export time, it's merged at codebase
   load time such that it can be part of the API analysis.
 
-* Support for an updated signature file format (which is described in [FORMAT.md](FORMAT.md))
+* Support for an updated signature file format (which is described in FORMAT.md)
 
   * Address errors in the doclava1 format which for example was missing
     annotation class instance methods
diff --git a/USAGE.md b/USAGE.md
deleted file mode 100644
index 9cdc59a..0000000
--- a/USAGE.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Metalava usage by clients
-
-This doc lists out known usages of Metalava with specific features used by each user. The main users are Android
-platform and AndroidX libraries.
-
-## Features used by both androidx and Android platform
-- Signature generation of `*.txt` e.g. `current.txt` (`--api`)
-- API change compatibility checking of current API vs previous version txt (`--check-compatibility:api:released`)
-- API lint for compliance with [Android API guidelines](https://s.android.com/api-guidelines) (`--api-lint`)
-
-## Features used exclusively by androidx
-- Kotlin sources as inputs
-
-## Features used exclusively by Android platform
-- Support for partial signature files (opposite of `--show-unannotated`) where `@SystemApi` txt file omits public APIs
-- Java stubs for jar generation (`--stubs`) for generating android.jar, etc for SDK
-- Java stubs for docs generation (`--doc-stubs`) for passing to documentation tools
-- Documentation stub enhancement (`--enhance-documentation`)
-- Injecting `added in API level` into documentation stubs (`--apply-api-levels`)
-- Generating API levels information for documentation and SDK (`--generate-api-levels`)
-- Documentation rewriting for documentation stubs (`--replace-documentation`) used by libcore
-- Rewriting of nullness annotations to @RecentlyNull/NonNull (`--migrate-nullness`,
-`--force-convert-to-warning-nullability-annotations`) for SDK
-- Tracking @removed APIs (`--removed-api`)
-- DEX API signature generation (`--dex-api`) for for hidden API enforcement
-- XML API signature generation (`--api-xml`) for CTS tests and test coverage infrastructure
-- Annotation include, exclude, rewrite, passthrough in stubs (`--include-annotations`, `--exclude-all-annotations`,
-`--pass-through-annotation`, `--exclude-annotation`)
-- Annotation extraction (`--extract-annotations`, `--include-annotation-classes`, `--rewrite-annotations`,
-`--copy-annotations`, `--include-source-retention`) for generating SDK
-- Generating SDK metadata (`--sdk-`values`)
diff --git a/androidx-studio-integration.sh b/androidx-studio-integration.sh
index 68f47ec..6a982c6 100755
--- a/androidx-studio-integration.sh
+++ b/androidx-studio-integration.sh
@@ -19,9 +19,4 @@
 export LINT_VERSION=`grep -oP "(?<=baseVersion = ).*" tools/buildSrc/base/version.properties`
 export LINT_REPO="$(pwd)/out/repo"
 
-tools/gradlew -p tools/metalava \
-  --no-daemon \
-  --stacktrace \
-   --dependency-verification=off \
-  -PlintRepo=$LINT_REPO \
-  -PlintVersion=$LINT_VERSION
+tools/gradlew -p tools/metalava --no-daemon --stacktrace -PlintRepo=$LINT_REPO -PlintVersion=$LINT_VERSION
diff --git a/build.gradle.kts b/build.gradle.kts
index 6f2499b..3cfadfa 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -31,7 +31,7 @@
 }
 
 plugins {
-    alias(libs.plugins.kotlinJvm)
+    kotlin("jvm") version "1.5.0"
     id("application")
     id("java")
     id("maven-publish")
@@ -56,8 +56,8 @@
 
     kotlinOptions {
         jvmTarget = "1.8"
-        apiVersion = "1.6"
-        languageVersion = "1.6"
+        apiVersion = "1.4"
+        languageVersion = "1.4"
         allWarningsAsErrors = true
     }
 }
@@ -67,8 +67,9 @@
     logger.warn("Building using custom $customLintVersion version of Android Lint")
     customLintVersion
 } else {
-    "30.3.0-alpha08"
+    "30.0.0-alpha14"
 }
+val kotlinVersion: String = "1.5.0"
 
 dependencies {
     implementation("com.android.tools.external.org-jetbrains:uast:$studioVersion")
@@ -81,15 +82,14 @@
     implementation("com.android.tools:common:$studioVersion")
     implementation("com.android.tools:sdk-common:$studioVersion")
     implementation("com.android.tools:sdklib:$studioVersion")
-    implementation(libs.kotlinStdlib)
-    implementation(libs.kotlinReflect)
+    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
+    implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
     implementation("org.ow2.asm:asm:8.0")
     implementation("org.ow2.asm:asm-tree:8.0")
-    implementation("com.google.guava:guava:30.1.1-jre")
     testImplementation("com.android.tools.lint:lint-tests:$studioVersion")
-    testImplementation("junit:junit:4.13.2")
-    testImplementation("com.google.truth:truth:1.1.3")
-    testImplementation(libs.kotlinTest)
+    testImplementation("junit:junit:4.11")
+    testImplementation("com.google.truth:truth:1.0")
+    testImplementation("org.jetbrains.kotlin:kotlin-test:$kotlinVersion")
 }
 
 val zipTask: TaskProvider<Zip> = project.tasks.register(
@@ -102,7 +102,6 @@
 
 val testTask = tasks.named("test", Test::class.java)
 testTask.configure {
-    maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1
     testLogging.events = hashSetOf(
         TestLogEvent.FAILED,
         TestLogEvent.PASSED,
@@ -137,9 +136,9 @@
 
 fun getBuildDirectory(): File {
     return if (System.getenv("OUT_DIR") != null) {
-        File(System.getenv("OUT_DIR"), "metalava")
+        File(System.getenv("OUT_DIR"), "host/common/metalava")
     } else {
-        File(projectDir, "../../out/metalava")
+        File("../../out/host/common")
     }
 }
 
@@ -151,7 +150,7 @@
     return if (System.getenv("DIST_DIR") != null) {
         File(System.getenv("DIST_DIR"))
     } else {
-        File(projectDir, "../../out/dist")
+        File("../../out/dist")
     }
 }
 
@@ -169,11 +168,11 @@
     return if (System.getenv("DIST_DIR") != null) File(System.getenv("DIST_DIR")).name else "0"
 }
 
-// KtLint: https://github.com/pinterest/ktlint
+// KtLint: https://github.com/shyiko/ktlint
 
 fun Project.getKtlintConfiguration(): Configuration {
     return configurations.findByName("ktlint") ?: configurations.create("ktlint") {
-        val dependency = project.dependencies.create("com.pinterest:ktlint:0.41.0")
+        val dependency = project.dependencies.create("com.pinterest:ktlint:0.33.0")
         dependencies.add(dependency)
     }
 }
@@ -182,7 +181,7 @@
     description = "Check Kotlin code style."
     group = "Verification"
     classpath = getKtlintConfiguration()
-    mainClass.set("com.pinterest.ktlint.Main")
+    main = "com.pinterest.ktlint.Main"
     args = listOf("src/**/*.kt", "build.gradle.kts")
 }
 
@@ -190,7 +189,7 @@
     description = "Fix Kotlin code style deviations."
     group = "formatting"
     classpath = getKtlintConfiguration()
-    mainClass.set("com.pinterest.ktlint.Main")
+    main = "com.pinterest.ktlint.Main"
     args = listOf("-F", "src/**/*.kt", "build.gradle.kts")
 }
 
@@ -240,22 +239,16 @@
         metadata.writeText(
             text.replace(
                 "\"buildId\": .*".toRegex(),
-                "\"buildId:\": \"${buildId}\""
-            )
+                "\"buildId:\": \"${buildId}\"")
         )
     }
 }
 
-val archiveTaskProvider = configurePublishingArchive(
+configureBuildInfoTask(project, isBuildingOnServer(), getDistributionDirectory())
+configurePublishingArchive(
     project,
     publicationName,
     repositoryName,
     getBuildId(),
     getDistributionDirectory()
 )
-configureBuildInfoTask(
-    project,
-    isBuildingOnServer(),
-    getDistributionDirectory(),
-    archiveTaskProvider
-)
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 50e3405..4c35c32 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -15,7 +15,7 @@
  */
 
 plugins {
-    alias(libs.plugins.kotlinJvm)
+    kotlin("jvm") version "1.5.0"
 }
 
 repositories {
diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts
deleted file mode 100644
index 57bf01a..0000000
--- a/buildSrc/settings.gradle.kts
+++ /dev/null
@@ -1,15 +0,0 @@
-pluginManagement {
-    repositories {
-        // Prefer mavenCentral as that has signed artifacts
-        mavenCentral()
-        gradlePluginPortal()
-    }
-}
-
-dependencyResolutionManagement {
-    versionCatalogs {
-        create("libs") {
-            from(files("../gradle/libs.versions.toml"))
-        }
-    }
-}
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/com/android/tools/metalava/LibraryBuildInfo.kt b/buildSrc/src/main/kotlin/com/android/tools/metalava/LibraryBuildInfo.kt
index 60716a7..807621f 100644
--- a/buildSrc/src/main/kotlin/com/android/tools/metalava/LibraryBuildInfo.kt
+++ b/buildSrc/src/main/kotlin/com/android/tools/metalava/LibraryBuildInfo.kt
@@ -26,7 +26,6 @@
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.bundling.Zip
 import java.io.File
 import java.util.concurrent.TimeUnit
 
@@ -41,8 +40,6 @@
     abstract val version: Property<String>
     @get:Input
     abstract val sha: Property<String>
-    @get:Input
-    abstract val projectZipPath: Property<String>
 
     @get:OutputFile
     abstract val outputFile: Property<File>
@@ -59,7 +56,6 @@
         info.version = version.get()
         info.path = "/"
         info.sha = sha.get()
-        info.projectZipPath = projectZipPath.get()
         info.dependencies = arrayListOf()
         info.checks = arrayListOf()
         val gson = GsonBuilder().setPrettyPrinting().create()
@@ -77,23 +73,21 @@
 fun configureBuildInfoTask(
     project: Project,
     inCI: Boolean,
-    distributionDirectory: File,
-    archiveTaskProvider: TaskProvider<Zip>
+    distributionDirectory: File
 ): TaskProvider<CreateLibraryBuildInfoTask> {
     return project.tasks.register(CREATE_BUILD_INFO_TASK, CreateLibraryBuildInfoTask::class.java) {
-        it.artifactId.set(project.provider { project.name })
-        it.groupId.set(project.provider { project.group as String })
-        it.version.set(project.provider { project.version as String })
+        it.artifactId.set(project.provider<String> { project.name })
+        it.groupId.set(project.provider<String> { project.group as String })
+        it.version.set(project.provider<String> { project.version as String })
         // Only set sha when in CI to keep local builds faster
-        it.sha.set(project.provider { if (inCI) getGitSha(project.projectDir) else "" })
-        it.projectZipPath.set(archiveTaskProvider.flatMap { task -> task.archiveFileName })
-        it.outputFile.set(project.provider {
+        it.sha.set(project.provider<String> { if (inCI) getGitSha(project.projectDir) else "" })
+        it.outputFile.set(project.provider<File> {
             File(
                 distributionDirectory,
                 "build-info/${project.group}_${project.name}_build_info.txt"
             )
         })
-        it.aggregateOutputFile.set(project.provider {
+        it.aggregateOutputFile.set(project.provider<File> {
             File(distributionDirectory, "androidx_aggregate_build_info.txt")}
         )
     }
@@ -144,7 +138,6 @@
     var version: String? = null
     var path: String? = null
     var sha: String? = null
-    var projectZipPath: String? = null
     var groupIdRequiresSameVersion: Boolean? = null
     var dependencies: ArrayList<Dependency> = arrayListOf()
     var checks: ArrayList<Check> = arrayListOf()
diff --git a/buildSrc/src/main/kotlin/com/android/tools/metalava/Publishing.kt b/buildSrc/src/main/kotlin/com/android/tools/metalava/Publishing.kt
index ab072b0..4d7ad0f 100644
--- a/buildSrc/src/main/kotlin/com/android/tools/metalava/Publishing.kt
+++ b/buildSrc/src/main/kotlin/com/android/tools/metalava/Publishing.kt
@@ -17,7 +17,6 @@
 package com.android.tools.metalava
 
 import org.gradle.api.Project
-import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.bundling.Zip
 import java.io.File
 
@@ -29,13 +28,13 @@
     repositoryName: String,
     buildId: String,
     distributionDirectory: File
-): TaskProvider<Zip> {
-    return project.tasks.register(CREATE_ARCHIVE_TASK, Zip::class.java) {
+) {
+    project.tasks.register(CREATE_ARCHIVE_TASK, Zip::class.java) {
         it.description = "Create a zip of the library in a maven format"
         it.group = "publishing"
 
         it.from("${distributionDirectory.canonicalPath}/repo")
-        it.archiveFileName.set(project.provider {
+        it.archiveFileName.set(project.provider<String> {
             "per-project-zips/${project.group}-${project.name}-all-$buildId-${project.version}.zip"
         })
         it.destinationDirectory.set(distributionDirectory)
diff --git a/gradle.properties b/gradle.properties
index 853d69f..04cb68f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,6 +4,5 @@
 org.gradle.caching=true
 org.gradle.parallel=true
 org.gradle.vfs.watch=true
-org.gradle.dependency.verification.console=verbose
 kotlin.incremental=true
 kotlin.incremental.usePreciseJavaTracking=true
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
deleted file mode 100644
index 00069ce..0000000
--- a/gradle/libs.versions.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-[versions]
-kotlin = "1.6.20"
-
-[libraries]
-kotlinStdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" }
-kotlinReflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
-kotlinTest = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
-
-[plugins]
-kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
\ No newline at end of file
diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys
deleted file mode 100644
index a674be6..0000000
--- a/gradle/verification-keyring.keys
+++ /dev/null
@@ -1,5099 +0,0 @@
-pub    14A84C976D265B25
-uid    Rafi Kamal <rafikamal93@gmail.com>
-
-sub    0190A8A50D88C2C9
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-sPa3uBnylgYyUnzuNZB3kLz3zAM04/jc8Vk=
-=/GAm
------END PGP PUBLIC KEY BLOCK-----
-
-pub    858FC4C4F43856A3
-uid    J. Daniel Kulp <dan@kulp.com>
-uid    J. Daniel Kulp <dkulp@talend.com>
-uid    J. Daniel Kulp <dan.kulp@sopera.com>
-uid    J. Daniel Kulp <dkulp@progress.com>
-uid    J. Daniel Kulp <dkulp@apache.org>
-
-sub    594E23256A36A392
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=rsN2
------END PGP PUBLIC KEY BLOCK-----
-
-pub    85911F425EC61B51
-uid    Open Source Development <mail@marcphilipp.de>
-
-sub    8B2A34A7D4A9B8B3
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-mdzS2PJko7mm
-=l0XA
------END PGP PUBLIC KEY BLOCK-----
-
-pub    A2115AE15F6B8B72
-uid    Stefan Bodewig <bodewig@apache.org>
-uid    Stefan Bodewig <stefan@samaflost.de>
-uid    Stefan Bodewig <stefan.bodewig@freenet.de>
-
-sub    6366592024774157
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=Lxw8
------END PGP PUBLIC KEY BLOCK-----
-
-pub    A41F13C999945293
-uid    Thomas Neidhart <thomas.neidhart@gmail.com>
-uid    Thomas Neidhart (CODE SIGNING KEY) <tn@apache.org>
-
-sub    8183E80D264EE073
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-25lhPkZ/FaSYF1lb13TNIRT1q1My
-=pAbP
------END PGP PUBLIC KEY BLOCK-----
-
-pub    22E44AC0622B91C3
-sub    BFE9E301CD277BAF
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFpqN94BCACaAb8Afmng1QPu5k5uzLoA1FJnF6Wf31ZU1FzDxHFHLNUYSWN2
-Bg6k95QH5ruZ+Z/QOJSoIB+b3htDklyxd8m+G2KsMIqnQs0BaTN18hb3PFyMIknM
-YWkkTPF3nVV9APk73AebTAcd2V1GB7xOP+L3T7tyUcB9/7bDeM3od6qPksdVGNMA
-0S32U8SNhe4jw8uXKdFL6PSxgyg9yeu0V7DyR92V9jF+ZicZWxaLeKpf/Vn3MBX8
-JdePR9SCJc8CNj0n/tsvg/aSmGZ3OMZTUYYvrtfgpXUw0WVkyma+T0ANcdDN91uZ
-P8lV3o+Ic8f15xwsTePDhMhmtOapIz/85ukFABEBAAG5AQ0EWmo33gEIAMB9fJ0T
-VVhqKzqj/gmlVDCT0kvevaGSDB83rwHatG/D2h9dmipoEIWBvD42/PXkYuY42iIO
-8/itvVOxpPZOL+FNRvei/ZbVEno4VGaJKQ646NkeVWyVgXZ8+VkRdZ0n09a+goz/
-e1pogJfL8BVKbU0F6trWXYywnV4+vp2kwwMGNRTXmvNabdY6rAE0TfjCGE6O9T28
-OXy7iHXFX3oTkHjtltUHWlHrLe9JhCDCPoFiSndTPYyDcZD+cEWg27BX8XsuJRvl
-brzA57xD3w25ESHWJyj84z6K52M/Ys7S/PawZ7pflRkbAJ9smeWr9+qg+GLJboc9
-vX4kdTTyQp5jkEkAEQEAAYkBNgQYAQgAIBYhBMcLhE8ALyH20rnIdSLkSsBiK5HD
-BQJaajfeAhsMAAoJECLkSsBiK5HD5coH/ROhc7Z1pjr9mWR8rr07yNEHNuGf3T/Z
-148z+ovLkV7dRobayB64VhtMwZtE+8Kmf0Tltx5zN2GQkqoSPl08dWFRTr6N7If8
-N0OCtw/XZJBHa8eD2FF7SnNWi6IwNfhCdRtbT0LCmaHKaUineldvmM1riI3GNggG
-a4cMSYw/65blR757aWAgAVZEWi9n0LUMKDRhjIaS1zjtxqSrcQ0o1TYsW9FxuCjJ
-+MzQSmtJQKiVRQ03fLJQ1z4j5u8YvmzCEqp2dEdqBuDuR6Wyf/TmgMUY9AeLT9U6
-VZTvAGH69TDqVvdmLsKhtQidSFbes+7ku5tM61P6ggfv5FJQgQk7WEQ=
-=k4Pb
------END PGP PUBLIC KEY BLOCK-----
-
-pub    CE8B1D1D2530EDC5
-uid    Eclipse Implementation of JAXB Project <jaxb-impl-dev@eclipse.org>
-
-sub    7ECBD740FF06AEB5
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-/GaP16/cf3GJBUvInoel0dMtWMeMWSA04t0=
-=F+y6
------END PGP PUBLIC KEY BLOCK-----
-
-pub    A6ADFC93EF34893E
-uid    Tom Denley (scarytom) <t.denley@cantab.net>
-
-sub    9C4C23E6FFE405BD
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN
-OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr
-9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe
-d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+
-0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg
-SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj
-YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD6JATgEEwECACIFAk+xZxICGwMG
-CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEKat/JPvNIk+ysEH/iY5dP/4ERAQ
-8YC1j1XoYmMxW219uzxZfwI0ltLtPjGQlZbwlFvwjZk0nDJ6O1iZSeZQm804uRup
-gUZe3wqOp7a7z5zHab93QD/nA7O9QmLf2RC7Y0mW0EvD0tfbCzt6JJkAaxKTDA+T
-jFoukUZx2KJr0XToE6kwAnKmCgyFkzb2SUqfsBRNRBJBa6XG/1mAtDJJSM1XLChV
-Sa9nLwYjZzIcebtmtQ1vVqovO74ixxEzonLlNZi7tkc3GS23yntf5tAH0bQ9bM68
-TB9RHpLvjGgHUJtghFQN/Ny+//q1EsjRGn6Pa20cUPxnMS+WguOYIQx5jTb9ZHA0
-WBcu/V4UL8W5AQ0ET7FnEgEIAM3i3e1sjwrx2PN8XYMPQWG+/YTtw1BYDl2+iYE+
-LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqKrkJ0LRjlpdKhKBvyH1ex4grh3cWN
-/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3aFIsii+vadrwYYvuVYGeWvdZhB7mJ
-KYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6
-JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh5eCol11uSoWPKcQR2Ar8Eo56nxv/
-UApdu15iJ7R8cA5guKeeS4jt0CGCPs2PhuggDxI73Xvl4zsAEQEAAYkBHwQYAQIA
-CQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9iwtIQeexMWBmQNdDe0md8HLulDfcu
-jPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP79uF0qgswSxINYCOJx4nTPIP9BOd
-TwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc0u/I0PqnhKCi4Pq79hLIx7eiX2yS
-fXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2c
-pIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co+GoYkieIxxibDCmt3BioLgmyzpGU
-sMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIhZlI/ojefaZkRseFrtl3X
-=rYGl
------END PGP PUBLIC KEY BLOCK-----
-
-pub    0DA8A5EC02D11EAD
-uid    Paul Holser <pholser@alumni.rice.edu>
-
-sub    71499A87DC1FF84B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBE3LMfMRBAD90h69D8yyPWaSoAyh2mOOOZ/XH0isuBpDZCWptemlMHgImqdQ
-2sXLXYT1bJKmSaMw+yKjp8J/NYk69EbmSK1C2nypLQtWhUmXXd3XVYw6hrG/dGvi
-gjkS5eq8L04f5CSuXO7r1eLTOch9iDl/ESaI5Nhq9A3mRQIhQalum+FjzwCgx0PK
-hoC4MVPVGXzOQPc5sG4jzAUD/0OX9c/yKQqjHUs38HTCgrjseM40iPhp8NfbWenP
-IwUMSWXE3lz0MMeKrGcEOcZOGWsjyepkLHXwj8DDOeGxhfh9bhFRJssdfzOCKBpf
-6S70A3fanzqOAvddxCqF/zOwDaieDmWvVntVpmZO9d+pgR/sZN0JgSIm7qGDdNqG
-Aq6eBACyywfwuVoY6lfNz70ZZqYjYuUkbKnKqpG0XmI+m5LYrUW7QuKJqaNdg+ZL
-vVgX/TdkWVSIoSRS5+eYm3fRD++cg3ZgoR6ZY4WEa7SRSp2zoidtQijWOzp8WeHs
-30rIaXBrb5wHR4GQ4FYsBGRuWkmIaferusllUmHCHFJI4ldvgbQlUGF1bCBIb2xz
-ZXIgPHBob2xzZXJAYWx1bW5pLnJpY2UuZWR1PohgBBMRAgAgBQJNyzHzAhsDBgsJ
-CAcDAgQVAggDBBYCAwECHgECF4AACgkQDail7ALRHq3DJACdGesiXWFVnEWCRLR8
-9xBCGaFsQLoAoKHC5Xa02yuYClszNb+YiWKWfIyRuQINBE3LMfMQCADWsPvQO8Jz
-L3VKFAo/aydnhwsmcXAoCu6UNRzGgFnQAbSoxtoTyOKIlMcjCBWuqwppLUkQ2/q1
-V1RLzEezC7fTO93ShtqP7ggZeUxV1zrTnZjhIsAY1sZXD30CHU6RDui/3aCZgBh+
-qmk61G3W3KXPsl/4Xp6vS6Z1UFmbx8n5CPNPDfoDARGPZuNVtzqiAzs6xPKu7mhk
-Y4n6glT4z3+aH8arcDKtx9TxzpsvalpxfDKUwTiXHLh8EHsGwyiA9deKmVnZdEft
-GaVmIB8se/dK3FUHVGstdVyN2eog7aC5VisrqbEf1Ywbguc4a9ydhN8a1Z7ESY0D
-mXwg5KCwr4ifAAMFCADTftyUMWLddZpkFVey3sh+RTpsqr2+GamFLh+4HHjCnswE
-DraTSQYOZlZxuKdlafJvKmKWL2KFhIeWncRjMI1NtQxaVuFz999ge6+tmwhPYPEw
-9vaIKeM+7kcwZ6BMzyJNOi1bjFiYlSwQMi+BBTPT9Q2w8dNfldTT1Khwvdg4/kzF
-wRuA7QWmOfLdfvqtz4RMB31OYMmLsc6bbiCsp05BcdAmvrmPudNz0zfNadPE4/d8
-v2NxWcZOcsZFWhHuR50OlrkWygWq1jxgxoW809W8jj6b6OjOM3BODZ0YbqdTZ0QL
-SqAMR4oxInAXXCA7cV7qZce/Gtq2A2up91j+u0QZiEkEGBECAAkFAk3LMfMCGwwA
-CgkQDail7ALRHq00qACeKCQcMI27s7CbzHTUT35ovvcmYNcAoKPtE6Hta7WJlBuN
-4l/KkzoJD593
-=PI9b
------END PGP PUBLIC KEY BLOCK-----
-
-pub    BCF4173966770193
-sub    C9F04E6E2DC4F7F8
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFKneXIBCACtnX3ZQmPujf6ocvdnhsBheze71DSl34TfebyW2Qt+g9NhMxo4
-DaJy+iFNnsaMwLZRr6k/qf+ISE3A4opWAQlbk+Wb5s6DPPA2cHH6W4GdkxtuJzqt
-tFn6YtkFhA15Aahr/vz31NBjUJlBmO4PwvkyxiF/MYP6TQ/AHar4xP1RxSYEPcCi
-dIQczQ8nXzya4OqOyTfibeGz/eiHHuwTLHi3Rd2kihQnlRQdhE1rmm8uTyzFe1H+
-P7WW7kQgygW6yxQ3J+DXrG8kG+nbe57ZY1oyv3F/fOBxzn/kuoKHZ3JJEMJmTIrT
-Lr1ngCZApgteAynRHk4t/SYZiyoyqZCuBcwHABEBAAG5AQ0EUqd5cgEIAL3PEOzt
-IFUibB6FYEkObVhsDbCnHw9yO5MAvAWB60Ohf1J4T9QK63jZ5/CiqcDrw+uab9I+
-Ruz/SgGyFS0UXAkwfTICUdhT5kUzZmGyoj2ul+iFDP9uUdEgSgyXXakrxBbBPzNa
-Mx8+GyIXRVFyRTH7+1gWgPQsdN1sGYOgZ+f8TMzAv6sxu0JVzjKXAAbXdiZTyJh9
-d6h1jS5Icilu8vRwn3Qc/ZzstBRk+eLbb69wS9YGoUlzYvDBz+5tiNwvHUriKc6z
-VT4Edngcr0mKWTdvD+AsvZffU0XK+vxbgMuRWi/51qb+VgK2gFeAseV6a+D1059u
-2+5Pn3h/Fv/vRAEAEQEAAYkBJQQYAQIADwUCUqd5cgIbDAUJEswDAAAKCRC89Bc5
-ZncBk0qgCACdP8kyUZVqfncA2RsQH38NFYhBz5MAEOIhCm7qwPC6XG08CUZfpPXd
-UbxZGUliE6vhfj7rZbvUKKHlcHDPobdTJqGof2jt2MfsjJ18JY0exSWuVTmNmqAC
-3gsiMfEGIqjQFWonfm0Od4AvduLuc0TPkyfr0gobakgYvhDjk7eQvgC1QfKlk6hH
-A/OAFW774qaQsyrANrFevRa7CBQEob6V6N8aV1vNxgl8a6fJzPTNBOOmP0mq7xk6
-nykQuqYTVFyqfXN0p1bbTxHBoW/fvdizi7zMSsuBkWUtfG1wyN70uoEQzSQwqgWC
-IaddzrPZPmaZ8CtzzyB7+JdSNItBB2Sp
-=wK3Q
------END PGP PUBLIC KEY BLOCK-----
-
-pub    5796E91EE6619C69
-uid    Eclipse EE4J Project <ee4j-dev@eclipse.org>
-
-sub    153E7A3C2B4E5118
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-YoHw
-=1Yfs
------END PGP PUBLIC KEY BLOCK-----
-
-pub    F6D4A1D411E9D1AE
-sub    B5CB27F94F97173B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE89LqsBCAC/C7QToaRF8eZgGOxcvp9aG+mFFCMjaRAb4Mh59OYdmUb6ZjfO
-9388HPebGbPNR8SHYs0dBIuWY4ZJ7oUTYPswasL8vB0iPFdyHhvkCca+yk0b8ZBM
-DmFlISm9HkYpoVjcFUp1oivyeJ5LRTJTd5JGEd/SWFRbB4TimdKXBzej9fIm2zVl
-KInEMMd8HnSYE6nm3aNkbyiqhx81bFvl8x6X3ZMWcKs+TAVXdP9uLVvWowUwcApk
-xpee442Ld1QfzMqdDnA6bGrp8LN8PZF9AXQ9Z6LTQL3p9PIq/6LPueQjpJWM+2j8
-BfhbW/F2kyHRwVNkjaa68A544shgxJcrxWzJABEBAAG5AQ0ETz0uqwEIALmEZ0xN
-tuX1cLsNUzzq0HVzwDiw5IquPWy33McESXvkaMyqyQtYisW++dY06MxBCS3uV4+1
-nKI6oA7Lk482ixwzbwws0Rb8H5CeLHDEwGXfthmLAvDdxoNCUYAtpVOMGcbGpy51
-TG3V9i9JWe1px+kvhieX9BLfDzP4Pldho9lK2gYRhmpPDgUOjYZgiQXMmIPAYfdH
-IA/VdYTETC0lu4Adb56SzOwvGMpnd3rXWUiJbZg7lW97hvbOFMKudbNjBCrF7LhW
-Ah089MU9rvunuz7mquVdNtfEBkdVrqZJdvYiFBee4RUe3+qGCpHnLzynOGHr+iIt
-DG73NR9fZCzl1K8AEQEAAYkBHwQYAQIACQUCTz0uqwIbDAAKCRD21KHUEenRrp0k
-B/wPuP2W69oweOqtSRDf1FeFNzAUIjbwjkg/bTjzJwb1cyedx7rbxhpJmn27W8A2
-WjfmDLOn4orQTKoxf3kP6SeeGhYLkzxjBa5Rco89p/6X35By6VR4LPFeTOACyE7b
-cAjqPFb+7t1YzvnmuZIgpvTKickq1D9g7+JT1Qd9nqBFKlg8aMngAooVvlLXaPEw
-Q1XfkfMN+ltwlEr7o1ts/YzDUxflaFVg0FnN7qezam/s7VvcK46rO95yQr/Wyz2o
-VDzc34e+Nr/b2pN05MDHA0dXmb/irwPBl0mTOgAgC805qkR14xhd1GeL6MEA34k8
-2Sq/O3gWhBaB3KOy55/lvvKp
-=CmMl
------END PGP PUBLIC KEY BLOCK-----
-
-pub    0374CF2E8DD1BDFD
-uid    Sonatype, Inc. (Sonatype release key) <dev@sonatype.com>
-
-sub    F2E4DE8FA750E060
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBEmoKU8RBADEN0Q6AuEWEeddjARAzNXcjEx1WfTbLxW5abiiy7zLEht63mhF
-kBlbyxEIRnHCSrPLUqY5ROWdyey8MJw+bsQn005RZmSvq2rniXz3MpcyAcYPVPWx
-zgoqKUiu+pn3R7eldoDpMcQRsdNbK4TOFWNUomII70Lkj4u/DP9eko6xowCgvK/R
-oRhshwRoxJl1LauUFuTeVHUD/i5DryK5j/P9tv9BWSb/2Jji6gbg6Q3MThZ+jCTi
-leOHR6PSqajYphOFaA8xVWQAkvbqfSps9HnmdFJ37zxOn2ps9d1L8NLoX1GMu7dv
-UZkCY5hR4gwaAk5YpyKa93NpaS5nX6beKiCes7lDy7DezjQLZVbKI3Vsd5t70eTW
-tD7JA/4lGUSkole28jxo4ZKKkGMFnAXkV5mWeOTz14BibW7JqhkiIpckDfyq4NjK
-ts1EzMmnXmPkB/u5QHHe6fJP+Laoe//gP3Y5+xlnAsyI4iEfEjydJWiSNx48c/2l
-qCQ/wdOb28xoFavdCCBavqSKXKJREHXul1UGMICpu3rq9EOk47Q4U29uYXR5cGUs
-IEluYy4gKFNvbmF0eXBlIHJlbGVhc2Uga2V5KSA8ZGV2QHNvbmF0eXBlLmNvbT6I
-YAQTEQIAIAUCSagpTwIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEAN0zy6N
-0b39dtIAnibkyo2aMppDYMxMs0uQvs8Twb+XAJ43OOyntZVCmB9nD2mlCamzXwqg
-5IhGBBARAgAGBQJJqFtYAAoJEDDm+AQ0pyp/VrwAniL38WwXOBSLRSgp2Ytqs7Sq
-MgWpAJ9iLiUTWoqDmBhw0N7NXgARTM67nohGBBARAgAGBQJJrdziAAoJEJsf2p88
-BiIxMpgAoN6x/nM+QKDJyH4zgVAJ6DdvKkzYAJ0QvklYyclsvFgeN5J1QjFyFMJ3
-l4hGBBARAgAGBQJJrd0vAAoJEGEoqs75eNhPncgAnAzDok7Av5IBxgcHWKynG5mj
-J3ZyAKC/EcWsrnQJQdMzOz1uLzF4A4Dx47kCDQRJqClPEAgA0QeHyW6OIAnKi2f9
-oxjnsGli1YfeJrnEAD0KxhwzAfO9eB4rk5gCj2DJ2IQ2vQhnFrjcCdnhagn3oAct
-fc61cmGvyN298QeusekfuweASCuW/dVjDYdlJT1yZ+/7K+ILsFKtCprot87BJpaL
-ODlk6sIbsnYUAqEKdF3Brxk6zY/T8+7pqwHgbTeadVpHrZlKGe0XHiJJaU7vxxop
-RBsHk6AryhgDWT1gDgRF5LBkyUpal8Y6qDAcbD7G5GRdQ5vOWFpNa99eA+vlGzFn
-Mi+IofgRdJ92IinZDOpmMz92uZ8jH2voCLb5zlYo4jK3RZpfQdY4ayHW31sE+zYW
-us7UfwADBQf9HFVVZi47bQfyhHVunnOSOh/CBaTu3o1Jdm7uZkxnCppGDHuBcHz0
-OriMAvDjFewBZ5uBhp1F5Z5/VlJSXHwvPUwo6KQICV3XyW+p/+V++seL5kcic3Op
-hwB1qZPYEqhceEghHmN/r/wWV/8WxkZ7Sw1AnDwqXTJiIZhaEjRVXUIjN5WpINIs
-sz+DjFnTu76S3v9VSOjTmUU7qPII3Eg7dJEgE0wv3E1d9lIPPbUa0pba9735uMLq
-oQNrT87kXKSjKhQUD0u5bu3TmLdPboHzUBWYH/00zEodwkjWK1TxZ7sv4gC8oLXT
-pyHDhLGFdjFr8bp/FM2WQ9Ip1w8ax0UAtohJBBgRAgAJBQJJqClPAhsMAAoJEAN0
-zy6N0b39q5AAoIK0VSayWKgg9KNmRZUsmmjvsiq5AJ9yBhsAewK4wWQeRnWhlAD9
-/+S7pA==
-=SKKY
------END PGP PUBLIC KEY BLOCK-----
-
-pub    0729A0AFF8999A87
-uid    Kotlin Release <kt-a@jetbrains.com>
-
-sub    3FF44D37464BBB7E
-sub    6A0975F8B1127B83
-sub    6005789E24E5AD1E
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=cFun
------END PGP PUBLIC KEY BLOCK-----
-
-pub    083891AD4774845A
-uid    Eclipse Project for JAXB <jaxb-dev@eclipse.org>
-
-sub    8118B3BCDB1A5000
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-XCfM
-=930f
------END PGP PUBLIC KEY BLOCK-----
-
-pub    6449005F96BC97A3
-uid    Michel Kraemer <michel@undercouch.de>
-
-sub    D3DBC823BE4819ED
-sub    0162FE0CF6E18BD4
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQINBE7sdQQBEACsLaqrIiSlsJIWpalL9i+i6x8Yg6l+bw8qaH/i7kjZKFLf6Xrq
-PFHo9dpF3LPOguvPLP5fs04KIShl0IhJuArSxvwfH8GnqPAaM0TZpfJQ9uqAcvxk
-OPHX7L7kow+G92RKN/nQvsLGp5sDIeThggVic041lZLmX2yRHtKVC5BYHZ03EtHU
-Ge902CwQusDyLbrDK3f+p50S33SNnCmjWhxLfGxLbOVJcRP3Zabp6dtiCJ8TLuZW
-Gn4Qwci5V/t4qk+Oi5tHerHAXn7ksaIaaGBnr8EXB07/8GRzTRZw5EO89BTnKAix
-hjJUJRr1vSpkJRY9JQbz5M2SCR2fejG7c76JmHI6i+DR6TwyqjRACBLFQnt5Qn+6
-gCpofb5qxKqStJun172/fUOZjQflws88QF0CrlVQr6BZ9pI4qjriuZtY8zmUnOHY
-mnGqzEnkzgOMXVYVyJJMBKriFD4BF8apd1ipbxokD497U1GLiZVtvCSmpdrQtIbm
-8lMRA/Qe6AJudocFNncOkw04SSO5RNRpfM4UxKMKaqnsaDMQMAhR3pFHDRaMBb5o
-cGHP9Vt5R8zZfExS3z+NHc6T26UU5OuydmMmR4GB5BxBpferUxY3F1PQSQCTyKiC
-j8x1fepD+6sxdw1F3cvq4NU5UyfdtyZydrxaCQrrwqgkB6/zkJwvYV5lyQARAQAB
-tCVNaWNoZWwgS3JhZW1lciA8bWljaGVsQHVuZGVyY291Y2guZGU+iQI1BBMBAgAf
-BQJO7HUEAhsDBgsJCAcDAgQVAggDAxYCAQIeAQIXgAAKCRBkSQBflryXo9RlD/9C
-g2XvJcLerwwN62M4S1uF4AasUgL9iDGOZV3JLNAuNmZDw63sGTNsf8/EsAHt5LZt
-Kli3PQea03F9wOK8undAZ4GltjgVR748Q+3x1iPcJhmTpCbFdZyKEAMTYcaFsrLq
-qbXKmZVlA8j7ozH9FffgSXmTNKjtYiGg7QLqy2xb3A88tejj3edPjAMnws08SJdI
-S7kL9uLyIyVYL24oChDctLLVV56nVnBLCLPps8Damxp64RWLjEK8IfrCnuLIKk6o
-ICHOOW4zjNQ7cC7R6eu+p12JLyTOMr1rKBLgV9qKeJJ0qg4i8RDrgV1gK52tUj9E
-jc9eOuFZmVX+WTqvQeEK5rw1wVNbNT+bFDDO4iWp7np5NUn0c3Q79SUS2lFSiji7
-HMtz5k3lFXK9DPF05BcT0Ir34Kl36mr704irg4V8ni6avKiMfOvbwMf516sVScmc
-Fi4894RyOLCdysan2vUpnvvPagzK+41X69JbQHpOji2WWHqSVv4mk+3jDKHnxOty
-7hfrx/MtYO1Ty2GUXgpyGQ2l27QPBFhJX9YOv2qua3ZbJEqASBmCF8ylU3LKjeZM
-HQm8mK2fOXNnjjrGeHtZrvIHLnXCvKJjr1Z5VaGnuSM7te+SMb1ZC7EtpQRSCQJp
-mRUh7/0piZEb5hmJcay4czK7zaFqkbg82qlwvonRcbkCDQRaM8ReARAAudt5KWlL
-xY//10x5MY+cz8eGg0szvzOUtbPfJPfcZQXS/B+indQvhlzmum1zl1xmdDVGsco/
-WoeAfkk2kgiLqo8Qcn/LneIPR2h/ficEs5AYySXaNVSuyO56nkA4SntC8nQ4PneE
-dG6w0ObBRRecbaauVzcwMxKM5iMFVOXOzhmeKGOYIfvHb+SeRRGStXyxKwodJo2C
-UQcB2lG6xyTrJJm8DT7V5RAYCQdMq+UplONw8z/u8pAO7mcPBLr0P5Vm4+EQ4loi
-+GAjBdSIGVTpdjmKiUe3otUt/EM63pjNuyyn9pnI0x9xQUTpMOB3A4DHoPisK4a+
-BPe9eXSfU6jJ6h00f6bAYKHgfQ4l5JF+bof0EtXGvMPba4OJ5n2CPszsaslemAWL
-e2OIXi05VkQ5USJheFfdzedIRMyAjQD/mzwVmPzTPn9y/MWS7Fsod4cPiTXOc+C1
-5vJbD5CpqTCOLdSBFcjYjGYRyxDmf4NjvqQxrdJp3KanOf/996J1+FMp+y3+p4gQ
-0Y/uXlFf9WzxkkvDntTwr6CsZ81WsVyMjVLXa01yCZ+km9OZTMwlI4aj1jB+JbTb
-RohYtL51w1sqzLHnIoRAlg/V+TtFh1xOAchu0IvfuO9xxjt/GnTRVeoD9hgrx2nI
-85wl90k2ySoUfan+7LNy73r1YYYiuPbCPx0AEQEAAYkEbAQYAQgAIBYhBB+jf75E
-U8EHPn72HWRJAF+WvJejBQJaM8ReAhsCAkAJEGRJAF+WvJejwXQgBBkBCAAdFiEE
-uMuoUN3BraxnT/jh09vII75IGe0FAlozxF4ACgkQ09vII75IGe1ySg//Qr8RPqBT
-hu87vMWDzAV8Zq7dH44JiB4EOD/v7N62f7p16ClxOnE19R7KBfcl2JDhRWvopo33
-TbLBahThnl8m+2LlcPgmUeZT4qy4P50A6Zc11MDJW8mpXO6C0ukNoS/uo9nvJQmn
-IqnHoTnm7UCB6mol6C5yGZWrZLLAmLsg+GIEKMz8fOC84OlB7rY1HFGwviYWhVtB
-XhpvLDpy2elEg1ouRlDzh+R3F894odzFqPy5Udwghq5Q71+iaqaV2A5vOjKfXChE
-fbAvzNIO/uvSRuga4/Whfo/NdvasnYpR5jebbCeFZjdSZH2NIwuXMAyLQ58SUO+K
-AtIUju/be8Fdvv/C/POTl6yrdxymiul9aBD031Ro44fM9PbxN8Nqi4hh/yjlkUdP
-cv8qdzwR232Hbuu0MTbTn5iaWjL8bBIDYVK18fykfHhlV+RPyKXL7hQL5aqDJeCs
-2Jl5pVJH8MKLXUTAcH8MQF6ErHSTbgod+sL7lUdyIbKddDFB95S7t8IyudfnX+gO
-RbVayJ9PfVn6I9YmXw2VWADUO60/Mh4sHM38M6XttR20F/HnfwoqGhZ46Qv8Q5yL
-j06aCkIV/OEQ1CB1P5O/IzYROvdyIUIXQn5/yGxIcbe7NEENzuIC1xNwtqDB3nh6
-S+ouO/m2u1cIsp0gMIijlbpYciGy3dSwU9VUvg//T2LeLhTU4U49PHF69ClktnPL
-Nxgus8cW6ZLNryfVonRJMe5PoAlsL1enm0ZAH3iC42100qKp+TXJSYAMWQ+CtUeG
-Bh3vITwf1/EFrHYPbeC/TBp/gqQCfg4HtnsbgkYauXyqKZrIuAxIEKmNN33L1rBN
-rIDxK34BxapcTId4vXtV5JCOFoU5L2K7gkHH3YN67s4ieYyI1qfYbETmbUbfrXwn
-wGKmMOP8iaDOObNHnWCl6O5/Nc9oAfKqLUhYnZsjA1Q5Y0x3D8upH63VD7/ThMjJ
-34uvFKF6vBr5nFb8vRbKYNQNjq3AyrscQEQetqPiIu+OThbz8IE7yIOmMJavywRd
-MMpgDrHljcxCCOYZslqkRLeIZDsIlKqayqas+2GMPWGaLGnO3JUz4zV1eSWt4z3O
-9wIwp5aCg2HaVwZ8yqu+sJmm58tZiWxJn2XVGptvODMKO6Jsf0I5I4DFG1WED2tn
-WaIwt6zPw0cmeLTnXIlFS/yd+Op5Lj/OK4RSOWKj4yK1ZVkdAlK0uJFaFQpzxZQc
-YtUefk6UhMb1KsUHJPdGJXbWm5yAG65Q9uuUCxnMy9N41vwZ0qFd6OfphpfPerho
-5df1LfgMBFXxH2ECA6e/mUTSVtbBHe3xtzv62DCmUFQ4PLJI+vIlDdwrygZu9+58
-SJdvzVHEXraSdgCUtk65Ag0EWjPEPAEQANK3d6/aCTYbSg4tSReUTOSDcUed17Rc
-M4zRRk/mPHPpn0qfSgC/8nIZChMrK9Uree7oB9Gxy8K5xpd84lLgkveW5PBofP0y
-adOIGWAux+S+id3QnjPBaPaLj0TG/APprWehd23tTsYA6w/K7DU0YOi4dqaNpDyX
-e1ks0qtxgpBMZnonvVjAP0gub5Cse3QHeHVCxRDHddDyQgWRSeRnKXRe6NACeZDg
-05yLpQ3o9gZExUcW7T2LQxFoKLsuQmu3b99kbqbaXvY68wrMEGWXW983tERaKfUF
-o9EAlWMl71z5xu7WjG0SSYxVzzCrzjMKIvA62VWq6yXzODgRzLx3xqQiXD379Qg9
-p5ibwcTTU4SVA40Leq1HrnM3uSqQOZW0UIpMMJSxFe2ynuk5TZqi2fXaATtiS+OD
-Ig+Wwfnw8GFfdVNnTUtsVIV/Btb82q0kvHYJ6a5jza3bTysMBWErZSZ9XxtGx6uA
-MCzOQvGZmN5zsEzcjyoaXTCIf40JVApDm/5G8JKZCc0AtWIbZcxvBcMY4NDBqVQQ
-JWJt6JeLbJg81p8hBQyg00mirnTkV81vxu7KFA4JcWD7wSZTwoNQDTG+BTdtiXvW
-JY2bKxo8FoGAAipJ6hyOiTYCQWgE5MKpFnlvoXzf/Iyt3Zz2YJ1TOgWhLsCpr4Ou
-+v5YXQda0bPvABEBAAGJAjYEGAEIACAWIQQfo3++RFPBBz5+9h1kSQBflryXowUC
-WjPEPAIbDAAKCRBkSQBflryXo489D/90qEuj8u31thQSIZkU4G/sQx9yFLblkCRE
-1Yie7X2zzGkPhm0fepkSI/h+wR7ptByumcxE1LFANwGzqYmyfT4CZVfp7kXBjKP4
-z/enYmEi66fyYYr+KbXK3JeeZku+NiGBFeP79EfyPOG33uOXEhZJbXELSiXWZlZL
-HGXo14+IHTbQA7XFUB3qi2Xg59/C59BsCqTvCB6/st+/DhUcgOiI/bXZM1c4lfqX
-u3v5x2J/U+2n2rZLVZpM92pQLRGS6Sy+crB8ymjtcTh37vi012CnJTPiRTxKOSN1
-31J3JC4RW4Bj4r0NRc8Xcb8rP3/y23WdrcOu/oFAgxqRGdCCkt4ly8yUhPHokTwj
-JxtMu98qD3A199FfqLZ331Eq+Fb1iRW/Wllr2ZNZxj5LR0vNCQZ6IYct6MZIb8DI
-cnAorSyXVjQFcUcftkCTnGeC0T3vi9hbr3oVaIOP3OgzLXGS2+xD4zySdd7YbDyL
-DJifsxHmuo1fIiaVyLBOoz4VGAddUOV0/Oz/bjdeiIeW6YBnMV2FO/BugzkBsJZh
-F/827tBdE+4+UPtFwiAOMBF2FTWQp2rWM+HYiA5CE05gTk6aoLC8Lh6klOCkrVoY
-dFrtUmOHjkpAPx9TnrqWV9AvHm4L+fVL/rZvpkfJwBT4xxYUYlnd2BpcnbuA7c8H
-5JruNwkxqQ==
-=lyIT
------END PGP PUBLIC KEY BLOCK-----
-
-pub    1669C4BB543E0445
-uid    Emily Johnston <epmjohnston@google.com>
-
-sub    5F6BA89D4B0869B9
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGNBF3TQCcBDAD177B+Btl8XBEkBQ5jFSezFrpEl4arwCEa7htCp6T3h55HvYwz
-P7Y9zWYXfhAC8XJlPQJYpqaQiiYtdlmOrOS4wbp5Lr+z/0XpFlJFzdKglxKYcdfP
-ntnGyoj7Dz03v+SitL9Ct1YZmOGz6onlifXsCTkWraSJTqR6/y2dL0Beu7dLZp94
-fgf+FAfr77bwGhUhOh0pPI6ZK2VwNMiQN92jS/RYb6i7QjzO654ALTBR6R2sqx26
-C0NNsTUZ1WawPreT/rmR4vux1pvgbC8DcXqdptVb+iQPymnysEr69J0f7YC579+7
-itFIh6efV75W9nDqp9QB/1G808oYx1rglUstOCI0axSgSNyazbInW9qOI58rLQ4v
-wnCSTWvesVNq+uO6aVrfpXIO3uUTI3t4mpBZgVYZ+g30BlCPRx52YofvQzYbbk9d
-wCMUDQAzKGJi+mazkgBhcz+neEuNUlR/0fBMObzb7cAT4gGo/sSzYVNN5oT3u/Mi
-J4hfzYUTFMsJBp0AEQEAAbQnRW1pbHkgSm9obnN0b24gPGVwbWpvaG5zdG9uQGdv
-b2dsZS5jb20+iQHUBBMBCgA+FiEEdhWtVhRN8jdvSdmLFmnEu1Q+BEUFAl3TQCcC
-GwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQFmnEu1Q+BEVv1Av+
-L/vJeWLlRoN6rdi8gto9D7kbcamLYCbpPoEG81XnY7TCX36HoAawC+DhuVNjU01z
-W/WQ+CJ3bfbq4u5WDZ964czksn4V3r8XWecD4Oexdqn8nSkC0HkxXTq+LIUF5+IJ
-OtqHU/Fd8Uinj8/CWgiplTeIBynu87DIravElsV3QaS0xYsFGllhA4Bg4/kpQ6N3
-LiFCPH3vVGgkbdWIJH4xj4/grdThSE8ZwMb7FX5i85RElpeMq9NVRBOUpwBX9hyG
-zKD9/SQONYj+JiDcythBIhe3ijmWHt40oAu31eYeckO5uIbMzusZ9vT0Px3Z/Vl3
-Fr1BCskZ48UwEAVnnQTA6sz7Sjj8GT1CM6nDxCE7PMKYleRomHPgoOx1KeDNtXGD
-3IeMsNdszr5C0s6TC529mQvuCC6rNM58YtEsrWGBkBEhiH57+HvzIIHKxRktsf0E
-G2kFRsHRI7dETG0r3aHn6137eK2l+nkqb7js7SlwFj+gioCvagrDZYGQq/zmkyg4
-uQGNBF3TQCcBDADJ17PQ4z5UVGBVUefEkTXeVlGX4oc+vUOVn8Z9B34sQkFmgsOR
-uwm+/1rGthrMatro1Jka4UXSxYFMCt6XBz4/OdJbquxs6D85iudaId9aozCOJypk
-fprp+ez2PK7pWeOq6DQ/lqqNGyoHxA703wshI38sNcKRcypn/vf1VJlO3ZjfLCVD
-Qw4+yNrdWiwklb4QS0xwjK9Bw9m8g6HiQGil8V/kL9Avpa76rGqaP9YnkTo7NQG0
-cwEbpcxNUrkO7fFKjTOMTmfPkh5pHAHVS+FsrCsxhRs6Eb6u/qestHjpYj6qtMJ5
-V7oXeUI3OZ9nAPctSxoNVn6f0otsaatoBwcJNNhO/6ZIFH7NlgYQNN3a5Pz6NrU1
-3+zMGbsxYzlL4/nVwhdn/kHPQ2tl4e2R79da7ModAjeafimikA3nGZj1Zvo1iXKL
-fguM+U90kTrPKSxcJqwgV4QvrO9Z9llRTzhdBmrFePFhlxN3JdpSKYXFInq6Jwnc
-mOAeIDhNYYcVXhcAEQEAAYkBvAQYAQoAJhYhBHYVrVYUTfI3b0nZixZpxLtUPgRF
-BQJd00AnAhsMBQkDwmcAAAoJEBZpxLtUPgRF32gMAJoI+6dvnT7GOJB4S0HAB2qh
-izmQ5MWiO7QE1HKQ6ShylihJfAIMnAMlLPhorr1ITZXaNMFO+rWNO76BdsBxAkd0
-rKIIjMTU5r1HuS+XCGFzitffkJ2TgQ2K4vKnSgEpCsBilgCJzdJevrYoCAudkZAa
-eBcT0fsTtQDnWHUJSkyWro0ovaaPF5tJzMkFZQBlaNyb+DmWPyNt5TP6iORnmeLN
-E0OajrUawFUcLUITdutn2t/PRE9LBDSlewE9Gabv79z8ZGAw7jPKx/p+ePpIj6J0
-5TM0BR9KLrk3avMIK+eKwcvm+nCyYA1jKr7c9E4bg+6sRbc6igvVL4QeKzjeGll3
-vjifmghVXVKVBOW1fk10cMNKaTEkGng8OfLhJDQDXuNz4m8/pMA/wyGfH3HBGSx+
-F3GZUb00kU0HbxV2Vt0QlyjwT9vJfVGQ4Y+GhnMF6qErtdX8cBIWFJXLEW77wWHN
-+QpRD6BShYZDvUA2mtO0zlB8reU+VCxgnFfm66DkUg==
-=wp39
------END PGP PUBLIC KEY BLOCK-----
-
-pub    80C08B1C29100955
-sub    CF771F914C2A4A73
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBE2fCWARBAC3v9wYo5kmynmVP+43ccamidflSLQjjpsXpSDLPFokGxeuw0OC
-QJy46m8b5ACoCqRlfwnRRcEHxiSlaBATJA6hi7NRO41R39C62JXsIxNJR16JNQ5k
-oG/NOAraw0E1RQIFslznQexfxPg4yFIVrsFp1wkpCRrCklatPMNap2DuNwCg7PWJ
-1vV93YIsaH0O2fnXz3E+6zsD/3cTzUWuySEDiCLNO3JYJm97v4NDQ93encP1Ooxh
-n+PSIP4GvjrAObh3FfWUucv8UGqcw5bAL7dA1z8SgKeyFk/afs2XofXdvC+PhZqC
-DwU0NiE0D/tDWqX0qIG4ezTU2uk+5dE/WVl3R10nOBgquQdWIdYKGfV4FNTiEduD
-Uw7fA/0XcwFom7eyR9eBonQmgIadljztm4gkv11lY33V1ZfJNndPKNzwevDwX+om
-/VEHvpEfPx5toD4H523BPx55ZtfowuMtFHZI718alpCo3h6xaDhGwXvsg3s9k03k
-rfxzCjf9qcJX1gb2JVZ2+2jCwUDQZeEwV2vivjGNiN9rShWW+7kCDQRNnwlgEAgA
-t5Th2AUoSfxvcTUtRPbmy+9RRfaS5UtDlPOiQLrONZCs96E6WxjH57LxFI3/oDms
-Eu2fXPvmuisXf683mQs8DPzHZOHoLF3qW+fcNAd+8MvRgeWnQBnOEfHmiDInF1qr
-DM3LQlbFq9oUY3pvxtutHU1/TySr93l01740ZV0Fdy6pSjqO3Vb62Rue2SVLl74H
-39D/gvx1iSXzFdEgwC4rDqHyPgsVex7rGd1Z5a1MiR9kibPR/twtBXlftBK/3SLU
-p/NP2EuJSOnCo/J21M24Hr6B1rriMU2FVy+Bb6HswfoVP/NKyzYmHZ4NHgcWu/sQ
-lJLx0oK8+jHLwSXylAwb/wADBQgAher6vLDji+gf8h1u9NC0ri3n+Wn86P1vtCsx
-He7+JDEzgrd2rutRsDyGN0wzeB8y7XcHinMa2lx/blvg0ghCSERL34JQNANgcX6D
-CSvARqxxt19hmIsAe1wyNbU6D4iFNjzAO4lPgjWmq6ZLNZXxTFUly2o1RNjZ5TvX
-nygPn6mt0Jx5AtvPGgoW27TnqRnb7jq/psCXyD/DxahU5FS4eu668qiExU8fA1DC
-zsocIXL1gKvjIhB+oLyDyghOqWBRlxlpfHor42d3ADosChckvR51pk5kG4WrkfsW
-SvDTv44hAWotMZwWlHXYDMOH2Wa3IlDydV9voiMA5LAE+URlZIhJBBgRAgAJBQJN
-nwlgAhsMAAoJEIDAixwpEAlV3nwAnRgDzG/RTk52by7bUG/LGMZLe0FkAKCAXo/o
-qOFQ+kgBhNLq/dO3OGQl2g==
-=Zffy
------END PGP PUBLIC KEY BLOCK-----
-
-pub    5F69AD087600B22C
-uid    Eric Bruneton <ebruneton@free.fr>
-
-sub    0440006D577EAE4B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG
-VnbtRrsIUdmNIFQmz71bBDFhRBbrSrkz927k8eUPhYtxE2NmmWSuKgrjF4qviPQv
-m/7SqGx378m/qw4EvpgGUB8EYif98LYdWp5vsU/zx0Ps9auqvetAzJaL9489oE0F
-q8FVhve6BMfUUV7zOTCmJnf438YO68upjU0PVBdfFE6Qx4cgCeWbQGy2cooW5azN
-iIenhuYU1qikmxMHq2xZzN4uSTWLGDpimPyz+Y1aTSYJ/bgn9gPStbI9sojWo9SS
-5gvNK3XqJzMwxwFow86UcIE0vPD2T6ZlBAXRABEBAAG0IUVyaWMgQnJ1bmV0b24g
-PGVicnVuZXRvbkBmcmVlLmZyPokBOAQTAQIAIgUCTslRFwIbAwYLCQgHAwIGFQgC
-CQoLBBYCAwECHgECF4AACgkQX2mtCHYAsiwWdQf/ZDnKejrNUOREfAZQYoAmf29G
-zPnQ2XVb6ZxoD2kg+b7SyzVL1lnpXw961Ayme9trxztb9KJcxJ6a+oSVIHWoiINS
-zx1g+lXCsBRH3Lb5iJTAr2u8+Gyva9+PB60CBmmcsuOjuLBx21N0/E4KpBiwEoWw
-5z8HGNVsa4jtRxB+RoQGiilBUIelsI17e3hQWgScIGJdLW5xErlC3WfgtUOL6q4J
-mSk/A1R2jmWKOO+WBvGbnOr7mKZd+/h4ohzVVwyC1WrFeFJgEZK7bXPA77Iv/4u+
-al7RuVztBKjrXD0yPwknuxMgyN+Y5f/pqqKncNl0lOtiWayKSxdatBLmGifAgbkB
-DQROyVEXAQgA2uNV77VI+ARj1d97b5cY3/er0Mcc8/Q9ctMY+5YpSYDOQF100QBd
-OQ8q3IJsfhZeF/iMFlHIUikuSgatb/Ih4lk1+irnERPuV2MNoAw3Fvn3/vwl/Jy0
-ZsQCBSXO54U42TcOXSwNLkYOJaomDiiuo61Rxj7jqijpnydwoFvEi84v6q/Uota3
-MijGMbzU9QyTX8J9OKMeCSUq0uVuk4ezebjv/bwA/ax/qQRIrEHDOOB1LJ5JyLac
-K4+h5J8tMkEmWxEQv7MNokRLgbaePqv+tdf1gee4f2fSE3EXKFxjTO2wjLPXCrHS
-SI5gecsilQn7ZNxH9g2YUJipn9yj3ywMxQARAQABiQEfBBgBAgAJBQJOyVEXAhsM
-AAoJEF9prQh2ALIsrWwH/3s8uN8/gDnbcbTX+7N/ZfQBXJZ+H9GGikmYRJE1xoOe
-Et9MOqZyGDTZfGM/qNKeDGfar7pcRQlMK/A4Nts5E6d1OX8fBkUBtYanyyjNLlT3
-yDjO6VaV0SCsgAzNjUZqc4lxS9atN6md5m6lWLAdHghrXuV6LsiKOS+96htchoCv
-Tvm7mcPI7w146yJRSyCC5+PybG3ult5Y6QASkwI3ZWB0u0PKUoqglwWngplu+0Fi
-b2rxQvL32is4YrYaZ+XwoR6u/Bgv0ZvZiypk17Uk17rDb/JfeLqDn7oW6Hlgi9KO
-LbRRIg7vwZVo2Ixco7aGxZp5c4zSfaPvn241v813ZcA=
-=A2GR
------END PGP PUBLIC KEY BLOCK-----
-
-pub    C92C5FEC70161C62
-uid    Herve Boutemy <hboutemy@apache.org>
-
-sub    64863FF4D1BF1809
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBEdUhrIRBADCU9cuKc92CWQlZxwtRuSIV/36Qmj264YD+Lix+r1Qe1PqRr1I
-/MObOo83ulorWigSkx1k81Mnr56NwmIeo2bMhjmgRgf7EG6XEbKdRKfJcJRR1lDV
-Ml4ru40W958M3PX5fsi0m0g2TuVrAKIS4vscUt4L/Cf4IT2/0OhaT6bWswCgsNws
-Qq6NtCkLkpWSBNYGT4zb6yUEALlhHMnfzPSDerKjDOaYHTz3PRc/GGUDSBTSVj6W
-hQIDrgTqrPxoB5JMnfUz8BLSayk0d6HiwspJ4Wnxe2/jdIT+6xhX9xBYXVHZVs4R
-cr8zbBNcW2kwFg5Mqy7TiAPzakzCslKAAX+cjAKSOWyRbmkEYnNgMlctdyENOR9+
-BpP+A/9anoVEfULqoETShmgWdi94gx713qymhNBpFZnPpm4j4JuxKopl/unQmw5i
-Jwtu93cg38UfaOMJjTi6tJ6F6SE8xXv43nKs3Xb+Ll1MpTgaGUXEhCOeTZl223Qe
-NBUp8kvfcys6aVX6GT93dmWxtMewlc6gc7HVQnUnyCFsVeoy/7QjSGVydmUgQm91
-dGVteSA8aGJvdXRlbXlAYXBhY2hlLm9yZz6IYAQTEQIAIAUCR1SGsgIbAwYLCQgH
-AwIEFQIIAwQWAgMBAh4BAheAAAoJEMksX+xwFhxid2sAoKppOorIM7ygdeFyhvcN
-VV0l9cRnAKCGxTdvoOnDAgZN+5lBP0q/o3PGPYkBMwQQAQoAHRYhBPp33P7y7m6y
-3r7dLAEleUZNAcBqBQJdyJjjAAoJEAEleUZNAcBqkiEIAJSzD+MACN+Dy/6l0htV
-6nP9sUTthw1Uwzxmj5vFCrBIjpq/l7ZSVfmNyyW+X/U3ZYIg8AmM1aoZ/x94pDO/
-XAvSlrw7XwAyiN+3lMg0PAIKCzjZPYszSvkdy+1yTd7ka5vp1F5AAVl1N+erIttJ
-yT/aKW708XGR5kRMBBvanXQJxTTNBrPVPBPTqM7F1cdR2sGzKcJmRudbuMJt6MXe
-SDOOjZD398ix8HIfk8CyTL38OvGaALOd2vxsyMLg6fjKmtbYNRE95fHJsmQcphco
-rLZcKg6SJlsGb8UIotMAmFWK0uP+h9oe4TGzhl0qNdsKr8EArWv+hUfRdmnw1moo
-jRe5Ag0ER1SGshAIAPzs1unq2BMWlk4yO8D5w9br9S3qtlkYRtSOWH7ilOyvdUzI
-pQZvC/qgphdUBIO8hepmLXcF4zogNGKBjlRHjSRC4SRSmTqHmaG/kdwwtOblLAZe
-8YtzYAfDLGoLOTeKvp6mUjGWhA5eSUeGQIWAmQcucQZp75kT1C+dAgzdiASsR1Tm
-lJZQSGQ7XbVR9+xsGlc17oT8bC4gDnidvVtbfEayD/U40JT4c8Luz/Rat/yXApoR
-fMTpnJ98Hwmf1TLXhVafGk6+GjuLqNDvx2IrG0rVMNmAxnv0Zl4jTg/AlxxToNP3
-OLXrbUYbZ5fDjt4UOLK2OXspgRuLZ1dNpd/2NgsAAwYIANouVBiqlgyeOi74ktaz
-cwSyxz7+xgEhYnEGOB8TE70RHQSHW/qdvO2s6dJdIsWi0Dquh4EjGW3sURvw3Q0m
-pMZTq/pIpeTSZx5mfbV8xppyz9VqMUBHNhVXRv4yk4OoM9sfQs9aUTMcQBzejrPn
-O4cWCmw+uPXwWxj4GTz9Dgo8Kx1X7t1mjGnpONUMZxX5ObPmDRDZcvl33l9j7mC8
-CsLlZGCX7aqIVPW0cdKYXQ4EFmyGTFc4oca+ck8X5Ar5h5ayx5/pQDs9zd8YdEIf
-w6H1hAwHnvLpPqW8wl0jjdr+IjvZbB4PsF2C0RAR8XRNBK3mbtlcwRWvYjdp4bSZ
-7kyISQQYEQIACQUCR1SGsgIbDAAKCRDJLF/scBYcYnKDAJ9NS1MPppAX0CRbDC3Q
-qcfjjkWDzgCfWEb3wKP15906jEy3qUAQdfV4cuo=
-=GWfv
------END PGP PUBLIC KEY BLOCK-----
-
-pub    9C4F7E9D98B1CC53
-uid    Benson Margulies <bimargulies@apache.org>
-
-sub    32E3DF6FC5E91334
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-4Q==
-=gGyT
------END PGP PUBLIC KEY BLOCK-----
-
-pub    59A252FB1199D873
-sub    92BD2D0B5B21ABA2
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFUBG7QBCADRWXf0Fw05qRhM4cRnGKlOW1ecue1DCxHAtFwoqmAXyTCO+tI0
-MEW5SyXUkX6FsWLl6A2y+KgOs669ogzfQ0rnZMEt4HisRp8wpgk3GWR1/9aKYz/c
-ymy2N3BP9cz2fJ9+3PpBccUPL+ydFKpcnEnIwiQK+p9JjEWzJBlrdUc/UEJ0R+n/
-5r/+0+BHiTEMvjAF6/SwyntpTWpu7iEzLv/pfdCuhFKa4yn+9Ciwe3wGtSiue+dh
-tqKcd4YxED3oAswObBca3CC2HWWsUEH6EmfT1jUdfy1cq4X5x7AZ26oFYfG+odqW
-W5dcB+13VkJtJRzQTO/2HKtITJYC65a1jKt3ABEBAAG5AQ0EVQEbtAEIANsILuU9
-cH/EIEL+OpwIacr/y3/6LG+ok8SKDHIlF6cSpusSsWM6L+RGcZgvCDR0S0EEid44
-yy8wFMvoYSlsXHLN4SqH/rpLIc4CD8DdCLWraKaRZrhtqzNWSsYxEgqo7n1xO6+c
-sU17VJArnpkGPHoA7ooZlaGrc0y/rlkTXH++LKqh8niO9Dap46pLFrdgvuyKbq1B
-6faAf2JMRyvqy2+fuwfVGTc7DEUUFtwGg7FniDF0zl+3rFG1ud9kH8UWz+GwCwFT
-6qhVglgOmtJgw1CSYNeDsQvDB4YTJNnMneMSdM6CkEcRhLp2+lz90+wR0K/a9QBE
-1NPubAaRB2uQR4UAEQEAAYkBHwQYAQIACQUCVQEbtAIbDAAKCRBZolL7EZnYc2uJ
-CADHHB/Bmc48Ye1xl6T6nbNEiMCdmpIba+JNFnEWcueq4xk0xoXXUSpBnjLaWPQr
-VZKHXdMxmmR3BjhtFvsLgeajypLUkVDlKMkdGQtsWXL0abr4cNoMDiXURxlbXgxZ
-8+hIs/rKSWKturrCD2V4MXLsQV4xArh1ezkJFEDA3tRGzjjgzg5MwmrmL7H5Pcd6
-vV1Ke60BmvFYvvjRwT4Uw1OD0XluuPOaaiTibhPECc5zLxBz9+eRSsRbxccNEzPY
-JS8Xl9+hIw7Y7Od184cOoexxdoI/K52kH7A5yfEj2kXCZm5tYylyKvgGpczWdZuo
-V3u1xg+t7/QlghTMoJAA0H5G
-=hS0U
------END PGP PUBLIC KEY BLOCK-----
-
-pub    379CE192D401AB61
-uid    Bintray (by JFrog) <bintray@bintray.com>
-
-sub    0CFE993CDBE1D0A2
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=7Wyn
------END PGP PUBLIC KEY BLOCK-----
-
-pub    6425559C47CC79C4
-sub    D547B4A01F74AC1E
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE3XFIUBCADcj1zw8m1evCgEMqxgOfl6L8y1tsYWsX7tVPvHEkYlXHrdcpkB
-fGuWPrauvhBmB9sBkFfxzU98Ilz3Xk9pfISYiaMUk9Mk1ZxsCoYPVhxvOSvk5LgS
-sviDzjYdZfZtskUM0sRmjmoQL//fVQbfLxJ2zses21za2VHuS3puUbdcm8+UIl/q
-oyneDbzM7j2nYXXJPNXJOfvyVxi1+rsc7xcjMvAj5ievYlWwYlAIgYbAiz969NdL
-RkoA1Wg+cQg+59k7Wvi6xwTfzMsO4jfkV2p24xn4fpcch9J49UhADh6O7XEls1Xr
-80WjysMJWTOX1O2oTtV/BMjpI4gj08SgZRhzABEBAAG5AQ0ETdcUhQEIALq5+uXj
-S4IHZBmOWOBSf6R1EnU4pUqEza0uwgIX5Xr2uSaaCMPCm5xrbtf/Iv45VEuR8zGK
-b8/0dV74me6nXnOeqD27pkkliVE5nMPQnqKAUQmrA5aDR7Tzmey46Bmc+IFrvbWq
-iyA3yZwUpi1FKZR5VLEYhMGI0qOyoaa1NWjD3LDL7/AmQESe9QLCtT6QhNhmj/QW
-ByRpmuIhayNyPGlh5osFyiGgVcinlZE7x12uG76C1V7jo9eYrkjl/uHJHRqfB628
-oLubDFimKl1raYClRZ63jkbZBfC1fRYzxk6356mAxlB2OVDH3aYB97KKZkU8cX22
-IMawk4aBhCyhX8sAEQEAAYkBHwQYAQIACQUCTdcUhQIbDAAKCRBkJVWcR8x5xIbA
-B/9HU+RuaFxAIVwySrAvBwycrq5qb850RU9+KgrKo8CSCKTLdmphgBSE3pCMr6A/
-Q1QtOUndbm7SSq+XqODhij4FfUx0Kz669iPEVEZgZCausY7LH9aTmTJCRM+Ey2eM
-32Skz+ur0T812dN3iNd8HtC/iaJAoGFAnWRHetcH03QMEuogZp80NBg0CHV5Is8x
-0uh8JRHi8hWD1f6vVq9/GwbgRsDOppVa8Z2BgyHOsBDoec/fYC3i4iF8rHuuSGqa
-jswzG9SnFN1zLcGhLEUEOJzeDCANb1b2sJO2r9xEvfNcswj6ksY5lgItE1roCI61
-unkajH4ViHheqLZ/7wRm6eOF
-=kuUA
------END PGP PUBLIC KEY BLOCK-----
-
-pub    B341DDB020FCB6AB
-uid    The Legion of the Bouncy Castle (Maven Repository Artifact Signer) <bcmavensync@bouncycastle.org>
-
-sub    315693699F8D102F
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBEowbDsRBAD2jx/Q2jNuCkgiS3fzIj6EzDP+2kipIKH2LEnpnTiBlds2PFYM
-xYibVab/grgQODxTdDnAKifbJA/4h1/T7ba+OV+xIUoSI5MbgaF3USidiDHPX0pY
-qvG+k3hKECLysQ2zoZpcC8c2ePiZQSVC2i5BRqgs0xZPz3kiT5U9WPozTwCgtasB
-TgHhkOGhZ0SOUuQ4dL54R9cEAIaDjdPcI7LxyOMvvGTuW/SaS9JyP21Kch+Vf6I4
-vKWWqXEaF0So8S088zHnBrcBKhu9D1sKIHS64EoYCrznfMUtoENPe4sf5QuJmZ9D
-+fBuFcudQIpkx8L73q+E3fmCK0uX+anqipJtS8mgpMeabKda4KkjDsZkiaNl7OBI
-0H09BACofK1HTNHNke2N0wXN1GyG7IAqprKl4lBbu5aRXvfKQ2tDj8s5webNQ+Se
-Om/Yg0Bi+CiONLgUjiwYe1wNls8zkk3LwYFeKIJ1AjAY3auBRWOI0/IFFzwTkV8J
-YPHa3Dl/kmYp8NMMwA5bgrblggM0Qhnp+k//xpb0FYbmwHMwUrRhVGhlIExlZ2lv
-biBvZiB0aGUgQm91bmN5IENhc3RsZSAoTWF2ZW4gUmVwb3NpdG9yeSBBcnRpZmFj
-dCBTaWduZXIpIDxiY21hdmVuc3luY0Bib3VuY3ljYXN0bGUub3JnPohgBBMRAgAg
-BQJKMGw7AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQs0HdsCD8tqsVVQCf
-fP6hDSk3fnQ9Hls+Bc0syNyo/aAAn1WKdS/Sf2OQiVG6iPUE3F/o5gu5uQINBEow
-bDsQCADkwyW3z1uiaoTRNKrrcmc9pJ4QqwDHoDUppdpKDQsQjt8x5tJBwB1V0AUG
-jgdpH6M00a/kkZO8A5suurGefmZT/6qF1PDhYJ/XtHgRMQpzeIU3fGunHPZV7Dxl
-anDc9wSAJ7btk3TYnoGC0SqFP2/1/QSQCBEciRxoUKfGZ7XI84U347T+fUD7n0Cv
-yubBwcailKhmUYMR0R2oSXH+yFCOqrovHdtZhdL58bNICKn4QBf92HxL2Zm5LpUJ
-aMvHRK1rW26i6r0907Pn/hb/Ph0Xfpdtl3VRkeTDsNIBRdhd/B8c+asE6svHwv7e
-cuM2cXhJIF3XgB86GcFxNC28u5UzAAMFB/wML1mG0mocH9pexBKsm2agdtQe44Hc
-d3zjzpRtlH4E+eddCd23cubbNpJjemVYzaePEvjaS49WuF10u7h9aZYaGf92MWFR
-6FnuGytDDvfl4w+FZlCkWddAFFf3wSVnhVWymzNIGHJvCUff2IJAE6/8i5H+3KRY
-jGM9jtEfjURZxI6MnUskzbKuT9H4WJ1TJ6151zBQCm4NkecfffROX/V74ximYzOB
-1QalT2/FkkcP27MRsjHJN3aTLbLdH6f/oSRG3cBT14jQhjUGpSHTAC4a/8yrZpIN
-dc1gn+nOddJAGObLa28mWpef7AjX+6NEwdNMVQHJK4zJmQLQ/BQACdYxiEkEGBEC
-AAkFAkowbDsCGwwACgkQs0HdsCD8tqt9zQCcCZBsSD1ecuv+3SJRLv5XsVwvkqkA
-n2TctLkkj3uDcZlDYIeRDAnf5Zw/
-=tn4r
------END PGP PUBLIC KEY BLOCK-----
-
-pub    1B2718089CE964B8
-uid    Robert Scholte <rfscholte@codehaus.org>
-
-sub    A182F48D9C2C0825
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-bkCLXLRrbbFNZmCYGMkpJaJp1fszyEpqZGNE2g==
-=oHeJ
------END PGP PUBLIC KEY BLOCK-----
-
-pub    012579464D01C06A
-sub    CB6D56B72FDDF8AA
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFgnlA8BCACVtx3oLXcanfvwtMRwal6pLQ8IVMG9+fr4xGdbSHXCRNbosDa5
-agU7WeQMPhusSxJGaA3w7NOdjAwD/LeHADhDPeI6llJg1Fb3EyqH0NZaODKU/Or/
-dID/i1onAX1dE914J4lf3XvIAxGiAjmr3UvWO9RiFxRUkecMAMlCBp2FuHuvxkcn
-Mk8q9dP9Ef360wu8X5rj0kgP6vPhgl9/RhuPsUxlazb2Kn9Zxi/RmDKDiH/vDuwy
-WdRGFOR1OPV7l3Ws01nrs4vKd2v5rsUmsjvQ8ldxdrA1xzX4IszHRDgSC9PI8ItZ
-1VlbaKjE0L03acPfFTg/wRFSF5zsrGNbTmq1ABEBAAG5AQ0EWCeUDwEIAMGWqQT5
-ccT/Q1OypoOQGEZn+oRkgEdnzt8mjo7aOXd6pkNTkt3+LCkmb8Pp3/a3iYEfvSvB
-Zbb2JbY9xnmM8jBucWnow1iwEPxGhUuu3jlIpRsCwLk+utLkMALRkooXqanDoVRW
-xuVeFYN0as8nndgWiJT30innN4vfaR3x3E6/nS57zp5IggxZYsXTRHb25kaof9lg
-lHyXeypW7quKOP4SeES70PVVUnYZBlLpnX8a2msRtJiouWxCv/kHnYsjW62vc7nq
-vWAsSsfBT61TVx7yI9CckVFBnkpG1I8C9WpfcR+j9yauptgUMfrfDTFg3Aip7czM
-SoL4Jpu7jBcXy9UAEQEAAYkBHwQYAQoACQUCWCeUDwIbDAAKCRABJXlGTQHAapGT
-B/oCoCsuJ7617gpcuEAXxWTBfcXKo4z8ObBek2RUh0AY9aXjRYSzwwbtVFRC01Es
-r7R9b5ScY7W1TDQBKL0OSRZ3jwy7/hA7k8P7xAp3mC4+FdHaHMH8nGz2IbUjGWl3
-Yp01NRn4jc8gcnHnqcUff7PXsRMUtJ3dnbsIYOrBAbWKld07RVEQUyafgUfdF9cx
-e6P/slSZxATJrlIPveB5bgcVDMMw1UQNqJL9LWP2IM7xcljOBHY7jqwqnQ4pRER9
-2VzhLdtsdwF0H1SuERpDxBAuibchMoCfQ3HER+K2mTUoJ04xog7MQs2aaMwSbem1
-LMvNBZ/mfF7QMYfMV2n7rbIk
-=PoPV
------END PGP PUBLIC KEY BLOCK-----
-
-pub    3A1959EEF8726006
-uid    Eclipse Project for JAF <jaf-dev@eclipse.org>
-
-sub    D908A43FB7EC07AC
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQINBFu07rsBEADYizNlY0FYNZ6q2wx7AmWLw6PHje55uFhYM8Saqtwg/rm1tl78
-j28E/coP2zMFf/ec+zqKsfYi4DMmLZ9ESIngMUOIE7mY0Pp4WN7oYFRtvU0ARWyp
-lOiq5GM/Em0mtCSDI+i+zpD7MKCQEeV6V9d09r8Ncltf42BQb2x30ajTsGps++tH
-Z6xxhlPaYsF6OT7SBSt40cjc+rhUuAUo7D4Jt7S7zvi2aeulEr9YD+gkp6+EED2p
-f085M4tn9FjIEmYEOdfq2LkrKbel4r7x3YTypU+G0SDEeGKLJrlekNr7B97CxNat
-aP+ioa6GPY1+u8pkELSZDaUUKpqPKuYt37t1XqWHnvzGYzFyORQjuANCz2f8yAkN
-QqgImFuHiv4Zem7Y4ZagG0TG+T+BT7fZFbYIjpMxuy96mn8jdDMRvNOlskMWD+7x
-QLt1TGaworhDJ5suY4TVN7jQfUX11sTjriBkb+xoSvEFJt5MmQvEi587rIt0Xxcu
-/PKkob99JB/W178ZSbJBoOD43iTP//ifgPPlWHa8GgLBg+EyR1HNvZ6goXhfysGB
-BMV0JP4Fk7SOeV6sb2A2vUIA4uVGVzkzxkb/aG03vIl4pvf74y2Gi70/y1/mAbQp
-BWg3LAcn9ARB6t3Z/rTXWL2bfQPGQ6HWSBcG/qHLwQq+1eUR08GdG2PvwwARAQAB
-tC1FY2xpcHNlIFByb2plY3QgZm9yIEpBRiA8amFmLWRldkBlY2xpcHNlLm9yZz6J
-AlQEEwEIAD4WIQTK44vJPZC4UtiEZd06GVnu+HJgBgUCW7TuuwIbLwUJCWYBgAUL
-CQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRA6GVnu+HJgBldkD/4oX+/9za65tSg7
-0pqCpSKb/P6QkKE7tHw25tb17zmAjQnHrRBGUC7wvHFmBgV1CELQeY91dls0knck
-5YGc8JoShHwU0RVqzYYyphu7EyQCpb0YG6i/sHuiQUV2HuZkyORYOENoZUU4asXj
-g9YaOmDP6oJhvMQZ7WLJTCVT6+SOIcCpmlcLSaabki+VxuDB5Sy1NSZ8/0lyiVXP
-g0T+iYNhbsKmOncoY/1N27X+PLe01/UtbLJ1tztiSdZrd0XDIj172INRZJKDrdWE
-rTCzIgKzwn1f2RVQkecKLzUTkVbIiu82xg2vdlQhuSgEszkI2UD09/vAnKu1cZZV
-asjbx4QPUsJpfHQDLe8d0X1bxy1n2P8RrhX/oS8JCZRhJdaZ3lNXhUzJPDJoVsiQ
-UHDojPBsOMNOuCJax5VFPAcLtumDyZKigJOMUp4t9JW6HNc1GQ8ohrOy5XxgQXxM
-XKawrdiI1ecy+PKetRf/DP31rOzeWJ0jnj7/2n52jf9bC3sW64C6wdrsHaGAGNjR
-Diz/IyTHauvF3ZK9RcZNuJB4hjEExKpUXeM3etFyoLCDIaM5o3Gzseiy9f98cccW
-s6FCP2P58w+9umnLVkhCifynVGvtd21XcX99KXZyIaoypeLeKBhvvFGUsiQeyq/c
-817q5SvkQvnMXcezMjY/4/KxGEFx5okCMwQQAQgAHRYhBJnkPtNq+rgsT+xZGp+i
-tymfUeVDBQJbtO7MAAoJEJ+itymfUeVDQ1kP/i7AzI9wSvanxk+zigwU3wVhxwqu
-0OfCjeLxRi9KK3+7JEZAUQluGAkvr46pn0bj/cm2PdatWqiBey1nuK6vrwE8d793
-uKF4mlP0OcmeYj68nyIgeSsLXwTIocoUTDWBqXNSANazHUus7dBOBytFC4gKnhCk
-/jGxH+rRt6QgIAcUNoWrmOpoxMe0ftH3kEdMeUSUZ9J8MaRpAc4wVNpCqcdscRTO
-wzKqtdVgLAaxb+JsJfxrrzp4pdB4NASjeDVJLf/zad5GuN+Rw4gekPkZHXt1j7GX
-dljvdWjoEUKEmBF3VRFHZA+4BP6uX26l988mTdOcVOk20whyQrfc9Dr063J4YSdD
-zM5ksHesVykDzo5zb0CJc8zdMzYmxyLcGYvHuDMIhqnHyS683W+RX/L8Z+zDg6y3
-p4/aEynX4oT63Q49QREPS2TX0k9Qq5N8UroJRFkRjKvACLsqfxHJgi/llbrtrJbR
-5Nhlg3aZSILoWEsDHfVxEUZXN3RE3I0wrOQuQfIemjrDkpEPkquA4oUUDdsnsHyZ
-N3ZnDqnK9O0hWHo8CDxP2/KNxhL5NPY9qm0Nuj817kpDyLo3QZ0d8huERWs5Raas
-fIqNY9sMigFb1Mvz1pWxElM20Le+tvC0/tP7S3+In5BEowcmujGKXPeBLgp9riGN
-A0kNapa8tS+EwDESuQINBFu07sABEADvtfuYWvWH514Ykl9/BpRFWuGvjR3Xfnc2
-hn12vCH61Na851r9vfYkq3PKLMnzBq5Z/jodIcivDLm4zsNUPxVtsHsqr9PE/5xe
-FO4i7EWU0554Z9p1L2D6Q556WSXAFfO6r/41H96VbSctF3onJ4aUL8QQ4gVtPgX3
-LutC59DUDpcN+1UtVFPsUMaRShVS7weN1PvBRo0QRIo5YbWMnbt48Hx/lY5X0IAT
-2ptdUbU+AGOiIh0WAMks+hyrKddi5fXupMTEYASnUvZOibBYKID4A6WmIma4Qnia
-Wy7CMPvGuKaHEZ9dDeK/kjGlHc5O9UmQ3bJgiTNTgmNij7VpxeTkiaYq+l7aPiuJ
-o4TQRLZ7XtMv3YTfHnMZFZj/BJw5otPa9EWvMXOO8mi8MRg4KfraMNUzniJnEGL2
-iXAPAU/oMiHRlgrTvKS2s81Kaj7HDfgxS1pKKLLcXTvDIt4VAe2+9rl7UEmlR9Uu
-RmFZx0dTmvby54MCqR6Xin0XMr+Y+NcONF8l1nN20AMhyWUzshKDoEsqdvyTyfKZ
-jUoP6kAvqQknsmC2nSyp1V2ToPlPACAK5cMdJPa7R7C5xWrF+Do7j3FQsAoy1GzJ
-ezP78tbZyCxQTSDOMjvMg4l+2ngHa/aLIb5aLopobuH/9yVSILOcjTnO6wEL6YZH
-aJAMckVGcQARAQABiQRyBBgBCAAmFiEEyuOLyT2QuFLYhGXdOhlZ7vhyYAYFAlu0
-7sACGwIFCQlmAYACQAkQOhlZ7vhyYAbBdCAEGQEIAB0WIQRt07jGTvdSU76yxTrZ
-CKQ/t+wHrAUCW7TuwAAKCRDZCKQ/t+wHrHoQD/9QeReiHZuVULn1D9d2aSq153KN
-O0hRRnI/UIgmILVGeyd/M6VIS/MtZEAqYyS5seIAmDz6Owonls9EZHArBo/q0FdE
-3ylZUvdiMuJ9/dybPEwCANcDC755XBuAHhE93OscnXEonRyZiWjjaTZ5rkawN9uC
-NMPjooryDjhyZXRPAyv8Q7lSDg+OFHg9PW7PLBq/vn2v2LHG8HGjgMjpPNjdmeLF
-F9HJ3NeseGdg6OojKgxfeHtVJtCT+cCghGIYy1N2bB0d0Z8yMx8AjAK3KQTXV9L1
-8FRrGe2N7Dk9+5N+ui2cs+yGusnjeZAQc2i0dDaxSuXiWGhxwjAhcIAnTCiLe38/
-Eo8l0/0b6iurK0ow8J0gL5bSsNg8pZ0LjqzAEJC5Cud0rifMVLz9ld+OFeQ4Fy3/
-AkkLqe6RK4nNKwVqvIpgBkaAIcaGdHs9HpQlShQ8uJv2RDoUPc5sNW7sbKppdmQ1
-k+EqhJezFh4/I4RqIo2Xm027UsJyr//zwEJDClxxxvQ+M5AdN7ghOj/96Ol3cYaK
-2/rMYgr1JIjdJ72rqFdUtGyvk5c9Sq5e7x4S1BovaQs87f/dP4HL9TwBtSJOBU6Z
-YdcJW2kmlPoZsTnaeDXv5KhdIQ8hxifPoEv2yEKfVIWPdlgTyfNx4YQ4fhIB+RTa
-oAx6kO75xBhw6dMneC/4D/wPDUng/3Yqs2gF2SgZg0UQUtJh2BJszIaUdOSf+TPF
-PUCcfHhDX3mk4zwLFYIdM2oeKDKPKrSV8gGfi4IXJXuoP2oQnwCJHjIr8RB5v/rt
-cmwm6ekYW7q8bO/zZmV+3VzVs6fD4jqfMwPwR760BQre3O8TNduhWuO2q9Wm9AlO
-gdI3NGDxwqmdTagX5rpGFseZfJ+aZdlBOrrni6x38IfhUfb7ylHyI/6pOEYQwEvq
-ASOgChVS2fbuNXcL/w1YVFfiB5+MfQMJu4NLPCjwG7tf/Zo6nW+szMpDra/p0Zcb
-nCyWmmMacl8KsBVGjm6HpylUhr6OqEuPzVcGM8LKUrYZ4jjG2Q0tx0ZEeWzDze+Y
-ox6825DL0OtmnJY/BmlnFV4+508RTw3nX1P6g3uxste9XjL5lq9rKk/kzfnS/V7q
-1yo4/7bo2aAYh2xV/P/jFpwjdFfQFNaPSZwKkSlP2li074UlcoQfEOdnqpIN+xKg
-0qFXnPe1o0tIz6kqfvFeX6t2o2TEM6XIwnsDi47Z/snxqFT7W55zL9i5HYot+1+r
-OB5fttMPvg/Cdoeacel5ZDQ8rbH3pfrLUuqhPdJUgVh4iTEe5Ikh760XhmbyGTDy
-AZfv7a5JO0qcCvkud3RqmCAXNGrjh8p3x8rPAFrvagaS2grj0z9tIo3Ki5HXDlWO
-9Q==
-=PprS
------END PGP PUBLIC KEY BLOCK-----
-
-pub    41321490758AAD6F
-uid    Groovy Operator (Groovy Language Continuous Integration Server) <ci@groovy-lang.org>
-
-sub    01F3A913FB698736
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-ZIY=
-=83HN
------END PGP PUBLIC KEY BLOCK-----
-
-pub    205C8673DC742C7C
-uid    Brian E Fox (CODE SIGNING KEY) <brianf@apache.org>
-
-sub    AD9CEBA0521B1945
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-hfxMZo//jMG5FUu/pIWz5aHxQUjBv7phbwxwKvQAB7q4eYIPG6ZabYTQJDIweq3S
-q0XJaY1DxbHet+O4PKHUu+p0fjLabGTwENN8fnzI1adO6mKDrn3LcdZmPj9m1KkK
-2hslY7P8q5jz1AjAsVlSMWQoLwqfwj4ZqPnvUDeR1YivXnFf5jYkmX5rrzOHuSpk
-i5K7fKT30hwLE8Ew1Fn7LftldGWIi7U/T+IUlCDUgF6CxBKMjXCDtAic2dYo62aY
-WimcJC2KNWsj41+Iq+auUBdbIB4uHkROm0/V08OhQNSrHx7piQQcBBABCAAGBQJK
-/hroAAoJEIqviNbYTkGuiecf/0ZxYsoCsaUtkmLHhIeaB+VSgsGQRzQJExLyUi58
-i8c91+FXYykabOCzsQlIN3hhqDI0s7rQUJQTGoFWgwdVWRWpAhklidEFGx4wS9wN
-9twIiY+xgdwQkQ4/hf//////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////+JAn4EEAECAGgFAksM
-3mcgHFNhbmRlciBUZW1tZSA8c2FuZGVyQHRlbW1lLm5ldD4iHFNhbmRlciBUZW1t
-ZSA8c2N0ZW1tZUBhcGFjaGUub3JnPh0cU2FuZGVyIFRlbW1lIDxzYW5kZXJAbWUu
-Y29tPgAKCRCbuGOw9Ru4ikI8D/9vWt/TfpmUErEq+Md9F0MZqJ2H+y/nJJMviUDH
-Hx+po2etYJauhw5Ota6brkLjef1cNRWQ4tDxctQRPc8SsU05/Epzrdov5SWVutcw
-vmAjWSUs2wKp7/+lPuFUvEd7g4xt8gXY+mmvo8qi8tTNE+nfzaU7I0MHIMbN25P2
-b6//+Po1ifLVFE+S9fq6NbXI0QvuVBKCCmzVvA4VTVNaCd2CQCrZA+6c5VuFJBZK
-VoCW2FThDvXyQYlQAZmE3zYAZDjNFU+jAYF6aqY0dtU6wh+U1c1qbpLhrdn073pT
-HsfNsQW1vyzYLLr7QxkU9pVpFJ5Ajq41NwyU6xxSZhnJN+7TOYcJ17EnDKmdO7Mb
-52nn0zvxG2bactz+ycWwZrIxfQo9RAxyor9shORfPmEoVbsLOdfuoJxvb3OL8mI7
-wcTTfsSoPeqac2p7NS5ZWaDenliNrVR5ZWJFQeeoll/paBampGjK5En/QpIEoct4
-p3KnVTusFSsZdRnNkOFCKPUusbiQPl7dga17oiIqhpsLewq7BnQ9oW8h5jO0TuJ7
-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
-y+5xrNg+uv6po4Jjtidfww==
-=uA5H
------END PGP PUBLIC KEY BLOCK-----
-
-pub    586654072EAD6677
-sub    2E74CACB6918A897
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBE1VSkkRBACkCgvt26sMi+0X+EOJDMqdK0Sziy06k47LJf1jOg4tTZ2T9QtP
-OZ8fD+va/O5+q8Kna993jzcO5n0Nv+R/K3+MvUqSmdITshCIjBt3cC0n6FWndGyl
-jY7rOmzdNnvSkMGE3V2fQ18stkJRleqk3EuWwv+EwpxcYeVfCO+UCJGz5wCgtqnZ
-JYdRHcDkDYaIZ4eizpbV4d0D/3cgBdpcbSrwIGtft+lDxacaJrWpT5Jh5P0gLlYu
-+6PFz8ZIC4+/aOSi4S4mgZxk8dBL8ZBqLqcW9rc//CYKNtPq33sdf9vxcusMIXvS
-PBODjDpoOsTJwy51fgCEL14qnp0v14y9p7ejjN5+GipiNY/JHo9S9kTdVhMYqt6x
-6a6MA/40vMejIbZ4q3Ia63jbHPi348fLDq3Gp8Wos7Sh2HnLC+pRdC46qX/5wL4t
-Vzj78yW9FdH5yeeE6nQLOBWh7PnSfMt2wYHoarEnkkkycP7WLpRME7qsBYqkNUNa
-2EQZSy8DnGiayYDij1YPNUHI9kpK6H/e3puhmgNkzrZj26T85LkCDQRNVUpZEAgA
-6xveuDcah4gFC0l2BFR9QsJU0SC5IkwRJC/3GcqAQZ5Bf0i1V90wuu8tt/jJLIgn
-VKEFHyTzReTwzoLZcD5zXgBVSu09Qeax47ndNjSfZWNkPmaztM5j9yr4OF5MEvOX
-E2wrzmrSNlc4rb5KWK/1pEEiX/zdzWJLmQEzvp/MtZmqyK6pCwtS8S+gKZQjZZLO
-EnezizecIce2r6xCRxotqncUwfUg+jMUUlZKUlKwh4TrYDFHhet8azXLpjED0ASG
-7/pBYDbRPnmWhX1NPiB4MvLDETrx67aszzrsGXZx9Tr61bhFbRKyDY5ia//5017V
-gStGAqbkkCNZHGnQnNzjuwADBQgA6A58Mp77pUtCtVhfBRnziKkEaCn8nCpqM/PF
-rxih08fQJ3xt/DbfpBx31Hky7KM1uLgzZEnekuU0ZqwgK3aqWg80moKaJNxUZdd5
-oreFobsO7ptejt5omX6kxdGjPclOt1M8sc6E+A3sR5a2QC/9Bts42myc1zKK6+6d
-3UpfUlqgaPvXbGTsisM7jt4DtVz6mXLTyjAiWeO07dcbSjgZuRnHsSCJobzTmNtF
-TP1DgUecgTcOK2ajgGsuzLqkbaQnK/RiRIzqkFIWlz8rzlYNXh8TA90BLeGXSuVO
-EW7GBIc8fVns6o10OdsAqnzEQqcCZv/eHHXjt9T5WgV3epy514hJBBgRAgAJBQJN
-VUpZAhsMAAoJEFhmVAcurWZ3QEMAoLP6krvubxUbwXhlbIO2EiMTh3/MAKCyB20O
-CDJEYrz4EqbscOdx6H3uwA==
-=e+jv
------END PGP PUBLIC KEY BLOCK-----
-
-pub    62C82E50836EB3EE
-sub    2AC7BF2F3349DE80
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-egz57oSj4I+NT33hA64x6jicEKyBNxNI
-=T3Bh
------END PGP PUBLIC KEY BLOCK-----
-
-pub    995EFBF4A3D20BEB
-uid    Ktlint (ktlint signing key) <ktlint-admin@pinterest.com>
-
-sub    B89991D171A02F5C
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-RUjO/QWG6CIej/nl7O0g91NtlEY=
-=Ixqm
------END PGP PUBLIC KEY BLOCK-----
-
-pub    AC5EC74981F9CDA6
-uid    Cedric Beust <cedric@beust.com>
-
-sub    5D9FFE7B8E3DEA8B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBF0YzcYBCADmNIEEzvSsnJnxH0u89Hb5vCCkl+45dWHyCMsCLNty8yL214LV
-B35gnU+6BvRXN3DmTpreCV8/wgI2h1eq83dTO2AsnJTxTjvYpiwAtWhONxWxCU1Y
-WlH8Fsvao51CJWUwYY2HzFr9j7h7EOnm6gj2pnUDdjHRgou9/OxIk6q3M6hrwwh2
-IXw6PXFmkg4wRwlqW5FiC90I8gd3ItFCzqx0TR7DuhOFhtvOheWMlApPoMOUY+6u
-C5Ek6kVW5w5xshKafS7p2s0WOsXkOnH76avFtkBtcsPbHkwWTal4xivSMMsCpdPM
-cF6Fr2p5hF4khQ1r5pdmHeYNoXcC+hSnPM9tABEBAAG0H0NlZHJpYyBCZXVzdCA8
-Y2VkcmljQGJldXN0LmNvbT6JAVQEEwEIAD4WIQTcugM4HvbIkJas2YWsXsdJgfnN
-pgUCXRjNxgIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCsXsdJ
-gfnNpjMGCAC9ojPgU3nJjPdbr57iB1ulJuDaMq+5AsFycAvpbBlbHQYVj3ngldzX
-eehl5H2KYYQzUfr7lDoTwk2dz1i64opMBbsNJZFamivwOaAEk1hX4CwZDGbzk0Cf
-T0oE4dR4TsNEbsW8AiLxXa8ZVbK9cGYdcWHYyNKDJeb/afNeCCpZpkx6+qpXJG2B
-QbIO+8J2E03WcaO0ualRdyw7GM/APJrU0o9sA3wwv4dReuJSrV4JlaoNvHvOok43
-Z6IxuWYwPe5Gf+zMXrHDUFOIiNbYLnXMxi1QDIyXsnJ+KNXRRo0icfB8P81AeG1g
-qFuw0Y15YoFvN+sFWtks0wdzZqzxLLp1uQENBF0YzcYBCACmu7FGW89IMsiRtCfW
-h5aPwLzmWaczLXeUhcrlcl2GHKiy//zM+1PhFj092Tl/WCif0694nXsKrlx9PO0q
-6ca9LSyHZqwAV8AbLHyxkl6mQs+HH5CHEMrT/FpPLCfTUCSyNRyuRJWkbJjCeMkA
-mB+eVHHQLfaRRHVTBW4EfxCHAtwLfys/0PO82+aCHwCgUh7vTUara4krPNHV+7Kf
-SbqCACk3b0ebY53cAva+p+BZac+vJ58Cg9MunvURigd111PZOkiKlAx6xwcq1Z2H
-cJFTj+jtTGwaeXJErusPXhW1NxiUqCeKe4o9Iw+D2pYIqqahVGKnqPYDYY3dBMU3
-GHiDABEBAAGJATwEGAEIACYWIQTcugM4HvbIkJas2YWsXsdJgfnNpgUCXRjNxgIb
-DAUJA8JnAAAKCRCsXsdJgfnNphXkB/9/M1DqpV/FBRhPYMiycj0L+qKXDjJdMSle
-m8a7F59PEGkB0oStEUC0voAeO3hPLvgm0MVAsX9ULtWHlPG+uDYG8/CnFla8BaFA
-kTSlTQsmE0/0j0XTrR4uO5aJBRR+yDKGeR31JyWGecE7UfwQPMxSZENLVft0oZUU
-Rc8vLNBn7Acl/kbw1uKI2ASVmIA4cLYBuYuI14Q63EZQHlGQ2AviuaMR23qYRv4R
-q5sRu1RJw/fITZzwFmmVT0MJvkW3y0pE0VAA7aGfx5ycnEPmNlqS4Xfjk+i864g1
-NjcUKpxv5QIn/p3P8XLKVJoUXU2y4MiJreUxhQI8ClVBsDh/Q9pr
-=543s
------END PGP PUBLIC KEY BLOCK-----
-
-pub    5E2F2B3D474EFE6B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFijpzMBCACxAT3jijwXbI6b7LIF/k8oSGyM8ZNJpb6AQvPqKIqCzxNFXzow
-EBCasKMhIWgGy+293Tpt/DY4btJie4u+igMBS86iXrF8CUnOLPgTlAIyil/oREGJ
-1GFkHsf0Yj88zCo9H9GNiUZRNSHdf55gsgjzzFVdZ6x0MoN7Yopbvl71bcTSbe25
-AZM6K4gIf5TTo66smG9FgwDkMxc61ixRty44gkfWapzdob5d0cli0Ze0mu+2PHJ0
-Fdt2sUX/4M0Bpxk7eaGVecyb9sm6KkRaGziJ+XVByZ0UMdrEEJscLaX/UpfK+Wek
-aPQjDdyYLW90PJofKFPt4h2DBQyf9DSZ8NfJABEBAAE=
-=rKaG
------END PGP PUBLIC KEY BLOCK-----
-
-pub    873A8E86B4372146
-sub    1AFEC329B615D06C
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBEdddbQRBADRgstdUZq7ceq3NYcR5kpoU2tN2Zvg1vptE9FxpDbL73gdLWnI
-C7IAx+NNjdG7Ncdg+u10UZv6OSmhWAd8ubWcD9JxKtS4UXkNPHxhHFHqVPHuCwsQ
-q2AaCtuOk6q9OtthQX6LfOuGqwbv9uH/KLUDn91PrgKuHPVfVveiF30ZvwCggutX
-D0jTGRHzUJl7F1wViuckHJcD/2z76t0ObSuTnENi0IUjF3Toe4tv+qO+Ljs0knvK
-tu1b8A5Bs+kxNcbEqV+zdIph+6gCL9jy+dB9J+t6uZg6ACJexbIkDPsutNtbAVDV
-w5AtM7JR8930dRHfEt26ahFohFi+73V8RiA7LrmMjA8rX4zuo5Pr48xt/RR1Y/VE
-8ohCA/wOqul9eHHevxeEMDYoGVjGl2EiuIThg4eYuQDDSisBNb9a6dhE8ECQFFBx
-mGz32+I8gXSTKFAkkQUI4HmJmTX35nGJql6E7Bn5yM2OaOG04PV+xkhScJll5ZxZ
-BNEccFDL/aI4N33cwrLHyk+wFNZHBL1hnHpxpjFZYv5xfEBjmbkCDQRHXXXPEAgA
-yqEz3eBEKiZ7VbAj96HtIvGufKTdZ0ERJtrdPO4FUGVBcXpphtnPn+JOWomszUKk
-KLO4x24OaDCG/SENsPy+Ned4wjBB+4uV0YEc5Xn8gts3g4Z5p+YiVu+aWeYPPC5B
-PU61tVqc996i9ZYkZiYOs9F5Z+dKozk3KwVcijaCr0IQMjAtJ/N70zcciP23KhrN
-9Z3Nn54Xm7GezD0nxTUGP8gM79zKHnVhDBptrxIT/adCzU9/UX3UVAQcdq86FfzT
-EpqFG3TM75HBTQgHihIkkirzurE+ivh6aaF3UJwmDBe5Wu3gvxF6Rl0Ja/YBNkkC
-iOXngXSxwvUUR8KJO07RGwADBggAxOFV2DfMHsTBu++gKJ94L6VjETfVFEYPo7e4
-tO2Zn2Unzdxz2BoTJcQY0j6/M3Tl9hCwhOSVVL8Ao/wp1ykjgXnwV4vz0be4d/ZM
-L+KF15x+8730H7Th+aR+Ug6K6Khsp8XIypmLJcYgYLD02PlSnDxCq9Fbv0JDlbr6
-tbsJiVzoRjg+WNEIB3IIrJbTIiOFrRBhloinYoot216QJ1rI2nQpMEBlSuX6f4jY
-F6F7X4dAY4V4ohjFeJCb6SYkKbj4caqBA9OVrj3vh8v/vAUKDB8pqVhpaZicFpMd
-2pEEYVMEU4i1sLE3X73y9RRuaJOvPAx2HHT8MlWjsDmNdY2Mg4hJBBgRAgAJBQJH
-XXXPAhsMAAoJEIc6joa0NyFGZKwAnA7QdwrbR2IBqxd9SgqHF/4MAomBAJ9fA/O+
-UMDa7hOEJLf1tEYcv0ESGQ==
-=+kDs
------END PGP PUBLIC KEY BLOCK-----
-
-pub    7C25280EAE63EBE5
-sub    926DFB2EDB329089
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBEPonucRBACtbhYckAoyz1tuSXYX4XiqGa5390gIMcxe2hJ+Ncx9o3zX09Im
-f8PW27BnMrz7EIydgB2wphhjfK4vkNNtm5ZDWH/zJStsk1Fe7lNuuxs8XorX1+8D
-bhhFEuc2B85vNf2o9Y4V5GFwbD+tFNy4u24n7zg6/VgE2WDvYJ8JRqCEkwCggyLj
-ba0lsZ2XtSINh/W8ok+9f0sD/A8WhqBfDTEBuG9gnuCYXM0j7XBBPdPS+FXmmfea
-zyP+URKRprLCdt0ThZAMllIxZJrkbv7aeXVpM6KSZ/XvvaFQ/gha4o4iJFvpoKt1
-Er2j4Tz/STKztHGsMt6pqfrMNPWovu4tLuLZQmojtbIk+IwmcYxMy99owH8oV1WC
-U4HeA/9MlUxzmlmrQF7VLqFTGEEqQaEJqz95wNPj/t1DmI97hshPzXLD4zwKwa9m
-qZJPStRHM0a6xW2dztF12aXhrmYg1gIGNnsHtq+t8ZhfINZUurSWn0m65WT5notA
-15s6hwyDACHWWOgFQ9jmWuGDh0ZpiaBe7BxeTV+MsswY81sOn7kCDQRD6J8HEAgA
-sivVzAfz34QE+S4WTXCuknmYiSEEnyTwk9awb52vrYlhoQ2t2EhRClc/tR6QbhNM
-haMxPt1OYeutOvZN4q216IE2SwZzIDDTchYApP/brBdIDf4L/XGWFIqftCSn+vnb
-0LAzYNVuNXtNwRni2q/fZ3g1wniVMbJ2MrJNt2VhLrP9K/ipFz7JCJittMngmmDF
-7mEKhnrqBROLubFsUfNmz1qRC6PiEwyyCCdG+4m8fIiSyqna3CMkZr/UaVfxuGZH
-WM8HYGmiQjafqeLqo8aSbWerzDYtF2+v4hAAt9eDwdgYy8oNxXEvw7Q+G5lix+6S
-UMYV6NKLNUbBYffm9wjVuwADBQf8DbA7RpziZWLv7DHjR31AA5nnGEeud0dCRO8r
-wfQNnaQvuJq8siRmU3uPAL2NwDgMaa0cT1xt7p4/8/RU0N9otVqnzkLMUTuqq/wt
-QrQt0OWsEJRyxemWFwiL9ZpU4eTg49cfOQXjg2q3fbx9D1Xr6Bu/Pn7UDU8r9GbD
-StGJ7R3Z0kkhtCErWnGNXbuqlVd8uEsyeM2HYpM76BmH/8vMg43lOJyyh6Id20ZT
-n3HgWzRI5QaDJ1JYBhMuVChbTPUCcMox+qgiH4KtRIAjt+m3w0Axjsqo3EFPweWG
-pRfqMyiUcESt4X/Z9V2Nf41NH+nQ74v3RvpP7EWKf9FfEtFpr4hGBBgRAgAGBQJD
-6J8HAAoJEHwlKA6uY+vlN70An1dGrF5xPmh6P43U9+ZwJMtk18aJAJ90ff5E8Fsp
-JCh/PZsbHv+eJN32qA==
-=win2
------END PGP PUBLIC KEY BLOCK-----
-
-pub    B16698A4ADF4D638
-uid    Checker Framework (Official Release) <checker-framework-dev@googlegroups.com>
-
-sub    32784D4F004B405B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFM1v9ABCADD0KoXq2ZKlUHeIVovQy3gFmW9oFAaraV48ouv8cYvqdf+s91H
-NyqeyNPT/ihFeNqZJUAMyPdwN5xrWD6gxMrOCR7BFhA5kLmAKz4HfFCQ05ViyQdI
-/HVNFvTdF8LNnuF+a5aNgg+jjLvFwzkyMFkuiPGuUDFnqEGxC+z9J8t40tpOTOIw
-tPjSzkDN41AJDpUK/simKC5F0Im78nUbwMalE5z2IsZRWpYZyIhN1HhEdDvaDIh7
-3vENjH7enAjWh0iGRu+GTP/fayZnX0uhmausCCwMMhsr489e63ZOaJrqeC//wWrX
-dtEJjcmvRmJ2hwLmgwMP4zSNKsnLGzP0sh69ABEBAAG0TUNoZWNrZXIgRnJhbWV3
-b3JrIChPZmZpY2lhbCBSZWxlYXNlKSA8Y2hlY2tlci1mcmFtZXdvcmstZGV2QGdv
-b2dsZWdyb3Vwcy5jb20+iQE4BBMBAgAiBQJTNb/QAhsDBgsJCAcDAgYVCAIJCgsE
-FgIDAQIeAQIXgAAKCRCxZpikrfTWOJ4nB/sGNeq4d18M8Cbrfaj+YwQCkmO2ZELb
-VegqcJELSnvvs9EKO4X1c4Snnbk5r9apoCBSXhODYMfkZ6SUI4Op/8y4S4Km35PL
-8revBwkuen1xMr5cRwRVkdZemKtLaKenUyY+ERpZPdRCSEfW7AVsRqRmsHIIz7UJ
-1p2tAiWHMnyhjFOM3Iap/w7liGPsLmqbHReKUkeriRo40H92ASlPcZxmnbKCMtkB
-wP2FuE1waOvjKfihtU1ZGjsP4JxriIcGz7h80kdGfWyFbZMIeZvnTFfB3odp5qNT
-Zf5enUcYf3NO3IsUqege0gy1PWEF6c3RSPX97YzuW90OPKAHKt/QLON6uQENBFM1
-v9ABCADutkjG6oCMxBUBB5cTTeaWR3e5rKgxEiCxWBZCNZsZZA9LcBVjG5OJzB9l
-V4Yrk97paigTlFFDUKzu3oLX2xrIFb+G1m1B33mZH76Fg5Zm674tWC5Uf2ccxqQj
-XPHt2jnDd1yh5QcH1GnKOqXEwby6SjwP0wI5EzrSuAOQM79QksKc0iX9m1VW65+5
-ov68O/EpmQFdv67YjlOWvUvt387MC5NTzv8//3eFaAnC9rNlrnlTtUPfZHo5BOeZ
-d5WMBIgc1bgAPfENGucIPOL0RhWUFiyMPHNtDp9vnWXEy2XOtWY57CNS0py1FMkP
-38x0Pgcp0BfZeN2QjyhSJdduTBopABEBAAGJAR8EGAECAAkFAlM1v9ACGwwACgkQ
-sWaYpK301jiXpQf/bw3Nxv5qyBwdT/85dBXZecEM2klXPSQf3HtNNfKbaZS+9dWn
-9GQ71qpmZCTZGLtJR4J54mlwdJdxhlDyGv02c1YBUkT4+uRVkzJAWzZ4RiMFeSFT
-j3Eiksg2J/f50D6ZlpeXw4/MYr+pCmMQOIY40W0RrlF4iNnZ8hR7haWnH/wH/zHN
-FPwgw7s+WtY0uEmLmDPxxVS/dzzmc8C1Ef/hg7lSRZ5tdq5oxpyVYEdK1nCSiber
-wrAT1XyGpn5erxvjeE1kPXro/EXeIY7GDzsA34FSFBiIaU1Cfn89OOn5M/TFp1+0
-SYeoaiwF0+x23NBUxbCmAGyyW5t0Pq1PY03TPA==
-=URva
------END PGP PUBLIC KEY BLOCK-----
-
-pub    0E91C2DE43B72BB1
-uid    Peter Palaga <ppalaga@apache.org>
-uid    Peter Palaga <peter@palaga.org>
-uid    Peter Palaga <ppalaga@redhat.com>
-
-sub    83552A552A0D431C
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-MNW5Qc4ZDKq+ywOElvONMnX4oaQ1
-=Z4Zj
------END PGP PUBLIC KEY BLOCK-----
-
-pub    ECDFEA3CB4493B94
-uid    Guillaume Nodet <gnodet@apache.org>
-
-sub    3BD211F725778C36
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-8Rk4igUAoKASMCNpbFGpw52Wz3D4pRtDjoYj
-=mkVE
------END PGP PUBLIC KEY BLOCK-----
-
-pub    15C71C0A4E0B8EDD
-sub    891E4C2D471515FE
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-tiwy+wOBjaK9g3Kk8jsN3I8t
-=8Tiq
------END PGP PUBLIC KEY BLOCK-----
-
-pub    461A804F2609FD89
-uid    Stanley Shyiko <stanley.shyiko@gmail.com>
-
-sub    8067ECAA8D58321C
-sub    750F9A735EECF640
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=wpe3
------END PGP PUBLIC KEY BLOCK-----
-
-pub    7A01B0F236E5430F
-uid    Inderjeet Singh <inder@alumni.stanford.edu>
-
-sub    C3E640F38D845FA2
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFZUsiQBCADGmoidvh3VvXWGdwbAtHPtDPKEebE/MfFVO+QTRbjJxphzKwAt
-mxHruikafaSTnC9FWizj99e/Yc45YZHcnt5Htmy0a7DSOQXL37rrnieZxg86tYmC
-4PxvvzC/s7xF8wmxDo4A+mRyoSF0NF/fQTZAr3ri5l0G/vntH7w8AbiiyerpLobW
-/TqQn1tpMh7XfZZ+XqQKANVRECUiCYT4iJKWMqcBpLZW8aa+iYW8yCQ1xfmNXjrx
-jpTqFCiQjvwCw4dDffNe/A1Dbq0wE6mw3YHW3OC1fnLiP+TEM9P9v02bZyem6uW2
-+krrToLTTHSqIGF9wUUF6S3Ikrw2EtJiRQtnABEBAAG0K0luZGVyamVldCBTaW5n
-aCA8aW5kZXJAYWx1bW5pLnN0YW5mb3JkLmVkdT6JATgEEwECACIFAlZUsiQCGwMG
-CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHoBsPI25UMP6r8H/Rq70+JN+EyS
-6iK6ilytB1vY5GdwBzAxpsRUhTL1lXSqgjCXy/6sgrTQv/9/EgQznm7hEFVkwr5Z
-CacXeajvFJ3FVtjgn0aLRADp88Ry75DsttjwV5nIBNvFBJbydvJhfruHY8gzdUv9
-yOHAX4qtoNDFRn1HDbNsYMlRSXgjHX0JvBexdtZArtsd3aLOM4m8r+t1GFM6ePgj
-CD1q8yBH2RAIETAId/jiu07AqsJXp+UPBgJQi8o7cEtEE1HgkI+IoEsZXFJldRqF
-GJS6eKS8bpjX16nHI0SnR/gtsWpblAdZsY0YieK7o2pU8lvlCFffaUxXDOP7+BCq
-8W29nfaD6YS5AQ0EVlSyJAEIAL0+8UoJuUsC3jDE60tmrApu/hK+dCbe5UJnR8z9
-3aQ/1AfEX6So6JZzBlxID/HCOvRjJbauL6Lrvw2xgSnrnOzRLf1StvBPASfJk1Zd
-o9LZon6Xofzg34qCLUQLkDyntgXQaYF3Yw/xfiqqTC/yav29VTzKnf0Nri8aXGsH
-OycJ8nTO7I0p4xuRirFu7Bkvd7bK99/tDxttYkvUnG3BUGlr85UX4uODh3EcVcgV
-QteawYbmsf4F00IBoTAycutCOdbP2RAgP6kgFxLcGz4zVqu93QjSjEdTegF1SUXc
-GpzvDR8T8zRsQbBCZ32A/UJqmx+EIPPFHNkLijDp+f5mkJcAEQEAAYkBHwQYAQIA
-CQUCVlSyJAIbDAAKCRB6AbDyNuVDD2xjCACqL670xI/26dWsz66ZyHQ2yJI7DNQx
-oiU3OZs2bfrRZxLpGP9Q6YWCehb+iucvmFFvLZBoGGWzffmVBisD2Yz3mHtF3wLx
-+2zJXHt1Xz7H6W89M54T3qUhQTTV6pl5f5/JCXK1DP9iC0y453ORY5B60byrGIUv
-BAv+qWXBPn3ECZ/3oEkErb5ZGof+gJjffqvWRAN3Li0WBRj0ldXpJoP/YE8naDJ7
-UdPfzcnh3tnOTfUDvFer1Nh00ilMmf6EYznRwaN9whc9W/1HwvDeXrijrc6/1U7H
-p1r5b1DddTtx6aHxpWrcwYw1yXGcm82fjXnRdomz6nBt2DF400YubAZR
-=2qwf
------END PGP PUBLIC KEY BLOCK-----
-
-pub    29579F18FA8FD93B
-sub    9DF7F2349731D55B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik
-h95RkbdeWsQSvduXWgQZsUDq9cLOkuS/ChAMkAAd3MPp1NMdFmAqS7BX5wU5s5I7
-XD+/p51SWLMvgrLxoenmoE04EuQqQiXd4DbU+HGPseiNx+mN0cxPssaZMBBsmi2r
-RjwcQrFTaC1iffzh8FKLQvoTDzci//b5bWcxCLbsY9dYcUaDCbBAkL8HzyZUKNE9
-XwXh/Rq8wDakI/VEg/905a9c4xq6Rss6Yn5E4V2SAo2+B3hYmvHFsefaM9kkqvXk
-MQ6zjx83LAtzavOzmthjhhPIgCAfoQ5Q5oDzABEBAAG5AQ0EVgWIwAEIAJ29KWGH
-aEt7gXV8EweJkrYd02nwjc1LyjUT2TRwEzZ9N9qUiVqfpkgnZn4mpHCToxFoqkHa
-iv/QDfj7cp8jbZJa2wjaUkDbH2pZqLBGJ0sUUBZ1KNPM2uhhWRzAnmF/bIo3+Yfl
-hGINLNqoevkYoo9cdelP3hepef4+PUuPmKmeo856uknmaWQ89LPwLlV7oj6wiqMY
-p22sHqTGAgXeR/fSLMK7d0vSPm+57LZed5ECoRMeqYFUwSMV64RjTMkKPsvFBGvR
-hppJ+uWQiMjFFuFq2DFeNBVtueHSdgCHx1TP9i+x+7JmYsmFFmRwnEdbxO3THFXa
-gFQGr4ima+oOjLcAEQEAAYkBHwQYAQIACQUCVgWIwAIbDAAKCRApV58Y+o/ZO+ZZ
-CACL1DlaVyRNjNxzC+30X6xGykPwCdwMRF3CRjoeIicss2pBJRaIdTYFpg3bCZKJ
-J5KDC6s+03zmd3ddnKEq1fEfRcoLZ9PNBYF3IESHnNPlR68RL2cjMgq6segbhOxa
-v13ZcOIOnyrWzgbVw0ZgN8P3vCllFtifwvuF50vTshIRY11G8Gluu+GZ7tfSkPww
-Eo+pRd8scdol62aUUo6a71rDOMg2XPULz0l2hxKWfeUsksT5EY03seZd3CYqOacL
-R+jaHyOc5Nh6R1MzcRz65YTwzVbKplXtZjOghMh+rS4eDIjEKlo456M4spKFBbTf
-Ub+QS9kCkBU8csUzwF0nk/oP
-=SZ35
------END PGP PUBLIC KEY BLOCK-----
-
-pub    86FDC7E2A11262CB
-uid    Gary David Gregory (Code signing key) <ggregory@apache.org>
-
-sub    59BA7BFEAD3D7F94
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=GKsT
------END PGP PUBLIC KEY BLOCK-----
-
-pub    7457CA33C3CE9E15
-uid    Colin Decker <cgdecker@google.com>
-
-sub    ABE9F3126BB741C1
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=Gj90
------END PGP PUBLIC KEY BLOCK-----
-
-pub    3FAAD2CD5ECBB314
-uid    Rob Tompkins <chtompki@apache.org>
-
-sub    3260CB2DEF74135B
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-lF+5G+lrwILgoMWRtTc1vbp0S9Y/P6OkLcGdUg==
-=VUSH
------END PGP PUBLIC KEY BLOCK-----
-
-pub    7A8860944FAD5F62
-sub    C189C86B813330C4
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-WxZ/desi/+eJ8DKd5ff/SE7/
-=G87i
------END PGP PUBLIC KEY BLOCK-----
-
-pub    1DA784CCB5C46DD5
-uid    Rafael Winterhalter <rafael.wth@gmail.com>
-
-sub    7999BEFBA1039E8B
-sub    A7E989B0634097AC
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=qLMN
------END PGP PUBLIC KEY BLOCK-----
-
-pub    B0F3710FA64900E7
-sub    7892707E9657EBD4
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFdbSfIBCACrFI0ai/abnV2U2Wa9QQZwGk3Fegc8laiuTKc0GoYdyptd83/H
-hD5S61ppdkOugBjVTHdgda3xJ7zBZdnwjZvV/TyayQltbh6hU+BMlEolzXLgyvY7
-cAzKE+iKWbLLwfhRn1iuC7s5l1NLPsh44IUt3xDaFXNQrPO5OnRz8bqsGFVawxmu
-2bPqIjkhxEiYpxwaZZbDkgBR6rbBth6A7QOadQcj/9wNdekoM9dyg+olOUmnLrtA
-nMBhrvvbm2fZxTps3SZHlLV7+iSu71B5SqU/kT54/49n8vxrQiGvzp9K+t7c7EP2
-w4Ax1nYpRkCxYdHOX3YBdayUiP9ZaYH/YHtLABEBAAG5AQ0EV1tJ8gEIAJVavNan
-4WxxlwLwvnBj3/wcEWqN+kfMHENMSjmRWOYSmC332hhGLmTDi++BPWt2OOvHUusJ
-V8dZP5D9yUBRFsKozIpyXyS76C5VYGMY8WZ6kyqn/mLCiwmnkOJ24kXLaaHPsQjv
-6i5f2KliDVhAGUHmNMJgH8o/GL7zZ03Mb8ZlKFZobp0dn+/lxoOtQSzR+cBz8NvM
-BkOKD8r4PJA6BxCR1HVEHsq4xSnjr/UZOYvh+Kaxfnop7Rn9in5MoY2rCY+PV59X
-bx4grqNpjupyHEf1MHodJRj85JiClnLZk7dNJ/kr+zggwbsd12/GHkBt/pxuWhe0
-eFcAOJmvqC3c4pUAEQEAAYkBHwQYAQoACQUCV1tJ8gIbDAAKCRCw83EPpkkA54FA
-CACFZB2Tk96FQkr8+WHOz93CJs4UD88PosLaKmiXKP68arjH3y5jhNLBzqteZo0C
-rfw75DYWIZChdf5uLGKCWXBEytF4uoHOy9Lv/3emoSeenluFVcNjL7CIOQDRmqw1
-t/LjnsLbgvlwHix5f7I6Txu/J0HKJbq0XpoTqCzFK6sxEPHH3gZto+XfHk85haKd
-73SOM4edkmJx+jDXES1wb3K3SpYibt+uPVfLYXWxK7xAaztESTIqZ9RnYHzd/7z6
-DO4z//lfB7IVAqvM8ga7Qj58ObeqZxx2iVit5WUZ4cE30crNGyXH/HKlAp+B9EvE
-Nnwr++TI1CGYthPLFHFc831L
-=57TL
------END PGP PUBLIC KEY BLOCK-----
-
-pub    7C7D8456294423BA
-sub    9842FE565AA0601E
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQGiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN
-Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt
-q3VzdxeVbwCaPJ0zixv8XPTAH6MpRJUvP9XjzxwaYHrjwcQ1LslW4TrIzwCgi5rf
-jChLCyKcaL05gqUjl4lmefED/iqOwYZw5pJ8+X+OHUViiOB43wsJt1brAhPj4KgB
-ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic
-J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z
-FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K
-RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk
-MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurkCDQRL7GcQEAgA
-thrbFDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr
-1c/rvH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThb
-zyQq4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKI
-VhUUfY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMw
-XwyHonlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2
-KKwlG2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqb
-KTwuRc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAG
-H/qjNuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2rav
-EqI7Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6
-j+52nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AI
-clQoMEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1IhJBBgRAgAJBQJL
-7GcQAhsMAAoJEHx9hFYpRCO6iXUAnRcLw17lBhe/WcKFRkzETSxaJcjIAJ4/P1NN
-On/eScLdx27sje7q3sBENw==
-=TzHJ
------END PGP PUBLIC KEY BLOCK-----
-
-pub    EE9E7DC9D92FC896
-sub    3B7272A25F20140F
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE/oyDcBCACgYsHtmWmtUzqyr/JN+orfJaTl2363qiS+NJ1lt2CNxUWOqldc
-VcIGyjmzokxTRpGdCFmT1Lh/hzZhcDPLjrtxf+f6njIibt80OiEbX39gjwZRIikd
-Uv44Z7zAGE/upTM87/s+1+M1h9NFHPUg4SOOHwk3hYvCbvde3bZaUDhhn2asrYb2
-wlUbPBZROtFWlxZXHGXsMnER6ZScxK3ckrJkikM5L8tGFrJlBb/lG2vS00lcZDoR
-7v7XtmHqOBxPFf4RIMP/HimGl4lEuBhc25eAt4QxoVmoqb2C4vCUWxwfAURkJzI2
-JU3l5YP0rSgO9rwrXGlTvASCuEoQyPDjwKGLABEBAAG5AQ0ET+jINwEIANpeqMgb
-VzzRnT60rHPxCM40VfwVTYFEspNZV4g9Byb/Cu4UqHtdOApqIS0XQDgT+042x4Jt
-I6OZ7fUzOpN6Xb673LnB746J9cOlDL9JkqUwD/sjFg9YYFMROvhOOB023moPDsPk
-9jSDDxWmMfpr0NWGba4xWG/R6FHAbK023oRZO1BACBcNF59M9y6iJ3Edb6qfiGXF
-fnJrvwOYfGEqzOA+5YJZHPI59RoxAMm7NT1EwhgnD3qw5qCBHBDzaI7qinAy5Zs2
-jtZIEZHlV37CAKjeXjmjCnAnYD/Tlh9vOY9ku3UK5uH5CGxYDKdd5bX5bNmWK2mb
-pRk7C6MSTGX9tTUAEQEAAYkBHwQYAQIACQUCT+jINwIbDAAKCRDunn3J2S/IluSv
-B/4o0x3rrIK3T9WK2Ylvh6eRLbB18fEiYj5B/aWRTYTHJRfGa+Tziwm55stRnQjZ
-ZMC36K7LjPQjqjAW0011azO8oFKFbJnVmmOTUrosVdkxYBdW6fcOXmFcFi2c/M4U
-At6Mb9qg7vVW1DUk5+W5OU3TC33WCBKClb3usf8Uv0hZ5TRs+gt35EWBYpHuQIhq
-W4+1ntttT9gF6+MruoAKy8ViEsPQ/tpLG0eOTc2XjWg9z2wVl0KVKJN32IQKwje8
-RtLK0bY1KEeKXo1FCUVTg9IWDaNsi2tWPL8CLpP/Hq4Qx9SX32Io/3rJxy3h+sg+
-hN0x6m3QjnijzvokolnfxsAb
-=RmVV
------END PGP PUBLIC KEY BLOCK-----
-
-pub    164BD2247B936711
-uid    Marc Philipp (JUnit Development, 2014) <mail@marcphilipp.de>
-
-sub    EFE8086F9E93774E
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-Qw==
-=iceo
------END PGP PUBLIC KEY BLOCK-----
-
-pub    BAC30622339994C4
-uid    Chris Povirk <cpovirk@google.com>
-
-sub    FC9BDC25FB378008
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFlMExYBCACmdTDSXPwSJeYbfYvHoDl5C7vx/0+LOTunDGJN38pNQHYQAZnv
-Gyoc9ZmChrhLoim7z4ILqmNo8eegknepQ3dGdUij4NVIhR+m+8irayTbsNHvo3UG
-9y7eM5tTSjyNYkyk5fAVuT7OhzIzMA+qtc3GRVxNYRKnaHajt+pOSqr+uoDtMG3n
-6eAMHCAnhgh5Nd+dCFcNT+syl3zCwolA1wrzGxxOaif+xi5wwXjmF/lAt4PDIuDT
-etA2/AqPM4zAC0BtC0iqVgVypjFV3EAexm/g0LNMiG/M/krzwjPq5gf1DY/57jU0
-02FpKd79HmR7bHdc4e2olEf9NlHxfbPXDDsHABEBAAG0IUNocmlzIFBvdmlyayA8
-Y3Bvdmlya0Bnb29nbGUuY29tPokBOAQTAQIAIgUCWUwTFgIbAwYLCQgHAwIGFQgC
-CQoLBBYCAwECHgECF4AACgkQusMGIjOZlMRhLgf/XwT7Pad1tB0h0AU/AKW8lOge
-5zuCz1Pb2GZ7b1VKeENMbYFT3nEzeZ1huylxv3IRimmzylYBditoCNRhwS3m1sGc
-gdztnoTEKqR1btCU3cCxjOzB8rTwxKVDNRJkZgCi1taOcg5OBlQGmuJCLg/ZHkFQ
-Cv8FgRAvsep2e1/xYoedaorMFVlVAxgYOXgzCVGUOPExbU+IZvdGoeGp7lD/+8Z9
-8V41B6D9LuZRf0UVxwzJCXxrPjRGRzAgjhAnQXq4UnD1ECi5x84z6JFIxxLm1RfS
-4czXxwT+k/RQjp/m01P2NZ249nzbQ8gDQA3llt2tjA1Z430VN/KPhZfDGWQIxrkB
-DQRZTBMWAQgA2YylXc0rxousuBBPKHn75163wLcPdPm2QR2WMc643fX+p0o2B7wf
-q4ofzNdFmyPml3xp2laQPhPMgy/MjDOLOwbDfg72F/UTZc+gOq9Cvf2nWyi9fc94
-O9Elj/skU230OymFVzfFZB82QLsl0w9rolGIUd3fKd9tD7CmV/i19oNWfUlcBanQ
-1IaAy1d+fmLX2EdBaOZE0Ao1At1WfxRzMjxd1UzttLiCIOlAy6RLKOyOACjjrqJE
-rb7x/wHAhF7UlG8XfsF2du9OD93OiLX8Ti6TBUkPpgTYuUPDN0aej0rE+VGy5jee
-eF5WCNusYnZcpEmQiTztwwaHjVUrDovi6wARAQABiQEfBBgBAgAJBQJZTBMWAhsM
-AAoJELrDBiIzmZTESIcIAJBWIY4eLQGhnvxknPovjxg0zHx9J1K/dgnzciHWfkNY
-ImCsNXlLf951iKeShUjQu6zLcx1+1GDo5Zpg645N/oxhx107+ZjfreOIwHJ/1SHc
-OqriwqpUtGdlsCqAPWh1GiPY2QRB+AQf8fglFWvGq7MAqhbAmHcyFj6RqNglEnJZ
-9zX8GbcGPW1wwaUZ4hB+BaF54yDeTGvEn1Nc+pWLpVU9o8ohTmLyXjpL5aDe68yz
-y8LdfM4i+FjpzCC4m/1SSNnAYNIj3nbAuqdEQzLSAVn44AHSomlgzecMR6RZk/fw
-bzSSiOc3rW1mNFOG70iLz9v4/BJb6dbcSlBl0upm05Q=
-=JITE
------END PGP PUBLIC KEY BLOCK-----
-
-pub    C51E6CBC7FF46F0B
-uid    Ron Shapiro <ronshapiro@google.com>
-
-sub    4006CBA6D352F1FC
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFbgSbABCADGGENSy3oWLjW7zfYMSsR0pm3l3eMA7ptyU5C0U/MoIYjbXwyX
-XtlGwKnNgngATh1SMpX4WDbD8tn6vdeP4uHQsDb40t0XN7/HISFcLhV5pCgz2wNR
-t1dZbreV/EaZn3f84Vnm9s6TU7RHuPP9qBne1YLbB+LKKZUfQGavqGR+n322DhrR
-NqLdC3zFNtSmCVXS6GZ17IV/B+6CiNdbmPVk0o7zZexqZCNMXxv1IFzHV1/Y8Htu
-WQBfZ0zWwrX85ZKysU7UDdoyUw2aa8/+YpZmKwo32N8GpqA6azBeUjjVXGuqktMy
-l6IcHbLlgymkkjK7TyAKltuhvp6AlBTzp9i/ABEBAAG0I1JvbiBTaGFwaXJvIDxy
-b25zaGFwaXJvQGdvb2dsZS5jb20+iQE4BBMBAgAiBQJW4EmwAhsDBgsJCAcDAgYV
-CAIJCgsEFgIDAQIeAQIXgAAKCRDFHmy8f/RvC2QHCAChHSed7wRyJS6cgRNk4Z2F
-oECztmirxmU+OolCsxFOoQp8akb9nAxhkssGu4UptvmNzRdFXp5OvTbNS9/sY1Q8
-USr7dJqU5imNYgUuz+8/I8RTieEs2I1pJkk1qT0oK2NcGjXUFkIQam5DvBoCOIs3
-Rm8Z8dy7Gfg3lSXNrBjOLTSd1cRe6kcgmVorrZEUaPg5VHEDtWVFE/h1GMoZo8bq
-uI5Jtwvw/T7hp7EDgczi4BXCUav/M2JsynSgG3EYnfv9g2JVLqnINrezVZ+06Z9Q
-Mfiyy0Yo59S/FQ4cNQ0JkBs0LtcOaXeG5gxHgm1sM7Uzn7eVfF9nFpXsmMY/XF4f
-uQENBFbgSbABCACxPdPzyrpxDrtgfkBhlfXtIyTJVvq7NwVejSPWWkcNFL8tMTfo
-6oTLMgswfD9Y6E2SlLJivabWj5TLiq02kP9BmD4unD+RGpqYcr4yvJYy4YULogMb
-e88L+/L1+whqkVBHALM7CvBTwQFxEbEoreuta46eAIu9XMkIPGDlw44YrLB1pp3h
-fEyd8iLaHI+CsQyi8aGPoReuHqW5IyJKX62d+Il/M3WTEQjSZYfqEx3v8bpWC0A2
-4JIEGvmOoJyplGYtEBlNNZOnlsP1N8jguvfvnoYmHGWEtHVqTxPx+dUYs5+0IqRX
-hX07ImvY5Bo8zMihxo7uulEUPKJHeBOnr9zfABEBAAGJAR8EGAECAAkFAlbgSbAC
-GwwACgkQxR5svH/0bwtXNAgAsuPW+B+mc2O9QKPSR0UaUGdlUlZPusT25a9QzqMr
-Qwv84VSnpHqxOzgRLpdFDqs1MizcJA4h8vuT0Yumarma/OT5WlVeY+g5Lmf9JXC9
-6H7L7UItQ8Hdav/Uc3nUlI42Nzopj1g5AwSBsgV6IccdQcUSAL5UZ5PWoGqX2wHc
-Lb+nI2MVtEw3D8eF1vN/ZzDdwjBFrZSNRoShmIuZ7FMO93LaUqvXZt6L/OcpBTqg
-f47r03D6IjsDxPuqNDgk2aOtFcD1H7+7qF7ZKy1SdAdOpnyolIGb2qqaWA4vSK4X
-B2qzs/DA9jq1Et8+K4k7C1RD8GPl3dOkMnpjMpx6qXA6Zg==
-=2mGd
------END PGP PUBLIC KEY BLOCK-----
-
-pub    A1B4460D8BA7B9AF
-sub    BA6D22590B3F9BEA
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE4waOEBCADHDHNTq1NRR5TSooIrKY0BTQnaLfjKZfcJOwp+btBJrOUO7+e/
-V3M4DZQclj/e8SBiVmRPK8Oyrv6i5B5+Ee/qNlLjWiO10AJ/PLRjYdoW1V6PlTm7
-2aUxQ/wNXxDcOoH8M7Y4fEqZJ3rFuta8ogeIYnkUwUk3gc5YKk7KJDbiOXQfRxlY
-9MeVKyoYfj+2Szaaz98W097Pqf9+7i3WjB3TKR1pnWlzF6rLWIGBJqcJuTGLWUAB
-hwOMoNiIBAqyGu8E4rT8pP9OueprOeIjyKgOBWV5yctIxd7uu51sGR47TM2wmMmm
-r/Kz8FkMr1efof7Bx4mJuup6wQXonRMVBqpLABEBAAG5AQ0ETjBo4QEIAMQ45a+j
-mpILPuXeTXCGKSf/EuQSFGlZZoyqGhSaAMuOls776WkwtNto7NWUr6zPMJUsUpPp
-A+vxQCcNqScEYFa6JTmCUJqi6oEwNkEjfpXlqNMfIAtfkF866rgjne5v/ofBR1A2
-sXNvV0Pu/h7Tb7EsWPXbQ84EBl4z10qaVQkogzctSLiAMZhABUsaJNdhpcav59gx
-cejp1Qfub77dAvJ0OsNIUAECj1Jju3zWr+ZWTHyoEfeTa7xdR7uVeg2b6W14OvjV
-nwPC7AmpqQEa6Luas8uu4W//iihh0wzDr2WZRsOqEpz54KpodOkKmOz+DylZDqN1
-W+vtNpbcmfeUYJkAEQEAAYkBHwQYAQIACQUCTjBo4QIbDAAKCRChtEYNi6e5r9m9
-CACOaQ8y7QRsWIZjta0g4GPiWO2QK+LK1v+yumXNEZlr+PCbGTn+0+/JCK4n+o6x
-fmcAS63T/d7pjK/Wif5iYJa/tKGoNGVYRFuiW+3YIkZ/BffqnArOpcqMwBvNOaFt
-pVC5MKkidcTbO/b/UbTlpSOa7i1W0u14Rr9Kh/pctcaSLmDszb6ToI9aQtz7/jbi
-9oay1GVYNbzPXgjN0w1Ww8iWa8SnTHpjEhhx7F1h7Z/LeAU/PJInHuMHg6vBgZdQ
-8fgKTtfoh4++/ZzF9Q632sbSS00ah/X4R3rCEprXvHz4snRk/xwgParilLscjeFu
-lMLvlKL9dnBldrACPh+aj4Re
-=Qq2e
------END PGP PUBLIC KEY BLOCK-----
-
-pub    C7CB325467893CC4
-uid    Marc Philipp (JUnit Maven Deployment) <mail@marcphilipp.de>
-
-sub    BF07AD5B93D4BEBE
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBE+VqAwBCADvIJMQYWtHnfpfI9IB9WPd+Fd5xlFT7R9trJEfQGA6TDH0IsqH
-0CXVLJ4fa+PiWfkDELK6b1qsGg52+mbzZzkbH+XAsX81sMEF6j5H4pjE9KPB8xAv
-tyuII8tNDwUjGSssw2UIHZpXMJESo1d0TCjd0K5iJ7vqVPAXXmOmatHM65jSE8JQ
-FlsKa87HdQ4u0VfM4DqI3fKNh6Ohwbnv1JLYCgm/Z6fD5SdSUcuGhGe2Ob1yn+mg
-Eaewsi/xmYlQwt4i7Uhibla4zy9jFTFVlvySFxbImj3jVcLZOGPgUIwiwUUMPFga
-H+Fpc1aw2pFcWqqn7QuIAt9qtwfe+J6acKl5ABEBAAG0O01hcmMgUGhpbGlwcCAo
-SlVuaXQgTWF2ZW4gRGVwbG95bWVudCkgPG1haWxAbWFyY3BoaWxpcHAuZGU+iQE5
-BBMBAgAjBQJPlagMAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQx8sy
-VGeJPMTpFAf+Pc5K8RM65SCmYiyzsLY/S2RWn2IHmN1RQsTEKyEkMQ3zyvt2b6IV
-kte/ZBKfc+DROLR/qH0OXd53ENTREjxCd7HnV511vLy4OG1yWQERg+CQOGTVD6Up
-r61x7K+Vp9aPWjXyEr9k8jWbvLavCLksXNameqGZLFH6ZxdF61iKAxvlRl1N7qWD
-P73daVGhimFGk16y3jkfcjZ8VEipJs/bVnj+z/sThmsrXrCNn+nT4ez63s0uI3ch
-2qYvBGT9Pu8OUG3LPWK8evk5kRr/HsTMRa9CLnnmSE5B1eIxgvwp4ZYkgxs/JVyb
-ZC0xWu5n0zU3zff7dH2SrCxwyDeqmBqvDbkBDQRPlagMAQgApQTVPSZufl0VkELc
-6upqQvLvYcWN4O9tOdDXb8TEmfMArlX4h+6AbHURMoplMVN7shAiUVQA2QrK7pe/
-qDFvd32cYSaptsme8Cfo2zhpVF6WNQ5gY4GpgxxikNgwOoiFEYVyL9wUF2qWFv75
-9oiFJs/wpbVZKju8XMidoFQlvz4TXQjClzhhOFOGqJ3/P5koGLrwRl24PtVQUKTr
-MLPxc/n7PwLyGZ3zX7pbRb/ZcUqqe0fpyFQzpAOOBX6CrYXYJNweR9ymaqato2vN
-aGg84lx7f/56n7g/NnxTAW/UeN+WSz1Wx0h2eyOLkzlOMsDCQ01eK0WBgE9hE3Vq
-+fzLUQARAQABiQEfBBgBAgAJBQJPlagMAhsMAAoJEMfLMlRniTzEt4wH/1lcB5OZ
-Kq/ATZtN5U0xlS9bUcSPVW+HoyqM5A80xfpxaHjKhj4ut0XEYLsco/0/F9ocno2b
-/pxVzdajaeNLUgskjvUMc9zUDQCH48XUj51IjTon+PvG9EZbLufu4jIodNNFzW9Q
-vTq13C9TtbFED542h9GmKZQYqbWAtjEh+66mgdysbyRERjLaC6rWCUXKGr72lN7Z
-jsDqguBsjHhJLTTHsYDdMitGubT8ojjz4Gj2ry+HtQQ7jheh4FV6adbU6xq8NZis
-yOVw1673zJ2quVdJ2W+dR/MEg7Q9NMrsgrqZwt2mTmbFpTS0izQLh7Q+DL64mizt
-QH04yffdzFyfppo=
-=h2wg
------END PGP PUBLIC KEY BLOCK-----
-
-pub    476634A4694E716A
-uid    Simon Mittermueller (none) <simon.mittermueller@gmail.com>
-
-sub    4CE6E05D128BCFAD
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFE0soEBCADAy/iIRT/lpb+vfDjWs/k1XQNU3mzXoMm1mmS/Z8VOc0jF7sVB
-A5z2pC6u2OmEr1oJkhWefX+mU//7kXs6VvUCReE4uheGBlisg/ELEXkTm342TcwS
-K+tR/NMk5h1DwxeGR2qc0+zhFcrITiYqCpdaggRVx92syhuYWrG2DtRI3eEz+fys
-2WLhAd/AqBTR0ENDZssp5S6tEBcLvU/jAvKv33/+ydg+1Bsw37CqCOO0bR388+ow
-uSXSARDJaesnBpUcXT9pbog3Wm9pSzJ2fX1FyFaf3rqIIYEqGk1rEND+AkT2CB08
-BykABpDx0mgR6/pAgQVywCatPuc7wneiZY+LABEBAAG0OlNpbW9uIE1pdHRlcm11
-ZWxsZXIgKG5vbmUpIDxzaW1vbi5taXR0ZXJtdWVsbGVyQGdtYWlsLmNvbT6JATgE
-EwECACIFAlE0soECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEEdmNKRp
-TnFqfr8H/1DXbZ4VzAqqIBhMUWOIvF220gZ6NAxgIP4IAzfuLYKso1pfogbuPzS4
-IzbTZIZv0TXsK7zEzxZY4Oxx5cQaOfRiPOBvkeEC1T8Pf8l9GDQ8ppy0aHPNLgV+
-nloylBUHWuKpTMUHKu3MpwHfwMFZ9ZFsUmgcQ9oYkWcvprH2uOachsuA4BSxXJNe
-OGU3aBIG1CR7lGENmkjwZowXhxM7QuYZ7qIR6oFxQCOj9jcV61AQhj5LuKNOJLfx
-fAICIeUD8mJP3NcblVNp/Nj656naiLWBsK1sfjGzvLkeTKnFYFMpJqEuLTv7VTx1
-fGJnaq2+2UznsLGgWcMVPg68ZOW5V6i5AQ0EUTSygQEIANTGYOD4HupAmugS69tx
-MTAW4GvRQ0s8Li/r/QQQUWPpjo3IkJDA0+kPCe2JRamNJJ2plzndeGUpQIZn+HJS
-N8fGRjZG56HG6l0BJmQRFHD/6CzNOOKK6z+8e306DAwQPqDdDpUgpBmbPHZDhCs7
-tvrOhrUesfLQla15MM7n1DEtII9y+AsMGfwrZCd2PeigiRC+/NH/lYObLUPc+NL6
-GrC1ZHrpGoOR+9GQ6voVNY5EIxVlNgoVBxn3ufcFvvghmZe0WyudBHK9ByWeioBI
-tHQW5n7eGpljcCUbTpsJmErhjH6KBKSuxPQsyV4TkQMqcsymGW0jhdHXc1/tStF3
-L0kAEQEAAYkBHwQYAQIACQUCUTSygQIbDAAKCRBHZjSkaU5xamOiB/9r943gZZy9
-FJv/NGPnNxCvI3ZusQfntgRfVyIFZLIUeaYDab6RqKTD8ZRgyfO2rmO73DiQ2bnt
-zmSPHeAlpKAIhTXfty0g5UICLjr27KocLNt234BKii6go+CDo2+lLUPUAe3cJPFq
-ZrtJ3pYLFwS7O43wwhRaO9A7L1uyruoCqql65B6CJcymMEsDnCizRVEAsE2lxenu
-fxcM8JIaQlczXTsHYf23vnmLjlXm5HvEAfXE0s7iHo9BMlSLxHWWEqeyrbwMdnn/
-gT8lHGw+SHO173THvhtGuKGkrglD2CA9G5d1ZWgAz3il0fLdBenLH6t1m0x3+P6h
-4sUJ04LlldPb
-=GdCO
------END PGP PUBLIC KEY BLOCK-----
-
-pub    9A259C7EE636C5ED
-sub    D66472CF54179CC4
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-DG71mmILRI1wVgrDp5mFKeV/d20uMvMq
-=IIN3
------END PGP PUBLIC KEY BLOCK-----
-
-pub    E3822B59020A349D
-uid    Kotlin Libraries Release <kt-libraries@jetbrains.com>
-
-sub    9351716690874F25
-sub    3D5839A2262CBBFB
-sub    60EB70DDAAC2EC21
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-dED2cvmydAtUu32DbR29bHQ=
-=vQ+m
------END PGP PUBLIC KEY BLOCK-----
-
-pub    DDDAFA7674E54418
-uid    Cedric Beust <cedric@beust.com>
-
-sub    50C6CC55C6F24FB1
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBF8tnmMBCADROe7j1ZvgiMgfsQKqCSuSqgMkfMT2DEXwZKdHqkj0gfx8MPQg
-OP1pmMgpIwIXKr5kZ9KMGiGULNnS+WU2SNqjyKeq3MlnSYW5Di52MoAD7W4cHmry
-8ekaasF/x0AS5Q3M/6X/EBOD8YLWaFkk+h5x8D4IOSqiOiWH8olGjY4ZmGblaldX
-PLr7BWSrPKQ1QDsoICn583Mnjz3YLlc4p5IKnY2wss1zm7/gQk6KkdL5bRuASxLh
-to2adZ1LEE8MQfHweauHCK915RmMg7W3KW66/EsuCyEwZKBwq6rIpAciym2FngJt
-CPnY0o4IMFSasV7d1xSH5N4jeHL3Hh2Yd9tHABEBAAG0H0NlZHJpYyBCZXVzdCA8
-Y2VkcmljQGJldXN0LmNvbT6JAU4EEwEIADgWIQR81StagpUTfIj7V0jd2vp2dOVE
-GAUCXy2eYwIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDd2vp2dOVEGLQr
-CACZTTneMoaUR4pQHa/rQfGnYcYznSL32JUP98bgstwN+g5BoivHkrN/5IinELly
-n2nxrjrPucN2arjOvObiGk7UhvUY8h1kqWKWqc5Gsc/iXwnrIx9bwzwdbYaiKqMT
-E6RJ+naIN80rNRQnOMtBRTNmRWYZ9UMk2W1DEKZeCaKUJpO2lLpMW6R+Sta/pkq9
-L36F5G9qWBrVhUS4U/rEE27G7xiDZ7fCnjYt6lfvc6mKQ72BIUGtjVDRwBAiG98X
-Zn5+TqLaMkC8NotYInuV1/CwvfE9SuYH8dn3YJqAkkn57L74y8I0V54AyMXaLNp5
-G62uRD43Xw6rLakCxGNUafcouQENBF8tnmMBCADWQEHet457l0v27b6EVxjNZMGl
-NI939o3k4NdrCBglIojODXA9jp8VkisL7+klrpOP1vmoVd80Lk0fGSOdZDcIMbzW
-WChRMVMkY0vgeDqOgKw0j6e+isqN/vNipj2nh8cYm4q+LB6GVE0pfFCsrM8RFFew
-RO+esEuw0R1qXhNYLIwpRV3Ov4ZxDp1yM7KAHSBc86HJHy1t4LqLofjA+RBP8f/6
-2MmSRKLbDwruLz/02p0fR+lp2DiJ/IN40lGq1fSxRjXMTQnI+bIdsd7TlY0AbT6R
-NklBL3i492hxU188dva1PZM0sxAMZRXSt6cFCvz/jDvlf6jB6DmN18E2ad55ABEB
-AAGJATYEGAEIACAWIQR81StagpUTfIj7V0jd2vp2dOVEGAUCXy2eYwIbDAAKCRDd
-2vp2dOVEGAwbB/sFvYn1o5Q0r+ngdMJLCjQYT8a6uy8SH8N3k8RsTJ+ad0TdfOoG
-wvxl/SFB1MEjEVpXgbojjv01gVDola2ObIYSX+GWcvlJdfXKz8oZ5f8/KdRrAc3h
-z7gf8huUVeriwHoEEA7xi14kJZpwCPh8PiMMl5KQFWuG4D1eQnwOm54cIw/9hYB3
-R7oVI+2THlm3CAlFalsXzZ1N/l/JQG6LfPkKmrubr++FveXx6izjZssdFiaLg4dk
-AQdAwgpmFmCQHb63BCKzqPwDxpazpk1wP6Y5ornLu/ISaOo9VC9ylX+vUK93eq4K
-AFuUjn/Jk55tpdUEH8mW12W6Ukjt9FxVb8ZX
-=Vb7/
------END PGP PUBLIC KEY BLOCK-----
-
-pub    E0130A3ED5A2079E
-sub    0AE7BBD7FEE66E0C
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQENBFlMSXMBCADcgN0/57D/gU5cDobPiRuDT6qAxb/NWhQiqwAocKd274r4gPJm
-RbffUEZEgKhjH6l0CQfilC4R4x2QtU9sNC9kB/D6zumoS1uI0Hmx1pC4UseUy55r
-20WDxujUQ7OcJbpe2cDcQVKmMok2top7ZJqt4KVosQEeT9jjsgBBbEtg4cWb5ddR
-5rf+aJw0v/6dMLef1r9YAo0ZtLc+g2dyacqw73tcWEd3oCH++SgE26NntN+GibZu
-VXSE5u6xI4KwfT2vUT3jt5Fb29myX4sxsfB7n/xageuJYy5ms1ABS+WDO5ssEZC4
-eQEVL7eyIb9YhNAW/WtjeAuOfOKNonoqKFGXABEBAAG5AQ0EWUxJcwEIAMgrP3U+
-7YCibxSQKOZrp63RaSUkv7mCvQ3Lx4P4ZD/sDEsLOiKkAc+ZU7ETTIQkEpHaibvC
-ZNrA+R0pfAj0LYBLstEIkUxtAaVM4DBQGN13Zdup46fI8rPZEyZVb2XpZ/qS4RYi
-StFyJzUdazBJs/IB7CT0xp4DUFUOrsykVy0aWzWt4z0QBe1x3AmpAO/DdrDN5gvt
-mWzWbV3f783PuK3g41ju7F9XX5nuuatNSNHOHt65XL4vmhmSfXuP6UFjK6MKzq9z
-pbZD4ipUPoKEId5ONDSucX4C8OydpC8+rFWJCDDDvocox3/l6TzihQXf8MDDcB0u
-1TgDPz4M/S2vBh8AEQEAAYkBHwQYAQgACQUCWUxJcwIbDAAKCRDgEwo+1aIHntk2
-B/42pBknUQB2YjkPryJ1B1ArcxaLO7gVo/lgT/rLGL7BuTYsFIl9kJUD156EfkmS
-AkfsxPzwUNh/GyfVQt09F6wheprx1fLNJCFIYA9ZA0WVZGSwbE3NdiuwEaJ3/HZ7
-7IteQh5LKllqFuSlZ3u0xdtGJjnAUU9wHxWH+0W3RPm62piSJcWUw7CSqEyuX+8Z
-+eq4HY0v74znfy6GyCiil7S1T9fdan22hP3xiJHgVKtyFmhhrz6YxcZLa0fYl+R3
-mCQvt2FuiaLL3d/uH0z6EzWs+XZNbjRBTGI9VmO7siIy6rjatdult3Sx1quBCixC
-4Ms2AWEA7bMqvUmCoB2M/0x8
-=6Sqy
------END PGP PUBLIC KEY BLOCK-----
-
-pub    6A65176A0FB1CD0B
-uid    Paul King <paulk@apache.org>
-uid    keybase.io/paulk_asert <paulk_asert@keybase.io>
-uid    Paul King <kingp@ociweb.com>
-uid    Paul King <paulk@asert.com.au>
-uid    Paul King <paul.king.asert@gmail.com>
-
-sub    EA8543C570FAF804
-sub    CA890A5FA09CFD80
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=Wk+k
------END PGP PUBLIC KEY BLOCK-----
-
-pub    6A65176A0FB1CD0B
-uid    Paul King <paulk@apache.org>
-uid    keybase.io/paulk_asert <paulk_asert@keybase.io>
-uid    Paul King <kingp@ociweb.com>
-uid    Paul King <paulk@asert.com.au>
-uid    Paul King <paul.king.asert@gmail.com>
-
-sub    EA8543C570FAF804
-sub    CA890A5FA09CFD80
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-mQINBFgMcBMBEAC/xcIVVOOh+F7S0OTzBlFH34s5fDbi6Zto469tZyW1peyWtXAZ
-m+2jzFfeTCHaUQO3YjoTy2fPygS4tVD+ew4EAzMG5Uti4kwWZw0PYKz2JO/gl1JY
-fKpWWkpKfHsGIFkfsOX6J83J4GVpaNJBUHsmcdep8YNf1nYDGpIZCxufihQXhuuK
-x9BPm2SUdeyFwUFdxhGN4JdalxZo+x0pvQ6sKO1hQKK14YZXQxLUV043p3me9lVy
-Ubld8kcda0edx3cyhilehib3sZPVhOm8s18GmjV5/ApPnehJN7SueivB2dzzFPN7
-mUwrslti0j2DmTdOImzcz0IT7zErmiV7xtgsgP8jgKEp2LF23VFXuWsKO2yNubQP
-shNDKpYMMgJn0PfD5gwYl8FN9Yzj3OKA5wiJpgPjPl2PveZ/+rOS91bQMG1hFc3W
-v9ZWSisJAZlNQlfyv36rD12WhwQLlupLo0zPlqp7e/i5ZJBPg4unbAYECtJI5Wqj
-Ljhyd0j68QWon1Ripi8ruqXA9MUe7JMy39ZmF3/fLT4rBiHyRVpWkVKjzLlm0Ks4
-f3cNAPxn4FWeTwM+oUzEbpkNpE/swIbR05u1J2y0f+GS6X5t0CSTcHk1VIOnOiTl
-wLzSEJe9hNkBuNJjwM9Cod7dbdorq6Qwd0ffPJoTw1SVkHMPwIjikzxU7QARAQAB
-tBxQYXVsIEtpbmcgPHBhdWxrQGFwYWNoZS5vcmc+iQI0BBMBCgAeBQJYDHATAhsD
-AwsJBwMVCggCHgECF4ADFgIBAhkBAAoJEGplF2oPsc0LrzcP/3w1z7KeiwXUc7fa
-yYeoWIAXJhtYSN32BCHpfOLruDAXA5FaQmqILVzT/Uk3SYYeaapRwJ72oon4L1oB
-+HaZu8WPwKbKJZ2zJiWDWtwC1aIMoRJpykt3GHlkorXLM4bY943eBnLbFhUi7RpZ
-wfPvrlnblVfUZf+Shxq7CNSwsgaj0CLv68B41HgUgNJeDqCI3DjHQYZ+aL6Gb3kJ
-q6dj4iLFM9WfMM3j+orGuc1+nxWa4GuS26rLlT4Tm95uEA508s+hOOZmMwgFr6AZ
-eF/al46f5jSY35asIIy37IXTX3X+Igky10pEMrMo1XlKOFllyXWBvpZ5aGKgp18Z
-YCeBHXxC85I9JYNUHaAiYVdA8eiLN172dzWvOfCbkYYTvQVXApD2oA85BDjLWnsJ
-3bGERMFnJap+WokGbP/5sEcngozRq0USKlchsN9ij9EGD/AWiUiJaKzPKCKGblmM
-mg9wMR9gUakgxUYFK8HsBNG3dX5zaHRiVxSQwupH4alVSdEqhpYQ3wFFzECcGs7y
-fxT0gxS9zr5e6BauA66BYkwGcNd7ieNwvWvIMpxBQ+eub5fZ3Ndi7Ys18wiNi4kc
-754yDFES8CvapSk4wPAP7j8ua+UyhjO9g8NQlulPES8DYiE5PiW8/0fc4wP4NmAm
-dHPm5OXE31G657HGQ3tqvmdnthBOiQEcBBABAgAGBQJYcO+0AAoJEMjoVWEpccxC
-x2cH/iUYciKTNOjMas94SnLNCFZQTzxFg+cfd37i3FzKzMXJrKTobDLUVtMq92KO
-+GvLjH9eYV99p098rJ609d90QpawKofigi5UNLhYsjLH6o9Fx84MokfXRbnkEnrm
-Fa0eg8B/E1pAli/1F+BSW6anLEAI72nrSnTTTok3o8RNsoJOJdFp11vNaNTv+L0c
-4IeCALiD8c8ChO8lXCK7rHfptsya+r+VrKqi4Bpv4xuhBgJCFvHj6tUDEPa/kVhU
-wbWgXfLtZogzO3ZZKYikAiOu/Tk91lIIocOHQpYYcoIXuUhVBuqAOeHIZHOSIc1U
-izv0hAvQ+FXQX9cH2r5zUyuAFAqJAhwEEAEKAAYFAlhzTG4ACgkQelgJCIR6+eAO
-8Q/8CoOCSsWa/MeTcnQsFTGwPhPgOttjyqV9o0cdmRqS20ygW2ds3uKUe+iP78yX
-NQnt9JOtqUVtL3bIAY4qH6VZSdpBCr904/4MemrHK1UOAYkhaQuWEv6LP/kHndDX
-L4wALn+7lideZjdV1N7jLRyvSH35Hf13yz2o1K4f2Rjrr6e0QRJKTm2RcJnH+zxC
-C4K+vYY1OBn8IyMDr+sD9iMVcy53zkIHHbu0saROaLBJ+vlntvsfaOhWEqOHUx7C
-/KiJQ9VshFyndSAc32LLVIu4/P0HQpLfezZTuNoZtHEaYXRCti3KK1zsGvXbW9aP
-DRAu+FrypUiRGWCyY4hnz3ex9QSoYpa0js6o8+VFPWDuwx428as8iGcbcZ8fPtxQ
-+91YDnWACNDCZq0mYTb+cFohnBhL+/PI3waZDKMypQnT+Fcp4uMV1oN7088mzMUq
-C1yBpEbrPexccDAiTKwYt4Ie4zaAgZmyUH3sSCctyoVhmv57DA6/PXPxJn4Y6IQg
-rBcpmx/MHBmhxfhq2hwTaW2MWESMADvoG5/2ze0bl3rp8FxcYyKhEtyn0bo2JJho
-ZC9YvxXlW1uzWci+CPw6nV6TtdsStRYryweNhoi9ob5PNQxGUfvivEfsBwAmyz9D
-eJI66tzxqyJptBuuaXmIzV2QS/Vpoh2GDgh0zusc5baU6Ky0L2tleWJhc2UuaW8v
-cGF1bGtfYXNlcnQgPHBhdWxrX2FzZXJ0QGtleWJhc2UuaW8+iQI5BBMBCAAjBQJY
-DHf6AhsDBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQamUXag+xzQswow/9
-GpjuyZMxZlpheqRv8YgpHo7cepgBC7YO7ZIphEAvelYGuIwXcMquTVN0OkNNE9iY
-c8vphvFPCHzcqweBKw25EOLzvx+DZbs5u5T6HX6MTb1Z+RNKHsP+HGlcEghcg1sS
-vT65mel3UsOjBv/cgt+8xEfRlLooJprjvlUGoT3z/mV5TLBHu2+zK0pfHgZcXC3t
-uACx2/ozO0WVD0b65UAkVf3wRP4yzha3biy1nH/sUKYOA31WooimDRlRvW+Q0TZJ
-LAv9ckdHsRG9lq2cXDn6h+jjkgbv0/jGpqziix649gjd3xB4Zbh7fEkd0+AMJOtO
-5eUkJUfEOB8PX9mz4Tvjg5995B6Y3G29Ct+pDsHv3zUT9Cvfsw4v4xz2BQa7pCv5
-+cpWvPt6hlhly1Q6wHMziSVWR+4Q0FGfGQMXXMvqa8bxEchGBFL0atCHrCopGj2N
-BcD1kzalLKS/tIw5gpgvDHGDJx9bj/D5lxvM6rPtNhAfoOMNdd7gdQcX3asxFTuk
-nSxzZKW3o1y92fejYdv/e/ScuhAwbAzoSseOodeKAe9SBn7ePz3ogSxR4Z3K0gX1
-cDBjjmETFBCigWofxXBydc/GXljaXDLtIEmo7ociU92xFaIETCmZMlT2bFGvz7TR
-DHFv7Ks3Zxn9Y9aNYBxJCHAMYa+8HO54fSYhlRMJeouJARwEEAECAAYFAlhw77QA
-CgkQyOhVYSlxzEKFDwf/St98fhr4Ngsz+mbjxjYMhmkeHuRU8+d0dMFpiJ++2cTi
-xzgce5oPFOM+mblDJuJRlS8YD+Ca+CNH60YGOUCIzEW281ZANjS2PiHFaeFKC/Sd
-olfOzUfjNdqffcGFMEZJkEgn6m0oc+MGljWwUdgglopbza7LM2A04R/VuNwUm8Ie
-irmHjBuPdJLM2VZlJdPQL+/wumXVLyT8oPPJMcaRFQyglNZw9ne5ftj6zKWRPoti
-o+RCAhjDhe6nE+G1WSHYL5GNdBH7UqHPiaL0hkzabPy960ycpGxSaOSBtRlqsqhc
-41frkjSFIf+kACgN29E8V7jw8ceg3lD05J+UBpDkSIkCHAQQAQoABgUCWHNMdQAK
-CRB6WAkIhHr54MJ1D/4/H5GkufHGm3GTtj5UfXW1Rr/SdvC5AqBpz+r66f8TUUJq
-rXBcn3V+gTITHZdheSUiL/9Gv2DsGeJ65RVBgEiya/4GgV8sjx3/tWRCa4Z7difx
-FBpjY8ZWSMD1r4rtCMANRaMZ5CF7iu+nQ7sLNoMJJYuO7C0MsF2jqUC67TFHoL5F
-N0vwMbk7yuhos/hlfhr+iklYppz3TwbKCEMSP4KfrusrSkq3LqGQJalzNT6RR47O
-LNMqG21XgWopxtyvBCsR2fJV8YUr9fUztskK3l/FCW8Qi92o8FMJpDwln5YNjy1W
-jlSJT/kFk2wG1leucpPR5M/Xf3OeSyelr4lW8hg4u72npOTQ9vfb/sZaS0IPOPuX
-A88NQVMZLbSU+OrtNrdY9AM7jKHxuwszj20wzGcx0XTAkleTHqhKL0tbfOJiq7Cu
-HLxgFOWO7+k4TB6ajMNrtr1rhkTCzjiiUT585+CC0pTtNVuonveq0ySId3bRmF64
-dl6ADFvibDUGsc7GZW/r6WU7xBI/7biykQdOs+GRtm2HrfGAVlrur+cITI4sLRx0
-D3eugxY98fz8DQ31Zw/LPNsKe23DdkHjoj07wRP7nAiRTZ2r/26Xw/rwK060Y2++
-lGVlsV2bJSNfk70jdmGddi307HyJLyFzdaq/DWc23gJlpBUeVtTiGDMjQEz+ALQc
-UGF1bCBLaW5nIDxraW5ncEBvY2l3ZWIuY29tPokCOQQTAQgAIwUCWAx33AIbAwcL
-CQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEGplF2oPsc0LTUgP/RGmHtWXolS2
-/kzTRwovyM1w0zUd55UbmdPZY2tsd97BhUslfUGnXGLBBEaMYejeKTqDlg+EUGv9
-thQIXuB4Pt1WSvDDHWGFRS6si+VEprkU2aCJKiMK3n7Lof4Q7RAve8hK6hGlwQGk
-ApEsig4uHNY4XwvoQ/+AdjlHggJynN1JaR+ylHJWbAEcAvZMuLqxYtNX10uy7tZc
-DveAbf01VIhQSI2rMWWy1nk9nX9TdlP6cYOBdx1s6+KXoXFb66Q1t7JUP36xRXPC
-5dKl62aENoYbSiZpHJVekX2fBDT2UILT8q81UJ2SJbr8SaQVfUVNQIDrOlZCYbhP
-CvOS7cOrYET33nzsGS3rbhssp6bS+tnVz9f1fJoNigBv46I9yTpSZe4PS6nFTFSL
-l17VgeEqbjaGUs8G02wFH5V+VXcpSLSLd28v/+BDmYWh/3/RXnI2XO0qTNK9tNHH
-ADJMQ8LaVUhAKk0DCR5W4SUg9192WMQwilpI5mNfCbYIFNrnzcsNarJMsvtUzFp5
-3RbQrwt0eB3QwCDonjgMdoHO9gXenkL3WeqC9MptzrkA3m9vTAwtnFQrN00DnaIL
-J80jSJg8cWFxwfR2lHldv7kM5muC67ZMBIBiVg5dKq9+yKEbUhaTsESaHvxOO8Vx
-ko8ohMsEXyw3Pm8brQofGV+8Ck6gvoQMiQEcBBABAgAGBQJYcO+0AAoJEMjoVWEp
-ccxC3zsH/0Nm5f6zzvLRVevJAn6qIozkKCO3kfHQpyspizDvhOO6oRBnlC9/7Ejg
-+Hl2mxtPnLly3V8fE2f6DHw0hTCWHxpzdgmR/sfoqwz7OsY1/miAFDs7BCNS+HmT
-oZ3PuvkkIXjPkHjLdAq7Qlp3epSfywXaq0MfZYhexLK3s5pqAc6r5bxmGgsDvUmw
-6vUR4I2EPL7Hkq1k2deCTxaEvTv16ESlGYvNSdmWEYHwGDz1n6ZE3sBnwpqVlIrp
-rIOt/+wmOm5BFwq5w5hZ3SGZttKcJlcfwzwfV9c4+EYbnnpl/WhQZFDRn+XuI2pn
-uOqLWMAy8S59HiV6bGqUvqxQobJaenmJAhwEEAEKAAYFAlhzTHUACgkQelgJCIR6
-+eD84Q/+Kate3f4jqwRUEr6cqeqnXOL87V2sbdcKeYtwx3MX8IZ1QhSY+BquDdVG
-XIwYzEF8oKm6pNhpWH/GZ6IcHHpKyhnCP27LDJQiH0cVfZkyzyg/Ae47uPNxPZl+
-ElC63jESvM9rbkEQPxlbhEWEZYL4+HbUGeIztjhccOzo6r92J0BkbBdnV2k7vZkW
-ZDy5zUkMhIyvn09/McaeZfL7MU1V1l+oSG6xQrmU0GheL8F7EMDo8g9m1sP9nqZ/
-4iMSJJdyLlnCz751ZH8yjfK0D7ouMo0QAIRZICgaboPSW4mG5kzQuaqiUHoQwm0i
-1aB7ZX3W5SStkH+GlChpFxaUutEKRsAWn6CUa/upXjZ6M9cpqiuDBLETNgcZhx8C
-Gf7Fake9yg1hq02kV7mSNfpjW8mfj6jvyJ/H7QO0U36ztNqg8VS2WfI0K3EXggCS
-UGKOp4SA6wST+aBe9Zlk+WCEZRFlRBuBE7xFcvpRUSn0Myvmi9iyyxncGjgz9f/z
-rgLWFwNXIjudHEFE0OxlzxQFay3qclLc7uJgRfmr5rURSPBLLdPVRU847CSWZYzc
-9ehIbsBFCesTiiTFdKFTCPah47JBuXTwDiHMMzW3NoGceihYB8MnaFD1e7mz2Ovl
-DpbUs2c4lF0gCSsALBsAsMHY0dqQJhLWN1hslgALz2KzzSP+fBG0HlBhdWwgS2lu
-ZyA8cGF1bGtAYXNlcnQuY29tLmF1PokCMQQTAQoAGwUCWAxwEwIbAwMLCQcDFQoI
-Ah4BAheAAxYCAQAKCRBqZRdqD7HNC0rxD/9AMTbcAybUWuoHznDgjKOl4OmW5LAe
-PiKW/nz4AsZHM/+/s4gqoO9ugydRCK9ZVMYNR4ukU1HcgyPaJuUW1jAc40p/eACR
-+f51X5rT4Mv976FvCCzP0IdmTilQUubh0RGEFfPK9FtrTplmqQoDf7ehDo2Tmt71
-V0P12LUBj5yx35DZBjjvV42wQzfi68oNaJDqKE7xGax8zOPI1/djyEtuTe/NX+/j
-XG8DP5hGLo305JZKytQKXeVW3fW0/3VEJ+YvVKEuvpoupy8cVYov8NVfs8YRRNwi
-ctRZEB6/q/RB7yin03rvbhN5zVHWMlseJAPooTNK27zxO28rlv55wZoK0NRDDJiB
-GEtF8bCCmdiBQaQdJuHZDfsCbvxL5HPmkUuGW8xbn7+FmW/X3T3VIzR5UNdJRh5A
-m1nvkdo9tM34c5wOk29VTzdgbN/1g9FvRdZMBGvKrQ45FM5pPi9Oux6HArEbRhaW
-UFqNXEatTZtGo+cTj6J8K5Qh1r+GtbeAQvCgq8WF8SY9S4j0vO/TnHYP+Ll+CT7D
-FKQlvHahTetfI8td2xH5Co6RkWLeUF4Z51H0lANZwi0KFI5FDM+rhdD8HKr40b8I
-/+tublwOXUHm71ltI5eDTxEgkK8a3Ii2zieXwsGGY4TK8XrhXbM3TV46hRwlv4lY
-YMIlOK2KZblXSIkBHAQQAQIABgUCWHDvtAAKCRDI6FVhKXHMQhPDB/9/9Ir91uzh
-us7NH1PH/QPx5K9TvaxE7hMfrz23CmxMN8W5yYFu5ra8roxTYRmyc1FdFRA9gM6u
-9tL4GjHpp+fd0Xgep0NcQ1Almcy6I8HgpDNQp5F712gbEYKMSup8dHT8+IBnFXHr
-YW5eIAGuaOYt0477cGQSDXbPhATd3PtLada5T+VNQNEsbMNjtXzr/XqVqOzsSD1Y
-jKmE9+eec2uFxCvMA8STBLkY8ScGD1b3Kjy3yEPwIkBKHyEFcIObPq4GRiRe+M3E
-Yg6xwNEe3tDFxlL8HKWW61YHm5b6ulIeUEfkKYIWuTMJUQVL9vgfZVZSIeaArlL+
-fRTZEfHGGooEiQIcBBABCgAGBQJYc0x1AAoJEHpYCQiEevngRdIP/1T3/aBsFgC4
-Bi6haOIbYsgdubjMHRZjvVwrer9odsQDs+84ntAad3ToN4QmwOnhjnh2vzDHALqR
-ICr9C23gKSRiW9k6WxAhdNOuO/ktFI5OOE17HPU32x2Jv+AMd+jgolYNIo3P5usB
-KACFTB8rsYLFXXwMuOuwbZ34+xmOnNoRCVcBxOhTiFUoNwoI7Q6ZHDmkiTa9vPI4
-UkshJA+bDLPK1b5aZXv55EZ/tHl/at1npT1lJCVAA6RXqIeapwtNxxOemNRihtvz
-gzO0SEpZfUfjOTnCEfMHEVlbAjSuT8i/uM7j0PK9OTS4sqGrBDEJ71GfIn//diNZ
-5WxVQpj6jqIMabfDC7sscVbmVJTrvqVHcs9VtrPnpnCvUZ2kBBAHvbU/SN2wjLsf
-fSOX3TSsROzw78geVDdTLIHH2mb3qlKsOupGvdkNvKGPs/WNwUjZqqZmNZzgSSf7
-4QH9eXoJZTOAuFmJ9Ja69x+19XR0uEjCl7stxAPFa0yag2c3a5x0AhQ1TkgjdjqF
-d34dW7GpQgwDqAL/CDGA08ma0WyP/sxq/ppgUfThakOu8JQHqHsK4SymwqAaLa8c
-/NwQu2a0lxZPLbvhK+A2hqX+Z3j/7HuYFektxCmFSF/sPOEBx/yJIbTEqhwOempc
-mTQfg8PvUHIBUKgltzQjn9WqzH804IqvtCVQYXVsIEtpbmcgPHBhdWwua2luZy5h
-c2VydEBnbWFpbC5jb20+iQIxBBMBCgAbBQJYDHATAhsDAwsJBwMVCggCHgECF4AD
-FgIBAAoJEGplF2oPsc0LHJkP/1dBsfR9T/mp901Z5BvhLfY7lQpA1sALRtWaUgx0
-Sw1ewrjHlzipFXB6OWTwVemZzifDFk/sechnRiC6QYk9vG+hc/CLhq8OllMM6l5V
-tyjKUjqMMu9ie4e72/YyosH3p1GrWpg6oxL09VzCjtKT8lYn9fQBHKXzTtVPnwkI
-DdD3K856UaSQy8NTJPkzfZOkkCsY/Yx7cgxStOU2WDspdqq7rs7P+xz5t9Vgj3GE
-8ynZthNrF8Qb6F4o7Vv80i1dktK5a27OBIjIrXTHryZdQuNJYC2yKRRuD+Us99wZ
-SJZhQCVIJSdIv85Pt9420+bgHwX5nSQkn9MzEh5nh8rgFiBKFYku7VpcrwR6Hr1M
-qik1aaEP1f0vufBcfhsEubqiIoA2Ik204dBGwzrmFPV5lHZ8j2bg6QHoSVQIe38T
-cIRMjJm4TS/FqnVLnf5B2pcpl8uYFPLFynNlqEgSxTfvGRw8Grs4cuA4RfRBX8vP
-idkWG4g1SDAhcs8UDI/QfPvqqNDxsDePSnrAr3BQN5cH4CsMQv0TVWr0aE5dBxKS
-dbND1HV2k1jikGVK/SZFTjdzWgMxzSU2j/gStTbKPVXrBykpLmYXSCVh03WNooUr
-hlq00v79enF1GpDxEV4fbHGUhLdPh3y24CkRt7gkm5LbaYBDuxqSHR8oAZpofthB
-QQDIiQEcBBABAgAGBQJYcO+0AAoJEMjoVWEpccxCyhkIAI8wL37reQe7T9M38XG7
-RxQCzn3TCpx9MGprEhSaC8Iwt5Wl1BKFyLrypQE8fYRhktkaraubEz+GjfVmHpWQ
-62AQ+HwPSh1MsvR/ZUgluIOPPs1aXJF30mBMlfP4gZ4H0CjGHT+inUsEU9axETTu
-THXCaN+BjYHv21zyewSdkU+8r9gsiLvqQnOT8xJrRXJoQl9DFRVOS/hH+VJLv306
-dfowzONAf0ToRaNaoaZ8vq7boov96U5lBIhuX4WJi6PuS9U8wvsRYg3XYhTSY0nC
-JrjJcWJMBZtAnJJAjf27wNGbT1CuLNMOpXzu1xYstujFyqzRo/iN+dOlqB39EleJ
-NSuJAhwEEAEKAAYFAlhzTHUACgkQelgJCIR6+eDZmg/9EL3qCgBf5wQc65uky7Ut
-IXaBeMmM8Wj7ZwN097ioF6AU2369smmU0kjmBDQtlFIxP0026HYTa38WtHQ5ossC
-Z0F7NdncjZXPH3DyyP/2mSotdBhORtZXjKWp547fpT1hX1/VnXxRU7uZpBgMDi82
-aPSEK66qYLUmCv1yWGvRl7y5mezj0UH5ZthOCKsFFJBVJ5AbOyRglHyGck1BxoIv
-wXUGK5IIfBMgrPSdKIeb/2bkpIdcOxZphP770pBbcF1sCnNPcXNxRsLxHlWhgS4e
-zq4OSzX87u49rKcS9Vd26vTVOHdc94My1n3pe6TuG0tkGnOwNLabSioLVX2V0Iuk
-LUThal1kpaW28nleNSwu5MeU7TT58OIvjzZuj6rDzwmBna7bV6eipe/FHIXYGo/q
-u5ls5tIUdzdeMx6PQqaXfSbr4Vm8OgcWgNxQpMMA3CtjIlK3ExpyHenoaBT0Cqvs
-LJEum1Ee/6jEvZ9Go2+kOabYwdOa50hqdf0C4urxox0AiHiYE1lrHEiH/yo9jhMJ
-0E1YFboRyVgSU+ZvuNZF8ZXmZUVFuKN3n4A2tgFUFDkT2erBPxdUi0/pg/A+cpzE
-+IQjCsURlX+zeko+7v735mil/tnmP9/h4dDDa2nPh/zKCRrJEYm526GsX/ejZseP
-lWDb7QYtk0aPkBUnAds6U+C5AQ0EWAxwEwEIAJILxPHY3dmmmonTcC4MmsE5w0lT
-3TddOnmXfuUGXQmI0IM/j7KCQJNTLPT8rlgpBgl/K5WYzmrTJ2qFDryeauaXGq8X
-FEi6DlWpoTtVaGSzI0A5E63EaL0ujoC6Qofa8rnZWHW6pE+Yrjiq0HX5uTwMTVge
-6G3TRcHUDC7iiMi3dYq5Gkz+hJh9uyiXzZ0+3VekO83V63ZvF432pFuUKnu7zc1G
-Z28AaIExERLrJXqfxdalAVORFh/vDJWuiY7PP2bzV1YBbkmzlAi+HcYxsUxL7Zud
-P45UiucK0kLDRO9NffFnHIwS5oK9gicJkD3Z+uakfAkxdq7v/W7XbO4ct+UAEQEA
-AYkDRAQYAQoADwUCWAxwEwUJDwmcAAIbIgEpCRBqZRdqD7HNC8BdIAQZAQoABgUC
-WAxwEwAKCRDqhUPFcPr4BCZEB/9T4GiPb/btnfXSPXjm4+GHzDXX1dzBWoKmBIBT
-DJzBA1ZSPBs3Zxs+0dylG6nvHhc09cpXXJgiE1UWIvusOLVmT9mYi88Yh200MkHJ
-yu1Kyq36kNHLIXey0G9b7cK+hBMkEfds1kJlk0UO/Sy480VqWrPDUJIj/RB0/x8v
-uTMYnUYBcP9dUMo83LVWgLOl74kBtQpoNX0OVYCecZ2WIs2x/UoVExeDWsLod8Er
-BbbdcRj97ILwStHmnEb0f+xK/7O+ySz96nHrepfNSc231PBHJCR+RkYJOb8Oh3+5
-WMzkGlO2axLzzELobhqlARdvNXydo3KTeY8kxhxWtYOT3pIfPncP/i4X9v+DgSkh
-HuHc71kKUKiBetGuCVAFjZS3DDNKNvRyjJmAXmKAFnkTri4yu3+QYEwuZUeTBSXx
-h1CZCtLqO7yWtOt3/teH0sf8w7FcExlpfD79k9ysfdpAVKi1wvYJeYE2+/g6yit2
-ImhN6gggWj5j/xXI6CtTg90b0wL+M3L7rU1wHdXN7IDqvpwu7z7sNeMGLLgzUnAR
-xGjdWl6G4nJM+xW9DwdOCAYS+vGqa/8L7h8B10Hl7xKk8uzuvnCsGyD6IqkKUGMM
-FUWnZIiDYaP1OihCGGVNLWzvsfGWdPdf2bu27DDSi4+NtVv3yeQSa54EC0QRqjrp
-irE1d1YfXRQqiHF5m94JCDMdp8iIOe/Ygt3FzpzGvnDqMSe1t3Q6kgL5X7eX315n
-gnLmvWkZlgSwDcDMDcZ51gtRYY2kNAIhVM+OHN5sAp3dUEiXI98y0dh+uGED6spz
-io+XhI2rKl9TTGvUy4e9vYJTrBhgBKh5B9yp3FvRA3GqmV9L4M5QLGi16OjhhZtG
-wLQSg2/xiSktqGGUhBmNrCuZpm1FOhvTsgqDtKw7Y73R40ncwuF/8BR8bVETQZ8f
-KjnBafyjDB2oReaf1x128DiCqzxsUFX5meBYq4XnzHAe/p3f2eg6iPzkN0QGi33A
-560aWMAoMEwYJdYzmVemU54z6gWzQUL8uQENBFgMcBMBCADbdP0cslUGpTkw26Wg
-Dwoq/1IuhLHRZhnri4OkyKsuscgmdNomOpeHh0zzcYZwzz+Hpvt/4x4fOEGp9NTv
-LCQf6OAEm4owJbz8BYpGifBof6CnPhTuZFMAHIo+H/HbYHZJxipcqARahHX88wBI
-kpV9Bu24qq6g/pkemDN3hWwU0Sn2VcJ8ETIzSDfJ9hVFKbzCnBnt79+Bi/e3vaoP
-hDCAWekicXSmjLbwHymAelxt1CJpQUHWEKEvDoyiY6B+TOzUWPKm/r9PDOc/eM/n
-Wdphees6VnCJaHGCE+HlYv9ifIbcpIMSAQVojT38mC6yt69oexrUvtHtjG8IYVIp
-ozhpABEBAAGJA0QEGAEKAA8FAlgMcBMFCQ8JnAACGwwBKQkQamUXag+xzQvAXSAE
-GQEKAAYFAlgMcBMACgkQyokKX6Cc/YA5TAgAl5h5XUOfyQ1VAr3Dsrom0MUEO0JN
-/Cj8uH58yhkcUAigDhdnkAu2GtpMgz3/XkeXQh8vRZrFdoePy5/YYflksc2Pc5hR
-f0CGYKtr8RQkKmjBpdppJcVVTIK4Azkgx9KkdGmyWeFmUENn2CD3/xRsETOff0PE
-0QQHq4ArUEsiqgf3YgJHibuZUIPl0bmTvfDHtmLqZKTxnv97OLgOIXOegkE6wDFJ
-3RC9KUQoLLVObTI+H8xwA1KXYFyaitU8TMQM+Hl05bxoD+h33Hud0dUqOTTWG8rN
-nid9Ne594nGal+kqkNVcEXlu85iUxeU9AqnAlIXh31Ksl1rsUmdPJDtoR92hD/40
-ZpM9N+E0s9AZ+tJKOZyxf+ZTx+jpvL3U7JoLmCGQg4XzlKX0A0n7ExvricAD8gfh
-76qpwTVg5e8UZS9sPhgRl/d7BTigZS3L+IbyUlRL5kG0wIMzoM6woMhfdQ3qhoDI
-Y5QJig9odPE7UuVn/WTSYK077kZz6Ct7RsNM/CR8D66lDKUB38nKhcXbyy/WfPmw
-NuHRShr3qw0QqwIcoEA8sWmOlbgHBnI2ulCV4qpWwSBOvsFZASCAqlslqcfXLHz0
-t8wCyiqNCY73SC/aTXsnbbNWgR6bFM6Yn2/8m+ihGl187yCBgf88o5EzJXiFMQyG
-0x2/rJJvbvBZpNqNBcKG116cFnFP8KOCj6FfuClaqZjj7KHnX4QlUW+Y0Iw8E5ph
-1Y7s1hbRoCzcLeyqRgzUKOX13rj8aNdGkiX84TM5xrc6H/QjfmkO3BcKG1Khto/p
-YMzMrKAREAxIQ2x8AhaXZVEmgmjys1IBb/mWTajhZhPDDlWaxdE8YsgryrdXIDVg
-sgiW1KorJoMy62HNL1bhc3S0ifOPqIxNuWXkFH2GK+fWtr/A7DsnWyWEGk+d5CkG
-oxjJp6kyI6lyfkUmZRfMgmSDxBx1nq25Or9reT4VOK7Kd1ckrLDP3fcmXBpPDlGO
-sOpznL6YLU4JiwHgbHheWdSmNH2JWMfWgwvQfmLUfg==
-=Wk+k
------END PGP PUBLIC KEY BLOCK-----
-
-pub    6A65176A0FB1CD0B
-uid    Paul King <paulk@apache.org>
-uid    keybase.io/paulk_asert <paulk_asert@keybase.io>
-uid    Paul King <kingp@ociweb.com>
-uid    Paul King <paulk@asert.com.au>
-uid    Paul King <paul.king.asert@gmail.com>
-
-sub    EA8543C570FAF804
-sub    CA890A5FA09CFD80
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-=Wk+k
------END PGP PUBLIC KEY BLOCK-----
-
-pub    5208812E1E4A6DB0
-uid    Gradle Inc. <info@gradle.com>
-uid    Gradle Inc. <maven-publishing@gradle.com>
-
-sub    33AEBC1F01C98081
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-bMFjyklLBAm1WETBiqR+k5uwXmJ8
-=RGVX
------END PGP PUBLIC KEY BLOCK-----
-
-pub    5208812E1E4A6DB0
-uid    Gradle Inc. <info@gradle.com>
-uid    Gradle Inc. <maven-publishing@gradle.com>
-
-sub    33AEBC1F01C98081
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.68
-
-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
-bMFjyklLBAm1WETBiqR+k5uwXmJ8
-=RGVX
------END PGP PUBLIC KEY BLOCK-----
-pub    696b6199a2a9d8c29ce78cc0d041cad2e452550f
-sub    1ce2b4b069f2056affb34cac5199f3dae89c332d
------BEGIN PGP PUBLIC KEY BLOCK-----
-Comment: Hostname:
-Version: Hockeypuck ~unreleased
-
-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
-f8npB1l1fT5cozzQJkPVYzhBWH1KXP5X
-=qJgQ
------END PGP PUBLIC KEY BLOCK-----
\ No newline at end of file
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
deleted file mode 100644
index d63300c..0000000
--- a/gradle/verification-metadata.xml
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<verification-metadata xmlns="https://schema.gradle.org/dependency-verification" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.1.xsd">
-   <configuration>
-      <verify-metadata>true</verify-metadata>
-      <verify-signatures>true</verify-signatures>
-      <key-servers enabled="false"/>
-      <trusted-artifacts>
-         <trust group="^com.android($|([.].*))" regex="true"/>
-         <trust file=".*-javadoc[.]jar" regex="true"/>
-         <trust file=".*-sources[.]jar" regex="true"/>
-      </trusted-artifacts>
-      <trusted-keys>
-         <trusted-key id="04543577d6a9cc626239c50c7ecbd740ff06aeb5">
-            <trusting group="com.sun.xml.fastinfoset"/>
-            <trusting group="com.sun.istack"/>
-            <trusting group="org.glassfish.jaxb"/>
-            <trusting group="com.sun.xml.bind"/>
-            <trusting group="com.sun.xml.bind.mvn"/>
-            <trusting group="org.jvnet.staxex"/>
-         </trusted-key>
-         <trusted-key id="0785b3eff60b1b1bea94e0bb7c25280eae63ebe5" group="org.apache.httpcomponents"/>
-         <trusted-key id="08f0aab4d0c1a4bdde340765b341ddb020fcb6ab" group="org.bouncycastle"/>
-         <trusted-key id="0cc641c3a62453ab390066c4a41f13c999945293" group="commons-logging"/>
-         <trusted-key id="160a7a9cf46221a56b06ad64461a804f2609fd89" group="com.github.shyiko.klob"/>
-         <trusted-key id="190d5a957ff22273e601f7a7c92c5fec70161c62" group="org.apache"/>
-         <trusted-key id="19beab2d799c020f17c69126b16698a4adf4d638" group="org.checkerframework"/>
-         <trusted-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" group="de.undercouch"/>
-         <trusted-key id="2bcbdd0f23ea1cafcc11d4860374cf2e8dd1bdfd">
-            <trusting group="org.codehaus"/>
-            <trusting group="net.java"/>
-         </trusted-key>
-         <trusted-key id="2db4f1ef0fa761ecc4ea935c86fdc7e2a11262cb">
-            <trusting group="commons-io"/>
-            <trusting group="commons-codec"/>
-            <trusting group="org.apache.commons"/>
-            <trusting group="xml-apis"/>
-         </trusted-key>
-         <trusted-key id="2e3a1affe42b5f53af19f780bcf4173966770193" group="org.jetbrains"/>
-         <trusted-key id="2e92113263fc31c74ccbaab20e91c2de43b72bb1" group="org.ec4j.core"/>
-         <trusted-key id="31fae244a81d64507b47182e1b2718089ce964b8" group="com.thoughtworks.qdox"/>
-         <trusted-key id="3d11126ea77e4e07fbabb38614a84c976d265b25" group="com.google.protobuf"/>
-         <trusted-key id="3d5839a2262cbbfb" group="org.jetbrains.kotlinx"/>
-         <trusted-key id="44fbdbbc1a00fe414f1c1873586654072ead6677" group="org.sonatype.oss"/>
-         <trusted-key id="476634a4694e716a" group="com.googlecode.java-diff-utils"/>
-         <trusted-key id="4db1a49729b053caf015cee9a6adfc93ef34893e" group="org.hamcrest"/>
-         <trusted-key id="4f7e32d440ef90a83011a8fc6425559c47cc79c4" group="com.sun.activation"/>
-         <trusted-key id="517b94f8d0a46317a28d8ab30da8a5ec02d11ead" group="net.sf.jopt-simple"/>
-         <trusted-key id="51b52dc5dd452f92be342cc2858fc4c4f43856a3" group="xerces"/>
-         <trusted-key id="5208812e1e4a6db0" group="com.gradle"/>
-         <trusted-key id="55e770230e69cc6de143fb5b62c82e50836eb3ee" group="com.github.gundy"/>
-         <trusted-key id="694621a7227d8d5289699830abe9f3126bb741c1">
-            <trusting group="com.google.guava"/>
-            <trusting group="com.google.jimfs"/>
-         </trusted-key>
-         <trusted-key id="6a65176a0fb1cd0b" group="org.codehaus.groovy"/>
-         <trusted-key id="6bdaca2c0493cca133b372d09c4f7e9d98b1cc53" group="org.apache"/>
-         <trusted-key id="6dd3b8c64ef75253beb2c53ad908a43fb7ec07ac">
-            <trusting group="com.sun.activation"/>
-            <trusting group="jakarta.activation"/>
-         </trusted-key>
-         <trusted-key id="6f538074ccebf35f28af9b066a0975f8b1127b83" group="org.jetbrains.kotlin"/>
-         <trusted-key id="7615ad56144df2376f49d98b1669c4bb543e0445" group="com.google.errorprone"/>
-         <trusted-key id="7616eb882daf57a11477aaf559a252fb1199d873" group="com.google.code.findbugs"/>
-         <trusted-key id="7999befba1039e8b" group="net.bytebuddy"/>
-         <trusted-key id="7c7d8456294423ba" group="org.objenesis"/>
-         <trusted-key id="7faa0f2206de228f0db01ad741321490758aad6f" group="org.codehaus.groovy"/>
-         <trusted-key id="8254180bfc943b816e0b5e2e5e2f2b3d474efe6b" group="it.unimi.dsi"/>
-         <trusted-key id="8756c4f765c9ac3cb6b85d62379ce192d401ab61">
-            <trusting group="org.jetbrains.intellij.deps"/>
-            <trusting group="org.jetbrains.kotlinx"/>
-            <trusting group="com.github.javaparser"/>
-            <trusting group="info.picocli"/>
-         </trusted-key>
-         <trusted-key id="90ee19787a7bcf6fd37a1e9180c08b1c29100955" group="com.squareup"/>
-         <trusted-key id="9a259c7ee636c5ed" group="com.google.errorprone"/>
-         <trusted-key id="a1b4460d8ba7b9af" group="org.mockito"/>
-         <trusted-key id="a5bd02b93e7a40482eb1d66a5f69ad087600b22c" group="org.ow2.asm"/>
-         <trusted-key id="aa70c7c433d501636392ec02153e7a3c2b4e5118" group="org.eclipse.ee4j"/>
-         <trusted-key id="adbc987d1a7b91db6b0aaa81995efbf4a3d20beb">
-            <trusting group="com.pinterest.ktlint"/>
-            <trusting group="com.pinterest"/>
-         </trusted-key>
-         <trusted-key id="afcc4c7594d09e2182c60e0f7a01b0f236e5430f" group="com.google.code.gson"/>
-         <trusted-key id="b0f3710fa64900e7" group="com.google.auto.value"/>
-         <trusted-key id="b6e73d84ea4fcc47166087253faad2cd5ecbb314" group="org.apache.commons"/>
-         <trusted-key id="b801e2f8ef035068ec1139cc29579f18fa8fd93b" group="com.google.j2objc"/>
-         <trusted-key id="bac30622339994c4" group="com.google.truth"/>
-         <trusted-key id="bdb5fa4fe719d787fb3d3197f6d4a1d411e9d1ae" group="com.google.guava"/>
-         <trusted-key id="c51e6cbc7ff46f0b" group="com.google.auto"/>
-         <trusted-key id="c70b844f002f21f6d2b9c87522e44ac0622b91c3" group="com.beust"/>
-         <trusted-key id="c7cb325467893cc4" group="junit"/>
-         <trusted-key id="ce8075a251547bee249bc151a2115ae15f6b8b72">
-            <trusting group="org.apache.ant"/>
-            <trusting group="org.apache.commons"/>
-         </trusted-key>
-         <trusted-key id="d041cad2e452550f" group="com.google.protobuf"/>
-         <trusted-key id="d6f1bc78607808ec8e9f69437a8860944fad5f62" group="org.apache.commons"/>
-         <trusted-key id="da7a1bb85b19e4fb05073431205c8673dc742c7c" group="org.apache"/>
-         <trusted-key id="dcba03381ef6c89096acd985ac5ec74981f9cda6" group="org.testng"/>
-         <trusted-key id="dddafa7674e54418" group="org.testng"/>
-         <trusted-key id="e0130a3ed5a2079e" group="org.webjars"/>
-         <trusted-key id="ea23db1360d9029481e7f2efecdfea3cb4493b94" group="jline"/>
-         <trusted-key id="ee9e7dc9d92fc896" group="com.google.errorprone"/>
-         <trusted-key id="efe8086f9e93774e" group="junit"/>
-         <trusted-key id="f254b35617dc255d9344bcfa873a8e86b4372146" group="org.apache"/>
-         <trusted-key id="fa77dcfef2ee6eb2debedd2c012579464d01c06a" group="org.apache"/>
-         <trusted-key id="fa7929f83ad44c4590f6cc6815c71c0a4e0b8edd" group="net.java.dev.jna"/>
-         <trusted-key id="fc411cd3cb7dcb0abc9801058118b3bcdb1a5000" group="jakarta.xml.bind"/>
-         <trusted-key id="ff6e2c001948c5f2f38b0cc385911f425ec61b51">
-            <trusting group="junit"/>
-            <trusting group="org.junit"/>
-            <trusting group="org.junit.platform"/>
-            <trusting group="org.junit.jupiter"/>
-            <trusting group="org.opentest4j"/>
-         </trusted-key>
-      </trusted-keys>
-   </configuration>
-   <components>
-      <component group="com.googlecode.json-simple" name="json-simple" version="1.1">
-         <artifact name="json-simple-1.1.jar">
-            <sha256 value="2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="json-simple-1.1.pom">
-            <sha256 value="47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="de.undercouch" name="gradle-download-task" version="4.1.1">
-         <artifact name="gradle-download-task-4.1.1.pom">
-            <ignored-keys>
-               <ignored-key id="1fa37fbe4453c1073e7ef61d6449005f96bc97a3" reason="PGP verification failed"/>
-            </ignored-keys>
-            <sha256 value="85e6607260dbbdb5e85f1988840b0d9ac4be9119dde90a1baca8ea775646415a" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="javax.inject" name="javax.inject" version="1">
-         <artifact name="javax.inject-1.jar">
-            <sha256 value="91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="javax.inject-1.pom">
-            <sha256 value="943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="net.sf.kxml" name="kxml2" version="2.3.0">
-         <artifact name="kxml2-2.3.0.jar">
-            <sha256 value="f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="kxml2-2.3.0.pom">
-            <sha256 value="31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.jetbrains.intellij.deps" name="trove4j" version="1.0.20181211">
-         <artifact name="trove4j-1.0.20181211.jar">
-            <sha256 value="affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="trove4j-1.0.20181211.pom">
-            <sha256 value="310a6aa2d90534c32b8f46f1fc98cd0edae95dcdfca23e2847e5efa9ae0c019a" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.jetbrains.kotlin.jvm" name="org.jetbrains.kotlin.jvm.gradle.plugin" version="1.6.20">
-         <artifact name="org.jetbrains.kotlin.jvm.gradle.plugin-1.6.20.pom">
-            <sha256 value="eb30990a12cace57fd1e2c0484fe482e0cdb9ba680e4b15996d9324495638903" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.mockito" name="mockito-core" version="3.4.6">
-         <artifact name="mockito-core-3.4.6.jar">
-            <sha256 value="1977fb3356258862b8373702de8818fb549f409298b9d4fe8339973879a89ea1" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="mockito-core-3.4.6.pom">
-            <sha256 value="f0a883f76a8b484009119fab1319d9a96e1d76ee672cb979c2af5944d54597d3" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.ow2" name="ow2" version="1.5">
-         <artifact name="ow2-1.5.pom">
-            <sha256 value="0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.ow2.asm" name="asm-analysis" version="7.0">
-         <artifact name="asm-analysis-7.0.jar">
-            <sha256 value="e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="asm-analysis-7.0.pom">
-            <sha256 value="c6b54477e9d5bae1e7addff2e24cbf92aaff2ff08fd6bc0596c3933c3fadc2cb" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.ow2.asm" name="asm-commons" version="7.0">
-         <artifact name="asm-commons-7.0.jar">
-            <sha256 value="fed348ef05958e3e846a3ac074a12af5f7936ef3d21ce44a62c4fa08a771927d" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="asm-commons-7.0.pom">
-            <sha256 value="f4c697886cdb4a5b2472054a0b5e34371e9b48e620be40c3ed48e1f4b6d51eb4" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.ow2.asm" name="asm-util" version="7.0">
-         <artifact name="asm-util-7.0.jar">
-            <sha256 value="75fbbca440ef463f41c2b0ab1a80abe67e910ac486da60a7863cbcb5bae7e145" origin="Generated by Gradle"/>
-         </artifact>
-         <artifact name="asm-util-7.0.pom">
-            <sha256 value="e07bce4bb55d5a06f4c10d912fc9dee8a9b9c04ec549bbb8db4f20db34706f75" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="org.sonatype.oss" name="oss-parent" version="7">
-         <artifact name="oss-parent-7.pom">
-            <sha256 value="b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-      <component group="com.gradle" name="gradle-enterprise-gradle-plugin" version="3.6.3">
-         <artifact name="gradle-enterprise-gradle-plugin-3.6.3.pom">
-            <sha256 value="792024ac9c73fb240d1f0e1183adceca3527b97cc4e808fcea09e1b232d0acb7" origin="Generated by Gradle"/>
-         </artifact>
-      </component>
-   </components>
-</verification-metadata>
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index a49e9c4..20e4994 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -4,4 +4,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
diff --git a/gradlew b/gradlew
index e3a0ab0..cccdd3d 100755
--- a/gradlew
+++ b/gradlew
@@ -66,15 +66,6 @@
 
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
-# --------------------- start of metalava changes ------------------------
-if [ $darwin == "true" ]; then
-    plat="darwin"
-else
-    plat="linux"
-fi
-export JAVA_HOME="$APP_HOME/../../prebuilts/jdk/jdk11/$plat-x86"
-# --------------------- end of metalava changes ------------------------
-
 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then
     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
diff --git a/manual/android/accounts/annotations.xml b/manual/android/accounts/annotations.xml
index f223d60..f47e761 100644
--- a/manual/android/accounts/annotations.xml
+++ b/manual/android/accounts/annotations.xml
@@ -1,157 +1,157 @@
 <?xml version="1.0" encoding="utf-8"?>
 <root>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.accounts.Account&gt; renameAccount(android.accounts.Account, java.lang.String, android.accounts.AccountManagerCallback&lt;android.accounts.Account&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; addAccount(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; confirmCredentials(android.accounts.Account, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; editProperties(java.lang.String, android.app.Activity, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.USE_CREDENTIALS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; getAuthToken(android.accounts.Account, java.lang.String, android.os.Bundle, boolean, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.USE_CREDENTIALS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; getAuthToken(android.accounts.Account, java.lang.String, boolean, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.USE_CREDENTIALS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; getAuthTokenByFeatures(java.lang.String, java.lang.String, java.lang.String[], android.app.Activity, android.os.Bundle, android.os.Bundle, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; removeAccount(android.accounts.Account, android.app.Activity, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;android.os.Bundle&gt; updateCredentials(android.accounts.Account, java.lang.String, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.AccountManagerFuture&lt;java.lang.Boolean&gt; removeAccount(android.accounts.Account, android.accounts.AccountManagerCallback&lt;java.lang.Boolean&gt;, android.os.Handler)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager boolean addAccountExplicitly(android.accounts.Account, java.lang.String, android.os.Bundle)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager boolean notifyAccountAuthenticated(android.accounts.Account)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager boolean removeAccountExplicitly(android.accounts.Account)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager java.lang.String blockingGetAuthToken(android.accounts.Account, java.lang.String, boolean)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.USE_CREDENTIALS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager java.lang.String getPassword(android.accounts.Account)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager java.lang.String getUserData(android.accounts.Account, java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager java.lang.String peekAuthToken(android.accounts.Account, java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager void addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.GET_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager void clearPassword(android.accounts.Account)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.MANAGE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager void invalidateAuthToken(java.lang.String, java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="anyOf" val="{&quot;android.permission.MANAGE_ACCOUNTS&quot;, &quot;android.permission.USE_CREDENTIALS&quot;}" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager void setAuthToken(android.accounts.Account, java.lang.String, java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager void setPassword(android.accounts.Account, java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager void setUserData(android.accounts.Account, java.lang.String, java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.Account[] getAccounts()">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.GET_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
     </item>
     <item name="android.accounts.AccountManager android.accounts.Account[] getAccountsByType(java.lang.String)">
-        <annotation name="androidx.annotation.RequiresPermission">
+        <annotation name="android.support.annotation.RequiresPermission">
             <val name="value" val="&quot;android.permission.GET_ACCOUNTS&quot;" />
             <val name="apis" val="&quot;..22&quot;" />
         </annotation>
diff --git a/manual/android/graphics/annotations.xml b/manual/android/graphics/annotations.xml
deleted file mode 100644
index db71aa4..0000000
--- a/manual/android/graphics/annotations.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<root>
-  <item name="android.graphics.RuntimeShader RuntimeShader(java.lang.String) 0">
-    <annotation name="org.intellij.lang.annotations.Language">
-      <val name="value" val="&quot;AGSL&quot;" />
-    </annotation>
-  </item>
-</root>
-
diff --git a/manual/android/location/annotations.xml b/manual/android/location/annotations.xml
index fcb41f7..9aa7540 100644
--- a/manual/android/location/annotations.xml
+++ b/manual/android/location/annotations.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <root>
   <item name="android.location.LocationManager void removeProximityAlert(android.app.PendingIntent)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="anyOf" val="{&quot;android.permission.ACCESS_COARSE_LOCATION&quot;, &quot;android.permission.ACCESS_FINE_LOCATION&quot;}" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.location.LocationManager void removeUpdates(android.location.LocationListener)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="anyOf" val="{&quot;android.permission.ACCESS_COARSE_LOCATION&quot;, &quot;android.permission.ACCESS_FINE_LOCATION&quot;}" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
diff --git a/manual/android/provider/annotations.xml b/manual/android/provider/annotations.xml
index 9a1dc0a..ab67042 100644
--- a/manual/android/provider/annotations.xml
+++ b/manual/android/provider/annotations.xml
@@ -1,87 +1,87 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <root>
   <item name="android.provider.Browser BOOKMARKS_URI">
-    <annotation name="androidx.annotation.RequiresPermission.Read">
+    <annotation name="android.support.annotation.RequiresPermission.Read">
       <val name="value" val="&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
-    <annotation name="androidx.annotation.RequiresPermission.Write">
+    <annotation name="android.support.annotation.RequiresPermission.Write">
       <val name="value" val="&quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser SEARCHES_URI">
-    <annotation name="androidx.annotation.RequiresPermission.Read">
+    <annotation name="android.support.annotation.RequiresPermission.Read">
       <val name="value" val="&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
-    <annotation name="androidx.annotation.RequiresPermission.Write">
+    <annotation name="android.support.annotation.RequiresPermission.Write">
       <val name="value" val="&quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser android.database.Cursor getAllBookmarks(android.content.ContentResolver)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser android.database.Cursor getAllVisitedUrls(android.content.ContentResolver)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser boolean canClearHistory(android.content.ContentResolver)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void addSearchUrl(android.content.ContentResolver, java.lang.String)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="allOf" val="{&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;, &quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;}" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void clearHistory(android.content.ContentResolver)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void clearSearches(android.content.ContentResolver)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void deleteFromHistory(android.content.ContentResolver, java.lang.String)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void deleteHistoryTimeFrame(android.content.ContentResolver, long, long)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void requestAllIcons(android.content.ContentResolver, java.lang.String, android.webkit.WebIconDatabase.IconListener)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="value" val="&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void truncateHistory(android.content.ContentResolver)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="allOf" val="{&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;, &quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;}" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
   </item>
   <item name="android.provider.Browser void updateVisitedHistory(android.content.ContentResolver, java.lang.String, boolean)">
-    <annotation name="androidx.annotation.RequiresPermission">
+    <annotation name="android.support.annotation.RequiresPermission">
       <val name="allOf" val="{&quot;com.android.browser.permission.READ_HISTORY_BOOKMARKS&quot;, &quot;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&quot;}" />
       <val name="apis" val="&quot;..22&quot;" />
     </annotation>
diff --git a/manual/android/util/annotations.xml b/manual/android/util/annotations.xml
index 0f17dfc..c4e8392 100644
--- a/manual/android/util/annotations.xml
+++ b/manual/android/util/annotations.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <root>
   <item name="android.util.Log boolean isLoggable(java.lang.String, int) 0">
-    <annotation name="androidx.annotation.Size">
+    <annotation name="android.support.annotation.Size">
       <val name="max" val="23" />
       <val name="apis" val="&quot;..23&quot;" />
     </annotation>
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..4be43e7
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':stub-annotations'
diff --git a/settings.gradle.kts b/settings.gradle.kts
deleted file mode 100644
index be5fbb7..0000000
--- a/settings.gradle.kts
+++ /dev/null
@@ -1,9 +0,0 @@
-pluginManagement {
-    repositories {
-        // Prefer mavenCentral as that has signed artifacts
-        mavenCentral()
-        gradlePluginPortal()
-    }
-}
-
-include(":stub-annotations")
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt b/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt
index edaac23..2eafd4a 100644
--- a/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt
+++ b/src/main/java/com/android/tools/lint/checks/infrastructure/ClassName.kt
@@ -16,38 +16,30 @@
 
 package com.android.tools.lint.checks.infrastructure
 
-import com.android.SdkConstants.DOT_JAVA
-import com.android.SdkConstants.DOT_KT
 import java.util.regex.Pattern
 
 // Copy in metalava from lint to avoid compilation dependency directly on lint-tests
 
-/**
- * A pair of package name and class name inferred from Java or Kotlin
- * source code. The [source] is the source code, and the [extension] is
- * the file extension (including the leading dot) which states whether
- * this is a Kotlin source file, a Java source file, a Groovy source
- * file, etc.
- */
-class ClassName(source: String, extension: String = DOT_JAVA) {
+/** A pair of package name and class name inferred from Java or Kotlin source code */
+class ClassName(source: String) {
     val packageName: String?
     val className: String?
 
     init {
-        val withoutComments = stripComments(source, extension)
+        val withoutComments = stripComments(source)
         packageName = getPackage(withoutComments)
         className = getClassName(withoutComments)
     }
 
+    @Suppress("unused")
     fun packageNameWithDefault() = packageName ?: ""
 }
 
 /**
- * Strips line and block comments from the given Java or Kotlin source
- * file.
+ * Strips line and block comments from the given Java or Kotlin source file
  */
 @Suppress("LocalVariableName")
-fun stripComments(source: String, extension: String, stripLineComments: Boolean = true): String {
+fun stripComments(source: String, stripLineComments: Boolean = true): String {
     val sb = StringBuilder(source.length)
     var state = 0
     val INIT = 0
@@ -55,12 +47,10 @@
     val LINE_COMMENT = 2
     val BLOCK_COMMENT = 3
     val BLOCK_COMMENT_ASTERISK = 4
-    val BLOCK_COMMENT_SLASH = 5
-    val IN_STRING = 6
-    val IN_STRING_ESCAPE = 7
-    val IN_CHAR = 8
-    val AFTER_CHAR = 9
-    var blockCommentDepth = 0
+    val IN_STRING = 5
+    val IN_STRING_ESCAPE = 6
+    val IN_CHAR = 7
+    val AFTER_CHAR = 8
     for (c in source) {
         when (state) {
             INIT -> {
@@ -79,7 +69,7 @@
             }
             INIT_SLASH -> {
                 when {
-                    c == '*' -> { blockCommentDepth++; state = BLOCK_COMMENT }
+                    c == '*' -> state = BLOCK_COMMENT
                     c == '/' && stripLineComments -> state = LINE_COMMENT
                     else -> {
                         state = INIT
@@ -96,32 +86,15 @@
             BLOCK_COMMENT -> {
                 when (c) {
                     '*' -> state = BLOCK_COMMENT_ASTERISK
-                    '/' -> state = BLOCK_COMMENT_SLASH
                 }
             }
-
             BLOCK_COMMENT_ASTERISK -> {
                 state = when (c) {
-                    '/' -> {
-                        blockCommentDepth--
-                        if (blockCommentDepth == 0) {
-                            INIT
-                        } else {
-                            BLOCK_COMMENT
-                        }
-                    }
+                    '/' -> INIT
                     '*' -> BLOCK_COMMENT_ASTERISK
                     else -> BLOCK_COMMENT
                 }
             }
-            BLOCK_COMMENT_SLASH -> {
-                if (c == '*' && extension == DOT_KT) {
-                    blockCommentDepth++
-                }
-                if (c != '/') {
-                    state = BLOCK_COMMENT
-                }
-            }
             IN_STRING -> {
                 when (c) {
                     '\\' -> state = IN_STRING_ESCAPE
@@ -154,14 +127,14 @@
 private val PACKAGE_PATTERN = Pattern.compile("""package\s+([\S&&[^;]]*)""")
 
 private val CLASS_PATTERN = Pattern.compile(
-    """(\bclass\b|\binterface\b|\benum class\b|\benum\b|\bobject\b)+?\s*([^\s:(]+)""",
+    """(class|interface|enum|object)+?\s*([^\s:(]+)""",
     Pattern.MULTILINE
 )
 
 fun getPackage(source: String): String? {
     val matcher = PACKAGE_PATTERN.matcher(source)
     return if (matcher.find()) {
-        matcher.group(1).trim { it <= ' ' }
+        matcher.group(1).trim()
     } else {
         null
     }
@@ -172,7 +145,7 @@
     var start = 0
     while (matcher.find(start)) {
         val cls = matcher.group(2)
-        val groupStart = matcher.start(1)
+        val groupStart = matcher.start(2)
 
         // Make sure this "class" reference isn't part of an annotation on the class
         // referencing a class literal -- Foo.class, or in Kotlin, Foo::class.java)
diff --git a/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt b/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
index 74add34..f907b59 100644
--- a/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
+++ b/src/main/java/com/android/tools/metalava/AndroidApiChecks.kt
@@ -36,42 +36,42 @@
             methodComparator = MethodItem.sourceOrderComparator,
             fieldComparator = FieldItem.comparator
         ) {
-                override fun skip(item: Item): Boolean {
-                    // Limit the checks to the android.* namespace (except for ICU)
-                    if (item is ClassItem) {
-                        val name = item.qualifiedName()
-                        return !(name.startsWith("android.") && !name.startsWith("android.icu."))
-                    }
-                    return super.skip(item)
+            override fun skip(item: Item): Boolean {
+                // Limit the checks to the android.* namespace (except for ICU)
+                if (item is ClassItem) {
+                    val name = item.qualifiedName()
+                    return !(name.startsWith("android.") && !name.startsWith("android.icu."))
                 }
+                return super.skip(item)
+            }
 
-                override fun visitItem(item: Item) {
-                    checkTodos(item)
-                }
+            override fun visitItem(item: Item) {
+                checkTodos(item)
+            }
 
-                override fun visitMethod(method: MethodItem) {
-                    checkRequiresPermission(method)
-                    if (!method.isConstructor()) {
-                        checkVariable(method, "@return", "Return value of '" + method.name() + "'", method.returnType())
-                    }
+            override fun visitMethod(method: MethodItem) {
+                checkRequiresPermission(method)
+                if (!method.isConstructor()) {
+                    checkVariable(method, "@return", "Return value of '" + method.name() + "'", method.returnType())
                 }
+            }
 
-                override fun visitField(field: FieldItem) {
-                    if (field.name().contains("ACTION")) {
-                        checkIntentAction(field)
-                    }
-                    checkVariable(field, null, "Field '" + field.name() + "'", field.type())
+            override fun visitField(field: FieldItem) {
+                if (field.name().contains("ACTION")) {
+                    checkIntentAction(field)
                 }
+                checkVariable(field, null, "Field '" + field.name() + "'", field.type())
+            }
 
-                override fun visitParameter(parameter: ParameterItem) {
-                    checkVariable(
-                        parameter,
-                        parameter.name(),
-                        "Parameter '" + parameter.name() + "' of '" + parameter.containingMethod().name() + "'",
-                        parameter.type()
-                    )
-                }
-            })
+            override fun visitParameter(parameter: ParameterItem) {
+                checkVariable(
+                    parameter,
+                    parameter.name(),
+                    "Parameter '" + parameter.name() + "' of '" + parameter.containingMethod().name() + "'",
+                    parameter.type()
+                )
+            }
+        })
     }
 
     private var cachedDocumentation: String = ""
@@ -148,11 +148,9 @@
         for (i in begin + 1 until doc.length) {
             val c = doc[i]
 
-            if (c == '@' && (
-                isLinePrefix ||
+            if (c == '@' && (isLinePrefix ||
                     doc.startsWith("@param", i, true) ||
-                    doc.startsWith("@return", i, true)
-                )
+                    doc.startsWith("@return", i, true))
             ) {
                 // Found it
                 end = i
@@ -176,9 +174,9 @@
     private fun checkRequiresPermission(method: MethodItem) {
         val text = method.documentation
 
-        val annotation = method.modifiers.findAnnotation("androidx.annotation.RequiresPermission")
+        val annotation = method.modifiers.findAnnotation("android.support.annotation.RequiresPermission")
         if (annotation != null) {
-            for (attribute in annotation.attributes) {
+            for (attribute in annotation.attributes()) {
                 var values: List<AnnotationAttributeValue>? = null
                 when (attribute.name) {
                     "value", "allOf", "anyOf" -> {
@@ -197,8 +195,7 @@
                         reporter.report(
                             // Why is that a problem? Sometimes you want to describe
                             // particular use cases.
-                            Issues.REQUIRES_PERMISSION, method,
-                            "Method '" + method.name() +
+                            Issues.REQUIRES_PERMISSION, method, "Method '" + method.name() +
                                 "' documentation mentions permissions already declared by @RequiresPermission"
                         )
                     }
@@ -206,8 +203,7 @@
             }
         } else if (text.contains("android.Manifest.permission") || text.contains("android.permission.")) {
             reporter.report(
-                Issues.REQUIRES_PERMISSION, method,
-                "Method '" + method.name() +
+                Issues.REQUIRES_PERMISSION, method, "Method '" + method.name() +
                     "' documentation mentions permissions without declaring @RequiresPermission"
             )
         }
@@ -235,8 +231,7 @@
             }
             if (!hasSdkConstant) {
                 reporter.report(
-                    Issues.SDK_CONSTANT, field,
-                    "Field '" + field.name() +
+                    Issues.SDK_CONSTANT, field, "Field '" + field.name() +
                         "' is missing @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)"
                 )
             }
@@ -245,8 +240,7 @@
         if (text.contains("Activity Action:")) {
             if (!hasSdkConstant) {
                 reporter.report(
-                    Issues.SDK_CONSTANT, field,
-                    "Field '" + field.name() +
+                    Issues.SDK_CONSTANT, field, "Field '" + field.name() +
                         "' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)"
                 )
             }
diff --git a/src/main/java/com/android/tools/metalava/AnnotationFilter.kt b/src/main/java/com/android/tools/metalava/AnnotationFilter.kt
index 74cf90d..5fc0d37 100644
--- a/src/main/java/com/android/tools/metalava/AnnotationFilter.kt
+++ b/src/main/java/com/android/tools/metalava/AnnotationFilter.kt
@@ -1,10 +1,8 @@
 package com.android.tools.metalava
 
 import com.android.SdkConstants.ATTR_VALUE
-import com.android.tools.metalava.model.AnnotationArrayAttributeValue
 import com.android.tools.metalava.model.AnnotationAttribute
 import com.android.tools.metalava.model.AnnotationItem
-import com.android.tools.metalava.model.AnnotationSingleAttributeValue
 import com.android.tools.metalava.model.DefaultAnnotationAttribute
 
 interface AnnotationFilter {
@@ -16,8 +14,6 @@
     // Returns a list of fully qualified annotation names that may be included by this filter.
     // Note that this filter might incorporate parameters but this function strips them.
     fun getIncludedAnnotationNames(): List<String>
-    // Returns true if [getIncludedAnnotationNames] includes the given qualified name
-    fun matchesAnnotationName(qualifiedName: String): Boolean
     // Tells whether there exists an annotation that is accepted by this filter and that
     // ends with the given suffix
     fun matchesSuffix(annotationSuffix: String): Boolean
@@ -49,7 +45,7 @@
     }
 
     override fun matches(annotation: AnnotationItem): Boolean {
-        if (annotation.qualifiedName == null) {
+        if (annotation.qualifiedName() == null) {
             return false
         }
         val wrapper = AnnotationFilterEntry.fromAnnotationItem(annotation)
@@ -70,15 +66,6 @@
         return annotationNames
     }
 
-    /** Cache for [getIncludedAnnotationNames] since we call this method over and over again */
-    private var includedNames: List<String>? = null
-
-    override fun matchesAnnotationName(qualifiedName: String): Boolean {
-        val includedNames = includedNames
-            ?: getIncludedAnnotationNames().also { includedNames = it }
-        return includedNames.contains(qualifiedName)
-    }
-
     override fun matchesSuffix(annotationSuffix: String): Boolean {
         return inclusionExpressions.any { included ->
             included.qualifiedName.endsWith(annotationSuffix)
@@ -106,29 +93,9 @@
             return false
         }
         for (attribute in filter.attributes) {
-            val existingValue = existingAnnotation.findAttribute(attribute.name)?.value
-            val existingValueSource = existingValue?.toSource()
-            val attributeValueSource = attribute.value.toSource()
-            if (attribute.name == "value") {
-                // Special-case where varargs value annotation attribute can be specified with
-                // either @Foo(BAR) or @Foo({BAR}) and they are equivalent.
-                when {
-                    attribute.value is AnnotationSingleAttributeValue &&
-                        existingValue is AnnotationArrayAttributeValue -> {
-                        if (existingValueSource != "{$attributeValueSource}") return false
-                    }
-                    attribute.value is AnnotationArrayAttributeValue &&
-                        existingValue is AnnotationSingleAttributeValue -> {
-                        if ("{$existingValueSource}" != attributeValueSource) return false
-                    }
-                    else -> {
-                        if (existingValueSource != attributeValueSource) return false
-                    }
-                }
-            } else {
-                if (existingValueSource != attributeValueSource) {
-                    return false
-                }
+            val existingValue = existingAnnotation.findAttribute(attribute.name)?.value?.toSource()
+            if (existingValue != attribute.value.toSource()) {
+                return false
             }
         }
         return true
diff --git a/src/main/java/com/android/tools/metalava/AnnotationStatistics.kt b/src/main/java/com/android/tools/metalava/AnnotationStatistics.kt
new file mode 100644
index 0000000..acc6d3f
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/AnnotationStatistics.kt
@@ -0,0 +1,474 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava
+
+import com.android.SdkConstants
+import com.android.tools.metalava.model.ClassItem
+import com.android.tools.metalava.model.Codebase
+import com.android.tools.metalava.model.FieldItem
+import com.android.tools.metalava.model.Item
+import com.android.tools.metalava.model.MemberItem
+import com.android.tools.metalava.model.MethodItem
+import com.android.tools.metalava.model.PackageItem
+import com.android.tools.metalava.model.ParameterItem
+import com.android.tools.metalava.model.visitors.ApiVisitor
+import com.google.common.io.ByteStreams
+import org.objectweb.asm.ClassReader
+import org.objectweb.asm.tree.AbstractInsnNode
+import org.objectweb.asm.tree.ClassNode
+import org.objectweb.asm.tree.FieldInsnNode
+import org.objectweb.asm.tree.MethodInsnNode
+import org.objectweb.asm.tree.MethodNode
+import java.io.BufferedWriter
+import java.io.File
+import java.io.FileWriter
+import java.io.IOException
+import java.io.PrintWriter
+import java.util.zip.ZipFile
+
+const val CLASS_COLUMN_WIDTH = 60
+const val COUNT_COLUMN_WIDTH = 16
+const val USAGE_REPORT_MAX_ROWS = 3000
+
+/** Sadly gitiles' markdown support doesn't handle tables with top/bottom horizontal edges */
+const val INCLUDE_HORIZONTAL_EDGES = false
+
+class AnnotationStatistics(val api: Codebase) {
+    private val apiFilter = ApiPredicate()
+
+    /** Measure the coverage statistics for the API */
+    fun count() {
+        // Count of all methods, fields and parameters
+        var allMethods = 0
+        var allFields = 0
+        var allParameters = 0
+
+        // Count of all methods, fields and parameters that requires annotations
+        // (e.g. not primitives, not constructors, etc)
+        var eligibleMethods = 0
+        var eligibleMethodReturns = 0
+        var eligibleFields = 0
+        var eligibleParameters = 0
+
+        // Count of methods, fields and parameters that were actually annotated
+        var annotatedMethods = 0
+        var annotatedMethodReturns = 0
+        var annotatedFields = 0
+        var annotatedParameters = 0
+
+        api.accept(object : ApiVisitor() {
+            override fun skip(item: Item): Boolean {
+                if (options.omitRuntimePackageStats && item is PackageItem) {
+                    val name = item.qualifiedName()
+                    if (name.startsWith("java.") ||
+                        name.startsWith("javax.") ||
+                        name.startsWith("kotlin.") ||
+                        name.startsWith("kotlinx.")
+                    ) {
+                        return true
+                    }
+                }
+                return super.skip(item)
+            }
+
+            override fun visitParameter(parameter: ParameterItem) {
+                allParameters++
+                if (!parameter.requiresNullnessInfo()) {
+                    return
+                }
+                eligibleParameters++
+                if (parameter.hasNullnessInfo()) {
+                    annotatedParameters++
+                }
+            }
+
+            override fun visitField(field: FieldItem) {
+                allFields++
+                if (!field.requiresNullnessInfo()) {
+                    return
+                }
+                eligibleFields++
+                if (field.hasNullnessInfo()) {
+                    annotatedFields++
+                }
+            }
+
+            override fun visitMethod(method: MethodItem) {
+                allMethods++
+                if (method.requiresNullnessInfo()) { // No, this includes parameter requirements
+                    eligibleMethods++
+                    if (method.hasNullnessInfo()) {
+                        annotatedMethods++
+                    }
+                }
+
+                // method.requiresNullnessInfo also checks parameters; here we want to consider
+                // only the method modifier list
+                if (!method.isConstructor() && method.returnType()?.primitive != true) {
+                    eligibleMethodReturns++
+                    if (method.modifiers.hasNullnessInfo()) {
+                        annotatedMethodReturns++
+                    }
+                }
+            }
+        })
+
+        options.stdout.println()
+        options.stdout.println(
+            """
+            Nullness Annotation Coverage Statistics:
+            $annotatedFields out of $eligibleFields eligible fields (out of $allFields total fields) were annotated (${percent(
+                annotatedFields,
+                eligibleFields
+            )}%)
+            $annotatedMethods out of $eligibleMethods eligible methods (out of $allMethods total methods) were fully annotated (${percent(
+                annotatedMethods,
+                eligibleMethods
+            )}%)
+                $annotatedMethodReturns out of $eligibleMethodReturns eligible method returns were annotated (${percent(
+                annotatedMethodReturns,
+                eligibleMethodReturns
+            )}%)
+                $annotatedParameters out of $eligibleParameters eligible parameters were annotated (${percent(
+                annotatedParameters,
+                eligibleParameters
+            )}%)
+            """.trimIndent()
+        )
+    }
+
+    private fun percent(numerator: Int, denominator: Int): Int {
+        return if (denominator == 0) {
+            100
+        } else {
+            numerator * 100 / denominator
+        }
+    }
+
+    fun measureCoverageOf(classPath: List<File>) {
+        val used = HashMap<MemberItem, Int>(1000)
+
+        for (entry in classPath) {
+            recordUsages(used, entry, entry.path)
+        }
+
+        // Keep only those items where there is at least one un-annotated element in the API
+        val filtered = used.keys.filter {
+            !it.hasNullnessInfo()
+        }
+
+        val referenceCount = used.size
+        val missingCount = filtered.size
+        val annotatedCount = used.size - filtered.size
+
+        // Sort by descending usage
+        val sorted = filtered.sortedWith(Comparator { o1, o2 ->
+            // Sort first by descending count, then increasing alphabetical
+            val delta = used[o2]!! - used[o1]!!
+            if (delta != 0) {
+                return@Comparator delta
+            }
+            o1.toString().compareTo(o2.toString())
+        })
+
+        // High level summary
+        options.stdout.println()
+        options.stdout.println(
+            "$missingCount methods and fields were missing nullness annotations out of " +
+                "$referenceCount total API references."
+        )
+        options.stdout.println("API nullness coverage is ${percent(annotatedCount, referenceCount)}%")
+        options.stdout.println()
+
+        reportTopUnannotatedClasses(sorted, used)
+        printMemberTable(sorted, used)
+    }
+
+    private fun reportTopUnannotatedClasses(sorted: List<MemberItem>, used: HashMap<MemberItem, Int>) {
+        // Aggregate class counts
+        val classCount = mutableMapOf<Item, Int>()
+        for (item in sorted) {
+            val containingClass = item.containingClass()
+            val itemCount = used[item]!!
+            val count = classCount[containingClass]
+            if (count == null) {
+                classCount[containingClass] = itemCount
+            } else {
+                classCount[containingClass] = count + itemCount
+            }
+        }
+
+        // Print out top entries
+        val classes = classCount.keys.sortedWith(Comparator { o1, o2 ->
+            // Sort first by descending count, then increasing alphabetical
+            val delta = classCount[o2]!! - classCount[o1]!!
+            if (delta != 0) {
+                return@Comparator delta
+            }
+            o1.toString().compareTo(o2.toString())
+        })
+
+        printClassTable(classes, classCount)
+    }
+
+    /** Print table in clean Markdown table syntax */
+    private fun printTable(
+        labelHeader: String,
+        countHeader: String,
+        items: List<Item>,
+        getLabel: (Item) -> String,
+        getCount: (Item) -> Int,
+        printer: PrintWriter = options.stdout
+    ) {
+        // Print table in clean Markdown table syntax
+        @Suppress("ConstantConditionIf")
+        if (INCLUDE_HORIZONTAL_EDGES) {
+            edge(printer, CLASS_COLUMN_WIDTH + COUNT_COLUMN_WIDTH + 7)
+        }
+        printer.printf(
+            "| %-${CLASS_COLUMN_WIDTH}s | %${COUNT_COLUMN_WIDTH}s |\n",
+            labelHeader, countHeader
+        )
+        separator(printer, CLASS_COLUMN_WIDTH + 2, COUNT_COLUMN_WIDTH + 2, rightJustify = true)
+
+        for (i in items.indices) {
+            val item = items[i]
+            val label = getLabel(item)
+            val count = getCount(item)
+            printer.printf(
+                "| %-${CLASS_COLUMN_WIDTH}s | %${COUNT_COLUMN_WIDTH}d |\n",
+                truncate(label, CLASS_COLUMN_WIDTH), count
+            )
+
+            if (i == USAGE_REPORT_MAX_ROWS) {
+                printer.printf(
+                    "| %-${CLASS_COLUMN_WIDTH}s | %${COUNT_COLUMN_WIDTH}s |\n",
+                    "... (${items.size - USAGE_REPORT_MAX_ROWS} more items", ""
+                )
+                break
+            }
+        }
+        @Suppress("ConstantConditionIf")
+        if (INCLUDE_HORIZONTAL_EDGES) {
+            edge(printer, CLASS_COLUMN_WIDTH + 2, COUNT_COLUMN_WIDTH + 2)
+        }
+    }
+
+    private fun printClassTable(classes: List<Item>, classCount: MutableMap<Item, Int>) {
+        val reportFile = options.annotationCoverageClassReport
+        val printer =
+            if (reportFile != null) {
+                reportFile.parentFile?.mkdirs()
+                PrintWriter(BufferedWriter(FileWriter(reportFile)))
+            } else {
+                options.stdout
+            }
+
+        // Top APIs
+        printer.println("\nTop referenced un-annotated classes:\n")
+
+        printTable(
+            "Qualified Class Name",
+            "Usage Count",
+            classes,
+            { (it as ClassItem).qualifiedName() },
+            { classCount[it]!! },
+            printer
+        )
+
+        if (reportFile != null) {
+            printer.close()
+            progress("$PROGRAM_NAME wrote class annotation coverage report to $reportFile")
+        }
+    }
+
+    private fun printMemberTable(
+        sorted: List<MemberItem>,
+        used: HashMap<MemberItem, Int>
+    ) {
+        val reportFile = options.annotationCoverageMemberReport
+        val printer =
+            if (reportFile != null) {
+                reportFile.parentFile?.mkdirs()
+                PrintWriter(BufferedWriter(FileWriter(reportFile)))
+            } else {
+                options.stdout
+            }
+
+        // Top APIs
+        printer.println("\nTop referenced un-annotated members:\n")
+
+        printTable(
+            "Member",
+            "Usage Count",
+            sorted,
+            {
+                val member = it as MemberItem
+                "${member.containingClass().simpleName()}.${member.name()}${if (member is MethodItem) "(${member.parameters().joinToString { parameter ->
+                    parameter.type().toSimpleType()
+                }})" else ""}"
+            },
+            { used[it]!! },
+            printer
+        )
+
+        if (reportFile != null) {
+            printer.close()
+            progress("$PROGRAM_NAME wrote member annotation coverage report to $reportFile")
+        }
+    }
+
+    private fun dashes(printer: PrintWriter, max: Int) {
+        for (count in 0 until max) {
+            printer.print('-')
+        }
+    }
+
+    private fun edge(printer: PrintWriter, max: Int) {
+        dashes(printer, max)
+        printer.println()
+    }
+
+    private fun edge(printer: PrintWriter, column1: Int, column2: Int) {
+        printer.print("|")
+        dashes(printer, column1)
+        printer.print("|")
+        dashes(printer, column2)
+        printer.print("|")
+        printer.println()
+    }
+
+    private fun separator(printer: PrintWriter, cell1: Int, cell2: Int, rightJustify: Boolean = false) {
+        printer.print('|')
+        dashes(printer, cell1)
+        printer.print('|')
+        if (rightJustify) {
+            dashes(printer, cell2 - 1)
+            // Markdown syntax to force column to be right justified instead of left justified
+            printer.print(":|")
+        } else {
+            dashes(printer, cell2)
+            printer.print('|')
+        }
+        printer.println()
+    }
+
+    private fun truncate(string: String, maxLength: Int): String {
+        if (string.length < maxLength) {
+            return string
+        }
+
+        return string.substring(0, maxLength - 3) + "..."
+    }
+
+    private fun recordUsages(used: MutableMap<MemberItem, Int>, file: File, path: String) {
+        when {
+            file.name.endsWith(SdkConstants.DOT_JAR) -> try {
+                ZipFile(file).use { jar ->
+                    val enumeration = jar.entries()
+                    while (enumeration.hasMoreElements()) {
+                        val entry = enumeration.nextElement()
+                        if (entry.name.endsWith(SdkConstants.DOT_CLASS)) {
+                            try {
+                                jar.getInputStream(entry).use { `is` ->
+                                    val bytes = ByteStreams.toByteArray(`is`)
+                                    if (bytes != null) {
+                                        recordUsages(used, bytes, path + ":" + entry.name)
+                                    }
+                                }
+                            } catch (e: Exception) {
+                                options.stdout.println("Could not read jar file entry ${entry.name} from $file: $e")
+                            }
+                        }
+                    }
+                }
+            } catch (e: IOException) {
+                options.stdout.println("Could not read jar file contents from $file: $e")
+            }
+            file.isDirectory -> {
+                val listFiles = file.listFiles()
+                listFiles?.forEach {
+                    recordUsages(used, it, it.path)
+                }
+            }
+            file.path.endsWith(SdkConstants.DOT_CLASS) -> {
+                val bytes = file.readBytes()
+                recordUsages(used, bytes, file.path)
+            }
+            else -> options.stdout.println("Ignoring entry $file")
+        }
+    }
+
+    private fun recordUsages(used: MutableMap<MemberItem, Int>, bytes: ByteArray, path: String) {
+        val reader: ClassReader
+        val classNode: ClassNode
+        try {
+            reader = ClassReader(bytes)
+            classNode = ClassNode()
+            reader.accept(classNode, 0)
+        } catch (t: Throwable) {
+            options.stderr.println("Error processing $path: broken class file?")
+            return
+        }
+
+        val skipJava = options.omitRuntimePackageStats
+
+        for (methodObject in classNode.methods) {
+            val method = methodObject as MethodNode
+            val nodes = method.instructions
+            for (i in 0 until nodes.size()) {
+                val instruction = nodes.get(i)
+                val type = instruction.type
+                if (type == AbstractInsnNode.METHOD_INSN) {
+                    val call = instruction as MethodInsnNode
+                    if (skipJava && isSkippableOwner(call.owner)) {
+                        continue
+                    }
+                    val item = api.findMethod(call, apiFilter)
+                    item?.let {
+                        val count = used[it]
+                        if (count == null) {
+                            used[it] = 1
+                        } else {
+                            used[it] = count + 1
+                        }
+                    }
+                } else if (type == AbstractInsnNode.FIELD_INSN) {
+                    val field = instruction as FieldInsnNode
+                    if (skipJava && isSkippableOwner(field.owner)) {
+                        continue
+                    }
+                    val item = api.findField(field, apiFilter)
+                    item?.let {
+                        val count = used[it]
+                        if (count == null) {
+                            used[it] = 1
+                        } else {
+                            used[it] = count + 1
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private fun isSkippableOwner(owner: String) =
+        owner.startsWith("java/") ||
+            owner.startsWith("javax/") ||
+            owner.startsWith("kotlin") ||
+            owner.startsWith("kotlinx/")
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt b/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt
index 0f4ab87..f5bba25 100644
--- a/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt
+++ b/src/main/java/com/android/tools/metalava/AnnotationsDiffer.kt
@@ -86,7 +86,7 @@
                         }
                     } else {
                         // TODO: Check for other incompatibilities than nullness?
-                        val qualifiedName = annotation.qualifiedName ?: continue
+                        val qualifiedName = annotation.qualifiedName() ?: continue
                         if (newModifiers.findAnnotation(qualifiedName) == null) {
                             addAnnotation = true
                         }
diff --git a/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt b/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt
index 8c46600..3cedb9b 100644
--- a/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt
+++ b/src/main/java/com/android/tools/metalava/AnnotationsMerger.kt
@@ -43,7 +43,10 @@
 import com.android.tools.lint.annotations.Extractor.IDEA_NULLABLE
 import com.android.tools.lint.annotations.Extractor.SUPPORT_NOTNULL
 import com.android.tools.lint.annotations.Extractor.SUPPORT_NULLABLE
+import com.android.tools.lint.checks.AnnotationDetector
 import com.android.tools.lint.detector.api.getChildren
+import com.android.tools.metalava.model.text.ApiFile
+import com.android.tools.metalava.model.text.ApiParseException
 import com.android.tools.metalava.model.AnnotationAttribute
 import com.android.tools.metalava.model.AnnotationAttributeValue
 import com.android.tools.metalava.model.AnnotationItem
@@ -60,8 +63,6 @@
 import com.android.tools.metalava.model.psi.PsiAnnotationItem
 import com.android.tools.metalava.model.psi.PsiBasedCodebase
 import com.android.tools.metalava.model.psi.PsiTypeItem
-import com.android.tools.metalava.model.text.ApiFile
-import com.android.tools.metalava.model.text.ApiParseException
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.google.common.io.ByteStreams
 import com.google.common.io.Closeables
@@ -124,8 +125,7 @@
                 javaStubFiles,
                 "Codebase loaded from stubs",
                 sourcePath = roots,
-                classpath = options.classpath
-            )
+                classpath = options.classpath)
             mergeJavaStubsCodebase(javaStubsCodebase)
         }
     }
@@ -273,7 +273,7 @@
                     }
                 } else {
                     // TODO: Check for other incompatibilities than nullness?
-                    val qualifiedName = annotation.qualifiedName ?: return
+                    val qualifiedName = annotation.qualifiedName() ?: return
                     if (newModifiers.findAnnotation(qualifiedName) == null) {
                         addAnnotation = true
                     }
@@ -321,7 +321,7 @@
                 override fun compare(old: Item, new: Item) {
                     // Transfer any show/hide annotations from the external to the main codebase.
                     for (annotation in old.modifiers.annotations()) {
-                        val qualifiedName = annotation.qualifiedName ?: continue
+                        val qualifiedName = annotation.qualifiedName() ?: continue
                         if ((showAnnotations.matches(annotation) || hideAnnotations.matches(annotation) || hideMetaAnnotations.contains(qualifiedName)) &&
                             new.modifiers.findAnnotation(qualifiedName) == null
                         ) {
@@ -541,7 +541,7 @@
         var haveNullable = false
         var haveNotNull = false
         for (existing in item.modifiers.annotations()) {
-            val name = existing.qualifiedName ?: continue
+            val name = existing.qualifiedName() ?: continue
             if (isNonNull(name)) {
                 haveNotNull = true
             }
@@ -563,7 +563,7 @@
 
     /** Reads in annotation data from an XML item (using IntelliJ IDE's external annotations XML format) and
      * creates a corresponding [AnnotationItem], performing some "translations" in the process (e.g. mapping
-     * from IntelliJ annotations like `org.jetbrains.annotations.Nullable` to `androidx.annotation.Nullable`. */
+     * from IntelliJ annotations like `org.jetbrains.annotations.Nullable` to `android.support.annotation.Nullable`. */
     private fun createAnnotation(annotationElement: Element): AnnotationItem? {
         val tagName = annotationElement.tagName
         assert(tagName == "annotation") { tagName }
@@ -580,10 +580,8 @@
                 val valName2 = valueElement2.getAttribute(ATTR_NAME)
                 val value2 = valueElement2.getAttribute(ATTR_VAL)
                 return PsiAnnotationItem.create(
-                    codebase,
-                    XmlBackedAnnotationItem(
-                        codebase,
-                        "androidx.annotation.IntRange",
+                    codebase, XmlBackedAnnotationItem(
+                        codebase, AnnotationDetector.INT_RANGE_ANNOTATION.newName(),
                         listOf(
                             // Add "L" suffix to ensure that we don't for example interpret "-1" as
                             // an integer -1 and then end up recording it as "ffffffff" instead of -1L
@@ -665,8 +663,7 @@
                     attributes.add(XmlBackedAnnotationAttribute(TYPE_DEF_FLAG_ATTRIBUTE, VALUE_TRUE))
                 }
                 return PsiAnnotationItem.create(
-                    codebase,
-                    XmlBackedAnnotationItem(
+                    codebase, XmlBackedAnnotationItem(
                         codebase,
                         if (valName == "stringValues") STRING_DEF_ANNOTATION.newName() else INT_DEF_ANNOTATION.newName(),
                         attributes
@@ -706,8 +703,7 @@
                     INT_DEF_ANNOTATION.newName() == name ||
                     ANDROID_INT_DEF == name
                 return PsiAnnotationItem.create(
-                    codebase,
-                    XmlBackedAnnotationItem(
+                    codebase, XmlBackedAnnotationItem(
                         codebase,
                         if (intDef) INT_DEF_ANNOTATION.newName() else STRING_DEF_ANNOTATION.newName(), attributes
                     )
@@ -721,8 +717,7 @@
                 val pure = valueElement.getAttribute(ATTR_PURE)
                 return if (pure != null && pure.isNotEmpty()) {
                     PsiAnnotationItem.create(
-                        codebase,
-                        XmlBackedAnnotationItem(
+                        codebase, XmlBackedAnnotationItem(
                             codebase, name,
                             listOf(
                                 XmlBackedAnnotationAttribute(TYPE_DEF_VALUE_ATTRIBUTE, value),
@@ -732,8 +727,7 @@
                     )
                 } else {
                     PsiAnnotationItem.create(
-                        codebase,
-                        XmlBackedAnnotationItem(
+                        codebase, XmlBackedAnnotationItem(
                             codebase, name,
                             listOf(XmlBackedAnnotationAttribute(TYPE_DEF_VALUE_ATTRIBUTE, value))
                         )
@@ -804,10 +798,14 @@
 // TODO: Replace with usage of DefaultAnnotationAttribute?
 class XmlBackedAnnotationItem(
     codebase: Codebase,
-    override val originalName: String,
-    override val attributes: List<XmlBackedAnnotationAttribute> = emptyList()
+    private val qualifiedName: String,
+    private val attributes: List<XmlBackedAnnotationAttribute> = emptyList()
 ) : DefaultAnnotationItem(codebase) {
-    override val qualifiedName: String? = AnnotationItem.mapName(codebase, originalName)
+
+    override fun originalName(): String? = qualifiedName
+    override fun qualifiedName(): String? = AnnotationItem.mapName(codebase, qualifiedName)
+
+    override fun attributes() = attributes
 
     override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String {
         val qualifiedName = AnnotationItem.mapName(codebase, qualifiedName, null, target) ?: return ""
diff --git a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
index f1c1753..ad84363 100644
--- a/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
+++ b/src/main/java/com/android/tools/metalava/ApiAnalyzer.kt
@@ -16,7 +16,6 @@
 
 package com.android.tools.metalava
 
-import com.android.SdkConstants.ATTR_VALUE
 import com.android.tools.metalava.model.AnnotationAttributeValue
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.Codebase
@@ -31,7 +30,9 @@
 import com.android.tools.metalava.model.VisibilityLevel
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.android.tools.metalava.model.visitors.ItemVisitor
-import java.util.Locale
+import java.util.ArrayList
+import java.util.HashMap
+import java.util.HashSet
 import java.util.function.Predicate
 
 /**
@@ -177,10 +178,8 @@
                 for (constructor in constructors) {
                     val superConstructor = constructor.superConstructor
                     if (superConstructor == null ||
-                        (
-                            superConstructor.containingClass() != superClass &&
-                                superConstructor.containingClass() != cls
-                            )
+                        (superConstructor.containingClass() != superClass &&
+                            superConstructor.containingClass() != cls)
                     ) {
                         constructor.superConstructor = superDefaultConstructor
                     }
@@ -676,8 +675,7 @@
                     reporter.report(
                         Issues.SHOWING_MEMBER_IN_HIDDEN_CLASS, item,
                         "Attempting to unhide ${item.describe()}, but surrounding ${parent.describe()} is " +
-                            "hidden and should also be annotated with $violatingAnnotation"
-                    )
+                            "hidden and should also be annotated with $violatingAnnotation")
                 }
             }
         })
@@ -693,7 +691,7 @@
 
         if (annotation != null) {
             hasAnnotation = true
-            for (attribute in annotation.attributes) {
+            for (attribute in annotation.attributes()) {
                 var values: List<AnnotationAttributeValue>? = null
                 var any = false
                 when (attribute.name) {
@@ -746,8 +744,7 @@
                     hasAnnotation = false
                 } else if (any && nonSystem.isNotEmpty() || !any && system.isEmpty()) {
                     reporter.report(
-                        Issues.REQUIRES_PERMISSION, method,
-                        "Method '" + method.name() +
+                        Issues.REQUIRES_PERMISSION, method, "Method '" + method.name() +
                             "' must be protected with a system permission; it currently" +
                             " allows non-system callers holding " + nonSystem.toString()
                     )
@@ -757,8 +754,7 @@
 
         if (!hasAnnotation) {
             reporter.report(
-                Issues.REQUIRES_PERMISSION, method,
-                "Method '" + method.name() +
+                Issues.REQUIRES_PERMISSION, method, "Method '" + method.name() +
                     "' must be protected with a system permission."
             )
         }
@@ -785,32 +781,13 @@
                     // Don't warn about this in Kotlin; the Kotlin deprecation annotation includes deprecation
                     // messages (unlike java.lang.Deprecated which has no attributes). Instead, these
                     // are added to the documentation by the [DocAnalyzer].
-                    !item.isKotlin() &&
-                    // @DeprecatedForSdk will show up as an alias for @Deprecated, but it's correct
-                    // and expected to *not* combine this with @deprecated in the text; here,
-                    // the text comes from an annotation attribute.
-                    item.modifiers.findAnnotation(JAVA_LANG_DEPRECATED)?.originalName != ANDROID_DEPRECATED_FOR_SDK
+                    !item.isKotlin()
                 ) {
                     reporter.report(
                         Issues.DEPRECATION_MISMATCH, item,
                         "${item.toString().capitalize()}: @Deprecated annotation (present) and @deprecated doc tag (not present) do not match"
                     )
                     // TODO: Check opposite (doc tag but no annotation)
-                } else {
-                    val deprecatedForSdk = item.modifiers.findExactAnnotation(ANDROID_DEPRECATED_FOR_SDK)
-                    if (deprecatedForSdk != null) {
-                        item.deprecated = true
-                        if (item.documentation.contains("@deprecated")) {
-                            reporter.report(
-                                Issues.DEPRECATION_MISMATCH, item,
-                                "${item.toString().capitalize()}: Documentation contains `@deprecated` which implies this API is fully deprecated, not just @DeprecatedForSdk"
-                            )
-                        } else {
-                            val value = deprecatedForSdk.findAttribute(ATTR_VALUE)
-                            val message = value?.value?.value()?.toString() ?: ""
-                            item.appendDocumentation(message, "@deprecated")
-                        }
-                    }
                 }
 
                 if (checkHiddenShowAnnotations &&
@@ -818,11 +795,9 @@
                     !item.originallyHidden &&
                     !item.modifiers.hasShowSingleAnnotation()
                 ) {
-                    val annotationName = (
-                        item.modifiers.annotations().firstOrNull { annotation ->
-                            options.showAnnotations.matches(annotation)
-                        }?.qualifiedName ?: options.showAnnotations.firstQualifiedName()
-                        ).removePrefix(ANDROID_ANNOTATION_PREFIX)
+                    val annotationName = (item.modifiers.annotations().firstOrNull { annotation ->
+                        options.showAnnotations.matches(annotation)
+                    }?.qualifiedName() ?: options.showAnnotations.firstQualifiedName()).removePrefix(ANDROID_ANNOTATION_PREFIX)
                     reporter.report(
                         Issues.UNHIDDEN_SYSTEM_API, item,
                         "@$annotationName APIs must also be marked @hide: ${item.describe()}"
@@ -835,7 +810,7 @@
                 // Done here rather than in the analyzer which propagates visibility, since we want to do it
                 // after warning
                 val containingClass = cls.containingClass()
-                if (containingClass != null && containingClass.deprecated) {
+                if (containingClass != null && containingClass.deprecated && compatibility.propagateDeprecatedInnerClasses) {
                     cls.deprecated = true
                 }
 
@@ -859,7 +834,7 @@
 
             override fun visitField(field: FieldItem) {
                 val containingClass = field.containingClass()
-                if (containingClass.deprecated) {
+                if (containingClass.deprecated && compatibility.propagateDeprecatedMembers) {
                     field.deprecated = true
                 }
 
@@ -875,7 +850,7 @@
                 }
 
                 val containingClass = method.containingClass()
-                if (containingClass.deprecated) {
+                if (containingClass.deprecated && compatibility.propagateDeprecatedMembers) {
                     method.deprecated = true
                 }
 
@@ -994,8 +969,7 @@
                         // don't bother reporting deprecated methods
                         // unless they are public
                         reporter.report(
-                            Issues.DEPRECATED, m,
-                            "Method " + cl.qualifiedName() + "." +
+                            Issues.DEPRECATED, m, "Method " + cl.qualifiedName() + "." +
                                 m.name() + " is deprecated"
                         )
                     }
@@ -1157,20 +1131,17 @@
         }
         // blow open super class and interfaces
         // TODO: Consider using val superClass = cl.filteredSuperclass(filter)
-        val superItems = cl.allInterfaces().toMutableSet()
-        cl.superClass()?.let { superClass -> superItems.add(superClass) }
-
-        for (superItem in superItems) {
-            if (superItem.isHiddenOrRemoved()) {
+        val superClass = cl.superClass()
+        if (superClass != null) {
+            if (superClass.isHiddenOrRemoved()) {
                 // cl is a public class declared as extending a hidden superclass.
                 // this is not a desired practice but it's happened, so we deal
                 // with it by finding the first super class which passes checkLevel for purposes of
                 // generating the doc & stub information, and proceeding normally.
-                if (!superItem.isFromClassPath()) {
+                if (!superClass.isFromClassPath()) {
                     reporter.report(
-                        Issues.HIDDEN_SUPERCLASS, cl,
-                        "Public class " + cl.qualifiedName() +
-                            " stripped of unavailable superclass " + superItem.qualifiedName()
+                        Issues.HIDDEN_SUPERCLASS, cl, "Public class " + cl.qualifiedName() +
+                            " stripped of unavailable superclass " + superClass.qualifiedName()
                     )
                 }
             } else {
@@ -1178,11 +1149,10 @@
                 // right (this was just done for its stub handling)
                 //   cantStripThis(superClass, filter, notStrippable, stubImportPackages, cl, "as super class")
 
-                if (superItem.isPrivate && !superItem.isFromClassPath()) {
+                if (superClass.isPrivate && !superClass.isFromClassPath()) {
                     reporter.report(
-                        Issues.PRIVATE_SUPERCLASS, cl,
-                        "Public class " +
-                            cl.qualifiedName() + " extends private class " + superItem.qualifiedName()
+                        Issues.PRIVATE_SUPERCLASS, cl, "Public class " +
+                            cl.qualifiedName() + " extends private class " + superClass.qualifiedName()
                     )
                 }
             }
@@ -1306,13 +1276,3 @@
         return null
     }
 }
-
-private fun String.capitalize(): String {
-    return this.replaceFirstChar {
-        if (it.isLowerCase()) {
-            it.titlecase(Locale.getDefault())
-        } else {
-            it.toString()
-        }
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/ApiLint.kt b/src/main/java/com/android/tools/metalava/ApiLint.kt
index c3dedef..e60bada 100644
--- a/src/main/java/com/android/tools/metalava/ApiLint.kt
+++ b/src/main/java/com/android/tools/metalava/ApiLint.kt
@@ -52,7 +52,6 @@
 import com.android.tools.metalava.Issues.ALL_UPPER
 import com.android.tools.metalava.Issues.ANDROID_URI
 import com.android.tools.metalava.Issues.ARRAY_RETURN
-import com.android.tools.metalava.Issues.ASYNC_SUFFIX_FUTURE
 import com.android.tools.metalava.Issues.AUTO_BOXING
 import com.android.tools.metalava.Issues.BAD_FUTURE
 import com.android.tools.metalava.Issues.BANNED_THROW
@@ -75,17 +74,16 @@
 import com.android.tools.metalava.Issues.EXTENDS_ERROR
 import com.android.tools.metalava.Issues.FORBIDDEN_SUPER_CLASS
 import com.android.tools.metalava.Issues.FRACTION_FLOAT
-import com.android.tools.metalava.Issues.GENERIC_CALLBACKS
 import com.android.tools.metalava.Issues.GENERIC_EXCEPTION
 import com.android.tools.metalava.Issues.GETTER_ON_BUILDER
 import com.android.tools.metalava.Issues.GETTER_SETTER_NAMES
 import com.android.tools.metalava.Issues.HEAVY_BIT_SET
+import com.android.tools.metalava.Issues.ILLEGAL_STATE_EXCEPTION
 import com.android.tools.metalava.Issues.INTENT_BUILDER_NAME
 import com.android.tools.metalava.Issues.INTENT_NAME
 import com.android.tools.metalava.Issues.INTERFACE_CONSTANT
 import com.android.tools.metalava.Issues.INTERNAL_CLASSES
 import com.android.tools.metalava.Issues.INTERNAL_FIELD
-import com.android.tools.metalava.Issues.INVALID_NULLABILITY_OVERRIDE
 import com.android.tools.metalava.Issues.Issue
 import com.android.tools.metalava.Issues.KOTLIN_OPERATOR
 import com.android.tools.metalava.Issues.LISTENER_INTERFACE
@@ -154,7 +152,6 @@
 import com.android.tools.metalava.model.SetMinSdkVersion
 import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.psi.PsiMethodItem
-import com.android.tools.metalava.model.psi.PsiTypeItem
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.intellij.psi.JavaRecursiveElementVisitor
 import com.intellij.psi.PsiClassObjectAccessExpression
@@ -205,14 +202,11 @@
     private fun check() {
         if (oldCodebase != null) {
             // Only check the new APIs
-            CodebaseComparator().compare(
-                object : ComparisonVisitor() {
-                    override fun added(new: Item) {
-                        new.accept(this@ApiLint)
-                    }
-                },
-                oldCodebase, codebase, filterReference
-            )
+            CodebaseComparator().compare(object : ComparisonVisitor() {
+                override fun added(new: Item) {
+                    new.accept(this@ApiLint)
+                }
+            }, oldCodebase, codebase, filterReference)
         } else {
             // No previous codebase to compare with: visit the whole thing
             codebase.accept(this)
@@ -235,7 +229,10 @@
         val superClass = cls.filteredSuperclass(filterReference)
         val interfaces = cls.filteredInterfaceTypes(filterReference).asSequence()
         val allMethods = methods.asSequence() + constructors.asSequence()
-        checkClass(cls, methods, constructors, allMethods, fields, superClass, interfaces)
+        checkClass(
+            cls, methods, constructors, allMethods, fields, superClass, interfaces,
+            filterReference
+        )
     }
 
     override fun visitMethod(method: MethodItem) {
@@ -244,7 +241,6 @@
         if (returnType != null) {
             checkType(returnType, method)
             checkNullableCollections(returnType, method)
-            checkMethodSuffixListenableFutureReturn(returnType, method)
         }
         for (parameter in method.parameters()) {
             checkType(parameter.type(), parameter)
@@ -279,7 +275,8 @@
         methodsAndConstructors: Sequence<MethodItem>,
         fields: Sequence<FieldItem>,
         superClass: ClassItem?,
-        interfaces: Sequence<TypeItem>
+        interfaces: Sequence<TypeItem>,
+        filterReference: Predicate<Item>
     ) {
         checkEquals(methods)
         checkEnums(cls)
@@ -299,11 +296,11 @@
         checkManager(cls, methods, constructors)
         checkStaticUtils(cls, methods, constructors, fields)
         checkCallbackHandlers(cls, methodsAndConstructors, superClass)
-        checkGenericCallbacks(cls, methods, constructors, fields)
         checkResourceNames(cls, fields)
         checkFiles(methodsAndConstructors)
         checkManagerList(cls, methods)
         checkAbstractInner(cls)
+        checkRuntimeExceptions(methodsAndConstructors, filterReference)
         checkError(cls, superClass)
         checkCloseable(cls, methods)
         checkNotKotlinOperator(methods)
@@ -353,12 +350,32 @@
     }
 
     private fun checkEnums(cls: ClassItem) {
+        /*
+            def verify_enums(clazz):
+                """Enums are bad, mmkay?"""
+                if "extends java.lang.Enum" in clazz.raw:
+                    error(clazz, None, "F5", "Enums are not allowed")
+         */
         if (cls.isEnum()) {
             report(ENUM, cls, "Enums are discouraged in Android APIs")
         }
     }
 
     private fun checkMethodNames(method: MethodItem) {
+        /*
+            def verify_method_names(clazz):
+                """Try catching malformed method names, like Foo() or getMTU()."""
+                if clazz.fullname.startswith("android.opengl"): return
+                if clazz.fullname.startswith("android.renderscript"): return
+                if clazz.fullname == "android.system.OsConstants": return
+
+                for m in clazz.methods:
+                    if re.search("[A-Z]{2,}", m.name) is not None:
+                        warn(clazz, m, "S1", "Method names with acronyms should be getMtu() instead of getMTU()")
+                    if re.match("[^a-z]", m.name):
+                        error(clazz, m, "S1", "Method name must start with lowercase char")
+         */
+
         // Existing violations
         val containing = method.containingClass().qualifiedName()
         if (containing.startsWith("android.opengl") ||
@@ -393,6 +410,21 @@
     }
 
     private fun checkClassNames(cls: ClassItem) {
+        /*
+            def verify_class_names(clazz):
+                """Try catching malformed class names like myMtp or MTPUser."""
+                if clazz.fullname.startswith("android.opengl"): return
+                if clazz.fullname.startswith("android.renderscript"): return
+                if re.match("android\.R\.[a-z]+", clazz.fullname): return
+
+                if re.search("[A-Z]{2,}", clazz.name) is not None:
+                    warn(clazz, None, "S1", "Class names with acronyms should be Mtp not MTP")
+                if re.match("[^A-Z]", clazz.name):
+                    error(clazz, None, "S1", "Class must start with uppercase char")
+                if clazz.name.endswith("Impl"):
+                    error(clazz, None, None, "Don't expose your implementation details")
+         */
+
         // Existing violations
         val qualifiedName = cls.qualifiedName()
         if (qualifiedName.startsWith("android.opengl") ||
@@ -430,6 +462,25 @@
     }
 
     private fun checkConstantNames(field: FieldItem) {
+        /*
+            def verify_constants(clazz):
+                """All static final constants must be FOO_NAME style."""
+                if re.match("android\.R\.[a-z]+", clazz.fullname): return
+                if clazz.fullname.startswith("android.os.Build"): return
+                if clazz.fullname == "android.system.OsConstants": return
+
+                req = ["java.lang.String","byte","short","int","long","float","double","boolean","char"]
+                for f in clazz.fields:
+                    if "static" in f.split and "final" in f.split:
+                        if re.match("[A-Z0-9_]+", f.name) is None:
+                            error(clazz, f, "C2", "Constant field names must be FOO_NAME")
+                        if f.typ != "java.lang.String":
+                            if f.name.startswith("MIN_") or f.name.startswith("MAX_"):
+                                warn(clazz, f, "C8", "If min/max could change in future, make them dynamic methods")
+                        if f.typ in req and f.value is None:
+                            error(clazz, f, None, "All constants must be defined at compile time")
+         */
+
         // Skip this check on Kotlin
         if (field.isKotlin()) {
             return
@@ -448,7 +499,7 @@
 
         val name = field.name()
         if (!constantNamePattern.matches(name)) {
-            val suggested = SdkVersionInfo.camelCaseToUnderlines(name).uppercase(Locale.US)
+            val suggested = SdkVersionInfo.camelCaseToUnderlines(name).toUpperCase(Locale.US)
             report(
                 ALL_UPPER, field,
                 "Constant field names must be named with only upper case characters: `$qualified#$name`, should be `$suggested`?"
@@ -467,6 +518,29 @@
     }
 
     private fun checkCallbacks(cls: ClassItem) {
+        /*
+            def verify_callbacks(clazz):
+                """Verify Callback classes.
+                All callback classes must be abstract.
+                All methods must follow onFoo() naming style."""
+                if clazz.fullname == "android.speech.tts.SynthesisCallback": return
+
+                if clazz.name.endswith("Callbacks"):
+                    error(clazz, None, "L1", "Callback class names should be singular")
+                if clazz.name.endswith("Observer"):
+                    warn(clazz, None, "L1", "Class should be named FooCallback")
+
+                if clazz.name.endswith("Callback"):
+                    if "interface" in clazz.split:
+                        error(clazz, None, "CL3", "Callbacks must be abstract class to enable extension in future API levels")
+
+                    for m in clazz.methods:
+                        if not re.match("on[A-Z][a-z]*", m.name):
+                            error(clazz, m, "L1", "Callback method names must be onFoo() style")
+
+            )
+         */
+
         // Existing violations
         val qualified = cls.qualifiedName()
         if (qualified == "android.speech.tts.SynthesisCallback") {
@@ -533,6 +607,28 @@
     }
 
     private fun checkListeners(cls: ClassItem, methods: Sequence<MethodItem>) {
+        /*
+            def verify_listeners(clazz):
+                """Verify Listener classes.
+                All Listener classes must be interface.
+                All methods must follow onFoo() naming style.
+                If only a single method, it must match class name:
+                    interface OnFooListener { void onFoo() }"""
+
+                if clazz.name.endswith("Listener"):
+                    if " abstract class " in clazz.raw:
+                        error(clazz, None, "L1", "Listeners should be an interface, or otherwise renamed Callback")
+
+                    for m in clazz.methods:
+                        if not re.match("on[A-Z][a-z]*", m.name):
+                            error(clazz, m, "L1", "Listener method names must be onFoo() style")
+
+                    if len(clazz.methods) == 1 and clazz.name.startswith("On"):
+                        m = clazz.methods[0]
+                        if (m.name + "Listener").lower() != clazz.name.lower():
+                            error(clazz, m, "L1", "Single listener method name must match class name")
+         */
+
         val name = cls.simpleName()
         if (name.endsWith("Listener")) {
             if (cls.isClass()) {
@@ -557,46 +653,39 @@
         }
     }
 
-    private fun checkGenericCallbacks(
-        cls: ClassItem,
-        methods: Sequence<MethodItem>,
-        constructors: Sequence<ConstructorItem>,
-        fields: Sequence<FieldItem>
-    ) {
-        val simpleName = cls.simpleName()
-        if (!simpleName.endsWith("Callback") && !simpleName.endsWith("Listener")) return
-
-        // The following checks for an interface or abstract class of the same shape as
-        // OutcomeReceiver, i.e. two methods, both with the "on" prefix for callbacks, one of
-        // them taking a Throwable or subclass.
-        if (constructors.any { !it.isImplicitConstructor() }) return
-        if (fields.any()) return
-        if (methods.count() != 2) return
-
-        fun isSingleParamCallbackMethod(method: MethodItem) =
-            method.parameters().size == 1 &&
-                method.name().startsWith("on") &&
-                !method.parameters().first().type().primitive &&
-                method.returnType()?.toTypeString() == Void.TYPE.name
-
-        if (!methods.all(::isSingleParamCallbackMethod)) return
-
-        fun TypeItem.extendsThrowable() = asClass()?.extends(JAVA_LANG_THROWABLE) ?: false
-        fun isErrorMethod(method: MethodItem) =
-            method.name().run { startsWith("onError") || startsWith("onFail") } &&
-                method.parameters().first().type().extendsThrowable()
-
-        if (methods.count(::isErrorMethod) == 1) {
-            report(
-                GENERIC_CALLBACKS,
-                cls,
-                "${cls.fullName()} can be replaced with OutcomeReceiver<R,E> (platform)" +
-                    " or suspend fun / ListenableFuture (AndroidX)."
-            )
-        }
-    }
-
     private fun checkActions(field: FieldItem) {
+        /*
+            def verify_actions(clazz):
+                """Verify intent actions.
+                All action names must be named ACTION_FOO.
+                All action values must be scoped by package and match name:
+                    package android.foo {
+                        String ACTION_BAR = "android.foo.action.BAR";
+                    }"""
+                for f in clazz.fields:
+                    if f.value is None: continue
+                    if f.name.startswith("EXTRA_"): continue
+                    if f.name == "SERVICE_INTERFACE" or f.name == "PROVIDER_INTERFACE": continue
+                    if "INTERACTION" in f.name: continue
+
+                    if "static" in f.split and "final" in f.split and f.typ == "java.lang.String":
+                        if "_ACTION" in f.name or "ACTION_" in f.name or ".action." in f.value.lower():
+                            if not f.name.startswith("ACTION_"):
+                                error(clazz, f, "C3", "Intent action constant name must be ACTION_FOO")
+                            else:
+                                if clazz.fullname == "android.content.Intent":
+                                    prefix = "android.intent.action"
+                                elif clazz.fullname == "android.provider.Settings":
+                                    prefix = "android.settings"
+                                elif clazz.fullname == "android.app.admin.DevicePolicyManager" or clazz.fullname == "android.app.admin.DeviceAdminReceiver":
+                                    prefix = "android.app.action"
+                                else:
+                                    prefix = clazz.pkg.name + ".action"
+                                expected = prefix + "." + f.name[7:]
+                                if f.value != expected:
+                                    error(clazz, f, "C4", "Inconsistent action value; expected '%s'" % (expected))
+         */
+
         val name = field.name()
         if (name.startsWith("EXTRA_") || name == "SERVICE_INTERFACE" || name == "PROVIDER_INTERFACE") {
             return
@@ -635,6 +724,38 @@
     }
 
     private fun checkIntentExtras(field: FieldItem) {
+        /*
+            def verify_extras(clazz):
+                """Verify intent extras.
+                All extra names must be named EXTRA_FOO.
+                All extra values must be scoped by package and match name:
+                    package android.foo {
+                        String EXTRA_BAR = "android.foo.extra.BAR";
+                    }"""
+                if clazz.fullname == "android.app.Notification": return
+                if clazz.fullname == "android.appwidget.AppWidgetManager": return
+
+                for f in clazz.fields:
+                    if f.value is None: continue
+                    if f.name.startswith("ACTION_"): continue
+
+                    if "static" in f.split and "final" in f.split and f.typ == "java.lang.String":
+                        if "_EXTRA" in f.name or "EXTRA_" in f.name or ".extra" in f.value.lower():
+                            if not f.name.startswith("EXTRA_"):
+                                error(clazz, f, "C3", "Intent extra must be EXTRA_FOO")
+                            else:
+                                if clazz.pkg.name == "android.content" and clazz.name == "Intent":
+                                    prefix = "android.intent.extra"
+                                elif clazz.pkg.name == "android.app.admin":
+                                    prefix = "android.app.extra"
+                                else:
+                                    prefix = clazz.pkg.name + ".extra"
+                                expected = prefix + "." + f.name[6:]
+                                if f.value != expected:
+                                    error(clazz, f, "C4", "Inconsistent extra value; expected '%s'" % (expected))
+
+
+         */
         val className = field.containingClass().qualifiedName()
         if (className == "android.app.Notification" || className == "android.appwidget.AppWidgetManager") {
             return
@@ -672,6 +793,18 @@
     }
 
     private fun checkEquals(methods: Sequence<MethodItem>) {
+        /*
+            def verify_equals(clazz):
+                """Verify that equals() and hashCode() must be overridden together."""
+                eq = False
+                hc = False
+                for m in clazz.methods:
+                    if " static " in m.raw: continue
+                    if "boolean equals(java.lang.Object)" in m.raw: eq = True
+                    if "int hashCode()" in m.raw: hc = True
+                if eq != hc:
+                    error(clazz, None, "M8", "Must override both equals and hashCode; missing one")
+         */
         var equalsMethod: MethodItem? = null
         var hashCodeMethod: MethodItem? = null
 
@@ -708,6 +841,26 @@
         constructors: Sequence<MethodItem>,
         fields: Sequence<FieldItem>
     ) {
+        /*
+            def verify_parcelable(clazz):
+                """Verify that Parcelable objects aren't hiding required bits."""
+                if "implements android.os.Parcelable" in clazz.raw:
+                    creator = [ i for i in clazz.fields if i.name == "CREATOR" ]
+                    write = [ i for i in clazz.methods if i.name == "writeToParcel" ]
+                    describe = [ i for i in clazz.methods if i.name == "describeContents" ]
+
+                    if len(creator) == 0 or len(write) == 0 or len(describe) == 0:
+                        error(clazz, None, "FW3", "Parcelable requires CREATOR, writeToParcel, and describeContents; missing one")
+
+                    if ((" final class " not in clazz.raw) and
+                        (" final deprecated class " not in clazz.raw)):
+                        error(clazz, None, "FW8", "Parcelable classes must be final")
+
+                    for c in clazz.ctors:
+                        if c.args == ["android.os.Parcel"]:
+                            error(clazz, c, "FW3", "Parcelable inflation is exposed through CREATOR, not raw constructors")
+         */
+
         if (!cls.implements("android.os.Parcelable")) {
             return
         }
@@ -752,6 +905,17 @@
     }
 
     private fun checkProtected(member: MemberItem) {
+        /*
+        def verify_protected(clazz):
+            """Verify that no protected methods or fields are allowed."""
+            for m in clazz.methods:
+                if m.name == "finalize": continue
+                if "protected" in m.split:
+                    error(clazz, m, "M7", "Protected methods not allowed; must be public")
+            for f in clazz.fields:
+                if "protected" in f.split:
+                    error(clazz, f, "M7", "Protected fields not allowed; must be public")
+         */
         val modifiers = member.modifiers
         if (modifiers.isProtected()) {
             if (member.name() == "finalize" && member is MethodItem && member.parameters().isEmpty()) {
@@ -766,39 +930,75 @@
     }
 
     private fun checkFieldName(field: FieldItem) {
+        /*
+        def verify_fields(clazz):
+            """Verify that all exposed fields are final.
+            Exposed fields must follow myName style.
+            Catch internal mFoo objects being exposed."""
+
+            IGNORE_BARE_FIELDS = [
+                "android.app.ActivityManager.RecentTaskInfo",
+                "android.app.Notification",
+                "android.content.pm.ActivityInfo",
+                "android.content.pm.ApplicationInfo",
+                "android.content.pm.ComponentInfo",
+                "android.content.pm.ResolveInfo",
+                "android.content.pm.FeatureGroupInfo",
+                "android.content.pm.InstrumentationInfo",
+                "android.content.pm.PackageInfo",
+                "android.content.pm.PackageItemInfo",
+                "android.content.res.Configuration",
+                "android.graphics.BitmapFactory.Options",
+                "android.os.Message",
+                "android.system.StructPollfd",
+            ]
+
+            for f in clazz.fields:
+                if not "final" in f.split:
+                    if clazz.fullname in IGNORE_BARE_FIELDS:
+                        pass
+                    elif clazz.fullname.endswith("LayoutParams"):
+                        pass
+                    elif clazz.fullname.startswith("android.util.Mutable"):
+                        pass
+                    else:
+                        error(clazz, f, "F2", "Bare fields must be marked final, or add accessors if mutable")
+
+                if "static" not in f.split and "property" not in f.split:
+                    if not re.match("[a-z]([a-zA-Z]+)?", f.name):
+                        error(clazz, f, "S1", "Non-static fields must be named using myField style")
+
+                if re.match("[ms][A-Z]", f.name):
+                    error(clazz, f, "F1", "Internal objects must not be exposed")
+
+                if re.match("[A-Z_]+", f.name):
+                    if "static" not in f.split or "final" not in f.split:
+                        error(clazz, f, "C2", "Constants must be marked static final")
+         */
         val className = field.containingClass().qualifiedName()
         val modifiers = field.modifiers
         if (!modifiers.isFinal()) {
             if (className !in classesWithBareFields &&
-                !className.endsWith("LayoutParams") &&
-                !className.startsWith("android.util.Mutable")
-            ) {
-                report(
-                    MUTABLE_BARE_FIELD, field,
-                    "Bare field ${field.name()} must be marked final, or moved behind accessors if mutable"
-                )
+                    !className.endsWith("LayoutParams") &&
+                    !className.startsWith("android.util.Mutable")) {
+                report(MUTABLE_BARE_FIELD, field,
+                        "Bare field ${field.name()} must be marked final, or moved behind accessors if mutable")
             }
         }
         if (!modifiers.isStatic()) {
             if (!fieldNamePattern.matches(field.name())) {
-                report(
-                    START_WITH_LOWER, field,
-                    "Non-static field ${field.name()} must be named using fooBar style"
-                )
+                report(START_WITH_LOWER, field,
+                        "Non-static field ${field.name()} must be named using fooBar style")
             }
         }
         if (internalNamePattern.matches(field.name())) {
-            report(
-                INTERNAL_FIELD, field,
-                "Internal field ${field.name()} must not be exposed"
-            )
+            report(INTERNAL_FIELD, field,
+                    "Internal field ${field.name()} must not be exposed")
         }
         if (constantNamePattern.matches(field.name()) && field.isJava()) {
             if (!modifiers.isStatic() || !modifiers.isFinal()) {
-                report(
-                    ALL_UPPER, field,
-                    "Constant ${field.name()} must be marked static final"
-                )
+                report(ALL_UPPER, field,
+                        "Constant ${field.name()} must be marked static final")
             }
         }
     }
@@ -809,14 +1009,46 @@
         val type = field.type()
 
         if (modifiers.isFinal() && modifiers.isStatic() && type.isString() && className in settingsKeyClasses) {
-            report(
-                NO_SETTINGS_PROVIDER, field,
-                "New setting keys are not allowed (Field: ${field.name()}); use getters/setters in relevant manager class"
-            )
+            report(NO_SETTINGS_PROVIDER, field,
+                "New setting keys are not allowed (Field: ${field.name()}); use getters/setters in relevant manager class")
         }
     }
 
     private fun checkRegistrationMethods(cls: ClassItem, methods: Sequence<MethodItem>) {
+        /*
+            def verify_register(clazz):
+                """Verify parity of registration methods.
+                Callback objects use register/unregister methods.
+                Listener objects use add/remove methods."""
+                methods = [ m.name for m in clazz.methods ]
+                for m in clazz.methods:
+                    if "Callback" in m.raw:
+                        if m.name.startswith("register"):
+                            other = "unregister" + m.name[8:]
+                            if other not in methods:
+                                error(clazz, m, "L2", "Missing unregister method")
+                        if m.name.startswith("unregister"):
+                            other = "register" + m.name[10:]
+                            if other not in methods:
+                                error(clazz, m, "L2", "Missing register method")
+
+                        if m.name.startswith("add") or m.name.startswith("remove"):
+                            error(clazz, m, "L3", "Callback methods should be named register/unregister")
+
+                    if "Listener" in m.raw:
+                        if m.name.startswith("add"):
+                            other = "remove" + m.name[3:]
+                            if other not in methods:
+                                error(clazz, m, "L2", "Missing remove method")
+                        if m.name.startswith("remove") and not m.name.startswith("removeAll"):
+                            other = "add" + m.name[6:]
+                            if other not in methods:
+                                error(clazz, m, "L2", "Missing add method")
+
+                        if m.name.startswith("register") or m.name.startswith("unregister"):
+                            error(clazz, m, "L3", "Listener methods should be named add/remove")
+         */
+
         /** Make sure that there is a corresponding method */
         fun ensureMatched(cls: ClassItem, methods: Sequence<MethodItem>, method: MethodItem, name: String) {
             if (method.superMethods().isNotEmpty()) return // Do not report for override methods
@@ -868,6 +1100,14 @@
     }
 
     private fun checkSynchronized(method: MethodItem) {
+        /*
+            def verify_sync(clazz):
+                """Verify synchronized methods aren't exposed."""
+                for m in clazz.methods:
+                    if "synchronized" in m.split:
+                        error(clazz, m, "M5", "Internal locks must not be exposed")
+         */
+
         fun reportError(method: MethodItem, psi: PsiElement? = null) {
             val message = StringBuilder("Internal locks must not be exposed")
             if (psi != null) {
@@ -917,6 +1157,18 @@
     }
 
     private fun checkIntentBuilder(method: MethodItem) {
+        /*
+            def verify_intent_builder(clazz):
+                """Verify that Intent builders are createFooIntent() style."""
+                if clazz.name == "Intent": return
+
+                for m in clazz.methods:
+                    if m.typ == "android.content.Intent":
+                        if m.name.startswith("create") and m.name.endswith("Intent"):
+                            pass
+                        else:
+                            warn(clazz, m, "FW1", "Methods creating an Intent should be named createFooIntent()")
+         */
         if (method.returnType()?.toTypeString() == "android.content.Intent") {
             val name = method.name()
             if (name.startsWith("create") && name.endsWith("Intent")) {
@@ -934,6 +1186,57 @@
     }
 
     private fun checkHelperClasses(cls: ClassItem, methods: Sequence<MethodItem>, fields: Sequence<FieldItem>) {
+        /*
+            def verify_helper_classes(clazz):
+                """Verify that helper classes are named consistently with what they extend.
+                All developer extendable methods should be named onFoo()."""
+                test_methods = False
+                if "extends android.app.Service" in clazz.raw:
+                    test_methods = True
+                    if not clazz.name.endswith("Service"):
+                        error(clazz, None, "CL4", "Inconsistent class name; should be FooService")
+
+                    found = False
+                    for f in clazz.fields:
+                        if f.name == "SERVICE_INTERFACE":
+                            found = True
+                            if f.value != clazz.fullname:
+                                error(clazz, f, "C4", "Inconsistent interface constant; expected '%s'" % (clazz.fullname))
+
+                if "extends android.content.ContentProvider" in clazz.raw:
+                    test_methods = True
+                    if not clazz.name.endswith("Provider"):
+                        error(clazz, None, "CL4", "Inconsistent class name; should be FooProvider")
+
+                    found = False
+                    for f in clazz.fields:
+                        if f.name == "PROVIDER_INTERFACE":
+                            found = True
+                            if f.value != clazz.fullname:
+                                error(clazz, f, "C4", "Inconsistent interface constant; expected '%s'" % (clazz.fullname))
+
+                if "extends android.content.BroadcastReceiver" in clazz.raw:
+                    test_methods = True
+                    if not clazz.name.endswith("Receiver"):
+                        error(clazz, None, "CL4", "Inconsistent class name; should be FooReceiver")
+
+                if "extends android.app.Activity" in clazz.raw:
+                    test_methods = True
+                    if not clazz.name.endswith("Activity"):
+                        error(clazz, None, "CL4", "Inconsistent class name; should be FooActivity")
+
+                if test_methods:
+                    for m in clazz.methods:
+                        if "final" in m.split: continue
+// Note: This regex seems wrong:
+                        if not re.match("on[A-Z]", m.name):
+                            if "abstract" in m.split:
+                                warn(clazz, m, None, "Methods implemented by developers should be named onFoo()")
+                            else:
+                                warn(clazz, m, None, "If implemented by developer, should be named onFoo(); otherwise consider marking final")
+
+         */
+
         fun ensureFieldValue(fields: Sequence<FieldItem>, fieldName: String, fieldValue: String) {
             fields.firstOrNull { it.name() == fieldName }?.let { field ->
                 if (field.initialValue(true) != fieldValue) {
@@ -1003,6 +1306,35 @@
         constructors: Sequence<ConstructorItem>,
         superClass: ClassItem?
     ) {
+        /*
+            def verify_builder(clazz):
+                """Verify builder classes.
+                Methods should return the builder to enable chaining."""
+                if " extends " in clazz.raw: return
+                if not clazz.name.endswith("Builder"): return
+
+                if clazz.name != "Builder":
+                    warn(clazz, None, None, "Builder should be defined as inner class")
+
+                has_build = False
+                for m in clazz.methods:
+                    if m.name == "build":
+                        has_build = True
+                        continue
+
+                    if m.name.startswith("get"): continue
+                    if m.name.startswith("clear"): continue
+
+                    if m.name.startswith("with"):
+                        warn(clazz, m, None, "Builder methods names should use setFoo() style")
+
+                    if m.name.startswith("set"):
+                        if not m.typ.endswith(clazz.fullname):
+                            warn(clazz, m, "M4", "Methods must return the builder object")
+
+                if not has_build:
+                    warn(clazz, None, None, "Missing build() method")
+         */
         if (!cls.simpleName().endsWith("Builder")) {
             return
         }
@@ -1040,7 +1372,7 @@
         // Maps each setter to a list of potential getters that would satisfy it.
         val expectedGetters = mutableListOf<Pair<Item, Set<String>>>()
         var builtType: TypeItem? = null
-        val clsType = cls.toType()
+        val clsType = cls.toType().toTypeString()
 
         for (method in methods) {
             val name = method.name()
@@ -1053,30 +1385,17 @@
                     "Getter should be on the built object, not the builder: ${method.describe()}"
                 )
             } else if (name.startsWith("set") || name.startsWith("add") || name.startsWith("clear")) {
-                val returnType = method.returnType()
-                if (returnType != null) {
-                    val returnsClassType = if (
-                        returnType is PsiTypeItem && clsType is PsiTypeItem
-                    ) {
-                        clsType.isAssignableFromWithoutUnboxing(returnType)
-                    } else {
-                        // fallback to a limited text based check
-                        val returnTypeBounds = returnType
-                            .asTypeParameter(context = method)
-                            ?.typeBounds()?.map {
-                                it.toTypeString()
-                            } ?: emptyList()
-                        returnTypeBounds.contains(clsType.toTypeString()) || returnType == clsType
-                    }
-                    if (!returnsClassType) {
-                        report(
-                            SETTER_RETURNS_THIS, method,
-                            "Methods must return the builder object (return type " +
-                                "$clsType instead of $returnType): ${method.describe()}"
-                        )
-                    }
-                }
+                val returnType = method.returnType()?.toTypeString() ?: ""
+                val returnTypeBounds = method.returnType()?.asTypeParameter(context = method)?.bounds()?.map {
+                    it.toType().toTypeString()
+                } ?: listOf()
 
+                if (returnType != clsType && !returnTypeBounds.contains(clsType)) {
+                    report(
+                        SETTER_RETURNS_THIS, method,
+                        "Methods must return the builder object (return type $clsType instead of $returnType): ${method.describe()}"
+                    )
+                }
                 if (method.modifiers.isNullable()) {
                     report(
                         SETTER_RETURNS_THIS, method,
@@ -1089,8 +1408,7 @@
                 }
                 val allowedGetters: Set<String>? = if (isBool && name.startsWith("set")) {
                     val pattern = goodBooleanGetterSetterPrefixes.match(
-                        name, GetterSetterPattern::setter
-                    )!!
+                            name, GetterSetterPattern::setter)!!
                     setOf("${pattern.getter}${name.removePrefix(pattern.setter)}")
                 } else {
                     when {
@@ -1106,9 +1424,9 @@
                                     listOf(nameWithoutPrefix, "${nameWithoutPrefix}es")
                                 }
                                 name.endsWith("sh") || name.endsWith("ch") || name.endsWith("x") ||
-                                    name.endsWith("z") -> listOf("${nameWithoutPrefix}es")
+                                        name.endsWith("z") -> listOf("${nameWithoutPrefix}es")
                                 name.endsWith("y") &&
-                                    name[name.length - 2] !in listOf('a', 'e', 'i', 'o', 'u')
+                                        name[name.length - 2] !in listOf('a', 'e', 'i', 'o', 'u')
                                 -> {
                                     listOf("${nameWithoutPrefix.removeSuffix("y")}ies")
                                 }
@@ -1139,12 +1457,12 @@
                     val expectedGetterCalls = expectedGetterNames.map { "$it()" }
                     val errorString = if (expectedGetterCalls.size == 1) {
                         "${builtClass.qualifiedName()} does not declare a " +
-                            "`${expectedGetterCalls.first()}` method matching " +
-                            setter.describe()
+                                "`${expectedGetterCalls.first()}` method matching " +
+                                "${setter.describe()}"
                     } else {
                         "${builtClass.qualifiedName()} does not declare a getter method " +
-                            "matching ${setter.describe()} (expected one of: " +
-                            "$expectedGetterCalls)"
+                                "matching ${setter.describe()} (expected one of: " +
+                                "$expectedGetterCalls)"
                     }
                     report(MISSING_GETTER_MATCHING_BUILDER, setter, errorString)
                 }
@@ -1153,6 +1471,13 @@
     }
 
     private fun checkAidl(cls: ClassItem, superClass: ClassItem?, interfaces: Sequence<TypeItem>) {
+        /*
+            def verify_aidl(clazz):
+                """Catch people exposing raw AIDL."""
+                if "extends android.os.Binder" in clazz.raw or "implements android.os.IInterface" in clazz.raw:
+                    error(clazz, None, None, "Raw AIDL interfaces must not be exposed")
+        */
+
         // Instead of ClassItem.implements() and .extends() which performs hierarchy
         // searches, here we only want to flag directly extending or implementing:
         val extendsBinder = superClass?.qualifiedName() == "android.os.Binder"
@@ -1171,6 +1496,13 @@
     }
 
     private fun checkInternal(cls: ClassItem) {
+        /*
+            def verify_internal(clazz):
+                """Catch people exposing internal classes."""
+                if clazz.pkg.name.startswith("com.android"):
+                    error(clazz, None, None, "Internal classes must not be exposed")
+        */
+
         if (cls.qualifiedName().startsWith("com.android.")) {
             report(
                 INTERNAL_CLASSES, cls,
@@ -1184,6 +1516,52 @@
         methodsAndConstructors: Sequence<MethodItem>,
         fields: Sequence<FieldItem>
     ) {
+        /*
+            def verify_layering(clazz):
+                """Catch package layering violations.
+                For example, something in android.os depending on android.app."""
+                ranking = [
+                    ["android.service","android.accessibilityservice","android.inputmethodservice","android.printservice","android.appwidget","android.webkit","android.preference","android.gesture","android.print"],
+                    "android.app",
+                    "android.widget",
+                    "android.view",
+                    "android.animation",
+                    "android.provider",
+                    ["android.content","android.graphics.drawable"],
+                    "android.database",
+                    "android.text",
+                    "android.graphics",
+                    "android.os",
+                    "android.util"
+                ]
+
+                def rank(p):
+                    for i in range(len(ranking)):
+                        if isinstance(ranking[i], list):
+                            for j in ranking[i]:
+                                if p.startswith(j): return i
+                        else:
+                            if p.startswith(ranking[i]): return i
+
+                cr = rank(clazz.pkg.name)
+                if cr is None: return
+
+                for f in clazz.fields:
+                    ir = rank(f.typ)
+                    if ir and ir < cr:
+                        warn(clazz, f, "FW6", "Field type violates package layering")
+
+                for m in clazz.methods:
+                    ir = rank(m.typ)
+                    if ir and ir < cr:
+                        warn(clazz, m, "FW6", "Method return type violates package layering")
+                    for arg in m.args:
+                        ir = rank(arg)
+                        if ir and ir < cr:
+                            warn(clazz, m, "FW6", "Method argument type violates package layering")
+
+        */
+
         fun packageRank(pkg: PackageItem): Int {
             return when (pkg.qualifiedName()) {
                 "android.service",
@@ -1345,6 +1723,21 @@
         type: TypeItem,
         item: Item
     ) {
+        /*
+            def verify_collections(clazz):
+                """Verifies that collection types are interfaces."""
+                if clazz.fullname == "android.os.Bundle": return
+
+                bad = ["java.util.Vector", "java.util.LinkedList", "java.util.ArrayList", "java.util.Stack",
+                       "java.util.HashMap", "java.util.HashSet", "android.util.ArraySet", "android.util.ArrayMap"]
+                for m in clazz.methods:
+                    if m.typ in bad:
+                        error(clazz, m, "CL2", "Return type is concrete collection; must be higher-level interface")
+                    for arg in m.args:
+                        if arg in bad:
+                            error(clazz, m, "CL2", "Argument is concrete collection; must be higher-level interface")
+        */
+
         if (type.primitive) {
             return
         }
@@ -1392,7 +1785,7 @@
         val superItem: Item? = when (item) {
             is MethodItem -> item.findPredicateSuperMethod(filterReference)
             is ParameterItem -> item.containingMethod().findPredicateSuperMethod(filterReference)
-                ?.parameters()?.find { it.parameterIndex == item.parameterIndex }
+                    ?.parameters()?.find { it.parameterIndex == item.parameterIndex }
             else -> null
         }
 
@@ -1401,13 +1794,12 @@
         }
 
         if (type.isArray() ||
-            typeAsClass.extendsOrImplements("java.util.Collection") ||
-            typeAsClass.extendsOrImplements("kotlin.collections.Collection") ||
-            typeAsClass.extendsOrImplements("java.util.Map") ||
-            typeAsClass.extendsOrImplements("kotlin.collections.Map") ||
-            typeAsClass.qualifiedName() == "android.os.Bundle" ||
-            typeAsClass.qualifiedName() == "android.os.PersistableBundle"
-        ) {
+                typeAsClass.extendsOrImplements("java.util.Collection") ||
+                typeAsClass.extendsOrImplements("kotlin.collections.Collection") ||
+                typeAsClass.extendsOrImplements("java.util.Map") ||
+                typeAsClass.extendsOrImplements("kotlin.collections.Map") ||
+                typeAsClass.qualifiedName() == "android.os.Bundle" ||
+                typeAsClass.qualifiedName() == "android.os.PersistableBundle") {
             val where = when (item) {
                 is MethodItem -> "Return type of ${item.describe()}"
                 else -> "Type of ${item.describe()}"
@@ -1415,13 +1807,30 @@
 
             val erased = type.toErasedTypeString(item)
             report(
-                NULLABLE_COLLECTION, item,
-                "$where is a nullable collection (`$erased`); must be non-null"
+                    NULLABLE_COLLECTION, item,
+                    "$where is a nullable collection (`$erased`); must be non-null"
             )
         }
     }
 
     private fun checkFlags(fields: Sequence<FieldItem>) {
+        /*
+            def verify_flags(clazz):
+                """Verifies that flags are non-overlapping."""
+                known = collections.defaultdict(int)
+                for f in clazz.fields:
+                    if "FLAG_" in f.name:
+                        try:
+                            val = int(f.value)
+                        except:
+                            continue
+
+                        scope = f.name[0:f.name.index("FLAG_")]
+                        if val & known[scope]:
+                            warn(clazz, f, "C1", "Found overlapping flag constant value")
+                        known[scope] |= val
+
+        */
         var known: MutableMap<String, Int>? = null
         var valueToFlag: MutableMap<Int?, String>? = null
         for (field in fields) {
@@ -1453,57 +1862,80 @@
     }
 
     private fun checkExceptions(method: MethodItem, filterReference: Predicate<Item>) {
+        /*
+            def verify_exception(clazz):
+                """Verifies that methods don't throw generic exceptions."""
+                for m in clazz.methods:
+                    for t in m.throws:
+                        if t in ["java.lang.Exception", "java.lang.Throwable", "java.lang.Error"]:
+                            error(clazz, m, "S1", "Methods must not throw generic exceptions")
+
+                        if t in ["android.os.RemoteException"]:
+                            if clazz.name == "android.content.ContentProviderClient": continue
+                            if clazz.name == "android.os.Binder": continue
+                            if clazz.name == "android.os.IBinder": continue
+
+                            error(clazz, m, "FW9", "Methods calling into system server should rethrow RemoteException as RuntimeException")
+
+                        if len(m.args) == 0 and t in ["java.lang.IllegalArgumentException", "java.lang.NullPointerException"]:
+                            warn(clazz, m, "S1", "Methods taking no arguments should throw IllegalStateException")
+        */
         for (exception in method.filteredThrowsTypes(filterReference)) {
-            if (isUncheckedException(exception)) {
-                report(
-                    BANNED_THROW, method,
-                    "Methods must not throw unchecked exceptions"
-                )
-            } else {
-                when (val qualifiedName = exception.qualifiedName()) {
-                    "java.lang.Exception",
-                    "java.lang.Throwable",
-                    "java.lang.Error" -> {
-                        report(
-                            GENERIC_EXCEPTION, method,
-                            "Methods must not throw generic exceptions (`$qualifiedName`)"
-                        )
-                    }
-                    "android.os.RemoteException" -> {
-                        when (method.containingClass().qualifiedName()) {
-                            "android.content.ContentProviderClient",
-                            "android.os.Binder",
-                            "android.os.IBinder" -> {
-                                // exceptions
-                            }
-                            else -> {
-                                report(
-                                    RETHROW_REMOTE_EXCEPTION, method,
-                                    "Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause)"
-                                )
-                            }
+            when (val qualifiedName = exception.qualifiedName()) {
+                "java.lang.Exception",
+                "java.lang.Throwable",
+                "java.lang.Error" -> {
+                    report(
+                        GENERIC_EXCEPTION, method,
+                        "Methods must not throw generic exceptions (`$qualifiedName`)"
+                    )
+                }
+                "android.os.RemoteException" -> {
+                    when (method.containingClass().qualifiedName()) {
+                        "android.content.ContentProviderClient",
+                        "android.os.Binder",
+                        "android.os.IBinder" -> {
+                            // exceptions
                         }
+                        else -> {
+                            report(
+                                RETHROW_REMOTE_EXCEPTION, method,
+                                "Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause)"
+                            )
+                        }
+                    }
+                }
+                "java.lang.IllegalArgumentException",
+                "java.lang.NullPointerException" -> {
+                    if (method.parameters().isEmpty()) {
+                        report(
+                            ILLEGAL_STATE_EXCEPTION, method,
+                            "Methods taking no arguments should throw `IllegalStateException` instead of `$qualifiedName`"
+                        )
                     }
                 }
             }
         }
     }
 
-    /**
-     * Unchecked exceptions are subclasses of RuntimeException or Error. These are not
-     * checked by the compiler, and it is against API guidelines to put them in the 'throws'.
-     * See https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html
-     */
-    private fun isUncheckedException(exception: ClassItem): Boolean {
-        val superNames = exception.allSuperClasses().map {
-            it.qualifiedName()
-        }
-        return superNames.any {
-            it == "java.lang.RuntimeException" || it == "java.lang.Error"
-        }
-    }
-
     private fun checkGoogle(cls: ClassItem, methods: Sequence<MethodItem>, fields: Sequence<FieldItem>) {
+        /*
+            def verify_google(clazz):
+                """Verifies that APIs never reference Google."""
+
+                if re.search("google", clazz.raw, re.IGNORECASE):
+                    error(clazz, None, None, "Must never reference Google")
+
+                test = []
+                test.extend(clazz.ctors)
+                test.extend(clazz.fields)
+                test.extend(clazz.methods)
+
+                for t in test:
+                    if re.search("google", t.raw, re.IGNORECASE):
+                        error(clazz, t, None, "Must never reference Google")
+        */
+
         fun checkName(name: String, item: Item) {
             if (name.contains("Google", ignoreCase = true)) {
                 report(
@@ -1534,6 +1966,20 @@
     }
 
     private fun checkManager(cls: ClassItem, methods: Sequence<MethodItem>, constructors: Sequence<ConstructorItem>) {
+        /*
+            def verify_manager(clazz):
+                """Verifies that FooManager is only obtained from Context."""
+
+                if not clazz.name.endswith("Manager"): return
+
+                for c in clazz.ctors:
+                    error(clazz, c, None, "Managers must always be obtained from Context; no direct constructors")
+
+                for m in clazz.methods:
+                    if m.typ == clazz.fullname:
+                        error(clazz, m, None, "Managers must always be obtained from Context")
+
+        */
         if (!cls.simpleName().endsWith("Manager")) {
             return
         }
@@ -1556,8 +2002,8 @@
     }
 
     private fun checkHasNullability(item: Item) {
-        if (!item.requiresNullnessInfo()) return
-        if (!item.hasNullnessInfo() && getImplicitNullness(item) == null) {
+        if (item.requiresNullnessInfo() && !item.hasNullnessInfo() &&
+                getImplicitNullness(item) == null) {
             val type = item.type()
             val inherited = when (item) {
                 is ParameterItem -> item.containingMethod().inheritedMethod
@@ -1606,81 +2052,33 @@
                 else -> throw IllegalStateException("Unexpected item type: $item")
             }
             report(MISSING_NULLABILITY, item, "Missing nullability on $where")
-        } else {
-            when (item) {
-                is ParameterItem -> {
-                    // We don't enforce this check on constructor params
-                    if (item.containingMethod().isConstructor()) return
-                    if (item.modifiers.isNonNull()) {
-                        if (anySuperParameterLacksNullnessInfo(item)) {
-                            report(INVALID_NULLABILITY_OVERRIDE, item, "Invalid nullability on parameter `${item.name()}` in method `${item.parent()?.name()}`. Parameters of overrides cannot be NonNull if the super parameter is unannotated.")
-                        } else if (anySuperParameterIsNullable(item)) {
-                            report(INVALID_NULLABILITY_OVERRIDE, item, "Invalid nullability on parameter `${item.name()}` in method `${item.parent()?.name()}`. Parameters of overrides cannot be NonNull if super parameter is Nullable.")
-                        }
-                    }
-                }
-                is MethodItem -> {
-                    // We don't enforce this check on constructors
-                    if (item.isConstructor()) return
-                    if (item.modifiers.isNullable()) {
-                        if (anySuperMethodLacksNullnessInfo(item)) {
-                            report(INVALID_NULLABILITY_OVERRIDE, item, "Invalid nullability on method `${item.name()}` return. Overrides of unannotated super method cannot be Nullable.")
-                        } else if (anySuperMethodIsNonNull(item)) {
-                            report(INVALID_NULLABILITY_OVERRIDE, item, "Invalid nullability on method `${item.name()}` return. Overrides of NonNull methods cannot be Nullable.")
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private fun anySuperMethodIsNonNull(method: MethodItem): Boolean {
-        return method.superMethods().any { superMethod ->
-            superMethod.modifiers.isNonNull() &&
-                // Disable check for generics
-                superMethod.returnType()?.isTypeParameter() != true
-        }
-    }
-
-    private fun anySuperParameterIsNullable(parameter: ParameterItem): Boolean {
-        val supers = parameter.containingMethod().superMethods()
-        return supers.all { superMethod ->
-            // Disable check for generics
-            superMethod.parameters().none {
-                it.type().isTypeParameter()
-            }
-        } && supers.any { superMethod ->
-            superMethod.parameters().firstOrNull { param ->
-                parameter.parameterIndex == param.parameterIndex
-            }?.modifiers?.isNullable() ?: false
-        }
-    }
-
-    private fun anySuperMethodLacksNullnessInfo(method: MethodItem): Boolean {
-        return method.superMethods().any { superMethod ->
-            !superMethod.hasNullnessInfo() &&
-                // Disable check for generics
-                superMethod.returnType()?.isTypeParameter() != true
-        }
-    }
-
-    private fun anySuperParameterLacksNullnessInfo(parameter: ParameterItem): Boolean {
-        val supers = parameter.containingMethod().superMethods()
-        return supers.all { superMethod ->
-            // Disable check for generics
-            superMethod.parameters().none {
-                it.type().isTypeParameter()
-            }
-        } && supers.any { superMethod ->
-            !(
-                superMethod.parameters().firstOrNull { param ->
-                    parameter.parameterIndex == param.parameterIndex
-                }?.hasNullnessInfo() ?: true
-                )
         }
     }
 
     private fun checkBoxed(type: TypeItem, item: Item) {
+        /*
+            def verify_boxed(clazz):
+                """Verifies that methods avoid boxed primitives."""
+
+                boxed = ["java.lang.Number","java.lang.Byte","java.lang.Double","java.lang.Float","java.lang.Integer","java.lang.Long","java.lang.Short"]
+
+                for c in clazz.ctors:
+                    for arg in c.args:
+                        if arg in boxed:
+                            error(clazz, c, "M11", "Must avoid boxed primitives")
+
+                for f in clazz.fields:
+                    if f.typ in boxed:
+                        error(clazz, f, "M11", "Must avoid boxed primitives")
+
+                for m in clazz.methods:
+                    if m.typ in boxed:
+                        error(clazz, m, "M11", "Must avoid boxed primitives")
+                    for arg in m.args:
+                        if arg in boxed:
+                            error(clazz, m, "M11", "Must avoid boxed primitives")
+        */
+
         fun isBoxType(qualifiedName: String): Boolean {
             return when (qualifiedName) {
                 "java.lang.Number",
@@ -1712,6 +2110,25 @@
         constructors: Sequence<ConstructorItem>,
         fields: Sequence<FieldItem>
     ) {
+        /*
+            def verify_static_utils(clazz):
+                """Verifies that helper classes can't be constructed."""
+                if clazz.fullname.startswith("android.opengl"): return
+                if clazz.fullname.startswith("android.R"): return
+
+                # Only care about classes with default constructors
+                if len(clazz.ctors) == 1 and len(clazz.ctors[0].args) == 0:
+                    test = []
+                    test.extend(clazz.fields)
+                    test.extend(clazz.methods)
+
+                    if len(test) == 0: return
+                    for t in test:
+                        if "static" not in t.split:
+                            return
+
+                    error(clazz, None, None, "Fully-static utility classes must not have constructor")
+        */
         if (!cls.isClass()) {
             return
         }
@@ -1739,8 +2156,7 @@
             }
 
             if (methods.none { !it.modifiers.isStatic() } &&
-                fields.none { !it.modifiers.isStatic() }
-            ) {
+                fields.none { !it.modifiers.isStatic() }) {
                 report(
                     STATIC_UTILS, cls,
                     "Fully-static utility classes must not have constructor"
@@ -1750,6 +2166,47 @@
     }
 
     private fun checkOverloadArgs(cls: ClassItem, methods: Sequence<MethodItem>) {
+        /*
+            def verify_overload_args(clazz):
+                """Verifies that method overloads add new arguments at the end."""
+                if clazz.fullname.startswith("android.opengl"): return
+
+                overloads = collections.defaultdict(list)
+                for m in clazz.methods:
+                    if "deprecated" in m.split: continue
+                    overloads[m.name].append(m)
+
+                for name, methods in overloads.items():
+                    if len(methods) <= 1: continue
+
+                    # Look for arguments common across all overloads
+                    def cluster(args):
+                        count = collections.defaultdict(int)
+                        res = set()
+                        for i in range(len(args)):
+                            a = args[i]
+                            res.add("%s#%d" % (a, count[a]))
+                            count[a] += 1
+                        return res
+
+                    common_args = cluster(methods[0].args)
+                    for m in methods:
+                        common_args = common_args & cluster(m.args)
+
+                    if len(common_args) == 0: continue
+
+                    # Require that all common arguments are present at start of signature
+                    locked_sig = None
+                    for m in methods:
+                        sig = m.args[0:len(common_args)]
+                        if not common_args.issubset(cluster(sig)):
+                            warn(clazz, m, "M2", "Expected common arguments [%s] at beginning of overloaded method" % (", ".join(common_args)))
+                        elif not locked_sig:
+                            locked_sig = sig
+                        elif locked_sig != sig:
+                            error(clazz, m, "M2", "Expected consistent argument ordering between overloads: %s..." % (", ".join(locked_sig)))
+        */
+
         if (cls.qualifiedName().startsWith("android.opengl")) {
             return
         }
@@ -1822,12 +2279,66 @@
         methodsAndConstructors: Sequence<MethodItem>,
         superClass: ClassItem?
     ) {
+        /*
+            def verify_callback_handlers(clazz):
+                """Verifies that methods adding listener/callback have overload
+                for specifying delivery thread."""
+
+                # Ignore UI packages which assume main thread
+                skip = [
+                    "animation",
+                    "view",
+                    "graphics",
+                    "transition",
+                    "widget",
+                    "webkit",
+                ]
+                for s in skip:
+                    if s in clazz.pkg.name_path: return
+                    if s in clazz.extends_path: return
+
+                # Ignore UI classes which assume main thread
+                if "app" in clazz.pkg.name_path or "app" in clazz.extends_path:
+                    for s in ["ActionBar","Dialog","Application","Activity","Fragment","Loader"]:
+                        if s in clazz.fullname: return
+                if "content" in clazz.pkg.name_path or "content" in clazz.extends_path:
+                    for s in ["Loader"]:
+                        if s in clazz.fullname: return
+
+                found = {}
+                by_name = collections.defaultdict(list)
+                examine = clazz.ctors + clazz.methods
+                for m in examine:
+                    if m.name.startswith("unregister"): continue
+                    if m.name.startswith("remove"): continue
+                    if re.match("on[A-Z]+", m.name): continue
+
+                    by_name[m.name].append(m)
+
+                    for a in m.args:
+                        if a.endswith("Listener") or a.endswith("Callback") or a.endswith("Callbacks"):
+                            found[m.name] = m
+
+                for f in found.values():
+                    takes_handler = False
+                    takes_exec = False
+                    for m in by_name[f.name]:
+                        if "android.os.Handler" in m.args:
+                            takes_handler = True
+                        if "java.util.concurrent.Executor" in m.args:
+                            takes_exec = True
+                    if not takes_exec:
+                        warn(clazz, f, "L1", "Registration methods should have overload that accepts delivery Executor")
+
+        */
+
+        // Note: In the above we compute takes_handler but it's not used; is this an incomplete
+        // check?
+
         fun packageContainsSegment(packageName: String?, segment: String): Boolean {
             packageName ?: return false
-            return (
-                packageName.contains(segment) &&
-                    (packageName.contains(".$segment.") || packageName.endsWith(".$segment"))
-                )
+            return (packageName.contains(segment) &&
+                (packageName.contains(".$segment.") || packageName.endsWith(".$segment")))
         }
 
         fun skipPackage(packageName: String?): Boolean {
@@ -1930,6 +2441,18 @@
     }
 
     private fun checkContextFirst(method: MethodItem) {
+        /*
+            def verify_context_first(clazz):
+                """Verifies that methods accepting a Context keep it the first argument."""
+                examine = clazz.ctors + clazz.methods
+                for m in examine:
+                    if len(m.args) > 1 and m.args[0] != "android.content.Context":
+                        if "android.content.Context" in m.args[1:]:
+                            error(clazz, m, "M3", "Context is distinct, so it must be the first argument")
+                    if len(m.args) > 1 and m.args[0] != "android.content.ContentResolver":
+                        if "android.content.ContentResolver" in m.args[1:]:
+                            error(clazz, m, "M3", "ContentResolver is distinct, so it must be the first argument")
+        */
         val parameters = method.parameters()
         if (parameters.size > 1 && parameters[0].type().toTypeString() != "android.content.Context") {
             for (i in 1 until parameters.size) {
@@ -1956,6 +2479,20 @@
     }
 
     private fun checkListenerLast(method: MethodItem) {
+        /*
+            def verify_listener_last(clazz):
+                """Verifies that methods accepting a Listener or Callback keep them as last arguments."""
+                examine = clazz.ctors + clazz.methods
+                for m in examine:
+                    if "Listener" in m.name or "Callback" in m.name: continue
+                    found = False
+                    for a in m.args:
+                        if a.endswith("Callback") or a.endswith("Callbacks") or a.endswith("Listener"):
+                            found = True
+                        elif found:
+                            warn(clazz, m, "M3", "Listeners should always be at end of argument list")
+                    */
+
         val name = method.name()
         if (name.contains("Listener") || name.contains("Callback")) {
             return
@@ -1979,6 +2516,37 @@
     }
 
     private fun checkResourceNames(cls: ClassItem, fields: Sequence<FieldItem>) {
+        /*
+            def verify_resource_names(clazz):
+                """Verifies that resource names have consistent case."""
+                if not re.match("android\.R\.[a-z]+", clazz.fullname): return
+
+                # Resources defined by files are foo_bar_baz
+                if clazz.name in ["anim","animator","color","dimen","drawable","interpolator","layout","transition","menu","mipmap","string","plurals","raw","xml"]:
+                    for f in clazz.fields:
+                        if re.match("config_[a-z][a-zA-Z1-9]*$", f.name): continue
+                        if f.name.startswith("config_"):
+                            error(clazz, f, None, "Expected config name to be config_fooBarBaz style")
+
+                        if re.match("[a-z1-9_]+$", f.name): continue
+                        error(clazz, f, None, "Expected resource name in this class to be foo_bar_baz style")
+
+                # Resources defined inside files are fooBarBaz
+                if clazz.name in ["array","attr","id","bool","fraction","integer"]:
+                    for f in clazz.fields:
+                        if re.match("config_[a-z][a-zA-Z1-9]*$", f.name): continue
+                        if re.match("layout_[a-z][a-zA-Z1-9]*$", f.name): continue
+                        if re.match("state_[a-z_]*$", f.name): continue
+
+                        if re.match("[a-z][a-zA-Z1-9]*$", f.name): continue
+                        error(clazz, f, "C7", "Expected resource name in this class to be fooBarBaz style")
+
+                # Styles are FooBar_Baz
+                if clazz.name in ["style"]:
+                    for f in clazz.fields:
+                        if re.match("[A-Z][A-Za-z1-9]+(_[A-Z][A-Za-z1-9]+?)*$", f.name): continue
+                        error(clazz, f, "C7", "Expected resource name in this class to be FooBar_Baz style")
+        */
         if (!cls.qualifiedName().startsWith("android.R.")) {
             return
         }
@@ -2067,7 +2635,7 @@
             }
 
             STYLEABLE, // appears as R class but name check is implicitly done as part of style class check
-            // DECLARE_STYLEABLE,
+                // DECLARE_STYLEABLE,
             STYLE_ITEM,
             PUBLIC,
             SAMPLE_DATA,
@@ -2080,6 +2648,28 @@
     }
 
     private fun checkFiles(methodsAndConstructors: Sequence<MethodItem>) {
+        /*
+            def verify_files(clazz):
+                """Verifies that methods accepting File also accept streams."""
+
+                has_file = set()
+                has_stream = set()
+
+                test = []
+                test.extend(clazz.ctors)
+                test.extend(clazz.methods)
+
+                for m in test:
+                    if "java.io.File" in m.args:
+                        has_file.add(m)
+                    if "java.io.FileDescriptor" in m.args or "android.os.ParcelFileDescriptor" in m.args or "java.io.InputStream" in m.args or "java.io.OutputStream" in m.args:
+                        has_stream.add(m.name)
+
+                for m in has_file:
+                    if m.name not in has_stream:
+                        warn(clazz, m, "M10", "Methods accepting File should also accept FileDescriptor or streams")
+        */
+
         var hasFile: MutableSet<MethodItem>? = null
         var hasStream: MutableSet<String>? = null
         for (method in methodsAndConstructors) {
@@ -2122,6 +2712,16 @@
     }
 
     private fun checkManagerList(cls: ClassItem, methods: Sequence<MethodItem>) {
+        /*
+            def verify_manager_list(clazz):
+                """Verifies that managers return List<? extends Parcelable> instead of arrays."""
+
+                if not clazz.name.endswith("Manager"): return
+
+                for m in clazz.methods:
+                    if m.typ.startswith("android.") and m.typ.endswith("[]"):
+                        warn(clazz, m, None, "Methods should return List<? extends Parcelable> instead of Parcelable[] to support ParceledListSlice under the hood")
+        */
         if (!cls.simpleName().endsWith("Manager")) {
             return
         }
@@ -2141,6 +2741,14 @@
     }
 
     private fun checkAbstractInner(cls: ClassItem) {
+        /*
+            def verify_abstract_inner(clazz):
+                """Verifies that abstract inner classes are static."""
+
+                if re.match(".+?\.[A-Z][^\.]+\.[A-Z]", clazz.fullname):
+                    if " abstract " in clazz.raw and " static " not in clazz.raw:
+                        warn(clazz, None, None, "Abstract inner classes should be static to improve testability")
+        */
         if (!cls.isTopLevelClass() && cls.isClass() && cls.modifiers.isAbstract() && !cls.modifiers.isStatic()) {
             report(
                 ABSTRACT_INNER, cls,
@@ -2149,7 +2757,112 @@
         }
     }
 
+    private fun checkRuntimeExceptions(
+        methodsAndConstructors: Sequence<MethodItem>,
+        filterReference: Predicate<Item>
+    ) {
+        /*
+            def verify_runtime_exceptions(clazz):
+                """Verifies that runtime exceptions aren't listed in throws."""
+
+                banned = [
+                    "java.lang.NullPointerException",
+                    "java.lang.ClassCastException",
+                    "java.lang.IndexOutOfBoundsException",
+                    "java.lang.reflect.UndeclaredThrowableException",
+                    "java.lang.reflect.MalformedParametersException",
+                    "java.lang.reflect.MalformedParameterizedTypeException",
+                    "java.lang.invoke.WrongMethodTypeException",
+                    "java.lang.EnumConstantNotPresentException",
+                    "java.lang.IllegalMonitorStateException",
+                    "java.lang.SecurityException",
+                    "java.lang.UnsupportedOperationException",
+                    "java.lang.annotation.AnnotationTypeMismatchException",
+                    "java.lang.annotation.IncompleteAnnotationException",
+                    "java.lang.TypeNotPresentException",
+                    "java.lang.IllegalStateException",
+                    "java.lang.ArithmeticException",
+                    "java.lang.IllegalArgumentException",
+                    "java.lang.ArrayStoreException",
+                    "java.lang.NegativeArraySizeException",
+                    "java.util.MissingResourceException",
+                    "java.util.EmptyStackException",
+                    "java.util.concurrent.CompletionException",
+                    "java.util.concurrent.RejectedExecutionException",
+                    "java.util.IllformedLocaleException",
+                    "java.util.ConcurrentModificationException",
+                    "java.util.NoSuchElementException",
+                    "java.io.UncheckedIOException",
+                    "java.time.DateTimeException",
+                    "java.security.ProviderException",
+                    "java.nio.BufferUnderflowException",
+                    "java.nio.BufferOverflowException",
+                ]
+
+                examine = clazz.ctors + clazz.methods
+                for m in examine:
+                    for t in m.throws:
+                        if t in banned:
+                            error(clazz, m, None, "Methods must not mention RuntimeException subclasses in throws clauses")
+
+        */
+        for (method in methodsAndConstructors) {
+            if (method.synthetic) {
+                continue
+            }
+            for (throws in method.filteredThrowsTypes(filterReference)) {
+                when (throws.qualifiedName()) {
+                    "java.lang.NullPointerException",
+                    "java.lang.ClassCastException",
+                    "java.lang.IndexOutOfBoundsException",
+                    "java.lang.reflect.UndeclaredThrowableException",
+                    "java.lang.reflect.MalformedParametersException",
+                    "java.lang.reflect.MalformedParameterizedTypeException",
+                    "java.lang.invoke.WrongMethodTypeException",
+                    "java.lang.EnumConstantNotPresentException",
+                    "java.lang.IllegalMonitorStateException",
+                    "java.lang.SecurityException",
+                    "java.lang.UnsupportedOperationException",
+                    "java.lang.annotation.AnnotationTypeMismatchException",
+                    "java.lang.annotation.IncompleteAnnotationException",
+                    "java.lang.TypeNotPresentException",
+                    "java.lang.IllegalStateException",
+                    "java.lang.ArithmeticException",
+                    "java.lang.IllegalArgumentException",
+                    "java.lang.ArrayStoreException",
+                    "java.lang.NegativeArraySizeException",
+                    "java.util.MissingResourceException",
+                    "java.util.EmptyStackException",
+                    "java.util.concurrent.CompletionException",
+                    "java.util.concurrent.RejectedExecutionException",
+                    "java.util.IllformedLocaleException",
+                    "java.util.ConcurrentModificationException",
+                    "java.util.NoSuchElementException",
+                    "java.io.UncheckedIOException",
+                    "java.time.DateTimeException",
+                    "java.security.ProviderException",
+                    "java.nio.BufferUnderflowException",
+                    "java.nio.BufferOverflowException" -> {
+                        report(
+                            BANNED_THROW, method,
+                            "Methods must not mention RuntimeException subclasses in throws clauses (was `${throws.qualifiedName()}`)"
+                        )
+                    }
+                }
+            }
+        }
+    }
+
     private fun checkError(cls: ClassItem, superClass: ClassItem?) {
+        /*
+            def verify_error(clazz):
+                """Verifies that we always use Exception instead of Error."""
+                if not clazz.extends: return
+                if clazz.extends.endswith("Error"):
+                    error(clazz, None, None, "Trouble must be reported through an Exception, not Error")
+                if clazz.extends.endswith("Exception") and not clazz.name.endswith("Exception"):
+                    error(clazz, None, None, "Exceptions must be named FooException")
+        */
         superClass ?: return
         if (superClass.simpleName().endsWith("Error")) {
             report(
@@ -2198,6 +2911,18 @@
     }
 
     private fun checkCloseable(cls: ClassItem, methods: Sequence<MethodItem>) {
+        /*
+            def verify_closable(clazz):
+                """Verifies that classes are AutoClosable."""
+                if "implements java.lang.AutoCloseable" in clazz.raw: return
+                if "implements java.io.Closeable" in clazz.raw: return
+
+                for m in clazz.methods:
+                    if len(m.args) > 0: continue
+                    if m.name in ["close","release","destroy","finish","finalize","disconnect","shutdown","stop","free","quit"]:
+                        warn(clazz, m, None, "Classes that release resources should implement AutoClosable and CloseGuard")
+                        return
+         */
         // AutoClosable has been added in API 19, so libraries with minSdkVersion <19 cannot use it. If the version
         // is not set, then keep the check enabled.
         val minSdkVersion = codebase.getMinSdkVersion()
@@ -2221,12 +2946,62 @@
     }
 
     private fun checkNotKotlinOperator(methods: Sequence<MethodItem>) {
+        /*
+            def verify_method_name_not_kotlin_operator(clazz):
+                """Warn about method names which become operators in Kotlin."""
+
+                binary = set()
+
+                def unique_binary_op(m, op):
+                    if op in binary:
+                        error(clazz, m, None, "Only one of '{0}' and '{0}Assign' methods should be present for Kotlin".format(op))
+                    binary.add(op)
+
+                for m in clazz.methods:
+                    if 'static' in m.split:
+                        continue
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#unary-prefix-operators
+                    if m.name in ["unaryPlus", "unaryMinus", "not"] and len(m.args) == 0:
+                        warn(clazz, m, None, "Method can be invoked as a unary operator from Kotlin")
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#increments-and-decrements
+                    if m.name in ["inc", "dec"] and len(m.args) == 0 and m.typ != "void":
+                        # This only applies if the return type is the same or a subtype of the enclosing class, but we have no
+                        # practical way of checking that relationship here.
+                        warn(clazz, m, None, "Method can be invoked as a pre/postfix inc/decrement operator from Kotlin")
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#arithmetic
+                    if m.name in ["plus", "minus", "times", "div", "rem", "mod", "rangeTo"] and len(m.args) == 1:
+                        warn(clazz, m, None, "Method can be invoked as a binary operator from Kotlin")
+                        unique_binary_op(m, m.name)
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#in
+                    if m.name == "contains" and len(m.args) == 1 and m.typ == "boolean":
+                        warn(clazz, m, None, "Method can be invoked as a "in" operator from Kotlin")
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#indexed
+                    if (m.name == "get" and len(m.args) > 0) or (m.name == "set" and len(m.args) > 1):
+                        warn(clazz, m, None, "Method can be invoked with an indexing operator from Kotlin")
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#invoke
+                    if m.name == "invoke":
+                        warn(clazz, m, None, "Method can be invoked with function call syntax from Kotlin")
+
+                    # https://kotlinlang.org/docs/reference/operator-overloading.html#assignments
+                    if m.name in ["plusAssign", "minusAssign", "timesAssign", "divAssign", "remAssign", "modAssign"] \
+                            and len(m.args) == 1 \
+                            and m.typ == "void":
+                        warn(clazz, m, None, "Method can be invoked as a compound assignment operator from Kotlin")
+                        unique_binary_op(m, m.name[:-6])  # Remove "Assign" suffix
+
+         */
+
         fun flagKotlinOperator(method: MethodItem, message: String) {
             if (method.isKotlin()) {
                 report(
                     KOTLIN_OPERATOR, method,
-                    "Note that adding the `operator` keyword would allow calling this method using operator syntax"
-                )
+                    "Note that adding the `operator` keyword would allow calling this method using operator syntax")
             } else {
                 report(
                     KOTLIN_OPERATOR, method,
@@ -2266,11 +3041,10 @@
                     val assignName = name + "Assign"
 
                     if (methods.any {
-                        it.name() == assignName &&
-                            it.parameters().size == 1 &&
-                            it.returnType()?.toTypeString() == "void"
-                    }
-                    ) {
+                            it.name() == assignName &&
+                                it.parameters().size == 1 &&
+                                it.returnType()?.toTypeString() == "void"
+                        }) {
                         report(
                             UNIQUE_KOTLIN_OPERATOR, method,
                             "Only one of `$name` and `${name}Assign` methods should be present for Kotlin"
@@ -2322,6 +3096,20 @@
     }
 
     private fun checkCollectionsOverArrays(type: TypeItem, typeString: String, item: Item) {
+        /*
+            def verify_collections_over_arrays(clazz):
+                """Warn that [] should be Collections."""
+
+                safe = ["java.lang.String[]","byte[]","short[]","int[]","long[]","float[]","double[]","boolean[]","char[]"]
+                for m in clazz.methods:
+                    if m.typ.endswith("[]") and m.typ not in safe:
+                        warn(clazz, m, None, "Method should return Collection<> (or subclass) instead of raw array")
+                    for arg in m.args:
+                        if arg.endswith("[]") and arg not in safe:
+                            warn(clazz, m, None, "Method argument should be Collection<> (or subclass) instead of raw array")
+
+         */
+
         if (!type.isArray() || (item is ParameterItem && item.isVarArgs())) {
             return
         }
@@ -2363,6 +3151,31 @@
     }
 
     private fun checkUserHandle(cls: ClassItem, methods: Sequence<MethodItem>) {
+        /*
+            def verify_user_handle(clazz):
+                """Methods taking UserHandle should be ForUser or AsUser."""
+                if clazz.name.endswith("Listener") or clazz.name.endswith("Callback") or clazz.name.endswith("Callbacks"): return
+                if clazz.fullname == "android.app.admin.DeviceAdminReceiver": return
+                if clazz.fullname == "android.content.pm.LauncherApps": return
+                if clazz.fullname == "android.os.UserHandle": return
+                if clazz.fullname == "android.os.UserManager": return
+
+                for m in clazz.methods:
+                    if re.match("on[A-Z]+", m.name): continue
+
+                    has_arg = "android.os.UserHandle" in m.args
+                    has_name = m.name.endswith("AsUser") or m.name.endswith("ForUser")
+
+                    if clazz.fullname.endswith("Manager") and has_arg:
+                        warn(clazz, m, None, "When a method overload is needed to target a specific "
+                             "UserHandle, callers should be directed to use "
+                             "Context.createPackageContextAsUser() and re-obtain the relevant "
+                             "Manager, and no new API should be added")
+                    elif has_arg and not has_name:
+                        warn(clazz, m, None, "Method taking UserHandle should be named 'doFooAsUser' "
+                             "or 'queryFooForUser'")
+
+         */
         val qualifiedName = cls.qualifiedName()
         if (qualifiedName == "android.app.admin.DeviceAdminReceiver" ||
             qualifiedName == "android.content.pm.LauncherApps" ||
@@ -2403,18 +3216,30 @@
     }
 
     private fun checkParams(cls: ClassItem) {
+        /*
+            def verify_params(clazz):
+                """Parameter classes should be 'Params'."""
+                if clazz.name.endswith("Params"): return
+                if clazz.fullname == "android.app.ActivityOptions": return
+                if clazz.fullname == "android.app.BroadcastOptions": return
+                if clazz.fullname == "android.os.Bundle": return
+                if clazz.fullname == "android.os.BaseBundle": return
+                if clazz.fullname == "android.os.PersistableBundle": return
+
+                bad = ["Param","Parameter","Parameters","Args","Arg","Argument","Arguments","Options","Bundle"]
+                for b in bad:
+                    if clazz.name.endswith(b):
+                        error(clazz, None, None, "Classes holding a set of parameters should be called 'FooParams'")
+         */
+
         val qualifiedName = cls.qualifiedName()
         for (suffix in badParameterClassNames) {
-            if (qualifiedName.endsWith(suffix) && !(
-                (
-                    qualifiedName.endsWith("Params") ||
-                        qualifiedName == "android.app.ActivityOptions" ||
-                        qualifiedName == "android.app.BroadcastOptions" ||
-                        qualifiedName == "android.os.Bundle" ||
-                        qualifiedName == "android.os.BaseBundle" ||
-                        qualifiedName == "android.os.PersistableBundle"
-                    )
-                )
+            if (qualifiedName.endsWith(suffix) && !((qualifiedName.endsWith("Params") ||
+                    qualifiedName == "android.app.ActivityOptions" ||
+                    qualifiedName == "android.app.BroadcastOptions" ||
+                    qualifiedName == "android.os.Bundle" ||
+                    qualifiedName == "android.os.BaseBundle" ||
+                    qualifiedName == "android.os.PersistableBundle"))
             ) {
                 report(
                     USER_HANDLE_NAME, cls,
@@ -2425,10 +3250,22 @@
     }
 
     private fun checkServices(field: FieldItem) {
+        /*
+            def verify_services(clazz):
+                """Service name should be FOO_BAR_SERVICE = 'foo_bar'."""
+                if clazz.fullname != "android.content.Context": return
+
+                for f in clazz.fields:
+                    if f.typ != "java.lang.String": continue
+                    found = re.match(r"([A-Z_]+)_SERVICE", f.name)
+                    if found:
+                        expected = found.group(1).lower()
+                        if f.value != expected:
+                            error(clazz, f, "C4", "Inconsistent service value; expected '%s'" % (expected))
+         */
         val type = field.type()
         if (!type.isString() || !field.modifiers.isFinal() || !field.modifiers.isStatic() ||
-            field.containingClass().qualifiedName() != "android.content.Context"
-        ) {
+            field.containingClass().qualifiedName() != "android.content.Context") {
             return
         }
         val name = field.name()
@@ -2440,8 +3277,7 @@
                 if (!endsWithService) " and its name must end with `_SERVICE`" else ""
 
             report(
-                SERVICE_NAME, field,
-                "Non-constant service constant `$name`. Must be static," +
+                SERVICE_NAME, field, "Non-constant service constant `$name`. Must be static," +
                     " final and initialized with a String literal$mustEndInService."
             )
             return
@@ -2454,7 +3290,7 @@
                     "`${name.removeSuffix("_MANAGER_SERVICE")}_SERVICE`, was `$name`"
             )
         } else if (endsWithService) {
-            val service = name.substring(0, name.length - "_SERVICE".length).lowercase(Locale.US)
+            val service = name.substring(0, name.length - "_SERVICE".length).toLowerCase(Locale.US)
             if (service != value) {
                 report(
                     SERVICE_NAME, field,
@@ -2465,16 +3301,24 @@
                 )
             }
         } else {
-            val valueUpper = value.uppercase(Locale.US)
+            val valueUpper = value.toUpperCase(Locale.US)
             report(
-                SERVICE_NAME, field,
-                "Inconsistent service constant name;" +
+                SERVICE_NAME, field, "Inconsistent service constant name;" +
                     " expected `${valueUpper}_SERVICE`, was `$name`"
             )
         }
     }
 
     private fun checkTense(method: MethodItem) {
+        /*
+            def verify_tense(clazz):
+                """Verify tenses of method names."""
+                if clazz.fullname.startswith("android.opengl"): return
+
+                for m in clazz.methods:
+                    if m.name.endswith("Enable"):
+                        warn(clazz, m, None, "Unexpected tense; probably meant 'enabled'")
+         */
         val name = method.name()
         if (name.endsWith("Enable")) {
             if (method.containingClass().qualifiedName().startsWith("android.opengl")) {
@@ -2488,6 +3332,37 @@
     }
 
     private fun checkIcu(type: TypeItem, typeString: String, item: Item) {
+        /*
+            def verify_icu(clazz):
+                """Verifies that richer ICU replacements are used."""
+                better = {
+                    "java.util.TimeZone": "android.icu.util.TimeZone",
+                    "java.util.Calendar": "android.icu.util.Calendar",
+                    "java.util.Locale": "android.icu.util.ULocale",
+                    "java.util.ResourceBundle": "android.icu.util.UResourceBundle",
+                    "java.util.SimpleTimeZone": "android.icu.util.SimpleTimeZone",
+                    "java.util.StringTokenizer": "android.icu.util.StringTokenizer",
+                    "java.util.GregorianCalendar": "android.icu.util.GregorianCalendar",
+                    "java.lang.Character": "android.icu.lang.UCharacter",
+                    "java.text.BreakIterator": "android.icu.text.BreakIterator",
+                    "java.text.Collator": "android.icu.text.Collator",
+                    "java.text.DecimalFormatSymbols": "android.icu.text.DecimalFormatSymbols",
+                    "java.text.NumberFormat": "android.icu.text.NumberFormat",
+                    "java.text.DateFormatSymbols": "android.icu.text.DateFormatSymbols",
+                    "java.text.DateFormat": "android.icu.text.DateFormat",
+                    "java.text.SimpleDateFormat": "android.icu.text.SimpleDateFormat",
+                    "java.text.MessageFormat": "android.icu.text.MessageFormat",
+                    "java.text.DecimalFormat": "android.icu.text.DecimalFormat",
+                }
+
+                for m in clazz.ctors + clazz.methods:
+                    types = []
+                    types.extend(m.typ)
+                    types.extend(m.args)
+                    for arg in types:
+                        if arg in better:
+                            warn(clazz, m, None, "Type %s should be replaced with richer ICU type %s" % (arg, better[arg]))
+         */
         if (type.primitive) {
             return
         }
@@ -2524,6 +3399,13 @@
     }
 
     private fun checkClone(method: MethodItem) {
+        /*
+            def verify_clone(clazz):
+                """Verify that clone() isn't implemented; see EJ page 61."""
+                for m in clazz.methods:
+                    if m.name == "clone":
+                        error(clazz, m, None, "Provide an explicit copy constructor instead of implementing clone()")
+         */
         if (method.name() == "clone" && method.parameters().isEmpty()) {
             report(
                 NO_CLONE, method,
@@ -2533,9 +3415,27 @@
     }
 
     private fun checkPfd(type: String, item: Item) {
+        /*
+            def verify_pfd(clazz):
+                """Verify that android APIs use PFD over FD."""
+                examine = clazz.ctors + clazz.methods
+                for m in examine:
+                    if m.typ == "java.io.FileDescriptor":
+                        error(clazz, m, "FW11", "Must use ParcelFileDescriptor")
+                    if m.typ == "int":
+                        if "Fd" in m.name or "FD" in m.name or "FileDescriptor" in m.name:
+                            error(clazz, m, "FW11", "Must use ParcelFileDescriptor")
+                    for arg in m.args:
+                        if arg == "java.io.FileDescriptor":
+                            error(clazz, m, "FW11", "Must use ParcelFileDescriptor")
+
+                for f in clazz.fields:
+                    if f.typ == "java.io.FileDescriptor":
+                        error(clazz, f, "FW11", "Must use ParcelFileDescriptor")
+
+         */
         if (item.containingClass()?.qualifiedName() in lowLevelFileClassNames ||
-            isServiceDumpMethod(item)
-        ) {
+            isServiceDumpMethod(item)) {
             return
         }
 
@@ -2556,6 +3456,28 @@
     }
 
     private fun checkNumbers(type: String, item: Item) {
+        /*
+            def verify_numbers(clazz):
+                """Discourage small numbers types like short and byte."""
+
+                discouraged = ["short","byte"]
+
+                for c in clazz.ctors:
+                    for arg in c.args:
+                        if arg in discouraged:
+                            warn(clazz, c, "FW12", "Should avoid odd sized primitives; use int instead")
+
+                for f in clazz.fields:
+                    if f.typ in discouraged:
+                        warn(clazz, f, "FW12", "Should avoid odd sized primitives; use int instead")
+
+                for m in clazz.methods:
+                    if m.typ in discouraged:
+                        warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead")
+                    for arg in m.args:
+                        if arg in discouraged:
+                            warn(clazz, m, "FW12", "Should avoid odd sized primitives; use int instead")
+         */
         if (type == "short" || type == "byte") {
             report(
                 NO_BYTE_OR_SHORT, item,
@@ -2569,6 +3491,19 @@
         methods: Sequence<MethodItem>,
         constructors: Sequence<ConstructorItem>
     ) {
+        /*
+            def verify_singleton(clazz):
+                """Catch singleton objects with constructors."""
+
+                singleton = False
+                for m in clazz.methods:
+                    if m.name.startswith("get") and m.name.endswith("Instance") and " static " in m.raw:
+                        singleton = True
+
+                if singleton:
+                    for c in clazz.ctors:
+                        error(clazz, c, None, "Singleton classes should use getInstance() methods")
+         */
         if (constructors.none()) {
             return
         }
@@ -2600,14 +3535,22 @@
         badFutureTypes.firstOrNull { cls.extendsOrImplements(it) }?.let {
             val extendOrImplement = if (cls.extends(it)) "extend" else "implement"
             report(
-                BAD_FUTURE, cls,
-                "${cls.simpleName()} should not $extendOrImplement `$it`." +
-                    " In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal`."
+                BAD_FUTURE, cls, "${cls.simpleName()} should not $extendOrImplement `$it`." +
+                    " In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of Consumer<T>, Executor, and CancellationSignal`."
             )
         }
     }
 
     private fun checkTypedef(cls: ClassItem) {
+        /*
+        def verify_intdef(clazz):
+            """intdefs must be @hide, because the constant names cannot be stored in
+               the stubs (only the values are, which is not useful)"""
+            if "@interface" not in clazz.split:
+                return
+            if "@IntDef" in clazz.annotations or "@LongDef" in clazz.annotations:
+                error(clazz, None, None, "@IntDef and @LongDef annotations must be @hide")
+         */
         if (cls.isAnnotationType()) {
             cls.modifiers.annotations().firstOrNull { it.isTypeDefAnnotation() }?.let {
                 report(PUBLIC_TYPEDEF, cls, "Don't expose ${AnnotationItem.simpleName(it)}: ${cls.simpleName()} must be hidden.")
@@ -2616,6 +3559,21 @@
     }
 
     private fun checkUri(typeString: String, item: Item) {
+        /*
+        def verify_uris(clazz):
+            bad = ["java.net.URL", "java.net.URI", "android.net.URL"]
+
+            for f in clazz.fields:
+                if f.typ in bad:
+                    error(clazz, f, None, "Field must be android.net.Uri instead of " + f.typ)
+
+            for m in clazz.methods + clazz.ctors:
+                if m.typ in bad:
+                    error(clazz, m, None, "Must return android.net.Uri instead of " + m.typ)
+                for arg in m.args:
+                    if arg in bad:
+                        error(clazz, m, None, "Argument must take android.net.Uri instead of " + arg)
+         */
         badUriTypes.firstOrNull { typeString.contains(it) }?.let {
             report(
                 ANDROID_URI, item, "Use android.net.Uri instead of $it (${item.describe()})"
@@ -2626,23 +3584,8 @@
     private fun checkFutures(typeString: String, item: Item) {
         badFutureTypes.firstOrNull { typeString.contains(it) }?.let {
             report(
-                BAD_FUTURE, item,
-                "Use ListenableFuture (library), " +
-                    "or a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal (platform) instead of $it (${item.describe()})"
-            )
-        }
-    }
-
-    private fun checkMethodSuffixListenableFutureReturn(type: TypeItem, method: MethodItem) {
-        if (type.toTypeString().contains(listenableFuture) &&
-            !method.isConstructor() &&
-            !method.name().endsWith("Async")
-        ) {
-            report(
-                ASYNC_SUFFIX_FUTURE,
-                method,
-                "Methods returning $listenableFuture should have a suffix *Async to " +
-                    "reserve unmodified name for a suspend function"
+                BAD_FUTURE, item, "Use ListenableFuture (library), " +
+                    "or a combination of Consumer<T>, Executor, and CancellationSignal (platform) instead of $it (${item.describe()})"
             )
         }
     }
@@ -2670,9 +3613,7 @@
             name: String,
             prop: (GetterSetterPattern) -> String
         ) = firstOrNull {
-            name.startsWith(prop(it)) && name.getOrNull(prop(it).length)?.let { charAfterPrefix ->
-                charAfterPrefix.isUpperCase() || charAfterPrefix.isDigit()
-            } ?: false
+            name.startsWith(prop(it)) && name.getOrNull(prop(it).length)?.isUpperCase() ?: false
         }
 
         private val badBooleanGetterPrefixes = listOf("isHas", "isCan", "isShould", "get", "is")
@@ -2689,8 +3630,6 @@
             "java.util.concurrent.Future"
         )
 
-        private val listenableFuture = "com.google.common.util.concurrent.ListenableFuture"
-
         /**
          * Classes for manipulating file descriptors directly, where using ParcelFileDescriptor
          * isn't required
@@ -2810,14 +3749,7 @@
             if (s.none { it.isLowerCase() }) {
                 // The entire thing is capitalized. If so, just perform
                 // normal capitalization, but try dropping _'s.
-                return SdkVersionInfo.underlinesToCamelCase(s.lowercase(Locale.US))
-                    .replaceFirstChar {
-                        if (it.isLowerCase()) {
-                            it.titlecase(Locale.getDefault())
-                        } else {
-                            it.toString()
-                        }
-                    }
+                return SdkVersionInfo.underlinesToCamelCase(s.toLowerCase(Locale.US)).capitalize()
             }
 
             while (true) {
@@ -2830,13 +3762,13 @@
                 // next word so capitalize it
                 s = if (index == s.length - acronym.length) {
                     // acronym at the end of the word word
-                    val decapitalized = acronym[0] + acronym.substring(1).lowercase(Locale.US)
+                    val decapitalized = acronym[0] + acronym.substring(1).toLowerCase(Locale.US)
                     s.replace(acronym, decapitalized)
                 } else {
                     val replacement = acronym[0] + acronym.substring(
                         1,
                         acronym.length - 1
-                    ).lowercase(Locale.US) + acronym[acronym.length - 1]
+                    ).toLowerCase(Locale.US) + acronym[acronym.length - 1]
                     s.replace(acronym, replacement)
                 }
             }
@@ -2859,4 +3791,4 @@
 1. Suppress the issues with @Suppress("<id>") / @SuppressWarnings("<id>")
 2. Update the baseline passed into metalava
 ************************************************************
-"""
+"""
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/ApiPredicate.kt b/src/main/java/com/android/tools/metalava/ApiPredicate.kt
index ff60efc..1178900 100644
--- a/src/main/java/com/android/tools/metalava/ApiPredicate.kt
+++ b/src/main/java/com/android/tools/metalava/ApiPredicate.kt
@@ -106,9 +106,8 @@
             }
         }
         while (clazz != null) {
-            visible = visible and (
-                clazz.isPublic || clazz.isProtected ||
-                    (clazz.isInternal && clazz.hasShowAnnotation())
+            visible = visible and (clazz.isPublic || clazz.isProtected ||
+                (clazz.isInternal && clazz.hasShowAnnotation())
                 )
             hasShowAnnotation = hasShowAnnotation or (ignoreShown || clazz.hasShowAnnotation())
             hidden = hidden or clazz.hidden
diff --git a/src/main/java/com/android/tools/metalava/ArtifactTagger.kt b/src/main/java/com/android/tools/metalava/ArtifactTagger.kt
index a9b30f4..916ace5 100644
--- a/src/main/java/com/android/tools/metalava/ArtifactTagger.kt
+++ b/src/main/java/com/android/tools/metalava/ArtifactTagger.kt
@@ -16,11 +16,11 @@
 
 package com.android.tools.metalava
 
-import com.android.tools.metalava.model.ClassItem
-import com.android.tools.metalava.model.Codebase
 import com.android.tools.metalava.model.text.ApiFile
 import com.android.tools.metalava.model.text.ApiParseException
 import com.android.tools.metalava.model.text.TextCodebase
+import com.android.tools.metalava.model.ClassItem
+import com.android.tools.metalava.model.Codebase
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import java.io.File
 
diff --git a/src/main/java/com/android/tools/metalava/Baseline.kt b/src/main/java/com/android/tools/metalava/Baseline.kt
index 62228f5..6921442 100644
--- a/src/main/java/com/android/tools/metalava/Baseline.kt
+++ b/src/main/java/com/android/tools/metalava/Baseline.kt
@@ -204,8 +204,7 @@
             if (line.startsWith("//") ||
                 line.startsWith("#") ||
                 line.isBlank() ||
-                line.startsWith(" ")
-            ) {
+                line.startsWith(" ")) {
                 continue
             }
             val idEnd = line.indexOf(':')
@@ -272,11 +271,9 @@
         }
 
         writer.println("Baseline issue type counts for $description baseline:")
-        writer.println(
-            "" +
-                "    Count Issue Id                       Severity\n" +
-                "    ---------------------------------------------\n"
-        )
+        writer.println("" +
+            "    Count Issue Id                       Severity\n" +
+            "    ---------------------------------------------\n")
         val list = counts.entries.toMutableList()
         list.sortWith(compareBy({ -it.value }, { it.key.name }))
         var total = 0
@@ -286,11 +283,9 @@
             writer.println("    ${String.format("%5d", count)} ${String.format("%-30s", issue.name)} ${configuration.getSeverity(issue)}")
             total += count
         }
-        writer.println(
-            "" +
-                "    ---------------------------------------------\n" +
-                "    ${String.format("%5d", total)}"
-        )
+        writer.println("" +
+            "    ---------------------------------------------\n" +
+            "    ${String.format("%5d", total)}")
         writer.println()
     }
 
diff --git a/src/main/java/com/android/tools/metalava/CommandArgsPreprocessor.kt b/src/main/java/com/android/tools/metalava/CommandArgsPreprocessor.kt
index 2eb6f9f..a4c7fa8 100644
--- a/src/main/java/com/android/tools/metalava/CommandArgsPreprocessor.kt
+++ b/src/main/java/com/android/tools/metalava/CommandArgsPreprocessor.kt
@@ -41,7 +41,15 @@
             if (prepend.isEmpty() && append.isEmpty()) {
                 args
             } else {
-                prepend + args + append
+                val index = args.indexOf(ARG_GENERATE_DOCUMENTATION)
+                val newArgs =
+                    if (index != -1) {
+                        args.sliceArray(0 until index) + prepend +
+                            args.sliceArray(index until args.size) + append
+                    } else {
+                        prepend + args + append
+                    }
+                newArgs
             }
         } else {
             args
@@ -141,8 +149,7 @@
 /** Generate a rerun script file name minus the extension. */
 private fun createRerunScriptBaseFilename(): String {
     val timestamp = LocalDateTime.now().format(
-        DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss.SSS")
-    )
+        DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss.SSS"))
 
     val uniqueInt = Random.nextInt(0, Int.MAX_VALUE)
     val dir = System.getenv("METALAVA_TEMP") ?: System.getenv("TMP") ?: System.getenv("TEMP") ?: "/tmp"
@@ -171,8 +178,7 @@
     val script = File("$scriptBaseName.sh")
     var optFileIndex = 0
     script.printWriter().use { out ->
-        out.println(
-            """
+        out.println("""
             |#!/bin/sh
             |#
             |# Auto-generated $PROGRAM_NAME rerun script
@@ -189,20 +195,17 @@
             |jvm_opts=(${"$"}METALAVA_JVM_OPTS)
             |
             |if [ ${"$"}{#jvm_opts[@]} -eq 0 ] ; then
-            """.trimMargin()
-        )
+            """.trimMargin())
 
         jvmOptions.forEach {
             out.println("""    jvm_opts+=(${shellEscape(it)})""")
         }
 
-        out.println(
-            """
+        out.println("""
             |fi
             |
             |${"$"}METALAVA_RUN_PREFIX $java "${"$"}{jvm_opts[@]}" \
-            """.trimMargin()
-        )
+            """.trimMargin())
         out.println("""    -jar $jar \""")
 
         // Write the actual metalava options
@@ -235,4 +238,4 @@
     // Just wrap a string in ' ... ', except of it contains a ', it needs to be changed to
     // '\''.
     return "'" + s.replace("""'""", """'\''""") + "'"
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt b/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt
index 18efeae..d131508 100644
--- a/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt
+++ b/src/main/java/com/android/tools/metalava/ComparisonVisitor.kt
@@ -22,14 +22,15 @@
 import com.android.tools.metalava.model.ConstructorItem
 import com.android.tools.metalava.model.FieldItem
 import com.android.tools.metalava.model.Item
-import com.android.tools.metalava.model.MergedCodebase
 import com.android.tools.metalava.model.MethodItem
+import com.android.tools.metalava.model.MergedCodebase
 import com.android.tools.metalava.model.PackageItem
 import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.PropertyItem
 import com.android.tools.metalava.model.VisitCandidate
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.intellij.util.containers.Stack
+import java.util.Comparator
 import java.util.function.Predicate
 
 /**
@@ -305,8 +306,7 @@
                 val superField = newParent.findField(
                     fieldName = old.name(),
                     includeSuperClasses = true,
-                    includeInterfaces = true
-                )
+                    includeInterfaces = true)
 
                 if (superField != null && (filter == null || filter.test(superField))) {
                     superField.duplicate(newParent)
@@ -402,20 +402,14 @@
                         item1.qualifiedName().compareTo((item2 as ClassItem).qualifiedName())
                     }
                     is MethodItem -> {
-                        // Try to incrementally match aspects of the method until you can conclude
-                        // whether they are the same or different.
-                        // delta is 0 when the methods are the same, else not 0
-                        // Start by comparing the names
                         var delta = item1.name().compareTo((item2 as MethodItem).name())
                         if (delta == 0) {
-                            // If the names are the same then compare the number of parameters
                             val parameters1 = item1.parameters()
                             val parameters2 = item2.parameters()
                             val parameterCount1 = parameters1.size
                             val parameterCount2 = parameters2.size
                             delta = parameterCount1 - parameterCount2
                             if (delta == 0) {
-                                // If the parameter count is the same, compare the parameter types
                                 for (i in 0 until parameterCount1) {
                                     val parameter1 = parameters1[i]
                                     val parameter2 = parameters2[i]
@@ -423,7 +417,7 @@
                                     val type2 = parameter2.type().toTypeString(context = parameter2)
                                     delta = type1.compareTo(type2)
                                     if (delta != 0) {
-                                        // If the parameter types aren't the same, try a little harder:
+                                        // Try a little harder:
                                         //  (1) treat varargs and arrays the same, and
                                         //  (2) drop java.lang. prefixes from comparisons in wildcard
                                         //      signatures since older signature files may have removed
@@ -432,21 +426,15 @@
                                         val simpleType2 = parameter2.type().toCanonicalType(parameter2)
                                         delta = simpleType1.compareTo(simpleType2)
                                         if (delta != 0) {
-                                            // If still not the same, check the special case for
-                                            // Kotlin coroutines: It's possible one has "experimental"
-                                            // when fully qualified while the other does not.
-                                            // We treat these the same, so strip the prefix and strip
-                                            // "experimental", then compare.
+                                            // Special case: Kotlin coroutines
                                             if (simpleType1.startsWith("kotlin.coroutines.") && simpleType2.startsWith("kotlin.coroutines.")) {
                                                 val t1 = simpleType1.removePrefix("kotlin.coroutines.").removePrefix("experimental.")
                                                 val t2 = simpleType2.removePrefix("kotlin.coroutines.").removePrefix("experimental.")
                                                 delta = t1.compareTo(t2)
                                                 if (delta != 0) {
-                                                    // They're not the same
                                                     break
                                                 }
                                             } else {
-                                                // They're not the same
                                                 break
                                             }
                                         }
@@ -454,7 +442,6 @@
                                 }
                             }
                         }
-                        // The method names are different, return the result of the compareTo
                         delta
                     }
                     is FieldItem -> {
@@ -464,7 +451,7 @@
                         item1.parameterIndex.compareTo((item2 as ParameterItem).parameterIndex)
                     }
                     is AnnotationItem -> {
-                        (item1.qualifiedName ?: "").compareTo((item2 as AnnotationItem).qualifiedName ?: "")
+                        (item1.qualifiedName() ?: "").compareTo((item2 as AnnotationItem).qualifiedName() ?: "")
                     }
                     is PropertyItem -> {
                         item1.name().compareTo((item2 as PropertyItem).name())
@@ -548,23 +535,23 @@
                 // So, when doing compatibility checking we want to consider public APIs even if the caller didn't explicitly pass --show-unannotated
                 showUnannotated = true
             ) {
-                    override fun visitItem(item: Item) {
-                        val node = ItemTree(item)
-                        val parent = stack.peek()
-                        parent.children += node
+                override fun visitItem(item: Item) {
+                    val node = ItemTree(item)
+                    val parent = stack.peek()
+                    parent.children += node
 
-                        stack.push(node)
-                    }
+                    stack.push(node)
+                }
 
-                    override fun include(cls: ClassItem): Boolean = if (acceptAll) true else super.include(cls)
+                override fun include(cls: ClassItem): Boolean = if (acceptAll) true else super.include(cls)
 
-                    /** Include all classes in the tree, even implicitly defined classes (such as containing classes) */
-                    override fun shouldEmitClass(vc: VisitCandidate): Boolean = true
+                /** Include all classes in the tree, even implicitly defined classes (such as containing classes) */
+                override fun shouldEmitClass(vc: VisitCandidate): Boolean = true
 
-                    override fun afterVisitItem(item: Item) {
-                        stack.pop()
-                    }
-                })
+                override fun afterVisitItem(item: Item) {
+                    stack.pop()
+                }
+            })
         }
 
         if (codebases.count() >= 2) {
diff --git a/src/main/java/com/android/tools/metalava/Compatibility.kt b/src/main/java/com/android/tools/metalava/Compatibility.kt
new file mode 100644
index 0000000..e7000bd
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/Compatibility.kt
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava
+
+const val COMPAT_MODE_BY_DEFAULT = true
+
+/**
+ * The old API generator code had a number of quirks. Initially we want to simulate these
+ * quirks to produce compatible signature files and APIs, but we want to track what these quirks
+ * are and be able to turn them off eventually. This class offers more fine grained control
+ * of these compatibility behaviors such that we can enable/disable them selectively
+ */
+var compatibility: Compatibility = Compatibility()
+
+class Compatibility(
+    /** Whether compatibility is generally on */
+    val compat: Boolean = COMPAT_MODE_BY_DEFAULT
+) {
+
+    /** In signature files, use "implements" instead of "extends" for the super class of
+     * an interface */
+    var extendsForInterfaceSuperClass: Boolean = compat
+
+    /** In signature files, refer to annotations as an "abstract class" instead of an "@interface"
+     * and implementing this interface: java.lang.annotation.Annotation */
+    var classForAnnotations: Boolean = compat
+
+    /** Add in explicit `valueOf` and `values` methods into enum classes */
+    var defaultEnumMethods: Boolean = compat
+
+    /** Whether signature files should contain annotation default values (as is already
+     * done for field default values) */
+    var includeAnnotationDefaults: Boolean = !compat
+
+    /** In signature files, refer to enums as "class" instead of "enum" */
+    var classForEnums: Boolean = compat
+
+    /** Whether to use a nonstandard, compatibility modifier order instead of the Java canonical order.
+     * ("deprecated" isn't a real modifier, so in "standard" mode it's listed first, as if it was the
+     * `@Deprecated` annotation before the modifier list */
+    var nonstandardModifierOrder: Boolean = compat
+
+    /** Whether to include instance methods in annotation classes for the annotation properties */
+    var skipAnnotationInstanceMethods: Boolean = compat
+
+    /**
+     * In signature files, whether interfaces should also be described as "abstract"
+     */
+    var abstractInInterfaces: Boolean = compat
+
+    /**
+     * In signature files, whether annotation types should also be described as "abstract"
+     */
+    var abstractInAnnotations: Boolean = compat
+
+    /**
+     * In signature files, whether interfaces can be listed as final
+     */
+    var finalInInterfaces: Boolean = compat
+
+    /**
+     * In this signature
+     *        public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
+     *  doclava1 would treat this as "throws Throwable" instead of "throws X". This variable turns on
+     *  this compat behavior.
+     * */
+    var useErasureInThrows: Boolean = compat
+
+    /**
+     * Whether throws classes in methods should be filtered. This should definitely
+     * be the case, but doclava1 doesn't. Note that this only applies to signature
+     * files, not stub files.
+     */
+    var filterThrowsClasses: Boolean = !compat
+
+    /** Format `Map<K,V>` as `Map<K, V>` */
+    var spaceAfterCommaInTypes: Boolean = compat
+
+    /**
+     * Doclava1 omits type parameters in interfaces (in signature files, not in stubs)
+     */
+    var omitTypeParametersInInterfaces: Boolean = compat
+
+    /** Force methods named "values" in enums to be marked final. This was done by
+     * doclava1 with this comment:
+     *
+     *     Explicitly coerce 'final' state of Java6-compiled enum values() method,
+     *     to match the Java5-emitted base API description.
+     *
+     **/
+    var forceFinalInEnumValueMethods: Boolean = compat
+
+    /** Whether signature files and stubs should contain annotations */
+    var annotationsInSignatures: Boolean = !compat
+
+    /**
+     * When a public class implementing a public interface inherits the implementation
+     * of a method in that interface from a hidden super class, the method must be
+     * included in the stubs etc (since otherwise subclasses would believe they need
+     * to implement that method and can't just inherit it). However, doclava1 does not
+     * list these methods. This flag controls this compatibility behavior.
+     * Not that this refers only to the signature files, not the stub file generation.
+     *
+     * An example is StringBuilder#setLength.
+     */
+    var skipInheritedMethods: Boolean = compat
+
+    /**
+     * Similar to [skipInheritedMethods], but for field constants.
+     */
+    var skipInheritedConstants: Boolean = compat
+
+    /**
+     * Whether to include parameter names in the signature file
+     */
+    var parameterNames: Boolean = !compat
+
+    /**
+     * *Some* signatures for doclava1 wrote "<?>" as "<? extends java.lang.Object>",
+     * which is equivalent. Metalava does not do that. This flags ensures that the
+     * signature files look like the old ones for the specific methods which did this.
+     */
+    var includeExtendsObjectInWildcard = compat
+
+    /**
+     * Whether deprecation should be shown in signature files as an annotation
+     * instead of a pseudo-modifier
+     */
+    var deprecatedAsAnnotation = !compat
+
+    /** Whether synchronized should be part of the output */
+    var includeSynchronized = compat
+
+    /** Whether we should omit common packages such as java.lang.* and kotlin.* from signature output */
+    var omitCommonPackages = !compat
+
+    /** Whether we should explicitly include retention when class even if not explicitly defined */
+    var explicitlyListClassRetention = !compat
+
+    /**
+     * If true, a @Deprecated class will automatically deprecate all its inner classes
+     * as well.
+     */
+    var propagateDeprecatedInnerClasses = !compat
+
+    /**
+     * If true, a @Deprecated class will automatically deprecate all members (not
+     * including inner classes; for that see [propagateDeprecatedInnerClasses]) as well.
+     */
+    var propagateDeprecatedMembers = !compat
+
+    /**
+     * If an overriding method differs from its super method only by final or deprecated
+     * and the containing class is final or deprecated, skip it in the signature file
+     */
+    var hideDifferenceImplicit = !compat
+
+    /** Whether inner enums should be listed as static in the signature file. */
+    var staticEnums = compat
+
+    /**
+     * The -new_api flag in API check (which generates an XML diff of the differences
+     * between two APIs) in doclava was ignoring fields. This flag controls whether
+     * we do the same.
+     */
+    var includeFieldsInApiDiff = !compat
+
+    /**
+     * Whether to escape the > character in JDiff XML files. The XML spec does not require
+     * this but doclava does it.
+     */
+    var xmlEscapeGreaterThan = compat
+
+    /**
+     * When producing JDiff output for field arrays but where we
+     * do not have the value, emit "null" into the JDiff report. This isn't right but matches
+     * what doclava did.
+     */
+    var xmlShowArrayFieldsAsNull = compat
+
+    /**
+     * Doclava was missing enum fields in JDiff reports
+     */
+    var xmlSkipEnumFields = compat
+
+    /**
+     * Doclava was missing annotation instance methods in JDiff reports
+     */
+    var xmlSkipAnnotationMethods = compat
+
+    /** Doclava lists character field values as integers instead of chars */
+    var xmlCharAsInt = compat
+
+    /**
+     * Doclava listed the superclass of annotations as
+     * java.lang.Object.
+     */
+    var xmlAnnotationAsObject = compat
+
+    // Other examples: sometimes we sort by qualified name, sometimes by full name
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
index a127c59..3f8ba9e 100644
--- a/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
+++ b/src/main/java/com/android/tools/metalava/CompatibilityCheck.kt
@@ -16,9 +16,10 @@
 
 package com.android.tools.metalava
 
-import com.android.tools.metalava.Issues.Issue
 import com.android.tools.metalava.NullnessMigration.Companion.findNullnessAnnotation
 import com.android.tools.metalava.NullnessMigration.Companion.isNullable
+import com.android.tools.metalava.Issues.Issue
+import com.android.tools.metalava.model.text.TextCodebase
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.Codebase
@@ -31,8 +32,6 @@
 import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.configuration
-import com.android.tools.metalava.model.psi.PsiItem
-import com.android.tools.metalava.model.text.TextCodebase
 import com.intellij.psi.PsiField
 import java.io.File
 import java.util.function.Predicate
@@ -63,10 +62,11 @@
     data class CheckRequest(
         val file: File,
         val apiType: ApiType,
+        val releaseType: ReleaseType,
         val codebase: File? = null
     ) {
         override fun toString(): String {
-            return "--check-compatibility:${apiType.flagName}:released $file"
+            return "--check-compatibility:${apiType.flagName}:${releaseType.flagName} $file"
         }
     }
 
@@ -176,29 +176,27 @@
     }
 
     override fun compare(old: ParameterItem, new: ParameterItem) {
-        val prevName = old.publicName()
+        val prevName = old.publicName() ?: return
         val newName = new.publicName()
-        if (prevName != null) {
-            if (newName == null) {
-                report(
-                    Issues.PARAMETER_NAME_CHANGE,
-                    new,
-                    "Attempted to remove parameter name from ${describe(new)}"
-                )
-            } else if (newName != prevName) {
-                report(
-                    Issues.PARAMETER_NAME_CHANGE,
-                    new,
-                    "Attempted to change parameter name from $prevName to $newName in ${describe(new.containingMethod())}"
-                )
-            }
+        if (newName == null) {
+            report(
+                Issues.PARAMETER_NAME_CHANGE,
+                new,
+                "Attempted to remove parameter name from ${describe(new)} in ${describe(new.containingMethod())}"
+            )
+        } else if (newName != prevName) {
+            report(
+                Issues.PARAMETER_NAME_CHANGE,
+                new,
+                "Attempted to change parameter name from $prevName to $newName in ${describe(new.containingMethod())}"
+            )
         }
 
         if (old.hasDefaultValue() && !new.hasDefaultValue()) {
             report(
                 Issues.DEFAULT_VALUE_CHANGE,
                 new,
-                "Attempted to remove default value from ${describe(new)}"
+                "Attempted to remove default value from ${describe(new)} in ${describe(new.containingMethod())}"
             )
         }
 
@@ -224,10 +222,7 @@
         val oldModifiers = old.modifiers
         val newModifiers = new.modifiers
 
-        if (old.isInterface() != new.isInterface() ||
-            old.isEnum() != new.isEnum() ||
-            old.isAnnotationType() != new.isAnnotationType()
-        ) {
+        if (old.isInterface() != new.isInterface()) {
             report(
                 Issues.CHANGED_CLASS, new, "${describe(new, capitalize = true)} changed class/interface declaration"
             )
@@ -254,7 +249,7 @@
 
         if (!oldModifiers.isSealed() && newModifiers.isSealed()) {
             report(Issues.ADD_SEALED, new, "Cannot add 'sealed' modifier to ${describe(new)}: Incompatible change")
-        } else if (old.isClass() && !oldModifiers.isAbstract() && newModifiers.isAbstract()) {
+        } else if (old.isClass() && oldModifiers.isAbstract() != newModifiers.isAbstract()) {
             report(
                 Issues.CHANGED_ABSTRACT, new, "${describe(new, capitalize = true)} changed 'abstract' qualifier"
             )
@@ -287,6 +282,10 @@
                         Issues.ADDED_FINAL, new, "${describe(new, capitalize = true)} added 'final' qualifier"
                     )
                 }
+            } else if (oldModifiers.isFinal() && !newModifiers.isFinal()) {
+                report(
+                    Issues.REMOVED_FINAL, new, "${describe(new, capitalize = true)} removed 'final' qualifier"
+                )
             }
 
             if (oldModifiers.isStatic() != newModifiers.isStatic()) {
@@ -336,10 +335,10 @@
             }
         }
 
-        if (old.hasTypeVariables() || new.hasTypeVariables()) {
+        if (old.hasTypeVariables() && new.hasTypeVariables()) {
             val oldTypeParamsCount = old.typeParameterList().typeParameterCount()
             val newTypeParamsCount = new.typeParameterList().typeParameterCount()
-            if (oldTypeParamsCount > 0 && oldTypeParamsCount != newTypeParamsCount) {
+            if (oldTypeParamsCount != newTypeParamsCount) {
                 report(
                     Issues.CHANGED_TYPE, new,
                     "${describe(
@@ -370,11 +369,10 @@
                     compatible = false
                 }
             } else if (oldTypeParameter == null && newTypeParameter != null) {
-                val constraints = newTypeParameter.typeBounds()
+                val constraints = newTypeParameter.bounds()
                 for (constraint in constraints) {
                     val oldClass = oldReturnType.asClass()
-                    val newClass = constraint.asClass()
-                    if (oldClass == null || newClass == null || !oldClass.extendsOrImplements(newClass.qualifiedName())) {
+                    if (oldClass == null || !oldClass.extendsOrImplements(constraint.qualifiedName())) {
                         compatible = false
                     }
                 }
@@ -385,8 +383,8 @@
             } else {
                 // If both return types are parameterized then the constraints must be
                 // exactly the same.
-                val oldConstraints = oldTypeParameter?.typeBounds() ?: emptyList()
-                val newConstraints = newTypeParameter?.typeBounds() ?: emptyList()
+                val oldConstraints = oldTypeParameter?.bounds() ?: emptyList()
+                val newConstraints = newTypeParameter?.bounds() ?: emptyList()
                 if (oldConstraints.size != newConstraints.size ||
                     newConstraints != oldConstraints
                 ) {
@@ -418,12 +416,8 @@
                 report(Issues.CHANGED_TYPE, new, message)
             }
 
-            // Annotation methods
-            if (
-                new.containingClass().isAnnotationType() &&
-                old.containingClass().isAnnotationType() &&
-                new.defaultValue() != old.defaultValue()
-            ) {
+            // Annotation methods?
+            if (!old.hasSameValue(new)) {
                 val prevValue = old.defaultValue()
                 val prevString = if (prevValue.isEmpty()) {
                     "nothing"
@@ -478,14 +472,6 @@
             }
         }
 
-        if (new.containingClass().isInterface() || new.containingClass().isAnnotationType()) {
-            if (oldModifiers.isDefault() && newModifiers.isAbstract()) {
-                report(
-                    Issues.CHANGED_DEFAULT, new, "${describe(new, capitalize = true)} has changed 'default' qualifier"
-                )
-            }
-        }
-
         if (oldModifiers.isNative() != newModifiers.isNative()) {
             report(
                 Issues.CHANGED_NATIVE, new, "${describe(new, capitalize = true)} has changed 'native' qualifier"
@@ -506,9 +492,11 @@
                 // and (b) the method is not already inferred to be 'final' by virtue of its class.
                 if (!old.isEffectivelyFinal() && new.isEffectivelyFinal()) {
                     report(
-                        Issues.ADDED_FINAL,
-                        new,
-                        "${describe(new, capitalize = true)} has added 'final' qualifier"
+                        Issues.ADDED_FINAL, new, "${describe(new, capitalize = true)} has added 'final' qualifier"
+                    )
+                } else if (old.isEffectivelyFinal() && !new.isEffectivelyFinal()) {
+                    report(
+                        Issues.REMOVED_FINAL, new, "${describe(new, capitalize = true)} has removed 'final' qualifier"
                     )
                 }
             }
@@ -523,13 +511,13 @@
         val oldVisibility = oldModifiers.getVisibilityString()
         val newVisibility = newModifiers.getVisibilityString()
         if (oldVisibility != newVisibility) {
-            // Only report issue if the change is a decrease in access; e.g. public -> protected
-            if (!newModifiers.asAccessibleAs(oldModifiers)) {
-                report(
-                    Issues.CHANGED_SCOPE, new,
-                    "${describe(new, capitalize = true)} changed visibility from $oldVisibility to $newVisibility"
-                )
-            }
+            // TODO: Use newModifiers.asAccessibleAs(oldModifiers) to provide different error messages
+            // based on whether this seems like a reasonable change, e.g. making a private or final method more
+            // accessible is fine (no overridden method affected) but not making methods less accessible etc
+            report(
+                Issues.CHANGED_SCOPE, new,
+                "${describe(new, capitalize = true)} changed visibility from $oldVisibility to $newVisibility"
+            )
         }
 
         if (old.deprecated != new.deprecated) {
@@ -574,8 +562,7 @@
                 if (!(old.name() == "finalize" && old.parameters().isEmpty()) &&
                     // exclude cases where throws clause was missing in signatures from
                     // old enum methods
-                    !old.isEnumSyntheticMethod()
-                ) {
+                    !old.isEnumSyntheticMethod()) {
                     val message = "${describe(new, capitalize = true)} added thrown exception ${exec.qualifiedName()}"
                     report(Issues.CHANGED_THROWS, new, message)
                 }
@@ -594,7 +581,7 @@
                         new,
                         capitalize = true
                     )} made type variable ${newTypes[i].simpleName()} reified: incompatible change"
-                    report(Issues.ADDED_REIFIED, new, message)
+                    report(Issues.CHANGED_THROWS, new, message)
                 }
             }
         }
@@ -602,13 +589,13 @@
 
     private fun describeBounds(
         type: TypeItem,
-        constraints: List<TypeItem>
+        constraints: List<ClassItem>
     ): String {
         return type.toSimpleType() +
             if (constraints.isEmpty()) {
                 " (extends java.lang.Object)"
             } else {
-                " (extends ${constraints.joinToString(separator = " & ") { it.toTypeString() }})"
+                " (extends ${constraints.joinToString(separator = " & ") { it.qualifiedName() }})"
             }
     }
 
@@ -623,14 +610,14 @@
                 val message = "${describe(new, capitalize = true)} has changed type from $oldType to $newType"
                 report(Issues.CHANGED_TYPE, new, message)
             } else if (!old.hasSameValue(new)) {
-                val prevValue = old.initialValue()
+                val prevValue = old.initialValue(true)
                 val prevString = if (prevValue == null && !old.modifiers.isFinal()) {
                     "nothing/not constant"
                 } else {
                     prevValue
                 }
 
-                val newValue = new.initialValue()
+                val newValue = new.initialValue(true)
                 val newString = if (newValue is PsiField) {
                     newValue.containingClass?.qualifiedName + "." + newValue.name
                 } else {
@@ -641,25 +628,26 @@
                     capitalize = true
                 )} has changed value from $prevString to $newString"
 
-                report(Issues.CHANGED_VALUE, new, message)
+                if (message == "Field android.telephony.data.ApnSetting.TYPE_DEFAULT has changed value from 17 to 1") {
+                    // Temporarily ignore: this value changed incompatibly from 28.txt to current.txt.
+                    // It's not clear yet whether this value change needs to be reverted, or suppressed
+                    // permanently in the source code, but suppressing from metalava so we can unblock
+                    // getting the compatibility checks enabled.
+                } else
+                    report(Issues.CHANGED_VALUE, new, message)
             }
         }
 
         val oldVisibility = oldModifiers.getVisibilityString()
         val newVisibility = newModifiers.getVisibilityString()
         if (oldVisibility != newVisibility) {
-            // Only report issue if the change is a decrease in access; e.g. public -> protected
-            if (!newModifiers.asAccessibleAs(oldModifiers)) {
-                report(
-                    Issues.CHANGED_SCOPE, new,
-                    "${
-                    describe(
-                        new,
-                        capitalize = true
-                    )
-                    } changed visibility from $oldVisibility to $newVisibility"
-                )
-            }
+            // TODO: Use newModifiers.asAccessibleAs(oldModifiers) to provide different error messages
+            // based on whether this seems like a reasonable change, e.g. making a private or final method more
+            // accessible is fine (no overridden method affected) but not making methods less accessible etc
+            report(
+                Issues.CHANGED_SCOPE, new,
+                "${describe(new, capitalize = true)} changed visibility from $oldVisibility to $newVisibility"
+            )
         }
 
         if (oldModifiers.isStatic() != newModifiers.isStatic()) {
@@ -672,16 +660,18 @@
             report(
                 Issues.ADDED_FINAL, new, "${describe(new, capitalize = true)} has added 'final' qualifier"
             )
-        } else if (
-            // Final can't be removed if field is static with compile-time constant
-            oldModifiers.isFinal() && !newModifiers.isFinal() &&
-            oldModifiers.isStatic() && old.initialValue() != null
-        ) {
+        } else if (oldModifiers.isFinal() && !newModifiers.isFinal()) {
             report(
                 Issues.REMOVED_FINAL, new, "${describe(new, capitalize = true)} has removed 'final' qualifier"
             )
         }
 
+        if (oldModifiers.isTransient() != newModifiers.isTransient()) {
+            report(
+                Issues.CHANGED_TRANSIENT, new, "${describe(new, capitalize = true)} has changed 'transient' qualifier"
+            )
+        }
+
         if (oldModifiers.isVolatile() != newModifiers.isVolatile()) {
             report(
                 Issues.CHANGED_VOLATILE, new, "${describe(new, capitalize = true)} has changed 'volatile' qualifier"
@@ -832,26 +822,7 @@
         }
 
         if (inherited == null || inherited == new || !inherited.modifiers.isAbstract()) {
-            val error = when {
-                new.modifiers.isAbstract() -> Issues.ADDED_ABSTRACT_METHOD
-                new.containingClass().isInterface() -> when {
-                    new.modifiers.isStatic() -> Issues.ADDED_METHOD
-                    new.modifiers.isDefault() -> {
-                        // Hack to always mark added Kotlin interface methods as abstract until
-                        // we properly support JVM default methods for Kotlin. This has to check
-                        // if it's a PsiItem because TextItem doesn't support isKotlin.
-                        //
-                        // TODO(b/200077254): Remove Kotlin special case
-                        if (new is PsiItem && new.isKotlin()) {
-                            Issues.ADDED_ABSTRACT_METHOD
-                        } else {
-                            Issues.ADDED_METHOD
-                        }
-                    }
-                    else -> Issues.ADDED_ABSTRACT_METHOD
-                }
-                else -> Issues.ADDED_METHOD
-            }
+            val error = if (new.modifiers.isAbstract()) Issues.ADDED_ABSTRACT_METHOD else Issues.ADDED_METHOD
             handleAdded(error, new)
         }
     }
@@ -922,6 +893,7 @@
         fun checkCompatibility(
             codebase: Codebase,
             previous: Codebase,
+            releaseType: ReleaseType,
             apiType: ApiType,
             oldBase: Codebase? = null,
             newBase: Codebase? = null
@@ -930,13 +902,19 @@
                 .or(apiType.getEmitFilter())
                 .or(ApiType.PUBLIC_API.getReferenceFilter())
                 .or(ApiType.PUBLIC_API.getEmitFilter())
-            val checker = CompatibilityCheck(filter, previous, apiType, newBase, options.reporterCompatibilityReleased)
+            val checker = CompatibilityCheck(filter, previous, apiType, newBase, getReporterForReleaseType(releaseType))
+            val issueConfiguration = releaseType.getIssueConfiguration()
+            val previousConfiguration = configuration
             // newBase is considered part of the current codebase
             val currentFullCodebase = MergedCodebase(listOf(newBase, codebase).filterNotNull())
             // oldBase is considered part of the previous codebase
             val previousFullCodebase = MergedCodebase(listOf(oldBase, previous).filterNotNull())
-
-            CodebaseComparator().compare(checker, previousFullCodebase, currentFullCodebase, filter)
+            try {
+                configuration = issueConfiguration
+                CodebaseComparator().compare(checker, previousFullCodebase, currentFullCodebase, filter)
+            } finally {
+                configuration = previousConfiguration
+            }
 
             val message = "Found compatibility problems checking " +
                 "the ${apiType.displayName} API (${codebase.location}) against the API in ${previous.location}"
@@ -945,5 +923,10 @@
                 throw DriverException(exitCode = -1, stderr = message)
             }
         }
+
+        private fun getReporterForReleaseType(releaseType: ReleaseType): Reporter = when (releaseType) {
+            ReleaseType.DEV -> options.reporterCompatibilityCurrent
+            ReleaseType.RELEASED -> options.reporterCompatibilityReleased
+        }
     }
 }
diff --git a/src/main/java/com/android/tools/metalava/Constants.kt b/src/main/java/com/android/tools/metalava/Constants.kt
index 943a21e..a763b56 100644
--- a/src/main/java/com/android/tools/metalava/Constants.kt
+++ b/src/main/java/com/android/tools/metalava/Constants.kt
@@ -23,23 +23,20 @@
 const val JAVA_LANG_THROWABLE = "java.lang.Throwable"
 const val JAVA_LANG_ANNOTATION = "java.lang.annotation.Annotation"
 const val JAVA_LANG_DEPRECATED = "java.lang.Deprecated"
-const val ORG_JETBRAINS_ANNOTATIONS_PREFIX = "org.jetbrains.annotations."
-const val ORG_INTELLIJ_LANG_ANNOTATIONS_PREFIX = "org.intellij.lang.annotations."
+const val ANDROID_SUPPORT_ANNOTATION_PREFIX = "android.support.annotation."
 const val ANDROID_ANNOTATION_PREFIX = "android.annotation."
 const val ANDROIDX_ANNOTATION_PREFIX = "androidx.annotation."
 const val ANDROIDX_NONNULL = "androidx.annotation.NonNull"
 const val ANDROIDX_NULLABLE = "androidx.annotation.Nullable"
 const val ANDROID_SYSTEM_API = "android.annotation.SystemApi"
 const val ANDROID_REQUIRES_PERMISSION = "android.annotation.RequiresPermission"
-const val ANDROID_DEPRECATED_FOR_SDK = "android.annotation.DeprecatedForSdk"
 const val RECENTLY_NULLABLE = "androidx.annotation.RecentlyNullable"
 const val RECENTLY_NONNULL = "androidx.annotation.RecentlyNonNull"
 const val ANDROID_NULLABLE = "android.annotation.Nullable"
 const val ANDROID_NONNULL = "android.annotation.NonNull"
-const val ANDROID_SDK_CONSTANT = "android.annotation.SdkConstant"
 const val ANDROIDX_VISIBLE_FOR_TESTING = "androidx.annotation.VisibleForTesting"
+const val ANDROID_SUPPORT_VISIBLE_FOR_TESTING = "android.support.annotation.VisibleForTesting"
 const val ATTR_OTHERWISE = "otherwise"
-const val ATTR_ALLOW_IN = "allowIn"
 const val CARRIER_PRIVILEGES_MARKER = "carrier privileges"
 
 const val ANDROID_SUPPRESS_LINT = "android.annotation.SuppressLint"
@@ -49,10 +46,4 @@
 const val ENV_VAR_METALAVA_TESTS_RUNNING = "METALAVA_TESTS_RUNNING"
 const val ENV_VAR_METALAVA_DUMP_ARGV = "METALAVA_DUMP_ARGV"
 const val ENV_VAR_METALAVA_PREPEND_ARGS = "METALAVA_PREPEND_ARGS"
-const val ENV_VAR_METALAVA_APPEND_ARGS = "METALAVA_APPEND_ARGS"
-
-const val JAVA_RETENTION = "java.lang.annotation.Retention"
-const val KT_RETENTION = "kotlin.annotation.Retention"
-
-fun isRetention(qualifiedName: String?): Boolean =
-    JAVA_RETENTION == qualifiedName || KT_RETENTION == qualifiedName
+const val ENV_VAR_METALAVA_APPEND_ARGS = "METALAVA_APPEND_ARGS"
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/ConvertJarsToSignatureFiles.kt b/src/main/java/com/android/tools/metalava/ConvertJarsToSignatureFiles.kt
index e425e6b..2475014 100644
--- a/src/main/java/com/android/tools/metalava/ConvertJarsToSignatureFiles.kt
+++ b/src/main/java/com/android/tools/metalava/ConvertJarsToSignatureFiles.kt
@@ -235,4 +235,4 @@
     companion object {
         val MATCH_ALL: Predicate<Item> = Predicate { true }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/DocAnalyzer.kt b/src/main/java/com/android/tools/metalava/DocAnalyzer.kt
index 7e357c0..026d158 100644
--- a/src/main/java/com/android/tools/metalava/DocAnalyzer.kt
+++ b/src/main/java/com/android/tools/metalava/DocAnalyzer.kt
@@ -18,11 +18,12 @@
 import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.psi.containsLinkTags
 import com.android.tools.metalava.model.visitors.ApiVisitor
+import com.google.common.io.Files
 import com.intellij.psi.PsiClass
 import com.intellij.psi.PsiField
 import com.intellij.psi.PsiMethod
 import java.io.File
-import java.nio.file.Files
+import java.util.HashMap
 import java.util.regex.Pattern
 import kotlin.math.min
 
@@ -59,10 +60,33 @@
 
         tweakGrammar()
 
+        for (docReplacement in options.docReplacements) {
+            codebase.accept(docReplacement)
+        }
+
+        injectArtifactIds()
+
         // TODO:
         // insertMissingDocFromHiddenSuperclasses()
     }
 
+    private fun injectArtifactIds() {
+        val artifacts = options.artifactRegistrations
+        if (!artifacts.any()) {
+            return
+        }
+
+        artifacts.tag(codebase)
+
+        codebase.accept(object : ApiVisitor() {
+            override fun visitClass(cls: ClassItem) {
+                cls.artifact?.let {
+                    cls.appendDocumentation(it, "@artifactId")
+                }
+            }
+        })
+    }
+
     val mentionsNull: Pattern = Pattern.compile("\\bnull\\b")
 
     /** Hide packages explicitly listed in [Options.hidePackages] */
@@ -124,10 +148,10 @@
             private fun findThreadAnnotations(annotations: List<AnnotationItem>): List<String> {
                 var result: MutableList<String>? = null
                 for (annotation in annotations) {
-                    val name = annotation.qualifiedName
-                    if (name != null &&
-                        name.endsWith("Thread") &&
-                        name.startsWith(ANDROIDX_ANNOTATION_PREFIX)
+                    val name = annotation.qualifiedName()
+                    if (name != null && name.endsWith("Thread") &&
+                        (name.startsWith(ANDROID_SUPPORT_ANNOTATION_PREFIX) ||
+                            name.startsWith(ANDROIDX_ANNOTATION_PREFIX))
                     ) {
                         if (result == null) {
                             result = mutableListOf()
@@ -159,7 +183,7 @@
                 depth: Int,
                 visitedClasses: MutableSet<String> = mutableSetOf()
             ) {
-                val name = annotation.qualifiedName
+                val name = annotation.qualifiedName()
                 if (name == null || name.startsWith(JAVA_LANG_PREFIX)) {
                     // Ignore java.lang.Retention etc.
                     return
@@ -198,10 +222,10 @@
                 annotation.resolve()?.modifiers?.annotations()?.forEach { nested ->
                     if (depth == 20) { // Temp debugging
                         throw StackOverflowError(
-                            "Unbounded recursion, processing annotation ${annotation.toSource()} " +
-                                "in $item in ${item.sourceFile()} "
+                            "Unbounded recursion, processing annotation " +
+                                "${annotation.toSource()} in $item in ${item.compilationUnit()} "
                         )
-                    } else if (nested.qualifiedName !in visitedClasses) {
+                    } else if (nested.qualifiedName() !in visitedClasses) {
                         handleAnnotation(nested, item, depth + 1, visitedClasses)
                     }
                 }
@@ -267,7 +291,7 @@
                 var values: List<AnnotationAttributeValue>? = null
                 var any = false
                 var conditional = false
-                for (attribute in annotation.attributes) {
+                for (attribute in annotation.attributes()) {
                     when (attribute.name) {
                         "value", "allOf" -> {
                             values = attribute.leafValues()
@@ -658,7 +682,50 @@
     }
 
     fun applyApiLevels(applyApiLevelsXml: File) {
-        val apiLookup = getApiLookup(applyApiLevelsXml)
+        @Suppress("DEPRECATION") // still using older lint-api when building with soong
+        val client = object : LintCliClient() {
+            override fun findResource(relativePath: String): File? {
+                if (relativePath == ApiLookup.XML_FILE_PATH) {
+                    return applyApiLevelsXml
+                }
+                return super.findResource(relativePath)
+            }
+
+            override fun getCacheDir(name: String?, create: Boolean): File? {
+                if (create && isUnderTest()) {
+                    // Pick unique directory during unit tests
+                    return Files.createTempDir()
+                }
+
+                val sb = StringBuilder(PROGRAM_NAME)
+                if (name != null) {
+                    sb.append(File.separator)
+                    sb.append(name)
+                }
+                val relative = sb.toString()
+
+                val tmp = System.getenv("TMPDIR")
+                if (tmp != null) {
+                    // Android Build environment: Make sure we're really creating a unique
+                    // temp directory each time since builds could be running in
+                    // parallel here.
+                    val dir = File(tmp, relative)
+                    if (!dir.isDirectory) {
+                        dir.mkdirs()
+                    }
+
+                    return java.nio.file.Files.createTempDirectory(dir.toPath(), null).toFile()
+                }
+
+                val dir = File(System.getProperty("java.io.tmpdir"), relative)
+                if (create && !dir.isDirectory) {
+                    dir.mkdirs()
+                }
+                return dir
+            }
+        }
+
+        val apiLookup = ApiLookup.get(client)
 
         val pkgApi = HashMap<PackageItem, Int?>(300)
         codebase.accept(object : ApiVisitor(visitConstructorsAsMethods = true) {
@@ -723,8 +790,7 @@
                 item.appendDocumentation(code, "@apiSince")
             } else {
                 reporter.report(
-                    Issues.FORBIDDEN_TAG, item,
-                    "Documentation should not specify @apiSince " +
+                    Issues.FORBIDDEN_TAG, item, "Documentation should not specify @apiSince " +
                         "manually; it's computed and injected at build time by $PROGRAM_NAME"
                 )
             }
@@ -756,8 +822,7 @@
                 item.appendDocumentation(code, "@deprecatedSince")
             } else {
                 reporter.report(
-                    Issues.FORBIDDEN_TAG, item,
-                    "Documentation should not specify @deprecatedSince " +
+                    Issues.FORBIDDEN_TAG, item, "Documentation should not specify @deprecatedSince " +
                         "manually; it's computed and injected at build time by $PROGRAM_NAME"
                 )
             }
@@ -814,57 +879,3 @@
     val owner = containingClass.qualifiedName ?: return -1
     return getFieldDeprecatedIn(owner, field.name)
 }
-
-fun getApiLookup(xmlFile: File, cacheDir: File? = null): ApiLookup {
-    val client = object : LintCliClient(PROGRAM_NAME) {
-        override fun getCacheDir(name: String?, create: Boolean): File? {
-            if (cacheDir != null) {
-                return cacheDir
-            }
-
-            if (create && isUnderTest()) {
-                // Pick unique directory during unit tests
-                return Files.createTempDirectory(PROGRAM_NAME).toFile()
-            }
-
-            val sb = StringBuilder(PROGRAM_NAME)
-            if (name != null) {
-                sb.append(File.separator)
-                sb.append(name)
-            }
-            val relative = sb.toString()
-
-            val tmp = System.getenv("TMPDIR")
-            if (tmp != null) {
-                // Android Build environment: Make sure we're really creating a unique
-                // temp directory each time since builds could be running in
-                // parallel here.
-                val dir = File(tmp, relative)
-                if (!dir.isDirectory) {
-                    dir.mkdirs()
-                }
-
-                return Files.createTempDirectory(dir.toPath(), null).toFile()
-            }
-
-            val dir = File(System.getProperty("java.io.tmpdir"), relative)
-            if (create && !dir.isDirectory) {
-                dir.mkdirs()
-            }
-            return dir
-        }
-    }
-
-    val xmlPathProperty = "LINT_API_DATABASE"
-    val prev = System.getProperty(xmlPathProperty)
-    try {
-        System.setProperty(xmlPathProperty, xmlFile.path)
-        return ApiLookup.get(client) ?: error("ApiLookup creation failed")
-    } finally {
-        if (prev != null) {
-            System.setProperty(xmlPathProperty, xmlFile.path)
-        } else {
-            System.clearProperty(xmlPathProperty)
-        }
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/DocLevel.kt b/src/main/java/com/android/tools/metalava/DocLevel.kt
index c500047..633aa6a 100644
--- a/src/main/java/com/android/tools/metalava/DocLevel.kt
+++ b/src/main/java/com/android/tools/metalava/DocLevel.kt
@@ -23,4 +23,4 @@
     PACKAGE,
     PRIVATE,
     HIDDEN
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/DocReplacement.kt b/src/main/java/com/android/tools/metalava/DocReplacement.kt
new file mode 100644
index 0000000..6ff46b4
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/DocReplacement.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava
+
+import com.android.tools.metalava.model.Item
+import com.android.tools.metalava.model.PackageItem
+import com.android.tools.metalava.model.visitors.ApiVisitor
+
+/**
+ * An [ApiVisitor] that applies a regex replacement to the documentation of
+ * [Item]s from the given packages and their sub-packages.
+ */
+class DocReplacement(
+    private val packageNames: List<String>,
+    private val regex: Regex,
+    private val replacement: String
+) : ApiVisitor() {
+
+    private fun appliesToPackage(packageItem: PackageItem): Boolean {
+        val fqn = packageItem.qualifiedName()
+        return packageNames.any {
+                pkg -> fqn.startsWith(pkg) && (fqn.length == pkg.length || fqn[pkg.length] == '.')
+        }
+    }
+
+    override fun visitItem(item: Item) {
+        val doc = item.documentation
+        if (doc.isBlank()) {
+            return
+        }
+        val pkg = item.containingPackage(strict = false)
+        if (pkg != null && appliesToPackage(pkg)) {
+            val new = doc.replace(regex, replacement)
+            if (new != doc) {
+                item.documentation = new
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/Driver.kt b/src/main/java/com/android/tools/metalava/Driver.kt
index 5d190c5..20e8756 100644
--- a/src/main/java/com/android/tools/metalava/Driver.kt
+++ b/src/main/java/com/android/tools/metalava/Driver.kt
@@ -21,6 +21,11 @@
 import com.android.SdkConstants.DOT_JAVA
 import com.android.SdkConstants.DOT_KT
 import com.android.SdkConstants.DOT_TXT
+import com.android.ide.common.process.CachedProcessOutputHandler
+import com.android.ide.common.process.DefaultProcessExecutor
+import com.android.ide.common.process.ProcessInfoBuilder
+import com.android.ide.common.process.ProcessOutput
+import com.android.ide.common.process.ProcessOutputHandler
 import com.android.tools.lint.UastEnvironment
 import com.android.tools.lint.annotations.Extractor
 import com.android.tools.lint.checks.infrastructure.ClassName
@@ -36,6 +41,8 @@
 import com.android.tools.metalava.model.text.TextCodebase
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.android.tools.metalava.stub.StubWriter
+import com.android.utils.StdLogger
+import com.android.utils.StdLogger.Level.ERROR
 import com.google.common.base.Stopwatch
 import com.google.common.collect.Lists
 import com.google.common.io.Files
@@ -46,13 +53,12 @@
 import com.intellij.psi.javadoc.CustomJavadocTagProvider
 import com.intellij.psi.javadoc.JavadocTagInfo
 import org.jetbrains.kotlin.config.CommonConfigurationKeys.MODULE_NAME
-import org.jetbrains.kotlin.config.JVMConfigurationKeys
 import org.jetbrains.kotlin.config.LanguageVersionSettings
 import java.io.File
 import java.io.IOException
+import java.io.OutputStream
 import java.io.OutputStreamWriter
 import java.io.PrintWriter
-import java.io.StringWriter
 import java.util.concurrent.TimeUnit.SECONDS
 import java.util.function.Predicate
 import kotlin.system.exitProcess
@@ -101,6 +107,7 @@
         maybeDumpArgv(stdout, originalArgs, modifiedArgs)
 
         // Actual work begins here.
+        compatibility = Compatibility(compat = Options.useCompatMode(modifiedArgs))
         options = Options(modifiedArgs, stdout, stderr)
 
         maybeActivateSandbox()
@@ -216,11 +223,11 @@
 
 private fun repeatErrors(writer: PrintWriter, reporters: List<Reporter>, max: Int) {
     writer.println("Error: $PROGRAM_NAME detected the following problems:")
-    val totalErrors = reporters.sumOf { it.errorCount }
+    val totalErrors = reporters.sumBy { it.errorCount }
     var remainingCap = max
     var totalShown = 0
     reporters.forEach {
-        val numShown = it.printErrors(writer, remainingCap)
+        var numShown = it.printErrors(writer, remainingCap)
         remainingCap -= numShown
         totalShown += numShown
     }
@@ -251,8 +258,6 @@
         } else {
             return
         }
-    codebase.apiLevel = options.currentApiLevel +
-        if (options.currentCodeName != null && "REL" != options.currentCodeName) 1 else 0
     options.manifest?.let { codebase.manifest = it }
 
     if (options.verbose) {
@@ -268,7 +273,7 @@
     val apiLevelJars = options.apiLevelJars
     if (androidApiLevelXml != null && apiLevelJars != null) {
         progress("Generating API levels XML descriptor file, ${androidApiLevelXml.name}: ")
-        ApiGenerator.generate(apiLevelJars, options.firstApiLevel, androidApiLevelXml, codebase)
+        ApiGenerator.generate(apiLevelJars, androidApiLevelXml, codebase)
     }
 
     if (options.docStubsDir != null || options.enhanceDocumentation) {
@@ -322,8 +327,8 @@
         val removedEmit = apiType.getEmitFilter()
         val removedReference = apiType.getReferenceFilter()
 
-        createReportFile(unfiltered, apiFile, "removed API", options.deleteEmptyRemovedSignatures) { printWriter ->
-            SignatureWriter(printWriter, removedEmit, removedReference, codebase.original != null, options.includeSignatureFormatVersionRemoved)
+        createReportFile(unfiltered, apiFile, "removed API") { printWriter ->
+            SignatureWriter(printWriter, removedEmit, removedReference, codebase.original != null)
         }
     }
 
@@ -338,6 +343,19 @@
         ) { printWriter -> DexApiWriter(printWriter, dexApiEmit, apiReference) }
     }
 
+    options.removedDexApiFile?.let { apiFile ->
+        val unfiltered = codebase.original ?: codebase
+
+        val removedFilter = FilterPredicate(ApiPredicate(matchRemoved = true))
+        val removedReference = ApiPredicate(ignoreShown = true, ignoreRemoved = true)
+        val memberIsNotCloned: Predicate<Item> = Predicate { !it.isCloned() }
+        val removedDexEmit = memberIsNotCloned.and(removedFilter)
+
+        createReportFile(
+            unfiltered, apiFile, "removed DEX API"
+        ) { printWriter -> DexApiWriter(printWriter, removedDexEmit, removedReference) }
+    }
+
     options.proguard?.let { proguard ->
         val apiEmit = FilterPredicate(ApiPredicate())
         val apiReference = ApiPredicate(ignoreShown = true)
@@ -417,10 +435,22 @@
     }
     options.externalAnnotations?.let { extractAnnotations(codebase, it) }
 
+    // Coverage stats?
+    if (options.dumpAnnotationStatistics) {
+        progress("Measuring annotation statistics: ")
+        AnnotationStatistics(codebase).count()
+    }
+    if (options.annotationCoverageOf.isNotEmpty()) {
+        progress("Measuring annotation coverage: ")
+        AnnotationStatistics(codebase).measureCoverageOf(options.annotationCoverageOf)
+    }
+
     if (options.verbose) {
         val packageCount = codebase.size()
         progress("$PROGRAM_NAME finished handling $packageCount packages in ${stopwatch.elapsed(SECONDS)} seconds\n")
     }
+
+    invokeDocumentationTool()
 }
 
 fun subtractApi(codebase: Codebase, subtractApiFile: File) {
@@ -432,14 +462,11 @@
             else -> throw DriverException("Unsupported $ARG_SUBTRACT_API format, expected .txt or .jar: ${subtractApiFile.name}")
         }
 
-    CodebaseComparator().compare(
-        object : ComparisonVisitor() {
-            override fun compare(old: ClassItem, new: ClassItem) {
-                new.emit = false
-            }
-        },
-        oldCodebase, codebase, ApiType.ALL.getReferenceFilter()
-    )
+    CodebaseComparator().compare(object : ComparisonVisitor() {
+        override fun compare(old: ClassItem, new: ClassItem) {
+            new.emit = false
+        }
+    }, oldCodebase, codebase, ApiType.ALL.getReferenceFilter())
 }
 
 fun processNonCodebaseFlags() {
@@ -484,15 +511,53 @@
                     file = baseFile,
                     kotlinStyleNulls = options.inputKotlinStyleNulls
                 )
-                TextCodebase.computeDelta(baseFile, baseApi, signatureApi)
+
+                val includeFields =
+                    if (convert.outputFormat == FileFormat.V2) true else compatibility.includeFieldsInApiDiff
+                TextCodebase.computeDelta(baseFile, baseApi, signatureApi, includeFields)
             } else {
                 signatureApi
             }
 
-        // See JDiff's XMLToAPI#nameAPI
-        val apiName = convert.outputFile.nameWithoutExtension.replace(' ', '_')
-        createReportFile(outputApi, convert.outputFile, "JDiff File") { printWriter ->
-            JDiffXmlWriter(printWriter, apiEmit, apiReference, signatureApi.preFiltered && !strip, apiName)
+        if (outputApi.isEmpty() && baseFile != null && compatibility.compat) {
+            // doclava compatibility: emits error warning instead of emitting empty <api/> element
+            options.stdout.println("No API change detected, not generating diff")
+        } else {
+            val output = convert.outputFile
+            if (convert.outputFormat == FileFormat.JDIFF) {
+                // See JDiff's XMLToAPI#nameAPI
+                val apiName = convert.outputFile.nameWithoutExtension.replace(' ', '_')
+                createReportFile(outputApi, output, "JDiff File") { printWriter ->
+                    JDiffXmlWriter(printWriter, apiEmit, apiReference, signatureApi.preFiltered && !strip, apiName)
+                }
+            } else {
+                val prevOptions = options
+                val prevCompatibility = compatibility
+                try {
+                    when (convert.outputFormat) {
+                        FileFormat.V1 -> {
+                            compatibility = Compatibility(true)
+                            options = Options(emptyArray(), options.stdout, options.stderr)
+                            FileFormat.V1.configureOptions(options, compatibility)
+                        }
+                        FileFormat.V2 -> {
+                            compatibility = Compatibility(false)
+                            options = Options(emptyArray(), options.stdout, options.stderr)
+                            FileFormat.V2.configureOptions(options, compatibility)
+                        }
+                        else -> error("Unsupported format ${convert.outputFormat}")
+                    }
+
+                    createReportFile(outputApi, output, "Diff API File") { printWriter ->
+                        SignatureWriter(
+                            printWriter, apiEmit, apiReference, signatureApi.preFiltered && !strip
+                        )
+                    }
+                } finally {
+                    options = prevOptions
+                    compatibility = prevCompatibility
+                }
+            }
         }
     }
 }
@@ -524,6 +589,7 @@
 
     var newBase: Codebase? = null
     var oldBase: Codebase? = null
+    val releaseType = check.releaseType
     val apiType = check.apiType
 
     // If diffing with a system-api or test-api (or other signature-based codebase
@@ -544,10 +610,8 @@
             if (options.baseApiForCompatCheck != null) {
                 // This option does not make sense with showAnnotation, as the "base" in that case
                 // is the non-annotated APIs.
-                throw DriverException(
-                    ARG_CHECK_COMPATIBILITY_BASE_API +
-                        " is not compatible with --showAnnotation."
-                )
+                throw DriverException(ARG_CHECK_COMPATIBILITY_BASE_API +
+                    " is not compatible with --showAnnotation.")
             }
 
             newBase = codebase
@@ -575,7 +639,42 @@
 
     // If configured, compares the new API with the previous API and reports
     // any incompatibilities.
-    CompatibilityCheck.checkCompatibility(new, current, apiType, oldBase, newBase)
+    CompatibilityCheck.checkCompatibility(new, current, releaseType, apiType, oldBase, newBase)
+
+    // Make sure the text files are identical too? (only applies for *current.txt;
+    // last-released is expected to differ)
+    if (releaseType == ReleaseType.DEV && !options.allowCompatibleDifferences) {
+        val apiFile = if (new.location.isFile)
+            new.location
+        else
+            apiType.getSignatureFile(codebase, "compat-diff-signatures-$apiType")
+
+        fun getCanonicalSignatures(file: File): String {
+            // Get rid of trailing newlines and Windows line endings
+            val text = file.readText(UTF_8)
+            return text.replace("\r\n", "\n").trim()
+        }
+        val currentTxt = getCanonicalSignatures(signatureFile)
+        val newTxt = getCanonicalSignatures(apiFile)
+        if (newTxt != currentTxt) {
+            val diff = getNativeDiff(signatureFile, apiFile) ?: getDiff(currentTxt, newTxt, 1)
+            val updateApi = if (isBuildingAndroid())
+                "Run make update-api to update.\n"
+            else
+                ""
+            val message =
+                """
+                    Your changes have resulted in differences in the signature file
+                    for the ${apiType.displayName} API.
+
+                    The changes may be compatible, but the signature file needs to be updated.
+                    $updateApi
+                    Diffs:
+                """.trimIndent() + "\n" + diff
+
+            throw DriverException(exitCode = -1, stderr = message)
+        }
+    }
 }
 
 fun createTempFile(namePrefix: String, nameSuffix: String): File {
@@ -591,6 +690,102 @@
     }
 }
 
+fun invokeDocumentationTool() {
+    if (options.noDocs) {
+        return
+    }
+
+    val args = options.invokeDocumentationToolArguments
+    if (args.isNotEmpty()) {
+        if (!options.quiet) {
+            options.stdout.println(
+                "Invoking external documentation tool ${args[0]} with arguments\n\"${
+                args.slice(1 until args.size).joinToString(separator = "\",\n\"") { it }}\""
+            )
+            options.stdout.flush()
+        }
+
+        val builder = ProcessInfoBuilder()
+
+        builder.setExecutable(File(args[0]))
+        builder.addArgs(args.slice(1 until args.size))
+
+        val processOutputHandler =
+            if (options.quiet) {
+                CachedProcessOutputHandler()
+            } else {
+                object : ProcessOutputHandler {
+                    override fun handleOutput(processOutput: ProcessOutput?) {
+                    }
+
+                    override fun createOutput(): ProcessOutput {
+                        val out = PrintWriterOutputStream(options.stdout)
+                        val err = PrintWriterOutputStream(options.stderr)
+                        return object : ProcessOutput {
+                            override fun getStandardOutput(): OutputStream {
+                                return out
+                            }
+
+                            override fun getErrorOutput(): OutputStream {
+                                return err
+                            }
+
+                            override fun close() {
+                                out.flush()
+                                err.flush()
+                            }
+                        }
+                    }
+                }
+            }
+
+        val result = DefaultProcessExecutor(StdLogger(ERROR))
+            .execute(builder.createProcess(), processOutputHandler)
+
+        val exitCode = result.exitValue
+        if (!options.quiet) {
+            options.stdout.println("${args[0]} finished with exitCode $exitCode")
+            options.stdout.flush()
+        }
+        if (exitCode != 0) {
+            val stdout = if (processOutputHandler is CachedProcessOutputHandler)
+                processOutputHandler.processOutput.standardOutputAsString
+            else ""
+            val stderr = if (processOutputHandler is CachedProcessOutputHandler)
+                processOutputHandler.processOutput.errorOutputAsString
+            else ""
+            throw DriverException(
+                stdout = "Invoking documentation tool ${args[0]} failed with exit code $exitCode\n$stdout",
+                stderr = stderr,
+                exitCode = exitCode
+            )
+        }
+    }
+}
+
+class PrintWriterOutputStream(private val writer: PrintWriter) : OutputStream() {
+
+    override fun write(b: ByteArray) {
+        writer.write(String(b, UTF_8))
+    }
+
+    override fun write(b: Int) {
+        write(byteArrayOf(b.toByte()), 0, 1)
+    }
+
+    override fun write(b: ByteArray, off: Int, len: Int) {
+        writer.write(String(b, off, len, UTF_8))
+    }
+
+    override fun flush() {
+        writer.flush()
+    }
+
+    override fun close() {
+        writer.close()
+    }
+}
+
 private fun migrateNulls(codebase: Codebase, previous: Codebase) {
     previous.compareWith(NullnessMigration(), codebase)
 }
@@ -608,11 +803,13 @@
 private fun loadFromSources(): Codebase {
     progress("Processing sources: ")
 
-    val sources = options.sources.ifEmpty {
+    val sources = if (options.sources.isEmpty()) {
         if (options.verbose) {
             options.stdout.println("No source files specified: recursively including all sources found in the source path (${options.sourcePath.joinToString()}})")
         }
         gatherSources(options.sourcePath)
+    } else {
+        options.sources
     }
 
     progress("Reading Codebase: ")
@@ -687,7 +884,8 @@
     classpath: List<File> = options.classpath,
     javaLanguageLevel: LanguageLevel = options.javaLanguageLevel,
     kotlinLanguageLevel: LanguageVersionSettings = options.kotlinLanguageLevel,
-    manifest: File? = options.manifest
+    manifest: File? = options.manifest,
+    currentApiLevel: Int = options.currentApiLevel + if (options.currentCodeName != null) 1 else 0
 ): PsiBasedCodebase {
     val sourceRoots = mutableListOf<File>()
     sourcePath.filterTo(sourceRoots) { it.path.isNotBlank() }
@@ -701,12 +899,6 @@
     config.kotlinLanguageLevel = kotlinLanguageLevel
     config.addSourceRoots(sourceRoots.map { it.absoluteFile })
     config.addClasspathRoots(classpath.map { it.absoluteFile })
-    options.jdkHome?.let {
-        if (options.isJdkModular(it)) {
-            config.kotlinCompilerConfig.put(JVMConfigurationKeys.JDK_HOME, it)
-            config.kotlinCompilerConfig.put(JVMConfigurationKeys.NO_JDK, false)
-        }
-    }
 
     val environment = createProjectEnvironment(config)
 
@@ -721,6 +913,7 @@
     val codebase = PsiBasedCodebase(rootDir, description)
     codebase.initialize(environment, units, packageDocs)
     codebase.manifest = manifest
+    codebase.apiLevel = currentApiLevel
     return codebase
 }
 
@@ -835,6 +1028,13 @@
     }
 
     val localTimer = Stopwatch.createStarted()
+    val prevCompatibility = compatibility
+    if (compatibility.compat) {
+        compatibility = Compatibility(false)
+        // But preserve the setting for whether we want to erase throws signatures (to ensure the API
+        // stays compatible)
+        compatibility.useErasureInThrows = prevCompatibility.useErasureInThrows
+    }
 
     val stubWriter =
         StubWriter(
@@ -870,6 +1070,8 @@
         }
     }
 
+    compatibility = prevCompatibility
+
     progress(
         "$PROGRAM_NAME wrote ${if (docStubs) "documentation" else ""} stubs directory $stubDir in ${
         localTimer.elapsed(SECONDS)} seconds\n"
@@ -880,7 +1082,6 @@
     codebase: Codebase,
     apiFile: File,
     description: String?,
-    deleteEmptyFiles: Boolean = false,
     createVisitor: (PrintWriter) -> ApiVisitor
 ) {
     if (description != null) {
@@ -888,16 +1089,11 @@
     }
     val localTimer = Stopwatch.createStarted()
     try {
-        val stringWriter = StringWriter()
-        val writer = PrintWriter(stringWriter)
+        val writer = PrintWriter(Files.asCharSink(apiFile, UTF_8).openBufferedStream())
         writer.use { printWriter ->
             val apiWriter = createVisitor(printWriter)
             codebase.accept(apiWriter)
         }
-        val text = stringWriter.toString()
-        if (text.isNotEmpty() || !deleteEmptyFiles) {
-            apiFile.writeText(text)
-        }
     } catch (e: IOException) {
         reporter.report(Issues.IO_ERROR, apiFile, "Cannot open file for write.")
     }
@@ -929,9 +1125,9 @@
     } else if (file.isFile) {
         when {
             file.name.endsWith(DOT_JAVA) ||
-                file.name.endsWith(DOT_KT) ||
-                file.name.equals(PACKAGE_HTML) ||
-                file.name.equals(OVERVIEW_HTML) -> list.add(file)
+            file.name.endsWith(DOT_KT) ||
+            file.name.equals(PACKAGE_HTML) ||
+            file.name.equals(OVERVIEW_HTML) -> list.add(file)
         }
     }
 }
@@ -1027,8 +1223,7 @@
             return File(path.substring(0, endIndex))
         } else {
             reporter.report(
-                Issues.IO_ERROR, file,
-                "$PROGRAM_NAME was unable to determine the package name. " +
+                Issues.IO_ERROR, file, "$PROGRAM_NAME was unable to determine the package name. " +
                     "This usually means that a source file was where the directory does not seem to match the package " +
                     "declaration; we expected the path $path to end with /${pkg.replace('.', '/') + '/' + file.name}"
             )
diff --git a/src/main/java/com/android/tools/metalava/DriverException.kt b/src/main/java/com/android/tools/metalava/DriverException.kt
index fbae77b..8c0b5d7 100644
--- a/src/main/java/com/android/tools/metalava/DriverException.kt
+++ b/src/main/java/com/android/tools/metalava/DriverException.kt
@@ -20,4 +20,4 @@
     val stderr: String = "",
     val stdout: String = "",
     val exitCode: Int = if (stderr.isBlank()) 0 else -1
-) : RuntimeException(stdout + stderr)
+) : RuntimeException(stdout + stderr)
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/ElidingPredicate.kt b/src/main/java/com/android/tools/metalava/ElidingPredicate.kt
index 00ab951..1dba9b5 100644
--- a/src/main/java/com/android/tools/metalava/ElidingPredicate.kt
+++ b/src/main/java/com/android/tools/metalava/ElidingPredicate.kt
@@ -18,6 +18,7 @@
 
 import com.android.tools.metalava.model.Item
 import com.android.tools.metalava.model.MethodItem
+
 import java.util.function.Predicate
 
 /**
@@ -30,14 +31,12 @@
         // This method should be included, but if it's an exact duplicate
         // override then we can elide it.
         return if (method is MethodItem && !method.isConstructor()) {
-            val differentSuper = method.findPredicateSuperMethod(
-                Predicate { test ->
-                    // We're looking for included and perfect signature
-                    wrapped.test(test) &&
-                        test is MethodItem &&
-                        MethodItem.sameSignature(method, test, false)
-                }
-            )
+            val differentSuper = method.findPredicateSuperMethod(Predicate { test ->
+                // We're looking for included and perfect signature
+                wrapped.test(test) &&
+                    test is MethodItem &&
+                    MethodItem.sameSignature(method, test, false)
+            })
             differentSuper == null
         } else {
             true
diff --git a/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt b/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt
index c5c7408..d53af19 100644
--- a/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt
+++ b/src/main/java/com/android/tools/metalava/ExtractAnnotations.kt
@@ -18,6 +18,7 @@
 
 import com.android.SdkConstants
 import com.android.tools.lint.annotations.Extractor
+import com.android.tools.lint.client.api.AnnotationLookup
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.AnnotationTarget
 import com.android.tools.metalava.model.ClassItem
@@ -35,8 +36,6 @@
 import com.android.tools.metalava.model.psi.UAnnotationItem
 import com.android.tools.metalava.model.visitors.ApiVisitor
 import com.google.common.xml.XmlEscapers
-import com.intellij.lang.jvm.annotation.JvmAnnotationConstantValue
-import com.intellij.lang.jvm.annotation.JvmAnnotationEnumFieldValue
 import com.intellij.psi.JavaRecursiveElementVisitor
 import com.intellij.psi.PsiAnnotation
 import com.intellij.psi.PsiClass
@@ -52,8 +51,8 @@
 import org.jetbrains.uast.UReferenceExpression
 import org.jetbrains.uast.USimpleNameReferenceExpression
 import org.jetbrains.uast.UastEmptyExpression
-import org.jetbrains.uast.UastFacade
-import org.jetbrains.uast.toUElement
+import org.jetbrains.uast.java.JavaUAnnotation
+import org.jetbrains.uast.java.expressions.JavaUAnnotationCallExpression
 import java.io.BufferedOutputStream
 import java.io.File
 import java.io.FileOutputStream
@@ -73,6 +72,8 @@
     // Used linked hash map for order such that we always emit parameters after their surrounding method etc
     private val packageToAnnotationPairs = LinkedHashMap<PackageItem, MutableList<Pair<Item, AnnotationHolder>>>()
 
+    private val annotationLookup = AnnotationLookup()
+
     private data class AnnotationHolder(
         val annotationClass: ClassItem?,
         val annotationItem: AnnotationItem,
@@ -185,27 +186,22 @@
     /** For a given item, extract the relevant annotations for that item */
     private fun checkItem(item: Item) {
         for (annotation in item.modifiers.annotations()) {
-            val qualifiedName = annotation.qualifiedName ?: continue
+            val qualifiedName = annotation.qualifiedName() ?: continue
             if (qualifiedName.startsWith(JAVA_LANG_PREFIX) ||
                 qualifiedName.startsWith(ANDROIDX_ANNOTATION_PREFIX) ||
-                qualifiedName.startsWith(ANDROID_ANNOTATION_PREFIX)
+                qualifiedName.startsWith(ANDROID_ANNOTATION_PREFIX) ||
+                qualifiedName.startsWith(ANDROID_SUPPORT_ANNOTATION_PREFIX)
             ) {
                 if (annotation.isTypeDefAnnotation()) {
                     // Imported typedef
                     addItem(item, AnnotationHolder(null, annotation, null))
-                } else if (annotation.targets.contains(AnnotationTarget.EXTERNAL_ANNOTATIONS_FILE) &&
+                } else if (annotation.targets().contains(AnnotationTarget.EXTERNAL_ANNOTATIONS_FILE) &&
                     !options.includeSourceRetentionAnnotations
                 ) {
                     addItem(item, AnnotationHolder(null, annotation, null))
                 }
 
                 continue
-            } else if (qualifiedName.startsWith(ORG_JETBRAINS_ANNOTATIONS_PREFIX) ||
-                qualifiedName.startsWith(ORG_INTELLIJ_LANG_ANNOTATIONS_PREFIX)
-            ) {
-                // Externally merged metadata, like @Contract and @Language
-                addItem(item, AnnotationHolder(null, annotation, null))
-                continue
             }
 
             val typeDefClass = annotation.resolve() ?: continue
@@ -240,11 +236,11 @@
                         if (typeDefAnnotation is PsiAnnotationItem && typeDefClass is PsiClassItem) {
                             AnnotationHolder(
                                 typeDefClass, typeDefAnnotation,
-                                UastFacade.convertElement(
+                                annotationLookup.findRealAnnotation(
                                     typeDefAnnotation.psiAnnotation,
-                                    null,
-                                    UAnnotation::class.java
-                                ) as UAnnotation
+                                    typeDefClass.psiClass,
+                                    null
+                                )
                             )
                         } else if (typeDefAnnotation is UAnnotationItem && typeDefClass is PsiClassItem) {
                             AnnotationHolder(
@@ -336,15 +332,8 @@
         val modifierList = cls.modifierList
         if (modifierList != null) {
             for (psiAnnotation in modifierList.annotations) {
-                val uAnnotation = psiAnnotation.toUElement(UAnnotation::class.java)
-                val hasSourceRetention =
-                    if (uAnnotation != null) {
-                        hasSourceRetention(uAnnotation)
-                    } else {
-                        // There is a hole in UAST conversion. If so, fall back to using PSI.
-                        hasSourceRetention(psiAnnotation)
-                    }
-                if (hasSourceRetention) {
+                val annotation = JavaUAnnotation.wrap(psiAnnotation)
+                if (hasSourceRetention(annotation)) {
                     return true
                 }
             }
@@ -355,7 +344,7 @@
 
     private fun hasSourceRetention(annotation: UAnnotation): Boolean {
         val qualifiedName = annotation.qualifiedName
-        if (isRetention(qualifiedName)) {
+        if ("java.lang.annotation.Retention" == qualifiedName || "kotlin.annotation.Retention" == qualifiedName) {
             val attributes = annotation.attributeValues
             if (attributes.size != 1) {
                 reporter.report(
@@ -370,13 +359,13 @@
                     val element = value.resolve()
                     if (element is PsiField) {
                         val field = element as PsiField?
-                        if (SOURCE == field!!.name) {
+                        if ("SOURCE" == field!!.name) {
                             return true
                         }
                     }
                 } catch (t: Throwable) {
                     val s = value.asSourceString()
-                    return s.contains(SOURCE)
+                    return s.contains("SOURCE")
                 }
             }
         }
@@ -384,28 +373,6 @@
         return false
     }
 
-    private fun hasSourceRetention(psiAnnotation: PsiAnnotation): Boolean {
-        val qualifiedName = psiAnnotation.qualifiedName
-        if (isRetention(qualifiedName)) {
-            val attributes = psiAnnotation.parameterList.attributes
-            if (attributes.size != 1) {
-                reporter.report(
-                    Issues.ANNOTATION_EXTRACTION, psiAnnotation,
-                    "Expected exactly one parameter passed to @Retention"
-                )
-                return false
-            }
-            return when (val value = attributes[0].attributeValue) {
-                is JvmAnnotationEnumFieldValue -> SOURCE == value.fieldName
-                is JvmAnnotationConstantValue ->
-                    (value.constantValue as? String)?.contains(SOURCE) ?: false
-                else -> false
-            }
-        }
-
-        return false
-    }
-
     /**
      * A writer which stores all its contents into a string and has the ability to mark a certain
      * freeze point and then reset back to it
@@ -511,10 +478,10 @@
                 is UAnnotationItem -> annotationItem.uAnnotation
                 is PsiAnnotationItem ->
                     // Imported annotation
-                    annotationItem.psiAnnotation.toUElement(UAnnotation::class.java) ?: return
+                    JavaUAnnotation.wrap(annotationItem.psiAnnotation)
                 else -> return
             }
-        val qualifiedName = annotationItem.qualifiedName
+        val qualifiedName = annotationItem.qualifiedName()
 
         writer.mark()
         writer.print("    <annotation name=\"")
@@ -555,17 +522,14 @@
                 // but we'll counteract that on the read-annotations side.
                 val annotation = expression as UAnnotation
                 attributes = annotation.attributeValues
-            } else if (expression is UCallExpression) {
-                val nestedPsi = expression.sourcePsi as? PsiAnnotation
-                val annotation = nestedPsi?.let {
-                    UastFacade.convertElement(it, expression, UAnnotation::class.java)
-                } as? UAnnotation
-                annotation?.attributeValues?.let { attributes = it }
+            } else if (expression is JavaUAnnotationCallExpression) {
+                val annotation = expression.uAnnotation
+                attributes = annotation.attributeValues
             } else if (expression is UastEmptyExpression && attributes[0].sourcePsi is PsiNameValuePair) {
                 val memberValue = (attributes[0].sourcePsi as PsiNameValuePair).value
                 if (memberValue is PsiAnnotation) {
-                    val annotation = memberValue.toUElement(UAnnotation::class.java)
-                    annotation?.attributeValues?.let { attributes = it }
+                    val annotation = JavaUAnnotation.wrap(memberValue)
+                    attributes = annotation.attributeValues
                 }
             }
         }
@@ -628,8 +592,4 @@
 
     /** Whether to sort annotation attributes (otherwise their declaration order is used)  */
     private val sortAnnotations: Boolean = true
-
-    companion object {
-        private const val SOURCE = "SOURCE"
-    }
 }
diff --git a/src/main/java/com/android/tools/metalava/FileFormat.kt b/src/main/java/com/android/tools/metalava/FileFormat.kt
index 2d600c3..c38b8df 100644
--- a/src/main/java/com/android/tools/metalava/FileFormat.kt
+++ b/src/main/java/com/android/tools/metalava/FileFormat.kt
@@ -20,11 +20,7 @@
 import com.android.SdkConstants.DOT_XML
 
 /** File formats that metalava can emit APIs to */
-enum class FileFormat(
-    val description: String,
-    val version: String? = null,
-    val conciseDefaultValues: Boolean = false
-) {
+enum class FileFormat(val description: String, val version: String? = null) {
     UNKNOWN("?"),
     JDIFF("JDiff"),
     BASELINE("Metalava baseline file", "1.0"),
@@ -34,16 +30,19 @@
     V1("Doclava signature file", "1.0"),
     V2("Metalava signature file", "2.0"),
     V3("Metalava signature file", "3.0"),
-    V4("Metalava signature file", "4.0", conciseDefaultValues = true);
+    V4("Metalava signature file", "4.0");
 
     /** Configures the option object such that the output format will be the given format */
-    fun configureOptions(options: Options) {
+    fun configureOptions(options: Options, compatibility: Compatibility) {
         if (this == JDIFF) {
             return
         }
         options.outputFormat = this
+        options.compatOutput = this == V1
         options.outputKotlinStyleNulls = this >= V3
         options.outputDefaultValues = this >= V2
+        options.outputConciseDefaultValues = this >= V4
+        compatibility.omitCommonPackages = this >= V2
         options.includeSignatureFormatVersion = this >= V2
     }
 
@@ -108,12 +107,6 @@
     }
 
     companion object {
-        /** The recommended signature file version, equivalent to --format=recommended */
-        val recommended = V2
-
-        /** The latest signature file version, equivalent to --format=latest */
-        val latest = values().maxOrNull()!!
-
         private fun firstLine(s: String): String {
             val index = s.indexOf('\n')
             if (index == -1) {
@@ -155,4 +148,4 @@
             return UNKNOWN
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/FilterPredicate.kt b/src/main/java/com/android/tools/metalava/FilterPredicate.kt
index 0a4be10..842647b 100644
--- a/src/main/java/com/android/tools/metalava/FilterPredicate.kt
+++ b/src/main/java/com/android/tools/metalava/FilterPredicate.kt
@@ -30,4 +30,4 @@
             else -> false
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/Issues.kt b/src/main/java/com/android/tools/metalava/Issues.kt
index 1c356fa..13b7d2c 100644
--- a/src/main/java/com/android/tools/metalava/Issues.kt
+++ b/src/main/java/com/android/tools/metalava/Issues.kt
@@ -16,6 +16,8 @@
 package com.android.tools.metalava
 
 import com.android.sdklib.SdkVersionInfo
+import java.util.ArrayList
+import java.util.HashMap
 import java.util.Locale
 import kotlin.reflect.full.declaredMemberProperties
 
@@ -25,46 +27,59 @@
 
     val PARSE_ERROR = Issue(Severity.ERROR)
     // Compatibility issues
-    val ADDED_PACKAGE = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val ADDED_CLASS = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val ADDED_METHOD = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val ADDED_FIELD = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val ADDED_INTERFACE = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val REMOVED_PACKAGE = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val REMOVED_CLASS = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val REMOVED_METHOD = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val REMOVED_FIELD = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val REMOVED_INTERFACE = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_STATIC = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val ADDED_FINAL = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_TRANSIENT = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_VOLATILE = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_TYPE = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_VALUE = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_SUPERCLASS = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_SCOPE = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_ABSTRACT = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_DEFAULT = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_THROWS = Issue(Severity.ERROR, Category.COMPATIBILITY)
+    val ADDED_PACKAGE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val ADDED_CLASS = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val ADDED_METHOD = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val ADDED_FIELD = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val ADDED_INTERFACE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val REMOVED_PACKAGE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val REMOVED_CLASS = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val REMOVED_METHOD = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val REMOVED_FIELD = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val REMOVED_INTERFACE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_STATIC = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val ADDED_FINAL = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_TRANSIENT = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_VOLATILE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_TYPE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_VALUE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_SUPERCLASS = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_SCOPE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_ABSTRACT = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_THROWS = Issue(Severity.WARNING, Category.COMPATIBILITY)
     val CHANGED_NATIVE = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val CHANGED_CLASS = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val CHANGED_DEPRECATED = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val CHANGED_SYNCHRONIZED = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val ADDED_FINAL_UNINSTANTIABLE = Issue(Severity.HIDDEN, Category.COMPATIBILITY)
-    val REMOVED_FINAL = Issue(Severity.ERROR, Category.COMPATIBILITY)
+    val CHANGED_CLASS = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_DEPRECATED = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val CHANGED_SYNCHRONIZED = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val ADDED_FINAL_UNINSTANTIABLE = Issue(Severity.WARNING, Category.COMPATIBILITY)
+    val REMOVED_FINAL = Issue(Severity.WARNING, Category.COMPATIBILITY)
     val REMOVED_DEPRECATED_CLASS = Issue(REMOVED_CLASS, Category.COMPATIBILITY)
     val REMOVED_DEPRECATED_METHOD = Issue(REMOVED_METHOD, Category.COMPATIBILITY)
     val REMOVED_DEPRECATED_FIELD = Issue(REMOVED_FIELD, Category.COMPATIBILITY)
-    val ADDED_ABSTRACT_METHOD = Issue(Severity.ERROR, Category.COMPATIBILITY)
-    val ADDED_REIFIED = Issue(Severity.ERROR, Category.COMPATIBILITY)
+    val ADDED_ABSTRACT_METHOD = Issue(ADDED_METHOD, Category.COMPATIBILITY)
+    val ADDED_REIFIED = Issue(Severity.WARNING, Category.COMPATIBILITY)
 
     // Issues in javadoc generation
     val UNRESOLVED_LINK = Issue(Severity.LINT, Category.DOCUMENTATION)
+    val BAD_INCLUDE_TAG = Issue(Severity.LINT, Category.DOCUMENTATION)
+    val UNKNOWN_TAG = Issue(Severity.LINT, Category.DOCUMENTATION)
+    val UNKNOWN_PARAM_TAG_NAME = Issue(Severity.LINT, Category.DOCUMENTATION)
+    val UNDOCUMENTED_PARAMETER = Issue(Severity.HIDDEN, Category.DOCUMENTATION)
+    val BAD_ATTR_TAG = Issue(Severity.LINT, Category.DOCUMENTATION)
+    val BAD_INHERITDOC = Issue(Severity.HIDDEN, Category.DOCUMENTATION)
+    val HIDDEN_LINK = Issue(Severity.LINT, Category.DOCUMENTATION)
+    val HIDDEN_CONSTRUCTOR = Issue(Severity.WARNING, Category.DOCUMENTATION)
     val UNAVAILABLE_SYMBOL = Issue(Severity.WARNING, Category.DOCUMENTATION)
     val HIDDEN_SUPERCLASS = Issue(Severity.WARNING, Category.DOCUMENTATION)
     val DEPRECATED = Issue(Severity.HIDDEN, Category.DOCUMENTATION)
     val DEPRECATION_MISMATCH = Issue(Severity.ERROR, Category.DOCUMENTATION)
+    val MISSING_COMMENT = Issue(Severity.LINT, Category.DOCUMENTATION)
     val IO_ERROR = Issue(Severity.ERROR)
+    val NO_SINCE_DATA = Issue(Severity.HIDDEN, Category.DOCUMENTATION)
+    val NO_FEDERATION_DATA = Issue(Severity.WARNING, Category.DOCUMENTATION)
+    val BROKEN_SINCE_FILE = Issue(Severity.ERROR, Category.DOCUMENTATION)
+    val INVALID_CONTENT_TYPE = Issue(Severity.ERROR, Category.DOCUMENTATION)
+    val INVALID_SAMPLE_INDEX = Issue(Severity.ERROR, Category.DOCUMENTATION)
     val HIDDEN_TYPE_PARAMETER = Issue(Severity.WARNING, Category.DOCUMENTATION)
     val PRIVATE_SUPERCLASS = Issue(Severity.WARNING, Category.DOCUMENTATION)
     val NULLABLE = Issue(Severity.HIDDEN, Category.DOCUMENTATION)
@@ -210,7 +225,6 @@
     val DOCUMENT_EXCEPTIONS = Issue(Severity.ERROR, Category.API_LINT, "docs-throws")
     val FORBIDDEN_SUPER_CLASS = Issue(Severity.ERROR, Category.API_LINT)
     val MISSING_NULLABILITY = Issue(Severity.ERROR, Category.API_LINT, "annotations")
-    val INVALID_NULLABILITY_OVERRIDE = Issue(Severity.ERROR, Category.API_LINT, "annotations-nullability-overrides")
     val MUTABLE_BARE_FIELD = Issue(Severity.ERROR, Category.API_LINT, "mutable-bare-field")
     val INTERNAL_FIELD = Issue(Severity.ERROR, Category.API_LINT, "internal-fields")
     val PUBLIC_TYPEDEF = Issue(Severity.ERROR, Category.API_LINT, "no-public-typedefs")
@@ -224,8 +238,6 @@
         Issue(Severity.WARNING, Category.API_LINT, "builders-nonnull-constructors")
     val NO_SETTINGS_PROVIDER = Issue(Severity.HIDDEN, Category.API_LINT, "no-settings-provider")
     val NULLABLE_COLLECTION = Issue(Severity.WARNING, Category.API_LINT, "methods-prefer-non-null-collections")
-    val ASYNC_SUFFIX_FUTURE = Issue(Severity.ERROR, Category.API_LINT)
-    val GENERIC_CALLBACKS = Issue(Severity.ERROR, Category.API_LINT, "callbacks-sam")
 
     fun findIssueById(id: String?): Issue? {
         return nameToIssue[id]
@@ -295,7 +307,7 @@
             if (property.returnType.classifier != Issue::class) continue
             val issue = property.getter.call(Issues) as Issue
 
-            issue.name = SdkVersionInfo.underlinesToCamelCase(property.name.lowercase(Locale.US))
+            issue.name = SdkVersionInfo.underlinesToCamelCase(property.name.toLowerCase(Locale.US))
             nameToIssue[issue.name] = issue
         }
         for (issue in allIssues) {
diff --git a/src/main/java/com/android/tools/metalava/JDiffXmlWriter.kt b/src/main/java/com/android/tools/metalava/JDiffXmlWriter.kt
index cb6a114..1b51857 100644
--- a/src/main/java/com/android/tools/metalava/JDiffXmlWriter.kt
+++ b/src/main/java/com/android/tools/metalava/JDiffXmlWriter.kt
@@ -59,7 +59,7 @@
     override fun visitCodebase(codebase: Codebase) {
         writer.print("<api")
 
-        if (apiName != null) {
+        if (apiName != null && !options.compatOutput) {
             // See JDiff's XMLToAPI#nameAPI
             writer.print(" name=\"")
             writer.print(apiName)
@@ -115,6 +115,36 @@
         writer.println("\"\n>")
 
         writeInterfaceList(cls)
+
+        if (cls.isEnum() && compatibility.defaultEnumMethods) {
+            writer.println(
+                """
+                <method name="valueOf"
+                 return="${cls.qualifiedName()}"
+                 abstract="false"
+                 native="false"
+                 synchronized="false"
+                 static="true"
+                 final="false"
+                 deprecated="not deprecated"
+                 visibility="public"
+                >
+                <parameter name="null" type="java.lang.String">
+                </parameter>
+                </method>
+                <method name="values"
+                 return="${cls.qualifiedName()}[]"
+                 abstract="false"
+                 native="false"
+                 synchronized="false"
+                 static="true"
+                 final="true"
+                 deprecated="not deprecated"
+                 visibility="public"
+                >
+                </method>""".trimIndent()
+            )
+        }
     }
 
     fun deprecation(item: Item): String {
@@ -160,16 +190,24 @@
     }
 
     override fun visitField(field: FieldItem) {
+        if (field.isEnumConstant() && compatibility.xmlSkipEnumFields) {
+            return
+        }
+
         val modifiers = field.modifiers
         val initialValue = field.initialValue(true)
         val value = if (initialValue != null) {
-            XmlUtils.toXmlAttributeValue(CodePrinter.constantToSource(initialValue))
+            if (initialValue is Char && compatibility.xmlCharAsInt) {
+                initialValue.toInt().toString()
+            } else {
+                escapeAttributeValue(CodePrinter.constantToSource(initialValue))
+            }
         } else null
 
         writer.print("<field name=\"")
         writer.print(field.name())
         writer.print("\"\n type=\"")
-        writer.print(XmlUtils.toXmlAttributeValue(formatType(field.type())))
+        writer.print(escapeAttributeValue(formatType(field.type())))
         writer.print("\"\n transient=\"")
         writer.print(modifiers.isTransient())
         writer.print("\"\n volatile=\"")
@@ -177,6 +215,8 @@
         if (value != null) {
             writer.print("\"\n value=\"")
             writer.print(value)
+        } else if (compatibility.xmlShowArrayFieldsAsNull && (field.type().isArray())) {
+            writer.print("\"\n value=\"null")
         }
 
         writer.print("\"\n static=\"")
@@ -202,6 +242,10 @@
     override fun visitMethod(method: MethodItem) {
         val modifiers = method.modifiers
 
+        if (method.containingClass().isAnnotationType() && compatibility.xmlSkipAnnotationMethods) {
+            return
+        }
+
         // Note - to match doclava we don't write out the type parameter list
         // (method.typeParameterList()) in JDiff files!
 
@@ -209,7 +253,7 @@
         writer.print(method.name())
         method.returnType()?.let {
             writer.print("\"\n return=\"")
-            writer.print(XmlUtils.toXmlAttributeValue(formatType(it)))
+            writer.print(escapeAttributeValue(formatType(it)))
         }
         writer.print("\"\n abstract=\"")
         writer.print(modifiers.isAbstract())
@@ -233,20 +277,34 @@
     }
 
     private fun writeSuperClassAttribute(cls: ClassItem) {
+        if (cls.isInterface() && compatibility.extendsForInterfaceSuperClass) {
+            // Written in the interface section instead
+            return
+        }
+
         val superClass = if (preFiltered)
             cls.superClassType()
         else cls.filteredSuperClassType(filterReference)
 
         val superClassString =
             when {
-                cls.isAnnotationType() -> JAVA_LANG_ANNOTATION
+                cls.isAnnotationType() -> if (compatibility.xmlAnnotationAsObject) {
+                    JAVA_LANG_OBJECT
+                } else {
+                    JAVA_LANG_ANNOTATION
+                }
                 superClass != null -> {
                     // doclava seems to include java.lang.Object for classes but not interfaces
                     if (!cls.isClass() && superClass.isJavaLangObject()) {
                         return
                     }
-                    XmlUtils.toXmlAttributeValue(
-                        formatType(superClass.toTypeString(context = superClass.asClass()))
+                    escapeAttributeValue(
+                        formatType(
+                            superClass.toTypeString(
+                                erased = compatibility.omitTypeParametersInInterfaces,
+                                context = superClass.asClass()
+                            )
+                        )
                     )
                 }
                 cls.isEnum() -> JAVA_LANG_ENUM
@@ -262,11 +320,18 @@
             cls.interfaceTypes().asSequence()
         else cls.filteredInterfaceTypes(filterReference).asSequence()
 
+        if (cls.isInterface() && compatibility.extendsForInterfaceSuperClass) {
+            val superClassType = cls.superClassType()
+            if (superClassType?.isJavaLangObject() == false) {
+                interfaces += superClassType
+            }
+        }
+
         if (interfaces.any()) {
             interfaces.sortedWith(TypeItem.comparator).forEach { item ->
                 writer.print("<implements name=\"")
-                val type = item.toTypeString(context = cls)
-                writer.print(XmlUtils.toXmlAttributeValue(formatType(type)))
+                val type = item.toTypeString(erased = compatibility.omitTypeParametersInInterfaces, context = cls)
+                writer.print(escapeAttributeValue(formatType(type)))
                 writer.println("\">\n</implements>")
             }
         }
@@ -277,7 +342,7 @@
             // NOTE: We report parameter name as "null" rather than the real name to match
             // doclava's behavior
             writer.print("<parameter name=\"null\" type=\"")
-            writer.print(XmlUtils.toXmlAttributeValue(formatType(parameter.type())))
+            writer.print(escapeAttributeValue(formatType(parameter.type())))
             writer.println("\">")
             writer.println("</parameter>")
         }
@@ -294,12 +359,17 @@
     private fun writeThrowsList(method: MethodItem) {
         val throws = when {
             preFiltered -> method.throwsTypes().asSequence()
-            else -> method.filteredThrowsTypes(filterReference).asSequence()
+            compatibility.filterThrowsClasses -> method.filteredThrowsTypes(filterReference).asSequence()
+            else -> method.throwsTypes().asSequence()
         }
         if (throws.any()) {
             throws.asSequence().sortedWith(ClassItem.fullNameComparator).forEach { type ->
                 writer.print("<exception name=\"")
-                writer.print(type.fullName())
+                if (options.compatOutput) {
+                    writer.print(type.simpleName())
+                } else {
+                    writer.print(type.fullName())
+                }
                 writer.print("\" type=\"")
                 writer.print(type.qualifiedName())
                 writer.println("\">")
@@ -307,4 +377,13 @@
             }
         }
     }
-}
+
+    private fun escapeAttributeValue(s: String): String {
+        val escaped = XmlUtils.toXmlAttributeValue(s)
+        return if (compatibility.xmlEscapeGreaterThan && escaped.contains(">")) {
+            escaped.replace(">", "&gt;")
+        } else {
+            escaped
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt b/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt
index a53704a..97dc8d2 100644
--- a/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt
+++ b/src/main/java/com/android/tools/metalava/KotlinInteropChecks.kt
@@ -30,7 +30,7 @@
 import org.jetbrains.kotlin.psi.KtProperty
 import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
 import org.jetbrains.kotlin.psi.psiUtil.isPublic
-import org.jetbrains.uast.UField
+import org.jetbrains.uast.kotlin.KotlinUField
 
 // Enforces the interoperability guidelines outlined in
 //   https://android.github.io/kotlin-guides/interop.html
@@ -46,20 +46,20 @@
             // No need to check "for stubs only APIs" (== "implicit" APIs)
             includeApisForStubPurposes = false
         ) {
-                private var isKotlin = false
+            private var isKotlin = false
 
-                override fun visitClass(cls: ClassItem) {
-                    isKotlin = cls.isKotlin()
-                }
+            override fun visitClass(cls: ClassItem) {
+                isKotlin = cls.isKotlin()
+            }
 
-                override fun visitMethod(method: MethodItem) {
-                    checkMethod(method, isKotlin)
-                }
+            override fun visitMethod(method: MethodItem) {
+                checkMethod(method, isKotlin)
+            }
 
-                override fun visitField(field: FieldItem) {
-                    checkField(field, isKotlin)
-                }
-            })
+            override fun visitField(field: FieldItem) {
+                checkField(field, isKotlin)
+            }
+        })
     }
 
     fun checkField(field: FieldItem, isKotlin: Boolean = field.isKotlin()) {
@@ -92,17 +92,15 @@
         if (exceptions.isEmpty()) {
             return
         }
-        val doc = method.documentation.ifEmpty { method.property?.documentation.orEmpty() }
+        val doc = method.documentation
         for (exception in exceptions.sortedBy { it.qualifiedName() }) {
-            val checked = !(
-                exception.extends("java.lang.RuntimeException") ||
-                    exception.extends("java.lang.Error")
-                )
+            val checked = !(exception.extends("java.lang.RuntimeException") ||
+                exception.extends("java.lang.Error"))
             if (checked) {
                 val annotation = method.modifiers.findAnnotation("kotlin.jvm.Throws")
                 if (annotation != null) {
                     // There can be multiple values
-                    for (attribute in annotation.attributes) {
+                    for (attribute in annotation.attributes()) {
                         for (v in attribute.leafValues()) {
                             val source = v.toSource()
                             if (source.endsWith(exception.simpleName() + "::class")) {
@@ -133,7 +131,7 @@
             // dip into Kotlin PSI to figure out if this field was really declared in
             // a companion object
             val psi = field.psi()
-            if (psi is UField) {
+            if (psi is KotlinUField) {
                 val sourcePsi = psi.sourcePsi
                 if (sourcePsi is KtProperty) {
                     val companionClassName = sourcePsi.containingClassOrObject?.name
@@ -167,9 +165,8 @@
                     }
                     for (ktProperty in ktProperties) {
                         if (ktProperty.annotationEntries.none { annotationEntry ->
-                            annotationEntry.shortName?.asString() == "JvmStatic"
-                        }
-                        ) {
+                                annotationEntry.shortName?.asString() == "JvmStatic"
+                            }) {
                             reporter.report(
                                 Issues.MISSING_JVMSTATIC, ktProperty,
                                 "Companion object constants like ${ktProperty.name} should be marked @JvmField for Java interoperability; see https://developer.android.com/kotlin/interop#companion_constants"
@@ -290,9 +287,7 @@
 
         if (haveDefault && method.modifiers.findAnnotation("kotlin.jvm.JvmOverloads") == null &&
             // Extension methods and inline functions aren't really useful from Java anyway
-            !method.isExtensionMethod() && !method.modifiers.isInline() &&
-            // Methods marked @JvmSynthetic are hidden from java, overloads not useful
-            !method.modifiers.hasJvmSyntheticAnnotation()
+            !method.isExtensionMethod() && !method.modifiers.isInline()
         ) {
             reporter.report(
                 Issues.MISSING_JVMSTATIC, method,
diff --git a/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt b/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt
index a7b5df0..ee650a7 100644
--- a/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt
+++ b/src/main/java/com/android/tools/metalava/NullabilityAnnotationsValidator.kt
@@ -134,7 +134,7 @@
     }
 
     private fun isNullFromTypeParam(it: AnnotationItem) =
-        it.qualifiedName?.endsWith("NullFromTypeParam") == true
+        it.qualifiedName()?.endsWith("NullFromTypeParam") == true
 
     private fun isAnyNullabilityAnnotation(it: AnnotationItem) =
         it.isNullnessAnnotation() || isNullFromTypeParam(it)
diff --git a/src/main/java/com/android/tools/metalava/Options.kt b/src/main/java/com/android/tools/metalava/Options.kt
index a65542e..7a87d67 100644
--- a/src/main/java/com/android/tools/metalava/Options.kt
+++ b/src/main/java/com/android/tools/metalava/Options.kt
@@ -18,6 +18,7 @@
 
 import com.android.SdkConstants
 import com.android.SdkConstants.FN_FRAMEWORK_LIBRARY
+import com.android.sdklib.SdkVersionInfo
 import com.android.tools.lint.detector.api.isJdkFolder
 import com.android.tools.metalava.CompatibilityCheck.CheckRequest
 import com.android.tools.metalava.model.defaultConfiguration
@@ -37,6 +38,8 @@
 import java.io.PrintWriter
 import java.io.StringWriter
 import java.util.Locale
+import kotlin.reflect.KMutableProperty1
+import kotlin.reflect.full.memberProperties
 import kotlin.text.Charsets.UTF_8
 
 /** Global options for the metadata extraction tool */
@@ -45,6 +48,7 @@
 private const val MAX_LINE_WIDTH = 120
 private const val INDENT_WIDTH = 45
 
+const val ARG_COMPAT_OUTPUT = "--compatible-output"
 const val ARG_FORMAT = "--format"
 const val ARG_HELP = "--help"
 const val ARG_VERSION = "--version"
@@ -57,9 +61,14 @@
 const val ARG_XML_API = "--api-xml"
 const val ARG_CONVERT_TO_JDIFF = "--convert-to-jdiff"
 const val ARG_CONVERT_NEW_TO_JDIFF = "--convert-new-to-jdiff"
+const val ARG_CONVERT_TO_V1 = "--convert-to-v1"
+const val ARG_CONVERT_TO_V2 = "--convert-to-v2"
+const val ARG_CONVERT_NEW_TO_V1 = "--convert-new-to-v1"
+const val ARG_CONVERT_NEW_TO_V2 = "--convert-new-to-v2"
 const val ARG_DEX_API = "--dex-api"
 const val ARG_SDK_VALUES = "--sdk-values"
 const val ARG_REMOVED_API = "--removed-api"
+const val ARG_REMOVED_DEX_API = "--removed-dex-api"
 const val ARG_MERGE_QUALIFIER_ANNOTATIONS = "--merge-qualifier-annotations"
 const val ARG_MERGE_INCLUSION_ANNOTATIONS = "--merge-inclusion-annotations"
 const val ARG_VALIDATE_NULLABILITY_FROM_MERGED_STUBS = "--validate-nullability-from-merged-stubs"
@@ -72,9 +81,6 @@
 const val ARG_KOTLIN_STUBS = "--kotlin-stubs"
 const val ARG_STUBS_SOURCE_LIST = "--write-stubs-source-list"
 const val ARG_DOC_STUBS_SOURCE_LIST = "--write-doc-stubs-source-list"
-/**
- * Used by Firebase, see b/116185431#comment15, not used by Android Platform or AndroidX
- */
 const val ARG_PROGUARD = "--proguard"
 const val ARG_EXTRACT_ANNOTATIONS = "--extract-annotations"
 const val ARG_EXCLUDE_ALL_ANNOTATIONS = "--exclude-all-annotations"
@@ -84,13 +90,20 @@
 const val ARG_MANIFEST = "--manifest"
 const val ARG_MIGRATE_NULLNESS = "--migrate-nullness"
 const val ARG_CHECK_COMPATIBILITY = "--check-compatibility"
+const val ARG_CHECK_COMPATIBILITY_API_CURRENT = "--check-compatibility:api:current"
 const val ARG_CHECK_COMPATIBILITY_API_RELEASED = "--check-compatibility:api:released"
+const val ARG_CHECK_COMPATIBILITY_REMOVED_CURRENT = "--check-compatibility:removed:current"
 const val ARG_CHECK_COMPATIBILITY_REMOVED_RELEASED = "--check-compatibility:removed:released"
 const val ARG_CHECK_COMPATIBILITY_BASE_API = "--check-compatibility:base"
+const val ARG_ALLOW_COMPATIBLE_DIFFERENCES = "--allow-compatible-differences"
 const val ARG_NO_NATIVE_DIFF = "--no-native-diff"
 const val ARG_INPUT_KOTLIN_NULLS = "--input-kotlin-nulls"
 const val ARG_OUTPUT_KOTLIN_NULLS = "--output-kotlin-nulls"
 const val ARG_OUTPUT_DEFAULT_VALUES = "--output-default-values"
+const val ARG_ANNOTATION_COVERAGE_STATS = "--annotation-coverage-stats"
+const val ARG_ANNOTATION_COVERAGE_OF = "--annotation-coverage-of"
+const val ARG_WRITE_CLASS_COVERAGE_TO = "--write-class-coverage-to"
+const val ARG_WRITE_MEMBER_COVERAGE_TO = "--write-member-coverage-to"
 const val ARG_WARNINGS_AS_ERRORS = "--warnings-as-errors"
 const val ARG_LINTS_AS_ERRORS = "--lints-as-errors"
 const val ARG_SHOW_ANNOTATION = "--show-annotation"
@@ -101,6 +114,8 @@
 const val ARG_SHOW_UNANNOTATED = "--show-unannotated"
 const val ARG_COLOR = "--color"
 const val ARG_NO_COLOR = "--no-color"
+const val ARG_OMIT_COMMON_PACKAGES = "--omit-common-packages"
+const val ARG_SKIP_JAVA_IN_COVERAGE_REPORT = "--skip-java-in-coverage-report"
 const val ARG_NO_BANNER = "--no-banner"
 const val ARG_ERROR = "--error"
 const val ARG_WARNING = "--warning"
@@ -110,9 +125,9 @@
 const val ARG_GENERATE_API_LEVELS = "--generate-api-levels"
 const val ARG_ANDROID_JAR_PATTERN = "--android-jar-pattern"
 const val ARG_CURRENT_VERSION = "--current-version"
-const val ARG_FIRST_VERSION = "--first-version"
 const val ARG_CURRENT_CODENAME = "--current-codename"
 const val ARG_CURRENT_JAR = "--current-jar"
+const val ARG_CHECK_KOTLIN_INTEROP = "--check-kotlin-interop"
 const val ARG_API_LINT = "--api-lint"
 const val ARG_API_LINT_IGNORE_PREFIX = "--api-lint-ignore-prefix"
 const val ARG_PUBLIC = "--public"
@@ -120,11 +135,13 @@
 const val ARG_PACKAGE = "--package"
 const val ARG_PRIVATE = "--private"
 const val ARG_HIDDEN = "--hidden"
+const val ARG_NO_DOCS = "--no-docs"
 const val ARG_JAVA_SOURCE = "--java-source"
 const val ARG_KOTLIN_SOURCE = "--kotlin-source"
 const val ARG_SDK_HOME = "--sdk-home"
 const val ARG_JDK_HOME = "--jdk-home"
 const val ARG_COMPILE_SDK_VERSION = "--compile-sdk-version"
+const val ARG_REGISTER_ARTIFACT = "--register-artifact"
 const val ARG_INCLUDE_ANNOTATIONS = "--include-annotations"
 const val ARG_COPY_ANNOTATIONS = "--copy-annotations"
 const val ARG_INCLUDE_ANNOTATION_CLASSES = "--include-annotation-classes"
@@ -136,6 +153,8 @@
 const val ARG_UPDATE_API = "--only-update-api"
 const val ARG_CHECK_API = "--only-check-api"
 const val ARG_PASS_BASELINE_UPDATES = "--pass-baseline-updates"
+const val ARG_GENERATE_DOCUMENTATION = "--generate-documentation"
+const val ARG_REPLACE_DOCUMENTATION = "--replace-documentation"
 const val ARG_BASELINE = "--baseline"
 const val ARG_BASELINE_API_LINT = "--baseline:api-lint"
 const val ARG_BASELINE_CHECK_COMPATIBILITY_RELEASED = "--baseline:compatibility:released"
@@ -147,13 +166,13 @@
 const val ARG_STUB_PACKAGES = "--stub-packages"
 const val ARG_STUB_IMPORT_PACKAGES = "--stub-import-packages"
 const val ARG_DELETE_EMPTY_BASELINES = "--delete-empty-baselines"
-const val ARG_DELETE_EMPTY_REMOVED_SIGNATURES = "--delete-empty-removed-signatures"
 const val ARG_SUBTRACT_API = "--subtract-api"
 const val ARG_TYPEDEFS_IN_SIGNATURES = "--typedefs-in-signatures"
 const val ARG_FORCE_CONVERT_TO_WARNING_NULLABILITY_ANNOTATIONS = "--force-convert-to-warning-nullability-annotations"
 const val ARG_IGNORE_CLASSES_ON_CLASSPATH = "--ignore-classes-on-classpath"
 const val ARG_ERROR_MESSAGE_API_LINT = "--error-message:api-lint"
 const val ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_RELEASED = "--error-message:compatibility:released"
+const val ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_CURRENT = "--error-message:compatibility:current"
 const val ARG_NO_IMPLICIT_ROOT = "--no-implicit-root"
 const val ARG_STRICT_INPUT_FILES = "--strict-input-files"
 const val ARG_STRICT_INPUT_FILES_STACK = "--strict-input-files:stack"
@@ -206,6 +225,18 @@
     /** Ignored flags we've already warned about - store here such that we don't keep reporting them */
     private val alreadyWarned: MutableSet<String> = mutableSetOf()
 
+    /**
+     * Set of arguments to invoke documentation generation tool (arg 0) with, unless --no-docs is also
+     * supplied
+     */
+    var invokeDocumentationToolArguments: Array<String> = emptyArray()
+
+    /**
+     * Whether to suppress documentation generation, even if a documentation generator has
+     * been configured via ${#ARG_GENERATE_DOCUMENTATION}
+     */
+    var noDocs = false
+
     /** API to subtract from signature and stub generation. Corresponds to [ARG_SUBTRACT_API]. */
     var subtractApi: File? = null
 
@@ -274,14 +305,29 @@
      */
     var onlyCheckApi = false
 
+    /**
+     * Whether signature files should emit in "compat" mode, preserving the various
+     * quirks of the previous signature file format -- this will for example use a non-standard
+     * modifier ordering, it will call enums interfaces, etc. See the [Compatibility] class
+     * for more fine grained control (which is not (currently) exposed as individual command line
+     * flags.
+     */
+    var compatOutput = useCompatMode(args)
+
     /** Whether nullness annotations should be displayed as ?/!/empty instead of with @NonNull/@Nullable. */
     var outputKotlinStyleNulls = false // requires v3
 
     /** Whether default values should be included in signature files */
-    var outputDefaultValues = true
+    var outputDefaultValues = !compatOutput
+
+    /**
+     *  Whether only the presence of default values should be included in signature files, and not
+     *  the full body of the default value.
+     */
+    var outputConciseDefaultValues = false // requires V4
 
     /** The output format version being used */
-    var outputFormat: FileFormat = FileFormat.recommended
+    var outputFormat: FileFormat = if (compatOutput) FileFormat.V1 else FileFormat.V2
 
     /**
      * Whether reading signature files should assume the input is formatted as Kotlin-style nulls
@@ -438,9 +484,15 @@
     /** If set, a file to write a dex API file to. Corresponds to the --removed-dex-api/-removedDexApi flag. */
     var removedApiFile: File? = null
 
+    /** If set, a file to write an API file to. Corresponds to the --removed-api/-removedApi flag. */
+    var removedDexApiFile: File? = null
+
     /** Whether output should be colorized */
     var color = System.getenv("TERM")?.startsWith("xterm") ?: System.getenv("COLORTERM") != null ?: false
 
+    /** Whether to omit Java and Kotlin runtime library packages from annotation coverage stats */
+    var omitRuntimePackageStats = false
+
     /** Whether to generate annotations into the stubs */
     var generateAnnotations = false
 
@@ -464,6 +516,16 @@
     /** The API to use a base for the otherwise checked API during compat checks. */
     var baseApiForCompatCheck: File? = null
 
+    /**
+     * When checking signature files, whether compatible differences in signature
+     * files are allowed. This is normally not allowed (since it means the next
+     * engineer adding an incompatible change will suddenly see the cumulative
+     * differences show up in their diffs when checking in signature files),
+     * but is useful from the test suite etc. Controlled by
+     * [ARG_ALLOW_COMPATIBLE_DIFFERENCES].
+     */
+    var allowCompatibleDifferences = false
+
     /** If false, attempt to use the native diff utility on the system */
     var noNativeDiff = false
 
@@ -477,6 +539,15 @@
      */
     var forceConvertToWarningNullabilityAnnotations: PackageFilter? = null
 
+    /** Set of jars and class files for existing apps that we want to measure coverage of */
+    var annotationCoverageOf: List<File> = mutableAnnotationCoverageOf
+
+    /** File to write the annotation class coverage report to, if any */
+    var annotationCoverageClassReport: File? = null
+
+    /** File to write the annotation member coverage report to, if any */
+    var annotationCoverageMemberReport: File? = null
+
     /** An optional <b>jar</b> file to load classes from instead of from source.
      * This is similar to the [classpath] attribute except we're explicitly saying
      * that this is the complete set of classes and that we <b>should</b> generate
@@ -484,6 +555,9 @@
      * is only used to resolve types.) */
     var apiJar: File? = null
 
+    /** Whether to emit coverage statistics for annotations in the API surface */
+    var dumpAnnotationStatistics = false
+
     /**
      * mapping from API level to android.jar files, if computing API levels
      */
@@ -492,12 +566,6 @@
     /** The api level of the codebase, or -1 if not known/specified */
     var currentApiLevel = -1
 
-    /**
-     * The first api level of the codebase; typically 1 but can be
-     * higher for example for the System API.
-     */
-    var firstApiLevel = 1
-
     /** The codename of the codebase, if it's a preview, or null if not specified */
     var currentCodeName: String? = null
 
@@ -510,28 +578,8 @@
     /** Level to include for javadoc */
     var docLevel = DocLevel.PROTECTED
 
-    /** Whether to include the signature file format version header in most signature files */
-    var includeSignatureFormatVersion: Boolean = true
-
-    /** Whether to include the signature file format version header in removed signature files */
-    val includeSignatureFormatVersionNonRemoved: EmitFileHeader get() =
-        if (includeSignatureFormatVersion) {
-            EmitFileHeader.ALWAYS
-        } else {
-            EmitFileHeader.NEVER
-        }
-
-    /** Whether to include the signature file format version header in removed signature files */
-    val includeSignatureFormatVersionRemoved: EmitFileHeader get() =
-        if (includeSignatureFormatVersion) {
-            if (deleteEmptyRemovedSignatures) {
-                EmitFileHeader.IF_NONEMPTY_FILE
-            } else {
-                EmitFileHeader.ALWAYS
-            }
-        } else {
-            EmitFileHeader.NEVER
-        }
+    /** Whether to include the signature file format version header in signature files */
+    var includeSignatureFormatVersion: Boolean = !compatOutput
 
     /** A baseline to check against */
     var baseline: Baseline? = null
@@ -556,6 +604,12 @@
      */
     var errorMessageCompatibilityReleased: String? = null
 
+    /**
+     * If set, metalava will show this error message when "check-compatibility:*:current" fails.
+     * (i.e. [ARG_CHECK_COMPATIBILITY_API_CURRENT] and [ARG_CHECK_COMPATIBILITY_REMOVED_CURRENT])
+     */
+    var errorMessageCompatibilityCurrent: String? = null
+
     /** [Reporter] for "api-lint" */
     var reporterApiLint: Reporter
 
@@ -565,6 +619,12 @@
      */
     var reporterCompatibilityReleased: Reporter
 
+    /**
+     * [Reporter] for "check-compatibility:*:current".
+     * (i.e. [ARG_CHECK_COMPATIBILITY_API_CURRENT] and [ARG_CHECK_COMPATIBILITY_REMOVED_CURRENT])
+     */
+    var reporterCompatibilityCurrent: Reporter
+
     var allReporters: List<Reporter>
 
     /** If updating baselines, don't fail the build */
@@ -573,9 +633,6 @@
     /** If updating baselines and the baseline is empty, delete the file */
     var deleteEmptyBaselines = false
 
-    /** If generating a removed signature file and it is empty, delete it */
-    var deleteEmptyRemovedSignatures = false
-
     /** Whether the baseline should only contain errors */
     var baselineErrorsOnly = false
 
@@ -584,6 +641,11 @@
     var reportEvenIfSuppressedWriter: PrintWriter? = null
 
     /**
+     * DocReplacements to apply to the documentation.
+     */
+    var docReplacements = mutableListOf<DocReplacement>()
+
+    /**
      * Whether to omit locations for warnings and errors. This is not a flag exposed to users
      * or listed in help; this is intended for the unit test suite, used for example for the
      * test which checks compatibility between signature and API files where the paths vary.
@@ -623,6 +685,9 @@
      */
     var compileSdkVersion: String? = null
 
+    /** Map from XML API descriptor file to corresponding artifact id name */
+    val artifactRegistrations = ArtifactTagger()
+
     /** List of signature files to export as JDiff files */
     val convertToXmlFiles: List<ConvertFile> = mutableConvertToXmlFiles
 
@@ -677,7 +742,8 @@
         val fromApiFile: File,
         val outputFile: File,
         val baseApiFile: File? = null,
-        val strip: Boolean = false
+        val strip: Boolean = false,
+        val outputFormat: FileFormat = FileFormat.JDIFF
     )
 
     /** Temporary folder to use instead of the JDK default, if any */
@@ -720,12 +786,12 @@
         val baselineCompatibilityReleasedBuilder = Baseline.Builder().apply { description = "compatibility:released" }
 
         fun getBaselineBuilderForArg(flag: String): Baseline.Builder = when (flag) {
-            ARG_BASELINE, ARG_UPDATE_BASELINE, ARG_MERGE_BASELINE -> baselineBuilder
-            ARG_BASELINE_API_LINT, ARG_UPDATE_BASELINE_API_LINT -> baselineApiLintBuilder
-            ARG_BASELINE_CHECK_COMPATIBILITY_RELEASED, ARG_UPDATE_BASELINE_CHECK_COMPATIBILITY_RELEASED
-            -> baselineCompatibilityReleasedBuilder
-            else -> error("Internal error: Invalid flag: $flag")
-        }
+                ARG_BASELINE, ARG_UPDATE_BASELINE, ARG_MERGE_BASELINE -> baselineBuilder
+                ARG_BASELINE_API_LINT, ARG_UPDATE_BASELINE_API_LINT -> baselineApiLintBuilder
+                ARG_BASELINE_CHECK_COMPATIBILITY_RELEASED, ARG_UPDATE_BASELINE_CHECK_COMPATIBILITY_RELEASED
+                    -> baselineCompatibilityReleasedBuilder
+                else -> error("Internal error: Invalid flag: $flag")
+            }
 
         var index = 0
         while (index < args.size) {
@@ -747,6 +813,8 @@
                     throw DriverException(stdout = "$PROGRAM_NAME version: ${Version.VERSION}")
                 }
 
+                ARG_COMPAT_OUTPUT -> compatOutput = true
+
                 // For now we don't distinguish between bootclasspath and classpath
                 ARG_CLASS_PATH, "-classpath", "-bootclasspath" -> {
                     val path = getValue(args, ++index)
@@ -822,6 +890,7 @@
                 ARG_DEX_API, "-dexApi" -> dexApiFile = stringToNewFile(getValue(args, ++index))
 
                 ARG_REMOVED_API, "-removedApi" -> removedApiFile = stringToNewFile(getValue(args, ++index))
+                ARG_REMOVED_DEX_API, "-removedDexApi" -> removedDexApiFile = stringToNewFile(getValue(args, ++index))
 
                 ARG_MANIFEST, "-manifest" -> manifest = stringToExistingFile(getValue(args, ++index))
 
@@ -959,10 +1028,10 @@
 
                 ARG_ERROR_MESSAGE_API_LINT -> errorMessageApiLint = getValue(args, ++index)
                 ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_RELEASED -> errorMessageCompatibilityReleased = getValue(args, ++index)
+                ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_CURRENT -> errorMessageCompatibilityCurrent = getValue(args, ++index)
 
                 ARG_PASS_BASELINE_UPDATES -> passBaselineUpdates = true
                 ARG_DELETE_EMPTY_BASELINES -> deleteEmptyBaselines = true
-                ARG_DELETE_EMPTY_REMOVED_SIGNATURES -> deleteEmptyRemovedSignatures = true
 
                 ARG_PUBLIC, "-public" -> docLevel = DocLevel.PUBLIC
                 ARG_PROTECTED, "-protected" -> docLevel = DocLevel.PROTECTED
@@ -1004,14 +1073,55 @@
                     }
                 }
 
-                ARG_CHECK_COMPATIBILITY, ARG_CHECK_COMPATIBILITY_API_RELEASED -> {
+                "--current-api" -> {
                     val file = stringToExistingFile(getValue(args, ++index))
-                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.PUBLIC_API))
+                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.PUBLIC_API, ReleaseType.DEV))
+                    reporter.report(
+                        Issues.DEPRECATED_OPTION, null as File?,
+                        "--current-api is deprecated; instead " +
+                            "use $ARG_CHECK_COMPATIBILITY_API_CURRENT"
+                    )
+                }
+
+                ARG_CHECK_COMPATIBILITY -> {
+                    // See if the next argument specifies the compatibility check.
+                    // Synonymous with ARG_CHECK_COMPATIBILITY_API_CURRENT, though
+                    // for backwards compatibility with earlier versions and usages
+                    // can also works in conjunction with ARG_CURRENT_API where the
+                    // usage was to use ARG_CURRENT_API to point to the API file and
+                    // then specify ARG_CHECK_COMPATIBILITY (without an argument) to
+                    // indicate that the current api should also be checked for
+                    // compatibility.
+                    if (index < args.size - 1) {
+                        val nextArg = args[index + 1]
+                        if (!nextArg.startsWith("-")) {
+                            val file = stringToExistingFile(nextArg)
+                            if (file.isFile) {
+                                index++
+                                mutableCompatibilityChecks.add(CheckRequest(file, ApiType.PUBLIC_API, ReleaseType.DEV))
+                            }
+                        }
+                    }
+                }
+
+                ARG_CHECK_COMPATIBILITY_API_CURRENT -> {
+                    val file = stringToExistingFile(getValue(args, ++index))
+                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.PUBLIC_API, ReleaseType.DEV))
+                }
+
+                ARG_CHECK_COMPATIBILITY_API_RELEASED -> {
+                    val file = stringToExistingFile(getValue(args, ++index))
+                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.PUBLIC_API, ReleaseType.RELEASED))
+                }
+
+                ARG_CHECK_COMPATIBILITY_REMOVED_CURRENT -> {
+                    val file = stringToExistingFile(getValue(args, ++index))
+                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.REMOVED, ReleaseType.DEV))
                 }
 
                 ARG_CHECK_COMPATIBILITY_REMOVED_RELEASED -> {
                     val file = stringToExistingFile(getValue(args, ++index))
-                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.REMOVED))
+                    mutableCompatibilityChecks.add(CheckRequest(file, ApiType.REMOVED, ReleaseType.RELEASED))
                 }
 
                 ARG_CHECK_COMPATIBILITY_BASE_API -> {
@@ -1019,6 +1129,7 @@
                     baseApiForCompatCheck = file
                 }
 
+                ARG_ALLOW_COMPATIBLE_DIFFERENCES -> allowCompatibleDifferences = true
                 ARG_NO_NATIVE_DIFF -> noNativeDiff = true
 
                 // Compat flag for the old API check command, invoked from build/make/core/definitions.mk:
@@ -1037,6 +1148,7 @@
                             CheckRequest(
                                 stableApiFile,
                                 ApiType.PUBLIC_API,
+                                ReleaseType.RELEASED,
                                 apiFileToBeTested
                             )
                         )
@@ -1044,12 +1156,26 @@
                             CheckRequest(
                                 stableRemovedApiFile,
                                 ApiType.REMOVED,
+                                ReleaseType.RELEASED,
                                 removedApiFileToBeTested
                             )
                         )
                     }
                 }
 
+                ARG_ANNOTATION_COVERAGE_STATS -> dumpAnnotationStatistics = true
+                ARG_ANNOTATION_COVERAGE_OF -> mutableAnnotationCoverageOf.addAll(
+                    stringToExistingDirsOrJars(
+                        getValue(args, ++index)
+                    )
+                )
+                ARG_WRITE_CLASS_COVERAGE_TO -> {
+                    annotationCoverageClassReport = stringToNewFile(getValue(args, ++index))
+                }
+                ARG_WRITE_MEMBER_COVERAGE_TO -> {
+                    annotationCoverageMemberReport = stringToNewFile(getValue(args, ++index))
+                }
+
                 ARG_ERROR, "-error" -> setIssueSeverity(
                     getValue(args, ++index),
                     Severity.ERROR,
@@ -1099,6 +1225,11 @@
                     // Already processed above but don't flag it here as invalid
                 }
 
+                ARG_OMIT_COMMON_PACKAGES, "$ARG_OMIT_COMMON_PACKAGES=yes" -> compatibility.omitCommonPackages = true
+                "$ARG_OMIT_COMMON_PACKAGES=no" -> compatibility.omitCommonPackages = false
+
+                ARG_SKIP_JAVA_IN_COVERAGE_REPORT -> omitRuntimePackageStats = true
+
                 // Extracting API levels
                 ARG_ANDROID_JAR_PATTERN -> {
                     val list = androidJarPatterns ?: run {
@@ -1114,9 +1245,6 @@
                         throw DriverException("Suspicious currentApi=$currentApiLevel, expected at least 27")
                     }
                 }
-                ARG_FIRST_VERSION -> {
-                    firstApiLevel = Integer.parseInt(getValue(args, ++index))
-                }
                 ARG_CURRENT_CODENAME -> {
                     currentCodeName = getValue(args, ++index)
                 }
@@ -1136,28 +1264,101 @@
                     }
                 }
 
+                ARG_NO_DOCS, "-nodocs" -> noDocs = true
+
                 ARG_UPDATE_API, "--update-api" -> onlyUpdateApi = true
                 ARG_CHECK_API -> onlyCheckApi = true
 
+                ARG_GENERATE_DOCUMENTATION -> {
+                    // Digest all the remaining arguments.
+                    // Allow "STUBS_DIR" to reference the stubs directory.
+                    var prev = ""
+                    invokeDocumentationToolArguments = args.slice(++index until args.size).mapNotNull {
+                        var argument = it
+                        // When generating documentation, use the doc stubs directory rather than the
+                        // original source path
+                        val docStubsDir = docStubsDir
+                        if (docStubsDir != null && (prev == ARG_SOURCE_PATH || prev == "-sourcepath") &&
+                            !argument.contains(docStubsDir.path)
+                        ) {
+                            // Insert the doc stubs as the default place to look for sources
+                            argument = docStubsDir.path
+                        }
+                        prev = it
+
+                        if (argument == "STUBS_DIR" && docStubsDir != null) {
+                            docStubsDir.path
+                        } else if (argument == "STUBS_DIR" && stubsDir != null) {
+                            stubsDir?.path
+                        } else if (argument == "DOCS_STUBS_DIR" && docStubsDir != null) {
+                            docStubsDir.path
+                        } else if (argument == "DOC_STUBS_SOURCE_LIST" && docStubsSourceList != null) {
+                            "@${docStubsSourceList?.path}"
+                        } else if (argument == "STUBS_SOURCE_LIST" && stubsSourceList != null) {
+                            "@${stubsSourceList?.path}"
+                        } else if (argument == "STUBS_SOURCE_LIST" && docStubsSourceList != null) {
+                            "@${docStubsSourceList?.path}"
+                        } else {
+                            argument
+                        }
+                    }.toTypedArray()
+
+                    index = args.size // jump to end of argument loop
+                }
+
+                ARG_REPLACE_DOCUMENTATION -> {
+                    val packageNames = args[++index].split(":")
+                    val regex = Regex(args[++index])
+                    val replacement = args[++index]
+                    val docReplacement = DocReplacement(packageNames, regex, replacement)
+                    docReplacements.add(docReplacement)
+                }
+
+                ARG_REGISTER_ARTIFACT, "-artifact" -> {
+                    val descriptor = stringToExistingFile(getValue(args, ++index))
+                    val artifactId = getValue(args, ++index)
+                    artifactRegistrations.register(artifactId, descriptor)
+                }
+
                 ARG_CONVERT_TO_JDIFF,
+                ARG_CONVERT_TO_V1,
+                ARG_CONVERT_TO_V2,
                 // doclava compatibility:
                 "-convert2xml",
                 "-convert2xmlnostrip" -> {
                     val strip = arg == "-convert2xml"
+                    val format = when (arg) {
+                        ARG_CONVERT_TO_V1 -> FileFormat.V1
+                        ARG_CONVERT_TO_V2 -> FileFormat.V2
+                        else -> FileFormat.JDIFF
+                    }
+
                     val signatureFile = stringToExistingFile(getValue(args, ++index))
                     val outputFile = stringToNewFile(getValue(args, ++index))
-                    mutableConvertToXmlFiles.add(ConvertFile(signatureFile, outputFile, null, strip))
+                    mutableConvertToXmlFiles.add(ConvertFile(signatureFile, outputFile, null, strip, format))
                 }
 
                 ARG_CONVERT_NEW_TO_JDIFF,
+                ARG_CONVERT_NEW_TO_V1,
+                ARG_CONVERT_NEW_TO_V2,
                 // doclava compatibility:
                 "-new_api",
                 "-new_api_no_strip" -> {
+                    val format = when (arg) {
+                        ARG_CONVERT_NEW_TO_V1 -> FileFormat.V1
+                        ARG_CONVERT_NEW_TO_V2 -> FileFormat.V2
+                        else -> FileFormat.JDIFF
+                    }
                     val strip = arg == "-new_api"
+                    if (arg != ARG_CONVERT_NEW_TO_JDIFF) {
+                        // Using old doclava flags: Compatibility behavior: don't include fields in the output
+                        compatibility.includeFieldsInApiDiff = false
+                    }
+
                     val baseFile = stringToExistingFile(getValue(args, ++index))
                     val signatureFile = stringToExistingFile(getValue(args, ++index))
                     val jDiffFile = stringToNewFile(getValue(args, ++index))
-                    mutableConvertToXmlFiles.add(ConvertFile(signatureFile, jDiffFile, baseFile, strip))
+                    mutableConvertToXmlFiles.add(ConvertFile(signatureFile, jDiffFile, baseFile, strip, format))
                 }
 
                 "--write-android-jar-signatures" -> {
@@ -1170,7 +1371,7 @@
 
                 "-encoding" -> {
                     val value = getValue(args, ++index)
-                    if (value.uppercase(Locale.getDefault()) != "UTF-8") {
+                    if (value.toUpperCase() != "UTF-8") {
                         throw DriverException("$value: Only UTF-8 encoding is supported")
                     }
                 }
@@ -1371,25 +1572,55 @@
                         } else {
                             yesNo(arg.substring(ARG_OUTPUT_DEFAULT_VALUES.length + 1))
                         }
+                    } else if (arg.startsWith(ARG_OMIT_COMMON_PACKAGES)) {
+                        compatibility.omitCommonPackages = if (arg == ARG_OMIT_COMMON_PACKAGES) {
+                            true
+                        } else {
+                            yesNo(arg.substring(ARG_OMIT_COMMON_PACKAGES.length + 1))
+                        }
+                    } else if (arg.startsWith(ARG_COMPAT_OUTPUT)) {
+                        compatOutput = if (arg == ARG_COMPAT_OUTPUT)
+                            true
+                        else yesNo(arg.substring(ARG_COMPAT_OUTPUT.length + 1))
                     } else if (arg.startsWith(ARG_INCLUDE_SIG_VERSION)) {
                         includeSignatureFormatVersion = if (arg == ARG_INCLUDE_SIG_VERSION)
                             true
                         else yesNo(arg.substring(ARG_INCLUDE_SIG_VERSION.length + 1))
                     } else if (arg.startsWith(ARG_FORMAT)) {
                         outputFormat = when (arg) {
-                            "$ARG_FORMAT=v1" -> FileFormat.V1
-                            "$ARG_FORMAT=v2" -> FileFormat.V2
-                            "$ARG_FORMAT=v3" -> FileFormat.V3
-                            "$ARG_FORMAT=v4" -> FileFormat.V4
-                            "$ARG_FORMAT=recommended" -> FileFormat.recommended
-                            "$ARG_FORMAT=latest" -> FileFormat.latest
+                            "$ARG_FORMAT=v1" -> {
+                                FileFormat.V1
+                            }
+                            "$ARG_FORMAT=v2", "$ARG_FORMAT=recommended" -> {
+                                FileFormat.V2
+                            }
+                            "$ARG_FORMAT=v3" -> {
+                                FileFormat.V3
+                            }
+                            "$ARG_FORMAT=v4", "$ARG_FORMAT=latest" -> {
+                                FileFormat.V4
+                            }
                             else -> throw DriverException(stderr = "Unexpected signature format; expected v1, v2, v3 or v4")
                         }
-                        outputFormat.configureOptions(this)
+                        outputFormat.configureOptions(this, compatibility)
                     } else if (arg.startsWith("-")) {
-                        // Some other argument: display usage info and exit
-                        val usage = getUsage(includeHeader = false, colorize = color)
-                        throw DriverException(stderr = "Invalid argument $arg\n\n$usage")
+                        // Compatibility flag; map to mutable properties in the Compatibility
+                        // class and assign it
+                        val compatibilityArg = findCompatibilityFlag(arg)
+                        if (compatibilityArg != null) {
+                            val dash = arg.indexOf('=')
+                            val value = if (dash == -1) {
+                                true
+                            } else {
+                                arg.substring(dash + 1).toBoolean()
+                            }
+                            compatibilityArg.set(compatibility, value)
+                        } else {
+                            // Some other argument: display usage info and exit
+
+                            val usage = getUsage(includeHeader = false, colorize = color)
+                            throw DriverException(stderr = "Invalid argument $arg\n\n$usage")
+                        }
                     } else {
                         if (delayedCheckApiFiles) {
                             delayedCheckApiFiles = false
@@ -1401,6 +1632,7 @@
                                 CheckRequest(
                                     stableApiFile,
                                     ApiType.PUBLIC_API,
+                                    ReleaseType.RELEASED,
                                     apiFileToBeTested
                                 )
                             )
@@ -1408,6 +1640,7 @@
                                 CheckRequest(
                                     stableRemovedApiFile,
                                     ApiType.REMOVED,
+                                    ReleaseType.RELEASED,
                                     removedApiFileToBeTested
                                 )
                             )
@@ -1438,13 +1671,7 @@
             // Fallbacks
             patterns.add("prebuilts/tools/common/api-versions/android-%/android.jar")
             patterns.add("prebuilts/sdk/%/public/android.jar")
-            apiLevelJars = findAndroidJars(
-                patterns,
-                firstApiLevel,
-                currentApiLevel,
-                currentCodeName,
-                currentJar
-            )
+            apiLevelJars = findAndroidJars(patterns, currentApiLevel, currentCodeName, currentJar)
         }
 
         // outputKotlinStyleNulls implies at least format=v3
@@ -1452,7 +1679,7 @@
             if (outputFormat < FileFormat.V3) {
                 outputFormat = FileFormat.V3
             }
-            outputFormat.configureOptions(this)
+            outputFormat.configureOptions(this, compatibility)
         }
 
         // If the caller has not explicitly requested that unannotated classes and
@@ -1471,6 +1698,9 @@
             }
             // We're running in update API mode: cancel other "action" flags; only signature file generation
             // flags count
+            annotationCoverageClassReport = null
+            annotationCoverageMemberReport = null
+            dumpAnnotationStatistics = false
             apiLevelJars = null
             generateApiLevelXml = null
             applyApiLevelsXml = null
@@ -1482,8 +1712,11 @@
             sdkValueDir = null
             externalAnnotations = null
             proguard = null
+            noDocs = true
+            invokeDocumentationToolArguments = emptyArray()
             mutableCompatibilityChecks.clear()
             mutableAnnotationCoverageOf.clear()
+            artifactRegistrations.clear()
             mutableConvertToXmlFiles.clear()
             nullabilityAnnotationsValidator = null
             nullabilityWarningsTxt = null
@@ -1491,6 +1724,9 @@
             validateNullabilityFromMergedStubs = false
             validateNullabilityFromList = null
         } else if (onlyCheckApi) {
+            annotationCoverageClassReport = null
+            annotationCoverageMemberReport = null
+            dumpAnnotationStatistics = false
             apiLevelJars = null
             generateApiLevelXml = null
             applyApiLevelsXml = null
@@ -1502,7 +1738,10 @@
             sdkValueDir = null
             externalAnnotations = null
             proguard = null
+            noDocs = true
+            invokeDocumentationToolArguments = emptyArray()
             mutableAnnotationCoverageOf.clear()
+            artifactRegistrations.clear()
             mutableConvertToXmlFiles.clear()
             nullabilityAnnotationsValidator = null
             nullabilityWarningsTxt = null
@@ -1513,6 +1752,7 @@
             apiXmlFile = null
             dexApiFile = null
             removedApiFile = null
+            removedDexApiFile = null
         }
 
         // Fix up [Baseline] files and [Reporter]s.
@@ -1545,6 +1785,12 @@
             baselineCompatibilityReleased ?: baseline,
             errorMessageCompatibilityReleased
         )
+        reporterCompatibilityCurrent = Reporter(
+            // Note, the compat-check:current shouldn't take a baseline file, so we don't have
+            // a task specific baseline file, but we still respect the global baseline file.
+            baseline,
+            errorMessageCompatibilityCurrent
+        )
 
         // Build "all baselines" and "all reporters"
 
@@ -1556,6 +1802,7 @@
             reporter,
             reporterApiLint,
             reporterCompatibilityReleased,
+            reporterCompatibilityCurrent
         )
 
         updateClassPath()
@@ -1569,30 +1816,36 @@
 
         if (sdkHome != null &&
             compileSdkVersion != null &&
-            classpath.none { it.name == FN_FRAMEWORK_LIBRARY }
-        ) {
+            classpath.none { it.name == FN_FRAMEWORK_LIBRARY }) {
             val jar = File(sdkHome, "platforms/android-$compileSdkVersion")
             if (jar.isFile) {
                 mutableClassPath.add(jar)
             } else {
-                throw DriverException(
-                    stderr = "Could not find android.jar for API level " +
-                        "$compileSdkVersion in SDK $sdkHome: $jar does not exist"
-                )
+                throw DriverException(stderr = "Could not find android.jar for API level " +
+                    "$compileSdkVersion in SDK $sdkHome: $jar does not exist")
             }
             if (jdkHome != null) {
                 throw DriverException(stderr = "Do not specify both $ARG_SDK_HOME and $ARG_JDK_HOME")
             }
         } else if (jdkHome != null) {
-            val isJre = !isJdkFolder(jdkHome)
-            @Suppress("DEPRECATION")
-            val roots = JavaSdkUtil.getJdkClassesRoots(jdkHome, isJre)
+                val isJre = !isJdkFolder(jdkHome)
+                val roots = JavaSdkUtil.getJdkClassesRoots(jdkHome, isJre)
             mutableClassPath.addAll(roots)
         }
     }
 
-    fun isJdkModular(homePath: File): Boolean {
-        return File(homePath, "jmods").isDirectory
+    private fun findCompatibilityFlag(arg: String): KMutableProperty1<Compatibility, Boolean>? {
+        val index = arg.indexOf('=')
+        val name = arg
+            .substring(0, if (index != -1) index else arg.length)
+            .removePrefix("--")
+            .replace('-', '_')
+        val propertyName = SdkVersionInfo.underlinesToCamelCase(name).decapitalize()
+        return Compatibility::class.memberProperties
+            .filterIsInstance<KMutableProperty1<Compatibility, Boolean>>()
+            .find {
+                it.name == propertyName
+            }
     }
 
     /**
@@ -1608,7 +1861,7 @@
         if (sourcePath.isNotEmpty() && sourcePath[0].path.isNotBlank()) {
             fun annotationToPrefix(qualifiedName: String): String {
                 val name = qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1)
-                return name.lowercase(Locale.US).removeSuffix("api") + "-"
+                return name.toLowerCase(Locale.US).removeSuffix("api") + "-"
             }
             val sb = StringBuilder()
             showAnnotations.getIncludedAnnotationNames().forEach { sb.append(annotationToPrefix(it)) }
@@ -1635,7 +1888,6 @@
      */
     private fun findAndroidJars(
         androidJarPatterns: List<String>,
-        minApi: Int,
         currentApiLevel: Int,
         currentCodeName: String?,
         currentJar: File?
@@ -1649,13 +1901,9 @@
         }
 
         val apiLevelFiles = mutableListOf<File>()
-        // api level 0: placeholder, should not be processed.
-        // (This is here because we want the array index to match
-        // the API level)
-        val element = File("not an api: the starting API index is $minApi")
-        for (i in 0 until minApi) {
-            apiLevelFiles.add(element)
-        }
+        // api level 0: placeholder, should not be processed
+        apiLevelFiles.add(File("there is no api 0"))
+        val minApi = 1
 
         // Get all the android.jar. They are in platforms-#
         var apiLevel = minApi - 1
@@ -1682,10 +1930,8 @@
                                 argList.add(args[index + 1])
                             }
                         }
-                        throw DriverException(
-                            stderr = "Could not find android.jar for API level $apiLevel; the " +
-                                "$ARG_ANDROID_JAR_PATTERN set might be invalid: ${argList.joinToString()}"
-                        )
+                        throw DriverException(stderr = "Could not find android.jar for API level $apiLevel; the " +
+                            "$ARG_ANDROID_JAR_PATTERN set might be invalid: ${argList.joinToString()}")
                     }
 
                     break
@@ -1722,6 +1968,27 @@
         if (apiJar != null && sources.isNotEmpty()) {
             throw DriverException(stderr = "Specify either $ARG_SOURCE_FILES or $ARG_INPUT_API_JAR, not both")
         }
+
+        if (compatOutput && outputKotlinStyleNulls) {
+            throw DriverException(
+                stderr = "$ARG_OUTPUT_KOTLIN_NULLS=yes should not be combined with " +
+                    "$ARG_COMPAT_OUTPUT=yes"
+            )
+        }
+
+        if (compatOutput && outputDefaultValues) {
+            throw DriverException(
+                stderr = "$ARG_OUTPUT_DEFAULT_VALUES=yes should not be combined with " +
+                    "$ARG_COMPAT_OUTPUT=yes"
+            )
+        }
+
+        if (compatOutput && includeSignatureFormatVersion) {
+            throw DriverException(
+                stderr = "$ARG_INCLUDE_SIG_VERSION=yes should not be combined with " +
+                    "$ARG_COMPAT_OUTPUT=yes"
+            )
+        }
     }
 
     private fun javadoc(arg: String) {
@@ -1986,58 +2253,49 @@
             ARG_VERBOSE, "Include extra diagnostic output",
             ARG_COLOR, "Attempt to colorize the output (defaults to true if \$TERM is xterm)",
             ARG_NO_COLOR, "Do not attempt to colorize the output",
-            ARG_UPDATE_API,
-            "Cancel any other \"action\" flags other than generating signature files. This is here " +
+            ARG_NO_DOCS, "Cancel any other documentation flags supplied to $PROGRAM_NAME. This is here " +
+                "to make it easier customize build system tasks.",
+            ARG_UPDATE_API, "Cancel any other \"action\" flags other than generating signature files. This is here " +
                 "to make it easier customize build system tasks, particularly for the \"make update-api\" task.",
-            ARG_CHECK_API,
-            "Cancel any other \"action\" flags other than checking signature files. This is here " +
+            ARG_CHECK_API, "Cancel any other \"action\" flags other than checking signature files. This is here " +
                 "to make it easier customize build system tasks, particularly for the \"make checkapi\" task.",
             "$ARG_REPEAT_ERRORS_MAX <N>", "When specified, repeat at most N errors before finishing.",
 
             "", "\nAPI sources:",
-            "$ARG_SOURCE_FILES <files>",
-            "A comma separated list of source files to be parsed. Can also be " +
+            "$ARG_SOURCE_FILES <files>", "A comma separated list of source files to be parsed. Can also be " +
                 "@ followed by a path to a text file containing paths to the full set of files to parse.",
 
-            "$ARG_SOURCE_PATH <paths>",
-            "One or more directories (separated by `${File.pathSeparator}`) " +
+            "$ARG_SOURCE_PATH <paths>", "One or more directories (separated by `${File.pathSeparator}`) " +
                 "containing source files (within a package hierarchy). If $ARG_STRICT_INPUT_FILES, " +
                 "$ARG_STRICT_INPUT_FILES_WARN, or $ARG_STRICT_INPUT_FILES_STACK are used, files accessed under " +
                 "$ARG_SOURCE_PATH that are not explicitly specified in $ARG_SOURCE_FILES are reported as " +
                 "violations.",
 
-            "$ARG_CLASS_PATH <paths>",
-            "One or more directories or jars (separated by " +
+            "$ARG_CLASS_PATH <paths>", "One or more directories or jars (separated by " +
                 "`${File.pathSeparator}`) containing classes that should be on the classpath when parsing the " +
                 "source files",
 
-            "$ARG_MERGE_QUALIFIER_ANNOTATIONS <file>",
-            "An external annotations file to merge and overlay " +
+            "$ARG_MERGE_QUALIFIER_ANNOTATIONS <file>", "An external annotations file to merge and overlay " +
                 "the sources, or a directory of such files. Should be used for annotations intended for " +
                 "inclusion in the API to be written out, e.g. nullability. Formats supported are: IntelliJ's " +
                 "external annotations database format, .jar or .zip files containing those, Android signature " +
                 "files, and Java stub files.",
 
-            "$ARG_MERGE_INCLUSION_ANNOTATIONS <file>",
-            "An external annotations file to merge and overlay " +
+            "$ARG_MERGE_INCLUSION_ANNOTATIONS <file>", "An external annotations file to merge and overlay " +
                 "the sources, or a directory of such files. Should be used for annotations which determine " +
                 "inclusion in the API to be written out, i.e. show and hide. The only format supported is " +
                 "Java stub files.",
 
-            ARG_VALIDATE_NULLABILITY_FROM_MERGED_STUBS,
-            "Triggers validation of nullability annotations " +
+            ARG_VALIDATE_NULLABILITY_FROM_MERGED_STUBS, "Triggers validation of nullability annotations " +
                 "for any class where $ARG_MERGE_QUALIFIER_ANNOTATIONS includes a Java stub file.",
 
-            ARG_VALIDATE_NULLABILITY_FROM_LIST,
-            "Triggers validation of nullability annotations " +
+            ARG_VALIDATE_NULLABILITY_FROM_LIST, "Triggers validation of nullability annotations " +
                 "for any class listed in the named file (one top-level class per line, # prefix for comment line).",
 
-            "$ARG_NULLABILITY_WARNINGS_TXT <file>",
-            "Specifies where to write warnings encountered during " +
+            "$ARG_NULLABILITY_WARNINGS_TXT <file>", "Specifies where to write warnings encountered during " +
                 "validation of nullability annotations. (Does not trigger validation by itself.)",
 
-            ARG_NULLABILITY_ERRORS_NON_FATAL,
-            "Specifies that errors encountered during validation of " +
+            ARG_NULLABILITY_ERRORS_NON_FATAL, "Specifies that errors encountered during validation of " +
                 "nullability annotations should not be treated as errors. They will be written out to the " +
                 "file specified in $ARG_NULLABILITY_WARNINGS_TXT instead.",
 
@@ -2045,25 +2303,25 @@
 
             "$ARG_MANIFEST <file>", "A manifest file, used to for check permissions to cross check APIs",
 
-            "$ARG_HIDE_PACKAGE <package>",
-            "Remove the given packages from the API even if they have not been " +
+            "$ARG_REPLACE_DOCUMENTATION <p> <r> <t>", "Amongst nonempty documentation of items from Java " +
+                "packages <p> and their subpackages, replaces any matches of regular expression <r> " +
+                "with replacement text <t>. <p> is given as a nonempty list of Java package names separated " +
+                "by ':' (e.g. \"java:android.util\"); <t> may contain backreferences (\$1, \$2 etc.) to " +
+                "matching groups from <r>.",
+
+            "$ARG_HIDE_PACKAGE <package>", "Remove the given packages from the API even if they have not been " +
                 "marked with @hide",
 
-            "$ARG_SHOW_ANNOTATION <annotation class>",
-            "Unhide any hidden elements that are also annotated " +
+            "$ARG_SHOW_ANNOTATION <annotation class>", "Unhide any hidden elements that are also annotated " +
                 "with the given annotation",
-            "$ARG_SHOW_SINGLE_ANNOTATION <annotation>",
-            "Like $ARG_SHOW_ANNOTATION, but does not apply " +
+            "$ARG_SHOW_SINGLE_ANNOTATION <annotation>", "Like $ARG_SHOW_ANNOTATION, but does not apply " +
                 "to members; these must also be explicitly annotated",
-            "$ARG_SHOW_FOR_STUB_PURPOSES_ANNOTATION <annotation class>",
-            "Like $ARG_SHOW_ANNOTATION, but elements annotated " +
+            "$ARG_SHOW_FOR_STUB_PURPOSES_ANNOTATION <annotation class>", "Like $ARG_SHOW_ANNOTATION, but elements annotated " +
                 "with it are assumed to be \"implicitly\" included in the API surface, and they'll be included " +
                 "in certain kinds of output such as stubs, but not in others, such as the signature file and API lint",
-            "$ARG_HIDE_ANNOTATION <annotation class>",
-            "Treat any elements annotated with the given annotation " +
+            "$ARG_HIDE_ANNOTATION <annotation class>", "Treat any elements annotated with the given annotation " +
                 "as hidden",
-            "$ARG_HIDE_META_ANNOTATION <meta-annotation class>",
-            "Treat as hidden any elements annotated with an " +
+            "$ARG_HIDE_META_ANNOTATION <meta-annotation class>", "Treat as hidden any elements annotated with an " +
                 "annotation which is itself annotated with the given meta-annotation",
             ARG_SHOW_UNANNOTATED, "Include un-annotated public APIs in the signature file as well",
             "$ARG_JAVA_SOURCE <level>", "Sets the source level for Java source files; default is 1.8.",
@@ -2071,25 +2329,21 @@
             "$ARG_SDK_HOME <dir>", "If set, locate the `android.jar` file from the given Android SDK",
             "$ARG_COMPILE_SDK_VERSION <api>", "Use the given API level",
             "$ARG_JDK_HOME <dir>", "If set, add the Java APIs from the given JDK to the classpath",
-            "$ARG_STUB_PACKAGES <package-list>",
-            "List of packages (separated by ${File.pathSeparator}) which will " +
+            "$ARG_STUB_PACKAGES <package-list>", "List of packages (separated by ${File.pathSeparator}) which will " +
                 "be used to filter out irrelevant code. If specified, only code in these packages will be " +
                 "included in signature files, stubs, etc. (This is not limited to just the stubs; the name " +
                 "is historical.) You can also use \".*\" at the end to match subpackages, so `foo.*` will " +
                 "match both `foo` and `foo.bar`.",
-            "$ARG_SUBTRACT_API <api file>",
-            "Subtracts the API in the given signature or jar file from the " +
+            "$ARG_SUBTRACT_API <api file>", "Subtracts the API in the given signature or jar file from the " +
                 "current API being emitted via $ARG_API, $ARG_STUBS, $ARG_DOC_STUBS, etc. " +
                 "Note that the subtraction only applies to classes; it does not subtract members.",
-            "$ARG_TYPEDEFS_IN_SIGNATURES <ref|inline>",
-            "Whether to include typedef annotations in signature " +
+            "$ARG_TYPEDEFS_IN_SIGNATURES <ref|inline>", "Whether to include typedef annotations in signature " +
                 "files. `$ARG_TYPEDEFS_IN_SIGNATURES ref` will include just a reference to the typedef class, " +
                 "which is not itself part of the API and is not included as a class, and " +
                 "`$ARG_TYPEDEFS_IN_SIGNATURES inline` will include the constants themselves into each usage " +
                 "site. You can also supply `$ARG_TYPEDEFS_IN_SIGNATURES none` to explicitly turn it off, if the " +
                 "default ever changes.",
-            ARG_IGNORE_CLASSES_ON_CLASSPATH,
-            "Prevents references to classes on the classpath from being added to " +
+            ARG_IGNORE_CLASSES_ON_CLASSPATH, "Prevents references to classes on the classpath from being added to " +
                 "the generated stub files.",
 
             "", "\nDocumentation:",
@@ -2105,15 +2359,18 @@
             "$ARG_DEX_API <file>", "Generate a DEX signature descriptor file listing the APIs",
             "$ARG_REMOVED_API <file>", "Generate a signature descriptor file for APIs that have been removed",
             "$ARG_FORMAT=<v1,v2,v3,...>", "Sets the output signature file format to be the given version.",
-            "$ARG_OUTPUT_KOTLIN_NULLS[=yes|no]",
-            "Controls whether nullness annotations should be formatted as " +
+            "$ARG_OUTPUT_KOTLIN_NULLS[=yes|no]", "Controls whether nullness annotations should be formatted as " +
                 "in Kotlin (with \"?\" for nullable types, \"\" for non nullable types, and \"!\" for unknown. " +
                 "The default is yes.",
-            "$ARG_OUTPUT_DEFAULT_VALUES[=yes|no]",
-            "Controls whether default values should be included in " +
+            "$ARG_OUTPUT_DEFAULT_VALUES[=yes|no]", "Controls whether default values should be included in " +
                 "signature files. The default is yes.",
-            "$ARG_INCLUDE_SIG_VERSION[=yes|no]",
-            "Whether the signature files should include a comment listing " +
+            "$ARG_COMPAT_OUTPUT=[yes|no]", "Controls whether to keep signature files compatible with the " +
+                "historical format (with its various quirks) or to generate the new format (which will also include " +
+                "annotations that are part of the API, etc.)",
+            "$ARG_OMIT_COMMON_PACKAGES[=yes|no]", "Skip common package prefixes like java.lang.* and " +
+                "kotlin.* in signature files, along with packages for well known annotations like @Nullable and " +
+                "@NonNull.",
+            "$ARG_INCLUDE_SIG_VERSION[=yes|no]", "Whether the signature files should include a comment listing " +
                 "the format version of the signature file.",
 
             "$ARG_PROGUARD <file>", "Write a ProGuard keep file for the API",
@@ -2121,66 +2378,56 @@
 
             "", "\nGenerating Stubs:",
             "$ARG_STUBS <dir>", "Generate stub source files for the API",
-            "$ARG_DOC_STUBS <dir>",
-            "Generate documentation stub source files for the API. Documentation stub " +
+            "$ARG_DOC_STUBS <dir>", "Generate documentation stub source files for the API. Documentation stub " +
                 "files are similar to regular stub files, but there are some differences. For example, in " +
                 "the stub files, we'll use special annotations like @RecentlyNonNull instead of @NonNull to " +
                 "indicate that an element is recently marked as non null, whereas in the documentation stubs we'll " +
                 "just list this as @NonNull. Another difference is that @doconly elements are included in " +
                 "documentation stubs, but not regular stubs, etc.",
-            ARG_KOTLIN_STUBS,
-            "[CURRENTLY EXPERIMENTAL] If specified, stubs generated from Kotlin source code will " +
+            ARG_KOTLIN_STUBS, "[CURRENTLY EXPERIMENTAL] If specified, stubs generated from Kotlin source code will " +
                 "be written in Kotlin rather than the Java programming language.",
             ARG_INCLUDE_ANNOTATIONS, "Include annotations such as @Nullable in the stub files.",
             ARG_EXCLUDE_ALL_ANNOTATIONS, "Exclude annotations such as @Nullable from the stub files; the default.",
-            "$ARG_PASS_THROUGH_ANNOTATION <annotation classes>",
-            "A comma separated list of fully qualified names of " +
+            "$ARG_PASS_THROUGH_ANNOTATION <annotation classes>", "A comma separated list of fully qualified names of " +
                 "annotation classes that must be passed through unchanged.",
-            "$ARG_EXCLUDE_ANNOTATION <annotation classes>",
-            "A comma separated list of fully qualified names of " +
+            "$ARG_EXCLUDE_ANNOTATION <annotation classes>", "A comma separated list of fully qualified names of " +
                 "annotation classes that must be stripped from metalava's outputs.",
             ARG_ENHANCE_DOCUMENTATION,
             "Enhance documentation in various ways, for example auto-generating documentation based on source " +
                 "annotations present in the code. This is implied by --doc-stubs.",
-            ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS,
-            "Exclude element documentation (javadoc and kdoc) " +
+            ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS, "Exclude element documentation (javadoc and kdoc) " +
                 "from the generated stubs. (Copyright notices are not affected by this, they are always included. " +
                 "Documentation stubs (--doc-stubs) are not affected.)",
-            "$ARG_STUBS_SOURCE_LIST <file>",
-            "Write the list of generated stub files into the given source " +
+            "$ARG_STUBS_SOURCE_LIST <file>", "Write the list of generated stub files into the given source " +
                 "list file. If generating documentation stubs and you haven't also specified " +
                 "$ARG_DOC_STUBS_SOURCE_LIST, this list will refer to the documentation stubs; " +
                 "otherwise it's the non-documentation stubs.",
-            "$ARG_DOC_STUBS_SOURCE_LIST <file>",
-            "Write the list of generated doc stub files into the given source " +
+            "$ARG_DOC_STUBS_SOURCE_LIST <file>", "Write the list of generated doc stub files into the given source " +
                 "list file",
+            "$ARG_REGISTER_ARTIFACT <api-file> <id>", "Registers the given id for the packages found in " +
+                "the given signature file. $PROGRAM_NAME will inject an @artifactId <id> tag into every top " +
+                "level stub class in that API.",
 
             "", "\nDiffs and Checks:",
-            "$ARG_INPUT_KOTLIN_NULLS[=yes|no]",
-            "Whether the signature file being read should be " +
+            "$ARG_INPUT_KOTLIN_NULLS[=yes|no]", "Whether the signature file being read should be " +
                 "interpreted as having encoded its types using Kotlin style types: a suffix of \"?\" for nullable " +
                 "types, no suffix for non nullable types, and \"!\" for unknown. The default is no.",
-            "$ARG_CHECK_COMPATIBILITY:type:state <file>",
-            "Check compatibility. Type is one of 'api' " +
+            "$ARG_CHECK_COMPATIBILITY:type:state <file>", "Check compatibility. Type is one of 'api' " +
                 "and 'removed', which checks either the public api or the removed api. State is one of " +
                 "'current' and 'released', to check either the currently in development API or the last publicly " +
                 "released API, respectively. Different compatibility checks apply in the two scenarios. " +
                 "For example, to check the code base against the current public API, use " +
                 "$ARG_CHECK_COMPATIBILITY:api:current.",
-            "$ARG_CHECK_COMPATIBILITY_BASE_API <file>",
-            "When performing a compat check, use the provided signature " +
+            "$ARG_CHECK_COMPATIBILITY_BASE_API <file>", "When performing a compat check, use the provided signature " +
                 "file as a base api, which is treated as part of the API being checked. This allows us to compute the " +
                 "full API surface from a partial API surface (e.g. the current @SystemApi txt file), which allows us to " +
                 "recognize when an API is moved from the partial API to the base API and avoid incorrectly flagging this " +
                 "as an API removal.",
-            "$ARG_API_LINT [api file]",
-            "Check API for Android API best practices. If a signature file is " +
+            "$ARG_API_LINT [api file]", "Check API for Android API best practices. If a signature file is " +
                 "provided, only the APIs that are new since the API will be checked.",
-            "$ARG_API_LINT_IGNORE_PREFIX [prefix]",
-            "A list of package prefixes to ignore API issues in " +
+            "$ARG_API_LINT_IGNORE_PREFIX [prefix]", "A list of package prefixes to ignore API issues in " +
                 "when running with $ARG_API_LINT.",
-            "$ARG_MIGRATE_NULLNESS <api file>",
-            "Compare nullness information with the previous stable API " +
+            "$ARG_MIGRATE_NULLNESS <api file>", "Compare nullness information with the previous stable API " +
                 "and mark newly annotated APIs as under migration.",
             ARG_WARNINGS_AS_ERRORS, "Promote all warnings to errors",
             ARG_LINTS_AS_ERRORS, "Promote all API lint warnings to errors",
@@ -2189,115 +2436,115 @@
             "$ARG_LINT <id>", "Report issues of the given id as having lint-severity",
             "$ARG_HIDE <id>", "Hide/skip issues of the given id",
             "$ARG_REPORT_EVEN_IF_SUPPRESSED <file>", "Write all issues into the given file, even if suppressed (via annotation or baseline) but not if hidden (by '$ARG_HIDE')",
-            "$ARG_BASELINE <file>",
-            "Filter out any errors already reported in the given baseline file, or " +
+            "$ARG_BASELINE <file>", "Filter out any errors already reported in the given baseline file, or " +
                 "create if it does not already exist",
-            "$ARG_UPDATE_BASELINE [file]",
-            "Rewrite the existing baseline file with the current set of warnings. " +
+            "$ARG_UPDATE_BASELINE [file]", "Rewrite the existing baseline file with the current set of warnings. " +
                 "If some warnings have been fixed, this will delete them from the baseline files. If a file " +
                 "is provided, the updated baseline is written to the given file; otherwise the original source " +
                 "baseline file is updated.",
-            "$ARG_BASELINE_API_LINT <file> $ARG_UPDATE_BASELINE_API_LINT [file]",
-            "Same as $ARG_BASELINE and " +
+            "$ARG_BASELINE_API_LINT <file> $ARG_UPDATE_BASELINE_API_LINT [file]", "Same as $ARG_BASELINE and " +
                 "$ARG_UPDATE_BASELINE respectively, but used specifically for API lint issues performed by " +
                 "$ARG_API_LINT.",
             "$ARG_BASELINE_CHECK_COMPATIBILITY_RELEASED <file> $ARG_UPDATE_BASELINE_CHECK_COMPATIBILITY_RELEASED [file]",
-            "Same as $ARG_BASELINE and " +
+                "Same as $ARG_BASELINE and " +
                 "$ARG_UPDATE_BASELINE respectively, but used specifically for API compatibility issues performed by " +
                 "$ARG_CHECK_COMPATIBILITY_API_RELEASED and $ARG_CHECK_COMPATIBILITY_REMOVED_RELEASED.",
-            "$ARG_MERGE_BASELINE [file]",
-            "Like $ARG_UPDATE_BASELINE, but instead of always replacing entries " +
+            "$ARG_MERGE_BASELINE [file]", "Like $ARG_UPDATE_BASELINE, but instead of always replacing entries " +
                 "in the baseline, it will merge the existing baseline with the new baseline. This is useful " +
                 "if $PROGRAM_NAME runs multiple times on the same source tree with different flags at different " +
                 "times, such as occasionally with $ARG_API_LINT.",
-            ARG_PASS_BASELINE_UPDATES,
-            "Normally, encountering error will fail the build, even when updating " +
+            ARG_PASS_BASELINE_UPDATES, "Normally, encountering error will fail the build, even when updating " +
                 "baselines. This flag allows you to tell $PROGRAM_NAME to continue without errors, such that " +
                 "all the baselines in the source tree can be updated in one go.",
-            ARG_DELETE_EMPTY_BASELINES,
-            "Whether to delete baseline files if they are updated and there is nothing " +
+            ARG_DELETE_EMPTY_BASELINES, "Whether to delete baseline files if they are updated and there is nothing " +
                 "to include.",
             "$ARG_ERROR_MESSAGE_API_LINT <message>", "If set, $PROGRAM_NAME shows it when errors are detected in $ARG_API_LINT.",
-            "$ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_RELEASED <message>",
-            "If set, $PROGRAM_NAME shows it " +
+            "$ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_RELEASED <message>", "If set, $PROGRAM_NAME shows it " +
                 "when errors are detected in $ARG_CHECK_COMPATIBILITY_API_RELEASED and $ARG_CHECK_COMPATIBILITY_REMOVED_RELEASED.",
+            "$ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_CURRENT <message>", "If set, $PROGRAM_NAME shows it " +
+                "when errors are detected in $ARG_CHECK_COMPATIBILITY_API_CURRENT and $ARG_CHECK_COMPATIBILITY_REMOVED_CURRENT.",
 
             "", "\nJDiff:",
             "$ARG_XML_API <file>", "Like $ARG_API, but emits the API in the JDiff XML format instead",
-            "$ARG_CONVERT_TO_JDIFF <sig> <xml>",
-            "Reads in the given signature file, and writes it out " +
+            "$ARG_CONVERT_TO_JDIFF <sig> <xml>", "Reads in the given signature file, and writes it out " +
                 "in the JDiff XML format. Can be specified multiple times.",
-            "$ARG_CONVERT_NEW_TO_JDIFF <old> <new> <xml>",
-            "Reads in the given old and new api files, " +
+            "$ARG_CONVERT_NEW_TO_JDIFF <old> <new> <xml>", "Reads in the given old and new api files, " +
                 "computes the difference, and writes out only the new parts of the API in the JDiff XML format.",
+            "$ARG_CONVERT_TO_V1 <sig> <sig>", "Reads in the given signature file and writes it out as a " +
+                "signature file in the original v1/doclava format.",
+            "$ARG_CONVERT_TO_V2 <sig> <sig>", "Reads in the given signature file and writes it out as a " +
+                "signature file in the new signature format, v2.",
+            "$ARG_CONVERT_NEW_TO_V2 <old> <new> <sig>", "Reads in the given old and new api files, " +
+                "computes the difference, and writes out only the new parts of the API in the v2 format.",
+
+            "", "\nStatistics:",
+            ARG_ANNOTATION_COVERAGE_STATS, "Whether $PROGRAM_NAME should emit coverage statistics for " +
+                "annotations, listing the percentage of the API that has been annotated with nullness information.",
+
+            "$ARG_ANNOTATION_COVERAGE_OF <paths>", "One or more jars (separated by `${File.pathSeparator}`) " +
+                "containing existing apps that we want to measure annotation coverage statistics for. The set of " +
+                "API usages in those apps are counted up and the most frequently used APIs that are missing " +
+                "annotation metadata are listed in descending order.",
+
+            ARG_SKIP_JAVA_IN_COVERAGE_REPORT, "In the coverage annotation report, skip java.** and kotlin.** to " +
+                "narrow the focus down to the Android framework APIs.",
+
+            "$ARG_WRITE_CLASS_COVERAGE_TO <path>", "Specifies a file to write the annotation " +
+                "coverage report for classes to.",
+            "$ARG_WRITE_MEMBER_COVERAGE_TO <path>", "Specifies a file to write the annotation " +
+                "coverage report for members to.",
 
             "", "\nExtracting Annotations:",
-            "$ARG_EXTRACT_ANNOTATIONS <zipfile>",
-            "Extracts source annotations from the source files and writes " +
+            "$ARG_EXTRACT_ANNOTATIONS <zipfile>", "Extracts source annotations from the source files and writes " +
                 "them into the given zip file",
-            "$ARG_INCLUDE_ANNOTATION_CLASSES <dir>",
-            "Copies the given stub annotation source files into the " +
+            "$ARG_INCLUDE_ANNOTATION_CLASSES <dir>", "Copies the given stub annotation source files into the " +
                 "generated stub sources; <dir> is typically $PROGRAM_NAME/stub-annotations/src/main/java/.",
-            "$ARG_REWRITE_ANNOTATIONS <dir/jar>",
-            "For a bytecode folder or output jar, rewrites the " +
+            "$ARG_REWRITE_ANNOTATIONS <dir/jar>", "For a bytecode folder or output jar, rewrites the " +
                 "androidx annotations to be package private",
-            "$ARG_FORCE_CONVERT_TO_WARNING_NULLABILITY_ANNOTATIONS <package1:-package2:...>",
-            "On every API declared " +
+            "$ARG_FORCE_CONVERT_TO_WARNING_NULLABILITY_ANNOTATIONS <package1:-package2:...>", "On every API declared " +
                 "in a class referenced by the given filter, makes nullability issues appear to callers as warnings " +
                 "rather than errors by replacing @Nullable/@NonNull in these APIs with " +
                 "@RecentlyNullable/@RecentlyNonNull",
-            "$ARG_COPY_ANNOTATIONS <source> <dest>",
-            "For a source folder full of annotation " +
+            "$ARG_COPY_ANNOTATIONS <source> <dest>", "For a source folder full of annotation " +
                 "sources, generates corresponding package private versions of the same annotations.",
-            ARG_INCLUDE_SOURCE_RETENTION,
-            "If true, include source-retention annotations in the stub files. Does " +
+            ARG_INCLUDE_SOURCE_RETENTION, "If true, include source-retention annotations in the stub files. Does " +
                 "not apply to signature files. Source retention annotations are extracted into the external " +
                 "annotations files instead.",
             "", "\nInjecting API Levels:",
-            "$ARG_APPLY_API_LEVELS <api-versions.xml>",
-            "Reads an XML file containing API level descriptions " +
+            "$ARG_APPLY_API_LEVELS <api-versions.xml>", "Reads an XML file containing API level descriptions " +
                 "and merges the information into the documentation",
 
             "", "\nExtracting API Levels:",
             "$ARG_GENERATE_API_LEVELS <xmlfile>",
             "Reads android.jar SDK files and generates an XML file recording " +
                 "the API level for each class, method and field",
-            "$ARG_ANDROID_JAR_PATTERN <pattern>",
-            "Patterns to use to locate Android JAR files. The default " +
+            "$ARG_ANDROID_JAR_PATTERN <pattern>", "Patterns to use to locate Android JAR files. The default " +
                 "is \$ANDROID_HOME/platforms/android-%/android.jar.",
-            ARG_FIRST_VERSION, "Sets the first API level to generate an API database from; usually 1",
             ARG_CURRENT_VERSION, "Sets the current API level of the current source code",
             ARG_CURRENT_CODENAME, "Sets the code name for the current source code",
             ARG_CURRENT_JAR, "Points to the current API jar, if any",
 
             "", "\nSandboxing:",
-            ARG_NO_IMPLICIT_ROOT,
-            "Disable implicit root directory detection. " +
+            ARG_NO_IMPLICIT_ROOT, "Disable implicit root directory detection. " +
                 "Otherwise, $PROGRAM_NAME adds in source roots implied by the source files",
-            "$ARG_STRICT_INPUT_FILES <file>",
-            "Do not read files that are not explicitly specified in the command line. " +
+            "$ARG_STRICT_INPUT_FILES <file>", "Do not read files that are not explicitly specified in the command line. " +
                 "All violations are written to the given file. Reads on directories are always allowed, but " +
                 "$PROGRAM_NAME still tracks reads on directories that are not specified in the command line, " +
                 "and write them to the file.",
-            "$ARG_STRICT_INPUT_FILES_WARN <file>",
-            "Warn when files not explicitly specified on the command line are " +
+            "$ARG_STRICT_INPUT_FILES_WARN <file>", "Warn when files not explicitly specified on the command line are " +
                 "read. All violations are written to the given file. Reads on directories not specified in the command " +
                 "line are allowed but also logged.",
             "$ARG_STRICT_INPUT_FILES_STACK <file>", "Same as $ARG_STRICT_INPUT_FILES but also print stacktraces.",
-            "$ARG_STRICT_INPUT_FILES_EXEMPT <files or dirs>",
-            "Used with $ARG_STRICT_INPUT_FILES. Explicitly allow " +
+            "$ARG_STRICT_INPUT_FILES_EXEMPT <files or dirs>", "Used with $ARG_STRICT_INPUT_FILES. Explicitly allow " +
                 "access to files and/or directories (separated by `${File.pathSeparator}). Can also be " +
                 "@ followed by a path to a text file containing paths to the full set of files and/or directories.",
 
             "", "\nEnvironment Variables:",
-            ENV_VAR_METALAVA_DUMP_ARGV,
-            "Set to true to have metalava emit all the arguments it was invoked with. " +
+            ENV_VAR_METALAVA_DUMP_ARGV, "Set to true to have metalava emit all the arguments it was invoked with. " +
                 "Helpful when debugging or reproducing under a debugger what the build system is doing.",
-            ENV_VAR_METALAVA_PREPEND_ARGS,
-            "One or more arguments (concatenated by space) to insert into the " +
+            ENV_VAR_METALAVA_PREPEND_ARGS, "One or more arguments (concatenated by space) to insert into the " +
                 "command line, before the documentation flags.",
-            ENV_VAR_METALAVA_APPEND_ARGS,
-            "One or more arguments (concatenated by space) to append to the " +
+            ENV_VAR_METALAVA_APPEND_ARGS, "One or more arguments (concatenated by space) to append to the " +
                 "end of the command line, after the generate documentation flags."
         )
 
@@ -2352,6 +2599,12 @@
     }
 
     companion object {
+        /** Whether we should use [Compatibility] mode */
+        fun useCompatMode(args: Array<String>): Boolean {
+            return COMPAT_MODE_BY_DEFAULT && !args.contains("$ARG_COMPAT_OUTPUT=no") &&
+                (args.none { it.startsWith("$ARG_FORMAT=") } || args.contains("--format=v1"))
+        }
+
         private fun setIssueSeverity(
             id: String,
             severity: Severity,
diff --git a/src/main/java/com/android/tools/metalava/Progress.kt b/src/main/java/com/android/tools/metalava/Progress.kt
index 5940b50..9c461ea 100644
--- a/src/main/java/com/android/tools/metalava/Progress.kt
+++ b/src/main/java/com/android/tools/metalava/Progress.kt
@@ -82,8 +82,7 @@
         "+%.1freal +%.1fusr +%.1fsys",
         realDeltaMs / 1_000.0,
         userDeltaMillis / 1_000.0,
-        sysDeltaMillis / 1_000.0
-    )
+        sysDeltaMillis / 1_000.0)
 }
 
 private fun getMemoryStats(): String {
@@ -94,8 +93,7 @@
         mu.init / 1024 / 1024,
         mu.used / 1024 / 1024,
         mu.committed / 1024 / 1024,
-        mu.max / 1024 / 1024
-    )
+        mu.max / 1024 / 1024)
 }
 
 /** Used for verbose output to show progress bar */
diff --git a/src/main/java/com/android/tools/metalava/ProguardWriter.kt b/src/main/java/com/android/tools/metalava/ProguardWriter.kt
index 795e3d6..cb8a2be 100644
--- a/src/main/java/com/android/tools/metalava/ProguardWriter.kt
+++ b/src/main/java/com/android/tools/metalava/ProguardWriter.kt
@@ -135,4 +135,4 @@
         }
         return qualifiedName
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/ReleaseType.kt b/src/main/java/com/android/tools/metalava/ReleaseType.kt
new file mode 100644
index 0000000..d37cbcf
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/ReleaseType.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava
+
+import com.android.tools.metalava.model.IssueConfiguration
+
+enum class ReleaseType(val flagName: String, private val displayName: String = flagName) {
+    DEV("current", "development") {
+        /**
+         * Customization of the severities to apply when doing compatibility checking against the
+         * current version of the API. Corresponds to the same flags passed into doclava's error
+         * check this way:
+         * args: "-error 2 -error 3 -error 4 -error 5 -error 6 " +
+         * "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+         * "-error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 " +
+         * "-error 25 -error 26 -error 27",
+         */
+        override fun getIssueConfiguration(): IssueConfiguration {
+            return super.getIssueConfiguration().apply {
+                error(Issues.ADDED_CLASS)
+                error(Issues.ADDED_FIELD)
+                error(Issues.ADDED_FINAL_UNINSTANTIABLE)
+                error(Issues.ADDED_INTERFACE)
+                error(Issues.ADDED_METHOD)
+                error(Issues.ADDED_PACKAGE)
+                error(Issues.CHANGED_ABSTRACT)
+                error(Issues.CHANGED_CLASS)
+                error(Issues.CHANGED_DEPRECATED)
+                error(Issues.CHANGED_SCOPE)
+                error(Issues.CHANGED_SYNCHRONIZED)
+                error(Issues.CHANGED_THROWS)
+                error(Issues.REMOVED_FINAL)
+            }
+        }
+    },
+
+    RELEASED("released", "released") {
+        /**
+         * Customization of the severities to apply when doing compatibility checking against the
+         * previously released stable version of the API. Corresponds to the same flags passed into
+         * doclava's error check this way:
+         * args: "-hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 -hide 26 -hide 27 " +
+         * "-error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 " +
+         * "-error 16 -error 17 -error 18 -error 31",
+         */
+        override fun getIssueConfiguration(): IssueConfiguration {
+            return super.getIssueConfiguration().apply {
+                error(Issues.ADDED_ABSTRACT_METHOD)
+                hide(Issues.ADDED_CLASS)
+                hide(Issues.ADDED_FIELD)
+                hide(Issues.ADDED_FINAL_UNINSTANTIABLE)
+                hide(Issues.ADDED_INTERFACE)
+                hide(Issues.ADDED_METHOD)
+                hide(Issues.ADDED_PACKAGE)
+                hide(Issues.CHANGED_DEPRECATED)
+                hide(Issues.CHANGED_SYNCHRONIZED)
+                hide(Issues.REMOVED_FINAL)
+            }
+        }
+    };
+
+    /** Returns the error configuration to use for the given release type */
+    open fun getIssueConfiguration(): IssueConfiguration {
+        return IssueConfiguration().apply {
+            error(Issues.ADDED_FINAL)
+            error(Issues.CHANGED_STATIC)
+            error(Issues.CHANGED_SUPERCLASS)
+            error(Issues.CHANGED_TRANSIENT)
+            error(Issues.CHANGED_TYPE)
+            error(Issues.CHANGED_VALUE)
+            error(Issues.CHANGED_VOLATILE)
+            error(Issues.REMOVED_CLASS)
+            error(Issues.REMOVED_FIELD)
+            error(Issues.REMOVED_INTERFACE)
+            error(Issues.REMOVED_METHOD)
+            error(Issues.REMOVED_PACKAGE)
+            error(Issues.ADDED_REIFIED)
+        }
+    }
+
+    override fun toString(): String = displayName
+}
diff --git a/src/main/java/com/android/tools/metalava/Reporter.kt b/src/main/java/com/android/tools/metalava/Reporter.kt
index 0c691eb..2d9afc7 100644
--- a/src/main/java/com/android/tools/metalava/Reporter.kt
+++ b/src/main/java/com/android/tools/metalava/Reporter.kt
@@ -33,11 +33,8 @@
 import com.intellij.psi.PsiCompiledElement
 import com.intellij.psi.PsiElement
 import com.intellij.psi.PsiModifierListOwner
-import com.intellij.psi.PsiNameIdentifierOwner
 import com.intellij.psi.impl.light.LightElement
-import org.jetbrains.kotlin.psi.KtModifierListOwner
-import org.jetbrains.uast.UClass
-import org.jetbrains.uast.UElement
+import org.jetbrains.uast.kotlin.KotlinUClass
 import java.io.File
 import java.io.PrintWriter
 
@@ -188,9 +185,9 @@
         item ?: return false
 
         for (annotation in item.modifiers.annotations()) {
-            val annotationName = annotation.qualifiedName
+            val annotationName = annotation.qualifiedName()
             if (annotationName != null && annotationName in SUPPRESS_ANNOTATIONS) {
-                for (attribute in annotation.attributes) {
+                for (attribute in annotation.attributes()) {
                     // Assumption that all annotations in SUPPRESS_ANNOTATIONS only have
                     // one attribute such as value/names that is varargs of String
                     val value = attribute.value
@@ -235,7 +232,7 @@
     private fun getTextRange(element: PsiElement): TextRange? {
         var range: TextRange? = null
 
-        if (element is UClass) {
+        if (element is KotlinUClass) {
             range = element.sourcePsi?.textRange
         } else if (element is PsiCompiledElement) {
             if (element is LightElement) {
@@ -251,7 +248,7 @@
         return range
     }
 
-    private fun elementToLocation(element: PsiElement?): String? {
+    private fun elementToLocation(element: PsiElement?, includeDocs: Boolean = true): String? {
         element ?: return null
         val psiFile = element.containingFile ?: return null
         val virtualFile = psiFile.virtualFile ?: return null
@@ -259,20 +256,17 @@
 
         val path = (rootFolder?.toPath()?.relativize(file.toPath()) ?: file.toPath()).toString()
 
-        // Unwrap UAST for accurate Kotlin line numbers (UAST synthesizes text offsets sometimes)
-        val sourceElement = (element as? UElement)?.sourcePsi ?: element
-
-        // Skip doc comments for classes, methods and fields by pointing at the line where the
-        // element's name is or falling back to the first line of its modifier list (which may
-        // include annotations) or lastly to the start of the element itself
-        val rangeElement = (sourceElement as? PsiNameIdentifierOwner)?.nameIdentifier
-            ?: (sourceElement as? KtModifierListOwner)?.modifierList
-            ?: (sourceElement as? PsiModifierListOwner)?.modifierList
-            ?: sourceElement
+        // Skip doc comments for classes, methods and fields; we usually want to point right to
+        // the class/method/field definition
+        val rangeElement = if (!includeDocs && element is PsiModifierListOwner) {
+            element.modifierList ?: element
+        } else
+            element
 
         val range = getTextRange(rangeElement)
         val lineNumber = if (range == null) {
-            -1 // No source offsets, use invalid line number
+            // No source offsets, use invalid line number
+            -1
         } else {
             getLineNumber(psiFile.text, range.startOffset) + 1
         }
@@ -398,8 +392,7 @@
                 id,
                 color = false,
                 omitLocations = false
-            )
-        )
+            ))
         return true
     }
 
@@ -457,4 +450,4 @@
     ANDROID_SUPPRESS_LINT,
     JAVA_LANG_SUPPRESS_WARNINGS,
     KOTLIN_SUPPRESS
-)
+)
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt b/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt
index a34c162..d256e10 100644
--- a/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt
+++ b/src/main/java/com/android/tools/metalava/RewriteAnnotations.kt
@@ -127,7 +127,6 @@
                 qualifiedName == RECENTLY_NONNULL ||
                 qualifiedName == ANDROID_NULLABLE ||
                 qualifiedName == ANDROID_NONNULL -> return false
-            qualifiedName.equals(ANDROID_SDK_CONSTANT) -> return true
             qualifiedName.startsWith("androidx.annotation.") -> return true
         }
 
@@ -135,9 +134,9 @@
         if (codebase != null) {
             val cls = codebase.findClass(qualifiedName) ?: return true
             return cls.isAnnotationType() && cls.getRetention() == AnnotationRetention.SOURCE
-        } else {
-            error("Found annotation with unknown desired retention: " + qualifiedName)
         }
+
+        return false
     }
 
     /** Writes the bytecode for the compiled annotations in the given file such that they are package private */
diff --git a/src/main/java/com/android/tools/metalava/SdkFileWriter.kt b/src/main/java/com/android/tools/metalava/SdkFileWriter.kt
index ee13682..e87166e 100644
--- a/src/main/java/com/android/tools/metalava/SdkFileWriter.kt
+++ b/src/main/java/com/android/tools/metalava/SdkFileWriter.kt
@@ -29,6 +29,7 @@
 private const val ANDROID_VIEW_VIEW = "android.view.View"
 private const val ANDROID_VIEW_VIEW_GROUP = "android.view.ViewGroup"
 private const val ANDROID_VIEW_VIEW_GROUP_LAYOUT_PARAMS = "android.view.ViewGroup.LayoutParams"
+private const val SDK_CONSTANT_ANNOTATION = "android.annotation.SdkConstant"
 private const val SDK_CONSTANT_TYPE_ACTIVITY_ACTION =
     "android.annotation.SdkConstant.SdkConstantType.ACTIVITY_INTENT_ACTION"
 private const val SDK_CONSTANT_TYPE_BROADCAST_ACTION =
@@ -76,7 +77,7 @@
                 val value = field.initialValue() ?: continue
                 val annotations = field.modifiers.annotations()
                 for (annotation in annotations) {
-                    if (ANDROID_SDK_CONSTANT == annotation.qualifiedName) {
+                    if (SDK_CONSTANT_ANNOTATION == annotation.qualifiedName()) {
                         val resolved =
                             annotation.findAttribute(null)?.leafValues()?.firstOrNull()?.resolve() as? FieldItem
                                 ?: continue
@@ -98,11 +99,11 @@
                 val annotations = clazz.modifiers.annotations()
                 if (annotations.isNotEmpty()) {
                     for (annotation in annotations) {
-                        if (SDK_WIDGET_ANNOTATION == annotation.qualifiedName) {
+                        if (SDK_WIDGET_ANNOTATION == annotation.qualifiedName()) {
                             widgets.add(clazz)
                             annotated = true
                             break
-                        } else if (SDK_LAYOUT_ANNOTATION == annotation.qualifiedName) {
+                        } else if (SDK_LAYOUT_ANNOTATION == annotation.qualifiedName()) {
                             layouts.add(clazz)
                             annotated = true
                             break
@@ -294,4 +295,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/SignatureFileLoader.kt b/src/main/java/com/android/tools/metalava/SignatureFileLoader.kt
index 67e75ec..3f9399c 100644
--- a/src/main/java/com/android/tools/metalava/SignatureFileLoader.kt
+++ b/src/main/java/com/android/tools/metalava/SignatureFileLoader.kt
@@ -16,9 +16,9 @@
 
 package com.android.tools.metalava
 
-import com.android.tools.metalava.model.Codebase
 import com.android.tools.metalava.model.text.ApiFile
 import com.android.tools.metalava.model.text.ApiParseException
+import com.android.tools.metalava.model.Codebase
 import java.io.File
 
 object SignatureFileLoader {
diff --git a/src/main/java/com/android/tools/metalava/SignatureWriter.kt b/src/main/java/com/android/tools/metalava/SignatureWriter.kt
index 0a04a5f..f51803c 100644
--- a/src/main/java/com/android/tools/metalava/SignatureWriter.kt
+++ b/src/main/java/com/android/tools/metalava/SignatureWriter.kt
@@ -24,6 +24,7 @@
 import com.android.tools.metalava.model.MethodItem
 import com.android.tools.metalava.model.ModifierList
 import com.android.tools.metalava.model.PackageItem
+import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.PropertyItem
 import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.TypeParameterList
@@ -35,8 +36,7 @@
     private val writer: PrintWriter,
     filterEmit: Predicate<Item>,
     filterReference: Predicate<Item>,
-    private val preFiltered: Boolean,
-    var emitHeader: EmitFileHeader = options.includeSignatureFormatVersionNonRemoved
+    private val preFiltered: Boolean
 ) : ApiVisitor(
     visitConstructorsAsMethods = false,
     nestInnerClasses = false,
@@ -48,112 +48,126 @@
     showUnannotated = options.showUnannotated
 ) {
     init {
-        if (emitHeader == EmitFileHeader.ALWAYS) {
+        if (options.includeSignatureFormatVersion) {
             writer.print(options.outputFormat.header())
-            emitHeader = EmitFileHeader.NEVER
         }
     }
 
-    fun write(text: String) {
-        if (emitHeader == EmitFileHeader.IF_NONEMPTY_FILE) {
-            if (options.includeSignatureFormatVersion) {
-                writer.print(options.outputFormat.header())
-            }
-            emitHeader = EmitFileHeader.NEVER
-        }
-        writer.print(text)
-    }
-
     override fun visitPackage(pkg: PackageItem) {
-        write("package ")
+        writer.print("package ")
         writeModifiers(pkg)
-        write("${pkg.qualifiedName()} {\n\n")
+        writer.print("${pkg.qualifiedName()} {\n\n")
     }
 
     override fun afterVisitPackage(pkg: PackageItem) {
-        write("}\n\n")
+        writer.print("}\n\n")
     }
 
     override fun visitConstructor(constructor: ConstructorItem) {
-        write("    ctor ")
+        writer.print("    ctor ")
         writeModifiers(constructor)
         // Note - we don't write out the type parameter list (constructor.typeParameterList()) in signature files!
         // writeTypeParameterList(constructor.typeParameterList(), addSpace = true)
-        write(constructor.containingClass().fullName())
+        writer.print(constructor.containingClass().fullName())
         writeParameterList(constructor)
         writeThrowsList(constructor)
-        write(";\n")
+        writer.print(";\n")
     }
 
     override fun visitField(field: FieldItem) {
+        if (compatibility.skipInheritedConstants && field.inheritedField) {
+            return
+        }
+
         val name = if (field.isEnumConstant()) "enum_constant" else "field"
-        write("    ")
-        write(name)
-        write(" ")
+        writer.print("    ")
+        writer.print(name)
+        writer.print(" ")
         writeModifiers(field)
         writeType(field, field.type())
-        write(" ")
-        write(field.name())
+        writer.print(' ')
+        writer.print(field.name())
         field.writeValueWithSemicolon(writer, allowDefaultValue = false, requireInitialValue = false)
-        write("\n")
+        writer.print("\n")
     }
 
     override fun visitProperty(property: PropertyItem) {
-        write("    property ")
+        writer.print("    property ")
         writeModifiers(property)
         writeType(property, property.type())
-        write(" ")
-        write(property.name())
-        write(";\n")
+        writer.print(' ')
+        writer.print(property.name())
+        writer.print(";\n")
     }
 
     override fun visitMethod(method: MethodItem) {
-        write("    method ")
+        if (compatibility.skipAnnotationInstanceMethods && method.containingClass().isAnnotationType() &&
+            !method.modifiers.isStatic()
+        ) {
+            return
+        }
+
+        if (compatibility.skipInheritedMethods && method.inheritedMethod) {
+            return
+        }
+
+        writer.print("    method ")
         writeModifiers(method)
         writeTypeParameterList(method.typeParameterList(), addSpace = true)
 
         writeType(method, method.returnType())
-        write(" ")
-        write(method.name())
+        writer.print(' ')
+        writer.print(method.name())
         writeParameterList(method)
         writeThrowsList(method)
 
-        if (method.containingClass().isAnnotationType()) {
-            val default = method.defaultValue()
-            if (default.isNotEmpty()) {
-                write(" default ")
-                write(default)
+        if (compatibility.includeAnnotationDefaults) {
+            if (method.containingClass().isAnnotationType()) {
+                val default = method.defaultValue()
+                if (default.isNotEmpty()) {
+                    writer.print(" default ")
+                    writer.print(default)
+                }
             }
         }
 
-        write(";\n")
+        writer.print(";\n")
     }
 
     override fun visitClass(cls: ClassItem) {
-        write("  ")
+        writer.print("  ")
 
         writeModifiers(cls)
 
         if (cls.isAnnotationType()) {
-            write("@interface")
+            if (compatibility.classForAnnotations) {
+                // doclava incorrectly treats annotations (such as TargetApi) as an abstract class instead
+                // of an @interface!
+                //
+                // Example:
+                //   public abstract class SuppressLint implements java.lang.annotation.Annotation { }
+                writer.print("class")
+            } else {
+                writer.print("@interface")
+            }
         } else if (cls.isInterface()) {
-            write("interface")
-        } else if (cls.isEnum()) {
-            write("enum")
+            writer.print("interface")
+        } else if (!compatibility.classForEnums && cls.isEnum()) { // compat mode calls enums "class" instead
+            writer.print("enum")
         } else {
-            write("class")
+            writer.print("class")
         }
-        write(" ")
-        write(cls.fullName())
+        writer.print(" ")
+        writer.print(cls.fullName())
         writeTypeParameterList(cls.typeParameterList(), addSpace = false)
         writeSuperClassStatement(cls)
         writeInterfaceList(cls)
 
-        write(" {\n")
+        writer.print(" {\n")
     }
 
     override fun afterVisitClass(cls: ClassItem) {
-        write("  }\n\n")
+        writer.print("  }\n\n")
     }
 
     private fun writeModifiers(item: Item) {
@@ -163,13 +177,19 @@
             item = item,
             target = AnnotationTarget.SIGNATURE_FILE,
             includeDeprecated = true,
+            includeAnnotations = compatibility.annotationsInSignatures,
             skipNullnessAnnotations = options.outputKotlinStyleNulls,
-            omitCommonPackages = true
+            omitCommonPackages = compatibility.omitCommonPackages
         )
     }
 
     private fun writeSuperClassStatement(cls: ClassItem) {
-        if (cls.isEnum() || cls.isAnnotationType()) {
+        if (!compatibility.classForEnums && cls.isEnum() || cls.isAnnotationType()) {
+            return
+        }
+
+        if (cls.isInterface() && compatibility.extendsForInterfaceSuperClass) {
+            // Written in the interface section instead
             return
         }
 
@@ -179,17 +199,21 @@
         if (superClass != null && !superClass.isJavaLangObject()) {
             val superClassString =
                 superClass.toTypeString(
+                    erased = compatibility.omitTypeParametersInInterfaces,
                     kotlinStyleNulls = false,
                     context = superClass.asClass(),
                     filter = filterReference
                 )
-            write(" extends ")
-            write(superClassString)
+            writer.print(" extends ")
+            writer.print(superClassString)
         }
     }
 
     private fun writeInterfaceList(cls: ClassItem) {
         if (cls.isAnnotationType()) {
+            if (compatibility.classForAnnotations) {
+                writer.print(" implements java.lang.annotation.Annotation")
+            }
             return
         }
         val isInterface = cls.isInterface()
@@ -197,10 +221,20 @@
         val interfaces = if (preFiltered)
             cls.interfaceTypes().asSequence()
         else cls.filteredInterfaceTypes(filterReference).asSequence()
+        val all: Sequence<TypeItem> = if (isInterface && compatibility.extendsForInterfaceSuperClass) {
+            val superClassType = cls.superClassType()
+            if (superClassType != null && !superClassType.isJavaLangObject()) {
+                interfaces.plus(sequenceOf(superClassType))
+            } else {
+                interfaces
+            }
+        } else {
+            interfaces
+        }
 
-        if (interfaces.any()) {
+        if (all.any()) {
             val label =
-                if (isInterface) {
+                if (isInterface && !compatibility.extendsForInterfaceSuperClass) {
                     val superInterface = cls.filteredSuperclass(filterReference)
                     if (superInterface != null && !superInterface.isJavaLangObject()) {
                         // For interfaces we've already listed "extends <super interface>"; we don't
@@ -212,11 +246,12 @@
                 } else {
                     " implements"
                 }
-            write(label)
-            interfaces.sortedWith(TypeItem.comparator).forEach { item ->
-                write(" ")
-                write(
+            writer.print(label)
+            all.sortedWith(TypeItem.comparator).forEach { item ->
+                writer.print(" ")
+                writer.print(
                     item.toTypeString(
+                        erased = compatibility.omitTypeParametersInInterfaces,
                         kotlinStyleNulls = false,
                         context = item.asClass(),
                         filter = filterReference
@@ -229,48 +264,51 @@
     private fun writeTypeParameterList(typeList: TypeParameterList, addSpace: Boolean) {
         val typeListString = typeList.toString()
         if (typeListString.isNotEmpty()) {
-            write(typeListString)
+            writer.print(typeListString)
             if (addSpace) {
-                write(" ")
+                writer.print(' ')
             }
         }
     }
 
     private fun writeParameterList(method: MethodItem) {
-        write("(")
+        writer.print("(")
+        val emitParameterNames = compatibility.parameterNames
         method.parameters().asSequence().forEachIndexed { i, parameter ->
             if (i > 0) {
-                write(", ")
+                writer.print(", ")
             }
             if (parameter.hasDefaultValue() &&
                 options.outputDefaultValues &&
-                options.outputFormat.conciseDefaultValues
+                options.outputConciseDefaultValues
             ) {
                 // Concise representation of a parameter with a default
-                write("optional ")
+                writer.print("optional ")
             }
             writeModifiers(parameter)
             writeType(parameter, parameter.type())
-            val name = parameter.publicName()
-            if (name != null) {
-                write(" ")
-                write(name)
+            if (emitParameterNames) {
+                val name = parameter.publicName()
+                if (name != null) {
+                    writer.print(" ")
+                    writer.print(name)
+                }
             }
             if (parameter.isDefaultValueKnown() &&
                 options.outputDefaultValues &&
-                !options.outputFormat.conciseDefaultValues
+                !options.outputConciseDefaultValues
             ) {
-                write(" = ")
+                writer.print(" = ")
                 val defaultValue = parameter.defaultValue()
                 if (defaultValue != null) {
-                    write(defaultValue)
+                    writer.print(defaultValue)
                 } else {
                     // null is a valid default value!
-                    write("null")
+                    writer.print("null")
                 }
             }
         }
-        write(")")
+        writer.print(")")
     }
 
     private fun writeType(
@@ -282,38 +320,52 @@
 
         var typeString = type.toTypeString(
             outerAnnotations = false,
-            innerAnnotations = true,
+            innerAnnotations = compatibility.annotationsInSignatures,
             erased = false,
             kotlinStyleNulls = outputKotlinStyleNulls,
             context = item,
             filter = filterReference
         )
 
-        // Strip java.lang. prefix
-        typeString = TypeItem.shortenTypes(typeString)
+        // Strip java.lang. prefix?
+        if (compatibility.omitCommonPackages) {
+            typeString = TypeItem.shortenTypes(typeString)
+        }
 
-        write(typeString)
+        if (compatibility.includeExtendsObjectInWildcard && typeString.endsWith(", ?>") && item is ParameterItem) {
+            // This wasn't done universally; just in a few places, so replicate it for those exact places
+            when (item.containingMethod().name()) {
+                "computeIfAbsent" -> {
+                    if (typeString == "java.util.function.Function<? super java.lang.Object, ?>") {
+                        typeString = "java.util.function.Function<? super java.lang.Object, ? extends java.lang.Object>"
+                    }
+                }
+                "computeIfPresent", "merge", "replaceAll", "compute" -> {
+                    if (typeString == "java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ?>") {
+                        typeString =
+                            "java.util.function.BiFunction<? super java.lang.Object, ? super java.lang.Object, ? extends java.lang.Object>"
+                    }
+                }
+            }
+        }
+
+        writer.print(typeString)
     }
 
     private fun writeThrowsList(method: MethodItem) {
         val throws = when {
             preFiltered -> method.throwsTypes().asSequence()
-            else -> method.filteredThrowsTypes(filterReference).asSequence()
+            compatibility.filterThrowsClasses -> method.filteredThrowsTypes(filterReference).asSequence()
+            else -> method.throwsTypes().asSequence()
         }
         if (throws.any()) {
-            write(" throws ")
+            writer.print(" throws ")
             throws.asSequence().sortedWith(ClassItem.fullNameComparator).forEachIndexed { i, type ->
                 if (i > 0) {
-                    write(", ")
+                    writer.print(", ")
                 }
-                write(type.qualifiedName())
+                writer.print(type.qualifiedName())
             }
         }
     }
 }
-
-enum class EmitFileHeader {
-    ALWAYS,
-    NEVER,
-    IF_NONEMPTY_FILE
-}
diff --git a/src/main/java/com/android/tools/metalava/apilevels/AddApisFromCodebase.kt b/src/main/java/com/android/tools/metalava/apilevels/AddApisFromCodebase.kt
index 71130ae..41db85f 100644
--- a/src/main/java/com/android/tools/metalava/apilevels/AddApisFromCodebase.kt
+++ b/src/main/java/com/android/tools/metalava/apilevels/AddApisFromCodebase.kt
@@ -29,116 +29,115 @@
         nestInnerClasses = false
     ) {
 
-            var currentClass: ApiClass? = null
+        var currentClass: ApiClass? = null
 
-            override fun afterVisitClass(cls: ClassItem) {
-                currentClass = null
-            }
+        override fun afterVisitClass(cls: ClassItem) {
+            currentClass = null
+        }
 
-            override fun visitClass(cls: ClassItem) {
-                val newClass = api.addClass(cls.internalName(), apiLevel, cls.deprecated)
-                currentClass = newClass
+        override fun visitClass(cls: ClassItem) {
+            val newClass = api.addClass(cls.internalName(), apiLevel, cls.deprecated)
+            currentClass = newClass
 
-                if (cls.isClass()) {
-                    // The jar files historically contain package private parents instead of
-                    // the real API so we need to correct the data we've already read in
+            if (cls.isClass()) {
+                // The jar files historically contain package private parents instead of
+                // the real API so we need to correct the data we've already read in
 
-                    val filteredSuperClass = cls.filteredSuperclass(filterReference)
-                    val superClass = cls.superClass()
-                    if (filteredSuperClass != superClass && filteredSuperClass != null) {
-                        val existing = newClass.superClasses.firstOrNull()?.name
-                        val superInternalName = superClass?.internalName()
-                        if (existing == superInternalName) {
-                            // The bytecode used to point to the old hidden super class. Point
-                            // to the real one (that the signature files referenced) instead.
-                            val removed = newClass.removeSuperClass(superInternalName)
-                            val since = removed?.since ?: apiLevel
-                            val entry = newClass.addSuperClass(filteredSuperClass.internalName(), since)
-                            // Show that it's also seen here
-                            entry.update(apiLevel)
+                val filteredSuperClass = cls.filteredSuperclass(filterReference)
+                val superClass = cls.superClass()
+                if (filteredSuperClass != superClass && filteredSuperClass != null) {
+                    val existing = newClass.superClasses.firstOrNull()?.name
+                    val superInternalName = superClass?.internalName()
+                    if (existing == superInternalName) {
+                        // The bytecode used to point to the old hidden super class. Point
+                        // to the real one (that the signature files referenced) instead.
+                        val removed = newClass.removeSuperClass(superInternalName)
+                        val since = removed?.since ?: apiLevel
+                        val entry = newClass.addSuperClass(filteredSuperClass.internalName(), since)
+                        // Show that it's also seen here
+                        entry.update(apiLevel)
 
-                            // Also inherit the interfaces from that API level, unless it was added later
-                            val superClassEntry = api.findClass(superInternalName)
-                            if (superClassEntry != null) {
-                                for (interfaceType in superClass!!.filteredInterfaceTypes(filterReference)) {
-                                    val interfaceClass = interfaceType.asClass() ?: return
-                                    var mergedSince = since
-                                    val interfaceName = interfaceClass.internalName()
-                                    for (itf in superClassEntry.interfaces) {
-                                        val currentInterface = itf.name
-                                        if (interfaceName == currentInterface) {
-                                            mergedSince = itf.since
-                                            break
-                                        }
+                        // Also inherit the interfaces from that API level, unless it was added later
+                        val superClassEntry = api.findClass(superInternalName)
+                        if (superClassEntry != null) {
+                            for (interfaceType in superClass!!.filteredInterfaceTypes(filterReference)) {
+                                val interfaceClass = interfaceType.asClass() ?: return
+                                var mergedSince = since
+                                val interfaceName = interfaceClass.internalName()
+                                for (itf in superClassEntry.interfaces) {
+                                    val currentInterface = itf.name
+                                    if (interfaceName == currentInterface) {
+                                        mergedSince = itf.since
+                                        break
                                     }
-                                    newClass.addInterface(interfaceClass.internalName(), mergedSince)
                                 }
+                                newClass.addInterface(interfaceClass.internalName(), mergedSince)
                             }
-                        } else {
-                            newClass.addSuperClass(filteredSuperClass.internalName(), apiLevel)
                         }
-                    } else if (superClass != null) {
-                        newClass.addSuperClass(superClass.internalName(), apiLevel)
+                    } else {
+                        newClass.addSuperClass(filteredSuperClass.internalName(), apiLevel)
                     }
-                } else if (cls.isInterface()) {
-                    val superClass = cls.superClass()
-                    if (superClass != null && !superClass.isJavaLangObject()) {
-                        newClass.addInterface(superClass.internalName(), apiLevel)
-                    }
-                } else if (cls.isEnum()) {
-                    // Implicit super class; match convention from bytecode
-                    if (newClass.name != "java/lang/Enum") {
-                        newClass.addSuperClass("java/lang/Enum", apiLevel)
-                    }
-
-                    // Mimic doclava enum methods
-                    newClass.addMethod("valueOf(Ljava/lang/String;)L" + newClass.name + ";", apiLevel, false)
-                    newClass.addMethod("values()[L" + newClass.name + ";", apiLevel, false)
-                } else if (cls.isAnnotationType()) {
-                    // Implicit super class; match convention from bytecode
-                    if (newClass.name != "java/lang/annotation/Annotation") {
-                        newClass.addSuperClass("java/lang/Object", apiLevel)
-                        newClass.addInterface("java/lang/annotation/Annotation", apiLevel)
-                    }
+                } else if (superClass != null) {
+                    newClass.addSuperClass(superClass.internalName(), apiLevel)
+                }
+            } else if (cls.isInterface()) {
+                val superClass = cls.superClass()
+                if (superClass != null && !superClass.isJavaLangObject()) {
+                    newClass.addInterface(superClass.internalName(), apiLevel)
+                }
+            } else if (cls.isEnum()) {
+                // Implicit super class; match convention from bytecode
+                if (newClass.name != "java/lang/Enum") {
+                    newClass.addSuperClass("java/lang/Enum", apiLevel)
                 }
 
-                // Ensure we don't end up with
-                //    -  <extends name="java/lang/Object"/>
-                //    +  <extends name="java/lang/Object" removed="29"/>
-                // which can happen because the bytecode always explicitly contains extends java.lang.Object
-                // but in the source code we don't see it, and the lack of presence of this shouldn't be
-                // taken as a sign that we no longer extend object. But only do this if the class didn't
-                // previously extend object and now extends something else.
-                if ((cls.isClass() || cls.isInterface()) &&
-                    newClass.superClasses.size == 1 &&
-                    newClass.superClasses[0].name == "java/lang/Object"
-                ) {
+                // Mimic doclava enum methods
+                newClass.addMethod("valueOf(Ljava/lang/String;)L" + newClass.name + ";", apiLevel, false)
+                newClass.addMethod("values()[L" + newClass.name + ";", apiLevel, false)
+            } else if (cls.isAnnotationType()) {
+                // Implicit super class; match convention from bytecode
+                if (newClass.name != "java/lang/annotation/Annotation") {
                     newClass.addSuperClass("java/lang/Object", apiLevel)
-                }
-
-                for (interfaceType in cls.filteredInterfaceTypes(filterReference)) {
-                    val interfaceClass = interfaceType.asClass() ?: return
-                    newClass.addInterface(interfaceClass.internalName(), apiLevel)
+                    newClass.addInterface("java/lang/annotation/Annotation", apiLevel)
                 }
             }
 
-            override fun visitMethod(method: MethodItem) {
-                if (method.isPrivate || method.isPackagePrivate) {
-                    return
-                }
-                val name = method.internalName() +
-                    // Use "V" instead of the type of the constructor for backwards compatibility
-                    // with the older bytecode
-                    method.internalDesc(voidConstructorTypes = true)
-                currentClass?.addMethod(name, apiLevel, method.deprecated)
+            // Ensure we don't end up with
+            //    -  <extends name="java/lang/Object"/>
+            //    +  <extends name="java/lang/Object" removed="29"/>
+            // which can happen because the bytecode always explicitly contains extends java.lang.Object
+            // but in the source code we don't see it, and the lack of presence of this shouldn't be
+            // taken as a sign that we no longer extend object. But only do this if the class didn't
+            // previously extend object and now extends something else.
+            if ((cls.isClass() || cls.isInterface()) &&
+                newClass.superClasses.size == 1 &&
+                newClass.superClasses[0].name == "java/lang/Object") {
+                newClass.addSuperClass("java/lang/Object", apiLevel)
             }
 
-            override fun visitField(field: FieldItem) {
-                if (field.isPrivate || field.isPackagePrivate) {
-                    return
-                }
-
-                currentClass?.addField(field.internalName(), apiLevel, field.deprecated)
+            for (interfaceType in cls.filteredInterfaceTypes(filterReference)) {
+                val interfaceClass = interfaceType.asClass() ?: return
+                newClass.addInterface(interfaceClass.internalName(), apiLevel)
             }
-        })
-}
+        }
+
+        override fun visitMethod(method: MethodItem) {
+            if (method.isPrivate || method.isPackagePrivate) {
+                return
+            }
+            val name = method.internalName() +
+                // Use "V" instead of the type of the constructor for backwards compatibility
+                // with the older bytecode
+                method.internalDesc(voidConstructorTypes = true)
+            currentClass?.addMethod(name, apiLevel, method.deprecated)
+        }
+
+        override fun visitField(field: FieldItem) {
+            if (field.isPrivate || field.isPackagePrivate) {
+                return
+            }
+
+            currentClass?.addField(field.internalName(), apiLevel, field.deprecated)
+        }
+    })
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/apilevels/AndroidJarReader.java b/src/main/java/com/android/tools/metalava/apilevels/AndroidJarReader.java
index 67ba3b6..c1739ed 100644
--- a/src/main/java/com/android/tools/metalava/apilevels/AndroidJarReader.java
+++ b/src/main/java/com/android/tools/metalava/apilevels/AndroidJarReader.java
@@ -57,10 +57,9 @@
         mCodebase = codebase;
     }
 
-    AndroidJarReader(@NotNull File[] apiLevels, int firstApiLevel, @Nullable Codebase codebase) {
+    AndroidJarReader(@NotNull File[] apiLevels, @Nullable Codebase codebase) {
         mApiLevels = apiLevels;
         mCodebase = codebase;
-        mMinApi = firstApiLevel;
     }
 
     public Api getApi() throws IOException {
@@ -71,8 +70,8 @@
                 max = mCodebase.getApiLevel();
             }
 
-            api = new Api(mMinApi, max);
-            for (int apiLevel = mMinApi; apiLevel < mApiLevels.length; apiLevel++) {
+            api = new Api(max);
+            for (int apiLevel = 1; apiLevel < mApiLevels.length; apiLevel++) {
                 File jar = getAndroidJarFile(apiLevel);
                 readJar(api, apiLevel, jar);
             }
@@ -83,7 +82,7 @@
                 }
             }
         } else {
-            api = new Api(mMinApi, mCurrentApi);
+            api = new Api(mCurrentApi);
             // Get all the android.jar. They are in platforms-#
             int apiLevel = mMinApi - 1;
             while (true) {
diff --git a/src/main/java/com/android/tools/metalava/apilevels/Api.java b/src/main/java/com/android/tools/metalava/apilevels/Api.java
index de08cf5..3c16f6b 100644
--- a/src/main/java/com/android/tools/metalava/apilevels/Api.java
+++ b/src/main/java/com/android/tools/metalava/apilevels/Api.java
@@ -25,12 +25,12 @@
  */
 public class Api extends ApiElement {
     private final Map<String, ApiClass> mClasses = new HashMap<>();
-    private final int mMin;
     private final int mMax;
 
-    public Api(int min, int max) {
+    public Api(int max) {
+        // Pretend that API started from version 0 to make sure that classes existed in the first version
+        // are printed with since="1".
         super("Android API");
-        mMin = min;
         mMax = max;
     }
 
@@ -40,11 +40,7 @@
      * @param stream the stream to print the XML elements to
      */
     public void print(PrintStream stream) {
-        stream.print("<api version=\"2\"");
-        if (mMin > 1) {
-            stream.print(" min=\"" + mMin + "\"");
-        }
-        stream.println(">");
+        stream.println("<api version=\"2\">");
         print(mClasses.values(), "class", "\t", stream);
         printClosingTag("api", "", stream);
     }
diff --git a/src/main/java/com/android/tools/metalava/apilevels/ApiGenerator.java b/src/main/java/com/android/tools/metalava/apilevels/ApiGenerator.java
index 28dec48..f8d9437 100644
--- a/src/main/java/com/android/tools/metalava/apilevels/ApiGenerator.java
+++ b/src/main/java/com/android/tools/metalava/apilevels/ApiGenerator.java
@@ -157,10 +157,9 @@
     }
 
     public static boolean generate(@NotNull File[] apiLevels,
-                                   int firstApiLevel,
                                    @NotNull File outputFile,
                                    @Nullable Codebase codebase) throws IOException {
-        AndroidJarReader reader = new AndroidJarReader(apiLevels, firstApiLevel, codebase);
+        AndroidJarReader reader = new AndroidJarReader(apiLevels, codebase);
         Api api = reader.getApi();
         return createApiFile(outputFile, api);
     }
diff --git a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
index 26cea66..cd69207 100644
--- a/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/AnnotationItem.kt
@@ -29,11 +29,13 @@
 import com.android.tools.metalava.ANDROIDX_NULLABLE
 import com.android.tools.metalava.ANDROID_NONNULL
 import com.android.tools.metalava.ANDROID_NULLABLE
-import com.android.tools.metalava.ApiPredicate
+import com.android.tools.metalava.ANDROID_SUPPORT_ANNOTATION_PREFIX
+import com.android.tools.metalava.Compatibility
 import com.android.tools.metalava.JAVA_LANG_PREFIX
 import com.android.tools.metalava.Options
 import com.android.tools.metalava.RECENTLY_NONNULL
 import com.android.tools.metalava.RECENTLY_NULLABLE
+import com.android.tools.metalava.ApiPredicate
 import com.android.tools.metalava.model.psi.PsiBasedCodebase
 import com.android.tools.metalava.options
 import com.intellij.psi.PsiCallExpression
@@ -54,18 +56,14 @@
         qualifiedName.endsWith("Nonnull")
 }
 
-fun isJvmSyntheticAnnotation(qualifiedName: String): Boolean {
-    return qualifiedName == "kotlin.jvm.JvmSynthetic"
-}
-
 interface AnnotationItem {
     val codebase: Codebase
 
     /** Fully qualified name of the annotation */
-    val qualifiedName: String?
+    fun qualifiedName(): String?
 
     /** Fully qualified name of the annotation (prior to name mapping) */
-    val originalName: String?
+    fun originalName(): String?
 
     /** Generates source code for this annotation (using fully qualified names) */
     fun toSource(
@@ -74,10 +72,10 @@
     ): String
 
     /** The applicable targets for this annotation */
-    val targets: Set<AnnotationTarget>
+    fun targets(): Set<AnnotationTarget>
 
     /** Attributes of the annotation (may be empty) */
-    val attributes: List<AnnotationAttribute>
+    fun attributes(): List<AnnotationAttribute>
 
     /** True if this annotation represents @Nullable or @NonNull (or some synonymous annotation) */
     fun isNullnessAnnotation(): Boolean {
@@ -86,33 +84,26 @@
 
     /** True if this annotation represents @Nullable (or some synonymous annotation) */
     fun isNullable(): Boolean {
-        return isNullableAnnotation(qualifiedName ?: return false)
+        return isNullableAnnotation(qualifiedName() ?: return false)
     }
 
     /** True if this annotation represents @NonNull (or some synonymous annotation) */
     fun isNonNull(): Boolean {
-        return isNonNullAnnotation(qualifiedName ?: return false)
-    }
-
-    /** True if this annotation represents @JvmSynthetic */
-    fun isJvmSynthetic(): Boolean {
-        return isJvmSyntheticAnnotation(qualifiedName ?: return false)
+        return isNonNullAnnotation(qualifiedName() ?: return false)
     }
 
     /** True if this annotation represents @IntDef, @LongDef or @StringDef */
     fun isTypeDefAnnotation(): Boolean {
-        val name = qualifiedName ?: return false
+        val name = qualifiedName() ?: return false
         if (!(name.endsWith("Def"))) {
             return false
         }
-        return (
-            INT_DEF_ANNOTATION.isEquals(name) ||
-                STRING_DEF_ANNOTATION.isEquals(name) ||
-                LONG_DEF_ANNOTATION.isEquals(name) ||
-                ANDROID_INT_DEF == name ||
-                ANDROID_STRING_DEF == name ||
-                ANDROID_LONG_DEF == name
-            )
+        return (INT_DEF_ANNOTATION.isEquals(name) ||
+            STRING_DEF_ANNOTATION.isEquals(name) ||
+            LONG_DEF_ANNOTATION.isEquals(name) ||
+            ANDROID_INT_DEF == name ||
+            ANDROID_STRING_DEF == name ||
+            ANDROID_LONG_DEF == name)
     }
 
     /**
@@ -120,7 +111,7 @@
      * The parameter name should be the default attribute or "value".
      */
     fun isParameterName(): Boolean {
-        return qualifiedName?.endsWith(".ParameterName") ?: return false
+        return qualifiedName()?.endsWith(".ParameterName") ?: return false
     }
 
     /**
@@ -128,30 +119,30 @@
      * The default value should be the default attribute or "value".
      */
     fun isDefaultValue(): Boolean {
-        return qualifiedName?.endsWith(".DefaultValue") ?: return false
+        return qualifiedName()?.endsWith(".DefaultValue") ?: return false
     }
 
     /** Returns the given named attribute if specified */
     fun findAttribute(name: String?): AnnotationAttribute? {
         val actualName = name ?: ATTR_VALUE
-        return attributes.firstOrNull { it.name == actualName }
+        return attributes().firstOrNull { it.name == actualName }
     }
 
     /** Find the class declaration for the given annotation */
     fun resolve(): ClassItem? {
-        return codebase.findClass(qualifiedName ?: return null)
+        return codebase.findClass(qualifiedName() ?: return null)
     }
 
     /** If this annotation has a typedef annotation associated with it, return it */
     fun findTypedefAnnotation(): AnnotationItem? {
-        val className = originalName ?: return null
+        val className = originalName() ?: return null
         return codebase.findClass(className)?.modifiers?.annotations()?.firstOrNull { it.isTypeDefAnnotation() }
     }
 
     /** Returns the retention of this annotation */
     val retention: AnnotationRetention
         get() {
-            val name = qualifiedName
+            val name = qualifiedName()
             if (name != null) {
                 val cls = codebase.findClass(name) ?: (codebase as? PsiBasedCodebase)?.findOrCreateClass(name)
                 if (cls != null) {
@@ -167,7 +158,8 @@
     companion object {
         /** The simple name of an annotation, which is the annotation name (not qualified name) prefixed by @ */
         fun simpleName(item: AnnotationItem): String {
-            return item.qualifiedName?.let { "@${it.substringAfterLast('.')}" }.orEmpty()
+            val qualifiedName = item.qualifiedName() ?: return ""
+            return "@${qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1)}"
         }
 
         /**
@@ -189,47 +181,83 @@
             }
             when (qualifiedName) {
                 // Resource annotations
+                "android.support.annotation.AnimRes",
                 "android.annotation.AnimRes" -> return "androidx.annotation.AnimRes"
+                "android.support.annotation.AnimatorRes",
                 "android.annotation.AnimatorRes" -> return "androidx.annotation.AnimatorRes"
+                "android.support.annotation.AnyRes",
                 "android.annotation.AnyRes" -> return "androidx.annotation.AnyRes"
+                "android.support.annotation.ArrayRes",
                 "android.annotation.ArrayRes" -> return "androidx.annotation.ArrayRes"
+                "android.support.annotation.AttrRes",
                 "android.annotation.AttrRes" -> return "androidx.annotation.AttrRes"
+                "android.support.annotation.BoolRes",
                 "android.annotation.BoolRes" -> return "androidx.annotation.BoolRes"
+                "android.support.annotation.ColorRes",
                 "android.annotation.ColorRes" -> return "androidx.annotation.ColorRes"
+                "android.support.annotation.DimenRes",
                 "android.annotation.DimenRes" -> return "androidx.annotation.DimenRes"
+                "android.support.annotation.DrawableRes",
                 "android.annotation.DrawableRes" -> return "androidx.annotation.DrawableRes"
+                "android.support.annotation.FontRes",
                 "android.annotation.FontRes" -> return "androidx.annotation.FontRes"
+                "android.support.annotation.FractionRes",
                 "android.annotation.FractionRes" -> return "androidx.annotation.FractionRes"
+                "android.support.annotation.IdRes",
                 "android.annotation.IdRes" -> return "androidx.annotation.IdRes"
+                "android.support.annotation.IntegerRes",
                 "android.annotation.IntegerRes" -> return "androidx.annotation.IntegerRes"
+                "android.support.annotation.InterpolatorRes",
                 "android.annotation.InterpolatorRes" -> return "androidx.annotation.InterpolatorRes"
+                "android.support.annotation.LayoutRes",
                 "android.annotation.LayoutRes" -> return "androidx.annotation.LayoutRes"
+                "android.support.annotation.MenuRes",
                 "android.annotation.MenuRes" -> return "androidx.annotation.MenuRes"
+                "android.support.annotation.PluralsRes",
                 "android.annotation.PluralsRes" -> return "androidx.annotation.PluralsRes"
+                "android.support.annotation.RawRes",
                 "android.annotation.RawRes" -> return "androidx.annotation.RawRes"
+                "android.support.annotation.StringRes",
                 "android.annotation.StringRes" -> return "androidx.annotation.StringRes"
+                "android.support.annotation.StyleRes",
                 "android.annotation.StyleRes" -> return "androidx.annotation.StyleRes"
+                "android.support.annotation.StyleableRes",
                 "android.annotation.StyleableRes" -> return "androidx.annotation.StyleableRes"
+                "android.support.annotation.TransitionRes",
                 "android.annotation.TransitionRes" -> return "androidx.annotation.TransitionRes"
+                "android.support.annotation.XmlRes",
                 "android.annotation.XmlRes" -> return "androidx.annotation.XmlRes"
 
                 // Threading
+                "android.support.annotation.AnyThread",
                 "android.annotation.AnyThread" -> return "androidx.annotation.AnyThread"
+                "android.support.annotation.BinderThread",
                 "android.annotation.BinderThread" -> return "androidx.annotation.BinderThread"
+                "android.support.annotation.MainThread",
                 "android.annotation.MainThread" -> return "androidx.annotation.MainThread"
+                "android.support.annotation.UiThread",
                 "android.annotation.UiThread" -> return "androidx.annotation.UiThread"
+                "android.support.annotation.WorkerThread",
                 "android.annotation.WorkerThread" -> return "androidx.annotation.WorkerThread"
 
                 // Colors
+                "android.support.annotation.ColorInt",
                 "android.annotation.ColorInt" -> return "androidx.annotation.ColorInt"
+                "android.support.annotation.ColorLong",
                 "android.annotation.ColorLong" -> return "androidx.annotation.ColorLong"
+                "android.support.annotation.HalfFloat",
                 "android.annotation.HalfFloat" -> return "androidx.annotation.HalfFloat"
 
                 // Ranges and sizes
+                "android.support.annotation.FloatRange",
                 "android.annotation.FloatRange" -> return "androidx.annotation.FloatRange"
+                "android.support.annotation.IntRange",
                 "android.annotation.IntRange" -> return "androidx.annotation.IntRange"
+                "android.support.annotation.Size",
                 "android.annotation.Size" -> return "androidx.annotation.Size"
+                "android.support.annotation.Px",
                 "android.annotation.Px" -> return "androidx.annotation.Px"
+                "android.support.annotation.Dimension",
                 "android.annotation.Dimension" -> return "androidx.annotation.Dimension"
 
                 // Null
@@ -239,17 +267,22 @@
 
                 ANDROIDX_NULLABLE,
                 ANDROID_NULLABLE,
+                "android.support.annotation.Nullable",
                 "libcore.util.Nullable",
                 "org.jetbrains.annotations.Nullable" -> return nullableAnnotationName(target)
 
                 ANDROIDX_NONNULL,
                 ANDROID_NONNULL,
+                "android.support.annotation.NonNull",
                 "libcore.util.NonNull",
                 "org.jetbrains.annotations.NotNull" -> return nonNullAnnotationName(target)
 
                 // Typedefs
+                "android.support.annotation.IntDef",
                 "android.annotation.IntDef" -> return "androidx.annotation.IntDef"
+                "android.support.annotation.StringDef",
                 "android.annotation.StringDef" -> return "androidx.annotation.StringDef"
+                "android.support.annotation.LongDef",
                 "android.annotation.LongDef" -> return "androidx.annotation.LongDef"
 
                 // Context Types
@@ -258,10 +291,11 @@
                 "android.annotation.NonUiContext" -> return "androidx.annotation.NonUiContext"
 
                 // Misc
-                "android.annotation.DeprecatedForSdk" -> return "java.lang.Deprecated"
+                "android.support.annotation.CallSuper",
                 "android.annotation.CallSuper" -> return "androidx.annotation.CallSuper"
+                "android.support.annotation.CheckResult",
                 "android.annotation.CheckResult" -> return "androidx.annotation.CheckResult"
-                "android.annotation.Discouraged" -> return "androidx.annotation.Discouraged"
+                "android.support.annotation.RequiresPermission",
                 "android.annotation.RequiresPermission" -> return "androidx.annotation.RequiresPermission"
                 "android.annotation.RequiresPermission.Read" -> return "androidx.annotation.RequiresPermission.Read"
                 "android.annotation.RequiresPermission.Write" -> return "androidx.annotation.RequiresPermission.Write"
@@ -319,7 +353,7 @@
                         isNullableAnnotation(qualifiedName) -> nullableAnnotationName(target)
                         isNonNullAnnotation(qualifiedName) -> nonNullAnnotationName(target)
 
-                        // AndroidX annotations are all included, as is the built-in stuff like @Retention
+                        // Support library annotations are all included, as is the built-in stuff like @Retention
                         qualifiedName.startsWith(ANDROIDX_ANNOTATION_PREFIX) -> return qualifiedName
                         qualifiedName.startsWith(JAVA_LANG_PREFIX) -> return qualifiedName
 
@@ -333,6 +367,15 @@
                             }
                         }
 
+                        qualifiedName.startsWith(ANDROID_SUPPORT_ANNOTATION_PREFIX) -> {
+                            return mapName(
+                                codebase,
+                                ANDROIDX_ANNOTATION_PREFIX + qualifiedName.substring(ANDROID_SUPPORT_ANNOTATION_PREFIX.length),
+                                filter,
+                                target
+                            )
+                        }
+
                         else -> {
                             // Remove, unless (a) public or (b) specifically included in --showAnnotations
                             return if (options.showAnnotations.matches(qualifiedName)) {
@@ -361,8 +404,7 @@
 
         private val TYPEDEF_ANNOTATION_TARGETS =
             if (options.typedefMode == Options.TypedefMode.INLINE ||
-                options.typedefMode == Options.TypedefMode.NONE
-            ) // just here for compatibility purposes
+                options.typedefMode == Options.TypedefMode.NONE) // just here for compatibility purposes
                 ANNOTATION_EXTERNAL
             else
                 ANNOTATION_EXTERNAL_ONLY
@@ -372,7 +414,7 @@
             annotation: AnnotationItem,
             classFinder: (String) -> ClassItem?
         ): Set<AnnotationTarget> {
-            val qualifiedName = annotation.qualifiedName ?: return NO_ANNOTATION_TARGETS
+            val qualifiedName = annotation.qualifiedName() ?: return NO_ANNOTATION_TARGETS
             if (options.passThroughAnnotations.contains(qualifiedName)) {
                 return ANNOTATION_IN_ALL_STUBS
             }
@@ -381,10 +423,13 @@
                 // The typedef annotations are special: they should not be in the signature
                 // files, but we want to include them in the external annotations file such that tools
                 // can enforce them.
+                "android.support.annotation.IntDef",
                 "android.annotation.IntDef",
                 "androidx.annotation.IntDef",
+                "android.support.annotation.StringDef",
                 "android.annotation.StringDef",
                 "androidx.annotation.StringDef",
+                "android.support.annotation.LongDef",
                 "android.annotation.LongDef",
                 "androidx.annotation.LongDef" -> return TYPEDEF_ANNOTATION_TARGETS
 
@@ -411,7 +456,6 @@
 
                 // TODO(aurimas): consider using annotation directly instead of modifiers
                 "kotlin.Deprecated" -> return NO_ANNOTATION_TARGETS // tracked separately as a pseudo-modifier
-                "android.annotation.DeprecatedForSdk",
                 "java.lang.Deprecated", // tracked separately as a pseudo-modifier
 
                 // Below this when-statement we perform the correct lookup: check API predicate, and check
@@ -513,7 +557,8 @@
 
         /**
          * Given a "full" annotation name, shortens it by removing redundant package names.
-         * This is intended to be used to reduce clutter in signature files.
+         * This is intended to be used by the [Compatibility.omitCommonPackages] flag
+         * to reduce clutter in signature files.
          *
          * For example, this method will convert `@androidx.annotation.Nullable` to just
          * `@Nullable`, and `@androidx.annotation.IntRange(from=20)` to `IntRange(from=20)`.
@@ -524,6 +569,9 @@
                 source.startsWith("android.annotation.", 1) -> {
                     "@" + source.substring("@android.annotation.".length)
                 }
+                source.startsWith(ANDROID_SUPPORT_ANNOTATION_PREFIX, 1) -> {
+                    "@" + source.substring("@android.support.annotation.".length)
+                }
                 source.startsWith(ANDROIDX_ANNOTATION_PREFIX, 1) -> {
                     "@" + source.substring("@androidx.annotation.".length)
                 }
@@ -538,7 +586,7 @@
         fun unshortenAnnotation(source: String): String {
             return when {
                 source == "@Deprecated" -> "@java.lang.Deprecated"
-                // These 3 annotations are in the android.annotation. package, not androidx.annotation
+                // These 3 annotations are in the android.annotation. package, not android.support.annotation
                 source.startsWith("@SystemService") ||
                     source.startsWith("@TargetApi") ||
                     source.startsWith("@SuppressLint") ->
@@ -600,10 +648,8 @@
                         nullable = false
                     }
                 }
-            } else if (item.synthetic && (
-                item is MethodItem && item.isEnumSyntheticMethod() ||
-                    item is ParameterItem && item.containingMethod().isEnumSyntheticMethod()
-                )
+            } else if (item.synthetic && (item is MethodItem && item.isEnumSyntheticMethod() ||
+                    item is ParameterItem && item.containingMethod().isEnumSyntheticMethod())
             ) {
                 // Workaround the fact that the Kotlin synthetic enum methods
                 // do not have nullness information
@@ -631,8 +677,15 @@
 
 /** Default implementation of an annotation item */
 abstract class DefaultAnnotationItem(override val codebase: Codebase) : AnnotationItem {
-    override val targets: Set<AnnotationTarget> by lazy {
-        AnnotationItem.computeTargets(this, codebase::findClass)
+    protected var targets: Set<AnnotationTarget>? = null
+
+    override fun targets(): Set<AnnotationTarget> {
+        if (targets == null) {
+            targets = AnnotationItem.computeTargets(this) { className ->
+                codebase.findClass(className)
+            }
+        }
+        return targets!!
     }
 }
 
@@ -795,8 +848,7 @@
     override fun toString(): String = toSource()
 }
 
-class DefaultAnnotationSingleAttributeValue(override val valueSource: String) :
-    DefaultAnnotationValue(),
+class DefaultAnnotationSingleAttributeValue(override val valueSource: String) : DefaultAnnotationValue(),
     AnnotationSingleAttributeValue {
     @Suppress("IMPLICIT_CAST_TO_ANY")
     override val value = when {
@@ -820,8 +872,7 @@
     override fun toSource() = valueSource
 }
 
-class DefaultAnnotationArrayAttributeValue(val value: String) :
-    DefaultAnnotationValue(),
+class DefaultAnnotationArrayAttributeValue(val value: String) : DefaultAnnotationValue(),
     AnnotationArrayAttributeValue {
     init {
         assert(value.startsWith("{") && value.endsWith("}")) { value }
diff --git a/src/main/java/com/android/tools/metalava/model/AnnotationRetention.kt b/src/main/java/com/android/tools/metalava/model/AnnotationRetention.kt
index 803bcf7..3de1336 100644
--- a/src/main/java/com/android/tools/metalava/model/AnnotationRetention.kt
+++ b/src/main/java/com/android/tools/metalava/model/AnnotationRetention.kt
@@ -21,4 +21,4 @@
     SOURCE,
     CLASS,
     RUNTIME
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/ClassItem.kt b/src/main/java/com/android/tools/metalava/model/ClassItem.kt
index 920c19d..a0d1c42 100644
--- a/src/main/java/com/android/tools/metalava/model/ClassItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/ClassItem.kt
@@ -96,15 +96,6 @@
     /** The super class of this class, if any  */
     fun superClass(): ClassItem?
 
-    /** All super classes, if any */
-    fun allSuperClasses(): Sequence<ClassItem> {
-        return superClass()?.let { cls ->
-            return generateSequence(cls) {
-                it.superClass()
-            }
-        } ?: return emptySequence()
-    }
-
     /** The super class type of this class, if any. The difference between this and [superClass] is
      * that the type reference can include type arguments; e.g. in "class MyList extends List<String>"
      * the super class is java.util.List and the super class type is java.util.List<java.lang.String>.
@@ -244,10 +235,6 @@
 
     var hasPrivateConstructor: Boolean
 
-    /** The primary constructor for this class in Kotlin, if present. */
-    val primaryConstructor: ConstructorItem?
-        get() = constructors().singleOrNull { it.isPrimary }
-
     /**
      * Maven artifact of this class, if any. (Not used for the Android SDK, but used in
      * for example support libraries.
@@ -542,8 +529,8 @@
         return true
     }
 
-    /** Returns the corresponding source file, if any */
-    fun getSourceFile(): SourceFileItem? = null
+    /** Returns the corresponding compilation unit, if any */
+    fun getCompilationUnit(): CompilationUnit? = null
 
     /** If this class is an annotation type, returns the retention of this class */
     fun getRetention(): AnnotationRetention
diff --git a/src/main/java/com/android/tools/metalava/model/CompilationUnit.kt b/src/main/java/com/android/tools/metalava/model/CompilationUnit.kt
new file mode 100644
index 0000000..528407d
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/model/CompilationUnit.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava.model
+
+import com.intellij.lang.Language
+import com.intellij.psi.PsiFile
+import org.jetbrains.uast.UFile
+import java.util.function.Predicate
+
+/** Represents a compilation unit (e.g. a .java or a .kt file) */
+open class CompilationUnit(
+    val file: PsiFile,
+    val uFile: UFile?
+) {
+
+    val language: Language? get() = file.language
+
+    open fun getHeaderComments(): String? = null
+
+    override fun toString(): String = "compilation unit ${file.virtualFile?.path}"
+
+    open fun getImportStatements(predicate: Predicate<Item>): Collection<Item> = emptyList()
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/ConstructorItem.kt b/src/main/java/com/android/tools/metalava/model/ConstructorItem.kt
index d593ae6..68eb476 100644
--- a/src/main/java/com/android/tools/metalava/model/ConstructorItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/ConstructorItem.kt
@@ -27,8 +27,4 @@
      * constructor). Note that it may not be in a super class, as in the case of a this-call.
      */
     var superConstructor: ConstructorItem?
-
-    /** True if this is the primary constructor in Kotlin. */
-    val isPrimary: Boolean
-        get() = false
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/DefaultModifierList.kt b/src/main/java/com/android/tools/metalava/model/DefaultModifierList.kt
index b40c42b..4a9e8e3 100644
--- a/src/main/java/com/android/tools/metalava/model/DefaultModifierList.kt
+++ b/src/main/java/com/android/tools/metalava/model/DefaultModifierList.kt
@@ -16,6 +16,8 @@
 
 package com.android.tools.metalava.model
 
+import com.android.tools.metalava.compatibility
+
 open class DefaultModifierList(
     override val codebase: Codebase,
     protected var flags: Int = PACKAGE_PRIVATE,
@@ -52,8 +54,7 @@
         val levels = VISIBILITY_LEVEL_ENUMS
         if (visibilityFlags >= levels.size) {
             throw IllegalStateException(
-                "Visibility flags are invalid, expected value in range [0, " + levels.size + ") got " + visibilityFlags
-            )
+                "Visibility flags are invalid, expected value in range [0, " + levels.size + ") got " + visibilityFlags)
         }
         return levels[visibilityFlags]
     }
@@ -146,14 +147,6 @@
         return isSet(INLINE)
     }
 
-    override fun isValue(): Boolean {
-        return isSet(VALUE)
-    }
-
-    override fun isData(): Boolean {
-        return isSet(DATA)
-    }
-
     override fun setVisibilityLevel(level: VisibilityLevel) {
         flags = (flags and VISIBILITY_MASK.inv()) or level.visibilityFlagValue
     }
@@ -214,14 +207,6 @@
         set(INLINE, inline)
     }
 
-    override fun setValue(value: Boolean) {
-        set(VALUE, value)
-    }
-
-    override fun setData(data: Boolean) {
-        set(DATA, data)
-    }
-
     override fun setVarArg(vararg: Boolean) {
         set(VARARG, vararg)
     }
@@ -265,23 +250,21 @@
     override fun equivalentTo(other: ModifierList): Boolean {
         if (other is DefaultModifierList) {
             val flags2 = other.flags
-            val mask = EQUIVALENCE_MASK
+            val mask = if (compatibility.includeSynchronized) COMPAT_EQUIVALENCE_MASK else EQUIVALENCE_MASK
 
             val masked1 = flags and mask
             val masked2 = flags2 and mask
             val same = masked1 xor masked2
             if (same == 0) {
                 return true
-            } else {
+            } else if (compatibility.hideDifferenceImplicit) {
                 if (same == FINAL &&
                     // Only differ in final: not significant if implied by containing class
-                    isFinal() && (owner as? MethodItem)?.containingClass()?.modifiers?.isFinal() == true
-                ) {
+                    isFinal() && (owner as? MethodItem)?.containingClass()?.modifiers?.isFinal() == true) {
                     return true
                 } else if (same == DEPRECATED &&
                     // Only differ in deprecated: not significant if implied by containing class
-                    isDeprecated() && (owner as? MethodItem)?.containingClass()?.deprecated == true
-                ) {
+                    isDeprecated() && (owner as? MethodItem)?.containingClass()?.deprecated == true) {
                     return true
                 }
             }
@@ -340,8 +323,6 @@
         const val SUSPEND = 1 shl 19
         const val COMPANION = 1 shl 20
         const val CONST = 1 shl 21
-        const val DATA = 1 shl 22
-        const val VALUE = 1 shl 23
 
         /**
          * Modifiers considered significant to include signature files (and similarly
@@ -350,5 +331,7 @@
         private const val EQUIVALENCE_MASK = VISIBILITY_MASK or STATIC or ABSTRACT or
             FINAL or TRANSIENT or VOLATILE or DEPRECATED or VARARG or
             SEALED or FUN or INFIX or OPERATOR or SUSPEND or COMPANION
+
+        private const val COMPAT_EQUIVALENCE_MASK = EQUIVALENCE_MASK or SYNCHRONIZED
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/FieldItem.kt b/src/main/java/com/android/tools/metalava/model/FieldItem.kt
index 092c86d..3cb25cd 100644
--- a/src/main/java/com/android/tools/metalava/model/FieldItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/FieldItem.kt
@@ -22,10 +22,6 @@
 import java.io.PrintWriter
 
 interface FieldItem : MemberItem {
-    /** The property this field backs; inverse of [PropertyItem.backingField] */
-    val property: PropertyItem?
-        get() = null
-
     /** The type of this field */
     override fun type(): TypeItem
 
@@ -87,8 +83,8 @@
      * to accommodate toolchains with different fp -> string conversions.
      */
     fun hasSameValue(other: FieldItem): Boolean {
-        val thisConstant = initialValue()
-        val otherConstant = other.initialValue()
+        val thisConstant = initialValue(true)
+        val otherConstant = other.initialValue(true)
         if (thisConstant == null != (otherConstant == null)) {
             return false
         }
@@ -226,7 +222,7 @@
                 }
                 is Char -> {
                     writer.print(" = ")
-                    val intValue = value.code
+                    val intValue = value.toInt()
                     writer.print(intValue)
                     writer.print("; // ")
                     writer.print(
@@ -264,7 +260,7 @@
             '\'' -> "\\'"
             '\"' -> "\\\""
             in ' '..'~' -> c
-            else -> String.format("\\u%04x", c.code)
+            else -> String.format("\\u%04x", c.toInt())
         }
     }
     return result
@@ -340,11 +336,11 @@
             }
             CHAR1, CHAR2, CHAR3, CHAR4 -> {
 
-                escaped = (escaped.code shl 4).toChar()
+                escaped = (escaped.toInt() shl 4).toChar()
                 escaped = when (c) {
-                    in '0'..'9' -> (escaped.code or (c - '0')).toChar()
-                    in 'a'..'f' -> (escaped.code or (10 + (c - 'a'))).toChar()
-                    in 'A'..'F' -> (escaped.code or (10 + (c - 'A'))).toChar()
+                    in '0'..'9' -> (escaped.toInt() or (c - '0')).toChar()
+                    in 'a'..'f' -> (escaped.toInt() or (10 + (c - 'a'))).toChar()
+                    in 'A'..'F' -> (escaped.toInt() or (10 + (c - 'A'))).toChar()
                     else -> throw IllegalArgumentException(
                         "bad escape sequence: '" + c + "' at pos " + i + " in: \"" +
                             str + "\""
diff --git a/src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt b/src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt
index 12974d1..8e9a27e 100644
--- a/src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt
+++ b/src/main/java/com/android/tools/metalava/model/IssueConfiguration.kt
@@ -16,9 +16,9 @@
 
 package com.android.tools.metalava.model
 
-import com.android.tools.metalava.Issues
 import com.android.tools.metalava.Options
 import com.android.tools.metalava.Severity
+import com.android.tools.metalava.Issues
 
 /** An issue configuration is a set of overrides for severities for various [Issues.Issue] */
 class IssueConfiguration {
diff --git a/src/main/java/com/android/tools/metalava/model/Item.kt b/src/main/java/com/android/tools/metalava/model/Item.kt
index f309fe4..6190412 100644
--- a/src/main/java/com/android/tools/metalava/model/Item.kt
+++ b/src/main/java/com/android/tools/metalava/model/Item.kt
@@ -16,13 +16,12 @@
 
 package com.android.tools.metalava.model
 
+import com.android.tools.metalava.model.visitors.ItemVisitor
+import com.android.tools.metalava.model.visitors.TypeVisitor
 import com.android.tools.metalava.NullnessMigration.Companion.findNullnessAnnotation
 import com.android.tools.metalava.RECENTLY_NONNULL
 import com.android.tools.metalava.RECENTLY_NULLABLE
-import com.android.tools.metalava.model.visitors.ItemVisitor
-import com.android.tools.metalava.model.visitors.TypeVisitor
 import com.intellij.psi.PsiElement
-import java.util.concurrent.atomic.AtomicInteger
 
 /**
  * Represents a code element such as a package, a class, a method, a field, a parameter.
@@ -193,11 +192,11 @@
         return modifiers.checkLevel()
     }
 
-    fun sourceFile(): SourceFileItem? {
+    fun compilationUnit(): CompilationUnit? {
         var curr: Item? = this
         while (curr != null) {
             if (curr is ClassItem && curr.isTopLevelClass()) {
-                return curr.getSourceFile()
+                return curr.getCompilationUnit()
             }
             curr = curr.parent()
         }
@@ -242,7 +241,7 @@
     /**
      * Returns the associated type if any. For example, for a field, property or parameter,
      * this is the type of the variable; for a method, it's the return type.
-     * For packages, classes and files, it's null.
+     * For packages, classes and compilation units, it's null.
      */
     fun type(): TypeItem?
 
@@ -377,7 +376,7 @@
     }
 }
 
-abstract class DefaultItem(override val sortingRank: Int = nextRank.getAndIncrement()) : Item {
+abstract class DefaultItem(override val sortingRank: Int = nextRank++) : Item {
     override val isPublic: Boolean get() = modifiers.isPublic()
     override val isProtected: Boolean get() = modifiers.isProtected()
     override val isInternal: Boolean
@@ -389,6 +388,6 @@
     override var tag: Boolean = false
 
     companion object {
-        private var nextRank = AtomicInteger()
+        private var nextRank: Int = 1
     }
 }
diff --git a/src/main/java/com/android/tools/metalava/model/Language.kt b/src/main/java/com/android/tools/metalava/model/Language.kt
index 849b21c..03642fa 100644
--- a/src/main/java/com/android/tools/metalava/model/Language.kt
+++ b/src/main/java/com/android/tools/metalava/model/Language.kt
@@ -19,4 +19,4 @@
 enum class Language {
     KOTLIN,
     JAVA
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/MemberItem.kt b/src/main/java/com/android/tools/metalava/model/MemberItem.kt
index 95985f8..962287e 100644
--- a/src/main/java/com/android/tools/metalava/model/MemberItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/MemberItem.kt
@@ -35,8 +35,6 @@
      * be final because its containing class is final
      */
     fun isEffectivelyFinal(): Boolean {
-        return modifiers.isFinal() ||
-            containingClass().modifiers.isFinal() ||
-            containingClass().modifiers.isSealed()
+        return modifiers.isFinal() || containingClass().modifiers.isFinal()
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/MethodItem.kt b/src/main/java/com/android/tools/metalava/model/MethodItem.kt
index e4eb38e..6fd4adc 100644
--- a/src/main/java/com/android/tools/metalava/model/MethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/MethodItem.kt
@@ -16,19 +16,14 @@
 
 package com.android.tools.metalava.model
 
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.text.TextCodebase
 import com.android.tools.metalava.model.visitors.ItemVisitor
 import com.android.tools.metalava.model.visitors.TypeVisitor
+import java.util.LinkedHashSet
 import java.util.function.Predicate
 
 interface MethodItem : MemberItem {
-    /**
-     * The property this method is an accessor for; inverse of [PropertyItem.getter] and
-     * [PropertyItem.setter]
-     */
-    val property: PropertyItem?
-        get() = null
-
     /** Whether this method is a constructor */
     fun isConstructor(): Boolean
 
@@ -122,7 +117,7 @@
     ): LinkedHashSet<ClassItem> {
 
         for (cls in throwsTypes()) {
-            if (predicate.test(cls) || cls.isTypeParameter) {
+            if (predicate.test(cls) || cls.isTypeParameter && !compatibility.useErasureInThrows) {
                 classes.add(cls)
             } else {
                 // Excluded, but it may have super class throwables that are included; if so, include those
@@ -287,7 +282,8 @@
                 return false
             }
 
-            if (method.deprecated != superMethod.deprecated && !method.deprecated) {
+            if (method.deprecated != superMethod.deprecated &&
+                (!compatibility.hideDifferenceImplicit || !method.deprecated)) {
                 return false
             }
 
@@ -366,13 +362,17 @@
     }
 
     override fun requiresNullnessInfo(): Boolean {
-        return when {
-            modifiers.hasJvmSyntheticAnnotation() -> false
-            isConstructor() -> false
-            (returnType()?.primitive != true) -> true
-            parameters().any { !it.type().primitive } -> true
-            else -> false
+        if (isConstructor()) {
+            return false
+        } else if (returnType()?.primitive != true) {
+            return true
         }
+        for (parameter in parameters()) {
+            if (!parameter.type().primitive) {
+                return true
+            }
+        }
+        return false
     }
 
     override fun hasNullnessInfo(): Boolean {
@@ -412,6 +412,19 @@
     }
 
     /**
+     * Check the declared default annotation value and return true if the defaults
+     * are the same. Only defined on two annotation methods; for all other
+     * methods the result is "true".
+     */
+    fun hasSameValue(other: MethodItem): Boolean {
+        if (!containingClass().isAnnotationType() || !other.containingClass().isAnnotationType()) {
+            return true
+        }
+
+        return defaultValue() == other.defaultValue()
+    }
+
+    /**
      * Returns true if this method is a signature match for the given method (e.g. can
      * be overriding). This checks that the name and parameter lists match, but ignores
      * differences in parameter names, return value types and throws list types.
@@ -528,10 +541,8 @@
     /** Returns true if this is a synthetic enum method */
     fun isEnumSyntheticMethod(): Boolean {
         return containingClass().isEnum() &&
-            (
-                name() == "values" && parameters().isEmpty() ||
-                    name() == "valueOf" && parameters().size == 1 &&
-                    parameters()[0].type().isString()
-                )
+            (name() == "values" && parameters().isEmpty() ||
+                name() == "valueOf" && parameters().size == 1 &&
+                parameters()[0].type().isString())
     }
 }
diff --git a/src/main/java/com/android/tools/metalava/model/ModifierList.kt b/src/main/java/com/android/tools/metalava/model/ModifierList.kt
index 5b81463..b0649cb 100644
--- a/src/main/java/com/android/tools/metalava/model/ModifierList.kt
+++ b/src/main/java/com/android/tools/metalava/model/ModifierList.kt
@@ -23,6 +23,7 @@
 import com.android.tools.metalava.DocLevel.PROTECTED
 import com.android.tools.metalava.DocLevel.PUBLIC
 import com.android.tools.metalava.Options
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.options
 import java.io.Writer
 
@@ -57,8 +58,6 @@
     fun isSuspend(): Boolean = false
     fun isOperator(): Boolean = false
     fun isInline(): Boolean = false
-    fun isValue(): Boolean = false
-    fun isData(): Boolean = false
     fun isEmpty(): Boolean
 
     fun isPackagePrivate() = !(isPublic() || isProtected() || isPrivate())
@@ -73,6 +72,7 @@
         if (isStatic() != other.isStatic()) return false
         if (isAbstract() != other.isAbstract()) return false
         if (isFinal() != other.isFinal()) { return false }
+        if (compatibility.includeSynchronized && isSynchronized() != other.isSynchronized()) return false
         if (isTransient() != other.isTransient()) return false
         if (isVolatile() != other.isVolatile()) return false
 
@@ -92,18 +92,6 @@
         return annotations().any { it.isNullable() }
     }
 
-    /** Returns true if this modifier list contains any a NonNull annotation */
-    fun isNonNull(): Boolean {
-        return annotations().any { it.isNonNull() }
-    }
-
-    /**
-     * Returns true if this modifier list contains the `@JvmSynthetic` annotation
-     */
-    fun hasJvmSyntheticAnnotation(): Boolean {
-        return annotations().any { it.isJvmSynthetic() }
-    }
-
     /**
      * Returns true if this modifier list contains any annotations explicitly passed in
      * via [Options.showAnnotations]
@@ -178,7 +166,7 @@
             return false
         }
         return annotations().any { annotation ->
-            options.hideMetaAnnotations.contains(annotation.qualifiedName)
+            options.hideMetaAnnotations.contains(annotation.qualifiedName())
         }
     }
 
@@ -187,26 +175,11 @@
         return findAnnotation(qualifiedName) != null
     }
 
-    /**
-     * Returns the annotation of the given qualified name (or equivalent) if found
-     * in this modifier list
-     */
+    /** Returns the annotation of the given qualified name if found in this modifier list */
     fun findAnnotation(qualifiedName: String): AnnotationItem? {
         val mappedName = AnnotationItem.mapName(codebase, qualifiedName)
         return annotations().firstOrNull {
-            mappedName == it.qualifiedName
-        }
-    }
-
-    /**
-     * Returns the annotation of the given qualified name if found in this modifier list.
-     * Like [findAnnotation], but where that method translates both the annotations in
-     * the source and the target name to their canonical form (E.g. the androidx name),
-     * this method will look at the original source for the exact name passed in here.
-     */
-    fun findExactAnnotation(qualifiedName: String): AnnotationItem? {
-        return annotations().firstOrNull {
-            qualifiedName == it.originalName
+            mappedName == it.qualifiedName()
         }
     }
 
@@ -269,6 +242,7 @@
             target: AnnotationTarget,
             // TODO: "deprecated" isn't a modifier; clarify method name
             includeDeprecated: Boolean = false,
+            includeAnnotations: Boolean = true,
             runtimeAnnotationsOnly: Boolean = false,
             skipNullnessAnnotations: Boolean = false,
             omitCommonPackages: Boolean = false,
@@ -298,17 +272,25 @@
                 modifiers
             }
 
-            writeAnnotations(
-                item,
-                target,
-                runtimeAnnotationsOnly,
-                includeDeprecated,
-                writer,
-                separateLines,
-                list,
-                skipNullnessAnnotations,
-                omitCommonPackages
-            )
+            if (includeAnnotations) {
+                writeAnnotations(
+                    item,
+                    target,
+                    runtimeAnnotationsOnly,
+                    includeDeprecated,
+                    writer,
+                    separateLines,
+                    list,
+                    skipNullnessAnnotations,
+                    omitCommonPackages
+                )
+            } else {
+                // We always include @Deprecated annotation in stub files
+                if (item.deprecated && target.isStubsFile()) {
+                    writer.write("@Deprecated")
+                    writer.write(if (separateLines) "\n" else " ")
+                }
+            }
 
             if (item is PackageItem) {
                 // Packages use a modifier list, but only annotations apply
@@ -322,96 +304,169 @@
             val classItem = item as? ClassItem
             val methodItem = item as? MethodItem
 
-            val visibilityLevel = list.getVisibilityLevel()
-            val modifier = if (language == Language.JAVA) {
-                visibilityLevel.javaSourceCodeModifier
+            // Order based on the old stubs code: TODO, use Java standard order instead?
+
+            if (compatibility.nonstandardModifierOrder) {
+                val visibilityLevel = list.getVisibilityLevel()
+                if (visibilityLevel != VisibilityLevel.PACKAGE_PRIVATE) {
+                    writer.write(visibilityLevel.javaSourceCodeModifier + " ")
+                }
+
+                if (list.isDefault()) {
+                    writer.write("default ")
+                }
+
+                if (list.isStatic() && (compatibility.staticEnums || classItem == null || !classItem.isEnum())) {
+                    writer.write("static ")
+                }
+
+                if (list.isFinal() &&
+                    // Don't show final on parameters: that's an implementation side detail
+                    item !is ParameterItem &&
+                    (classItem?.isEnum() != true || compatibility.finalInInterfaces) ||
+                    compatibility.forceFinalInEnumValueMethods &&
+                    methodItem?.name() == "values" && methodItem.containingClass().isEnum()
+                ) {
+                    writer.write("final ")
+                }
+
+                if (list.isSealed()) {
+                    writer.write("sealed ")
+                }
+
+                if (list.isSuspend()) {
+                    writer.write("suspend ")
+                }
+
+                if (list.isInline()) {
+                    writer.write("inline ")
+                }
+
+                if (list.isInfix()) {
+                    writer.write("infix ")
+                }
+
+                if (list.isOperator()) {
+                    writer.write("operator ")
+                }
+
+                val isInterface = classItem?.isInterface() == true ||
+                    (methodItem?.containingClass()?.isInterface() == true &&
+                        !list.isDefault() && !list.isStatic())
+
+                if ((compatibility.abstractInInterfaces && isInterface ||
+                        list.isAbstract() &&
+                        (classItem?.isEnum() != true &&
+                            (compatibility.abstractInAnnotations || classItem?.isAnnotationType() != true))) &&
+                    (!isInterface || compatibility.abstractInInterfaces)
+                ) {
+                    writer.write("abstract ")
+                }
+
+                if (list.isNative() && target.isStubsFile()) {
+                    writer.write("native ")
+                }
+
+                if (item.deprecated && includeDeprecated && !target.isStubsFile() && !compatibility.deprecatedAsAnnotation) {
+                    writer.write("deprecated ")
+                }
+
+                if (list.isSynchronized() && (compatibility.includeSynchronized || target.isStubsFile())) {
+                    writer.write("synchronized ")
+                }
+
+                if (list.isTransient()) {
+                    writer.write("transient ")
+                }
+
+                if (list.isVolatile()) {
+                    writer.write("volatile ")
+                }
             } else {
-                visibilityLevel.kotlinSourceCodeModifier
-            }
-            if (modifier.isNotEmpty()) {
-                writer.write("$modifier ")
-            }
+                if (item.deprecated && includeDeprecated && !target.isStubsFile() && !compatibility.deprecatedAsAnnotation) {
+                    writer.write("deprecated ")
+                }
 
-            val isInterface = classItem?.isInterface() == true ||
-                (
-                    methodItem?.containingClass()?.isInterface() == true &&
-                        !list.isDefault() && !list.isStatic()
-                    )
+                val visibilityLevel = list.getVisibilityLevel()
+                val modifier = if (language == Language.JAVA) {
+                    visibilityLevel.javaSourceCodeModifier
+                } else {
+                    visibilityLevel.kotlinSourceCodeModifier
+                }
+                if (modifier.isNotEmpty()) {
+                    writer.write("$modifier ")
+                }
 
-            if (list.isAbstract() &&
-                classItem?.isEnum() != true &&
-                classItem?.isAnnotationType() != true &&
-                !isInterface
-            ) {
-                writer.write("abstract ")
-            }
+                val isInterface = classItem?.isInterface() == true ||
+                    (methodItem?.containingClass()?.isInterface() == true &&
+                        !list.isDefault() && !list.isStatic())
 
-            if (list.isDefault() && item !is ParameterItem) {
-                writer.write("default ")
-            }
+                if ((compatibility.abstractInInterfaces && isInterface ||
+                        list.isAbstract() &&
+                        (classItem?.isEnum() != true &&
+                            (compatibility.abstractInAnnotations || classItem?.isAnnotationType() != true))) &&
+                    (!isInterface || compatibility.abstractInInterfaces)
+                ) {
+                    writer.write("abstract ")
+                }
 
-            if (list.isStatic() && (classItem == null || !classItem.isEnum())) {
-                writer.write("static ")
-            }
+                if (list.isDefault() && item !is ParameterItem) {
+                    writer.write("default ")
+                }
 
-            if (list.isFinal() &&
-                language == Language.JAVA &&
-                // Don't show final on parameters: that's an implementation side detail
-                item !is ParameterItem &&
-                classItem?.isEnum() != true
-            ) {
-                writer.write("final ")
-            } else if (!list.isFinal() && language == Language.KOTLIN) {
-                writer.write("open ")
-            }
+                if (list.isStatic() && (compatibility.staticEnums || classItem == null || !classItem.isEnum())) {
+                    writer.write("static ")
+                }
 
-            if (list.isSealed()) {
-                writer.write("sealed ")
-            }
+                if (list.isFinal() &&
+                    language == Language.JAVA &&
+                    // Don't show final on parameters: that's an implementation side detail
+                    item !is ParameterItem &&
+                    (classItem?.isEnum() != true || compatibility.finalInInterfaces)
+                ) {
+                    writer.write("final ")
+                } else if (!list.isFinal() && language == Language.KOTLIN) {
+                    writer.write("open ")
+                }
 
-            if (list.isSuspend()) {
-                writer.write("suspend ")
-            }
+                if (list.isSealed()) {
+                    writer.write("sealed ")
+                }
 
-            if (list.isInline()) {
-                writer.write("inline ")
-            }
+                if (list.isSuspend()) {
+                    writer.write("suspend ")
+                }
 
-            if (list.isValue()) {
-                writer.write("value ")
-            }
+                if (list.isInline()) {
+                    writer.write("inline ")
+                }
 
-            if (list.isInfix()) {
-                writer.write("infix ")
-            }
+                if (list.isInfix()) {
+                    writer.write("infix ")
+                }
 
-            if (list.isOperator()) {
-                writer.write("operator ")
-            }
+                if (list.isOperator()) {
+                    writer.write("operator ")
+                }
 
-            if (list.isTransient()) {
-                writer.write("transient ")
-            }
+                if (list.isTransient()) {
+                    writer.write("transient ")
+                }
 
-            if (list.isVolatile()) {
-                writer.write("volatile ")
-            }
+                if (list.isVolatile()) {
+                    writer.write("volatile ")
+                }
 
-            if (list.isSynchronized() && target.isStubsFile()) {
-                writer.write("synchronized ")
-            }
+                if (list.isSynchronized() && (compatibility.includeSynchronized || target.isStubsFile())) {
+                    writer.write("synchronized ")
+                }
 
-            if (list.isNative() && target.isStubsFile()) {
-                writer.write("native ")
-            }
+                if (list.isNative() && target.isStubsFile()) {
+                    writer.write("native ")
+                }
 
-            if (list.isFunctional()) {
-                writer.write("fun ")
-            }
-
-            if (language == Language.KOTLIN) {
-                if (list.isData()) {
-                    writer.write("data ")
+                if (list.isFunctional()) {
+                    writer.write("fun ")
                 }
             }
         }
@@ -430,7 +485,10 @@
             //  if includeDeprecated we want to do it
             //  unless runtimeOnly is false, in which case we'd include it too
             // e.g. emit @Deprecated if includeDeprecated && !runtimeOnly
-            if (item.deprecated && (runtimeAnnotationsOnly || includeDeprecated)) {
+            if (item.deprecated &&
+                (compatibility.deprecatedAsAnnotation || target.isStubsFile()) &&
+                (runtimeAnnotationsOnly || includeDeprecated)
+            ) {
                 writer.write("@Deprecated")
                 writer.write(if (separateLines) "\n" else " ")
             }
@@ -460,7 +518,7 @@
 
             // Ensure stable signature file order
             if (annotations.size > 1) {
-                annotations = annotations.sortedBy { it.qualifiedName }
+                annotations = annotations.sortedBy { it.qualifiedName() }
             }
 
             if (annotations.isNotEmpty()) {
@@ -473,13 +531,13 @@
                     }
 
                     var printAnnotation = annotation
-                    if (!annotation.targets.contains(target)) {
+                    if (!annotation.targets().contains(target)) {
                         continue
                     } else if ((annotation.isNullnessAnnotation())) {
                         if (skipNullnessAnnotations) {
                             continue
                         }
-                    } else if (annotation.qualifiedName == "java.lang.Deprecated") {
+                    } else if (annotation.qualifiedName() == "java.lang.Deprecated") {
                         // Special cased in stubs and signature files: emitted first
                         continue
                     } else if (options.typedefMode == Options.TypedefMode.INLINE) {
@@ -488,12 +546,11 @@
                             printAnnotation = typedef
                         }
                     } else if (options.typedefMode == Options.TypedefMode.REFERENCE &&
-                        annotation.targets === ANNOTATION_SIGNATURE_ONLY &&
-                        annotation.findTypedefAnnotation() != null
-                    ) {
+                        annotation.targets() === ANNOTATION_SIGNATURE_ONLY &&
+                        annotation.findTypedefAnnotation() != null) {
                         // For annotation references, only include the simple name
                         writer.write("@")
-                        writer.write(annotation.resolve()?.simpleName() ?: annotation.qualifiedName!!)
+                        writer.write(annotation.resolve()?.simpleName() ?: annotation.qualifiedName()!!)
                         if (separateLines) {
                             writer.write("\n")
                         } else {
@@ -504,11 +561,11 @@
 
                     // Optionally filter out duplicates
                     if (index > 0 && filterDuplicates) {
-                        val qualifiedName = annotation.qualifiedName
+                        val qualifiedName = annotation.qualifiedName()
                         var found = false
                         for (i in 0 until index) {
                             val prev = annotations[i]
-                            if (prev.qualifiedName == qualifiedName) {
+                            if (prev.qualifiedName() == qualifiedName) {
                                 found = true
                                 break
                             }
diff --git a/src/main/java/com/android/tools/metalava/model/MutableModifierList.kt b/src/main/java/com/android/tools/metalava/model/MutableModifierList.kt
index e784377..0158013 100644
--- a/src/main/java/com/android/tools/metalava/model/MutableModifierList.kt
+++ b/src/main/java/com/android/tools/metalava/model/MutableModifierList.kt
@@ -32,11 +32,9 @@
     fun setInfix(infix: Boolean)
     fun setOperator(operator: Boolean)
     fun setInline(inline: Boolean)
-    fun setValue(value: Boolean)
     fun setVarArg(vararg: Boolean)
-    fun setData(data: Boolean)
 
     fun addAnnotation(annotation: AnnotationItem)
     fun removeAnnotation(annotation: AnnotationItem)
     fun clearAnnotations(annotation: AnnotationItem)
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/PackageDocs.kt b/src/main/java/com/android/tools/metalava/model/PackageDocs.kt
index b033aab..107e9fd 100644
--- a/src/main/java/com/android/tools/metalava/model/PackageDocs.kt
+++ b/src/main/java/com/android/tools/metalava/model/PackageDocs.kt
@@ -22,4 +22,4 @@
     val hiddenPackages: MutableSet<String>
 ) {
     fun getOverviewDocumentation(pkg: PackageItem): String? = overviewDocs[pkg.qualifiedName()]
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/PackageItem.kt b/src/main/java/com/android/tools/metalava/model/PackageItem.kt
index e8198d7..711c0d9 100644
--- a/src/main/java/com/android/tools/metalava/model/PackageItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/PackageItem.kt
@@ -112,4 +112,4 @@
     companion object {
         val comparator: Comparator<PackageItem> = Comparator { a, b -> a.qualifiedName().compareTo(b.qualifiedName()) }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/PackageList.kt b/src/main/java/com/android/tools/metalava/model/PackageList.kt
index cf06715..d71caa0 100644
--- a/src/main/java/com/android/tools/metalava/model/PackageList.kt
+++ b/src/main/java/com/android/tools/metalava/model/PackageList.kt
@@ -43,4 +43,4 @@
     fun allClasses(): Sequence<ClassItem> {
         return packages.asSequence().flatMap { it.allClasses() }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/ParameterItem.kt b/src/main/java/com/android/tools/metalava/model/ParameterItem.kt
index 8cd1dc8..27e1748 100644
--- a/src/main/java/com/android/tools/metalava/model/ParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/ParameterItem.kt
@@ -78,10 +78,6 @@
      */
     fun isVarArgs(): Boolean
 
-    /** The property declared by this parameter; inverse of [PropertyItem.constructorParameter] */
-    val property: PropertyItem?
-        get() = null
-
     override fun parent(): MethodItem? = containingMethod()
 
     override fun accept(visitor: ItemVisitor) {
@@ -122,4 +118,4 @@
     override fun containingPackage(strict: Boolean): PackageItem? = containingMethod().containingPackage(false)
 
     // TODO: modifier list
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
index 95792d7..5f8478a 100644
--- a/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/PropertyItem.kt
@@ -20,25 +20,6 @@
 import com.android.tools.metalava.model.visitors.TypeVisitor
 
 interface PropertyItem : MemberItem {
-    /** The getter for this property, if it exists; inverse of [MethodItem.property] */
-    val getter: MethodItem?
-        get() = null
-
-    /** The setter for this property, if it exists; inverse of [MethodItem.property] */
-    val setter: MethodItem?
-        get() = null
-
-    /** The backing field for this property, if it exists; inverse of [FieldItem.property] */
-    val backingField: FieldItem?
-        get() = null
-
-    /**
-     * The constructor parameter for this property, if declared in a primary constructor; inverse
-     * of [ParameterItem.property]
-     */
-    val constructorParameter: ParameterItem?
-        get() = null
-
     /** The type of this property */
     override fun type(): TypeItem
 
@@ -83,4 +64,4 @@
     companion object {
         val comparator: java.util.Comparator<PropertyItem> = Comparator { a, b -> a.name().compareTo(b.name()) }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/SourceFileItem.kt b/src/main/java/com/android/tools/metalava/model/SourceFileItem.kt
deleted file mode 100644
index b4b48fc..0000000
--- a/src/main/java/com/android/tools/metalava/model/SourceFileItem.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model
-
-import com.android.tools.metalava.model.visitors.ItemVisitor
-import com.android.tools.metalava.model.visitors.TypeVisitor
-import java.util.function.Predicate
-
-/** Represents a Kotlin/Java source file */
-interface SourceFileItem : Item {
-    /** Top level classes contained in this file */
-    fun classes(): Sequence<ClassItem>
-
-    fun getHeaderComments(): String? = null
-
-    fun getImportStatements(predicate: Predicate<Item>): Collection<Item> = emptyList()
-
-    override fun parent(): PackageItem? = containingPackage()
-
-    override fun containingClass(strict: Boolean): ClassItem? = null
-
-    override fun type(): TypeItem? = null
-
-    override fun accept(visitor: ItemVisitor) {
-        if (visitor.skip(this)) return
-
-        visitor.visitItem(this)
-        visitor.visitSourceFile(this)
-
-        classes().forEach { it.accept(visitor) }
-
-        visitor.afterVisitSourceFile(this)
-        visitor.afterVisitItem(this)
-    }
-
-    override fun acceptTypes(visitor: TypeVisitor) {
-        if (visitor.skip(this)) return
-
-        classes().forEach { it.acceptTypes(visitor) }
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/TypeItem.kt b/src/main/java/com/android/tools/metalava/model/TypeItem.kt
index 8084dca..f4bc0ba 100644
--- a/src/main/java/com/android/tools/metalava/model/TypeItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/TypeItem.kt
@@ -20,6 +20,7 @@
 import com.android.tools.metalava.JAVA_LANG_OBJECT
 import com.android.tools.metalava.JAVA_LANG_PREFIX
 import com.android.tools.metalava.JAVA_LANG_STRING
+import com.android.tools.metalava.compatibility
 import java.util.function.Predicate
 
 /**
@@ -172,11 +173,19 @@
     companion object {
         /** Shortens types, if configured */
         fun shortenTypes(type: String): String {
-            var cleaned = type
-            if (cleaned.contains("@androidx.annotation.")) {
-                cleaned = cleaned.replace("@androidx.annotation.", "@")
+            if (compatibility.omitCommonPackages) {
+                var cleaned = type
+                if (cleaned.contains("@androidx.annotation.")) {
+                    cleaned = cleaned.replace("@androidx.annotation.", "@")
+                }
+                if (cleaned.contains("@android.support.annotation.")) {
+                    cleaned = cleaned.replace("@android.support.annotation.", "@")
+                }
+
+                return stripJavaLangPrefix(cleaned)
             }
-            return stripJavaLangPrefix(cleaned)
+
+            return type
         }
 
         /**
@@ -212,9 +221,19 @@
         }
 
         fun formatType(type: String?): String {
-            return if (type == null) {
-                ""
-            } else cleanupGenerics(type)
+            if (type == null) {
+                return ""
+            }
+
+            var cleaned = type
+
+            if (compatibility.spaceAfterCommaInTypes && cleaned.indexOf(',') != -1) {
+                // The compat files have spaces after commas where we normally don't
+                cleaned = cleaned.replace(",", ", ").replace(",  ", ", ")
+            }
+
+            cleaned = cleanupGenerics(cleaned)
+            return cleaned
         }
 
         fun cleanupGenerics(signature: String): String {
diff --git a/src/main/java/com/android/tools/metalava/model/TypeParameterItem.kt b/src/main/java/com/android/tools/metalava/model/TypeParameterItem.kt
index 036dd79..c419deb 100644
--- a/src/main/java/com/android/tools/metalava/model/TypeParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/TypeParameterItem.kt
@@ -17,14 +17,6 @@
 package com.android.tools.metalava.model
 
 interface TypeParameterItem : ClassItem {
-    @Deprecated(
-        message = "Please use typeBounds() instead.",
-        level = DeprecationLevel.ERROR,
-        replaceWith = ReplaceWith("typeBounds().mapNotNull { it.asClass() }")
-    )
-    fun bounds(): List<ClassItem> = typeBounds().mapNotNull {
-        it.asClass()
-    }
-    fun typeBounds(): List<TypeItem>
+    fun bounds(): List<ClassItem>
     fun isReified(): Boolean
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/TypeParameterList.kt b/src/main/java/com/android/tools/metalava/model/TypeParameterList.kt
index 765f499..51adbd5 100644
--- a/src/main/java/com/android/tools/metalava/model/TypeParameterList.kt
+++ b/src/main/java/com/android/tools/metalava/model/TypeParameterList.kt
@@ -48,4 +48,4 @@
             override fun typeParameterCount(): Int = 0
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/TypeParameterListOwner.kt b/src/main/java/com/android/tools/metalava/model/TypeParameterListOwner.kt
index 1f7bf7a..7fac61b 100644
--- a/src/main/java/com/android/tools/metalava/model/TypeParameterListOwner.kt
+++ b/src/main/java/com/android/tools/metalava/model/TypeParameterListOwner.kt
@@ -23,4 +23,4 @@
 
     /** Parent type parameter list owner */
     fun typeParameterListOwnerParent(): TypeParameterListOwner?
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/ClassType.kt b/src/main/java/com/android/tools/metalava/model/psi/ClassType.kt
index dcb6583..382d611 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/ClassType.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/ClassType.kt
@@ -37,4 +37,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/CodePrinter.kt b/src/main/java/com/android/tools/metalava/model/psi/CodePrinter.kt
index 83b58b9..44323b2 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/CodePrinter.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/CodePrinter.kt
@@ -37,7 +37,6 @@
 import com.intellij.psi.PsiTypeCastExpression
 import com.intellij.psi.PsiVariable
 import org.jetbrains.kotlin.name.ClassId
-import org.jetbrains.kotlin.name.Name
 import org.jetbrains.uast.UAnnotation
 import org.jetbrains.uast.UBinaryExpression
 import org.jetbrains.uast.UBinaryExpressionWithType
@@ -440,15 +439,8 @@
 
                 is Pair<*, *> -> {
                     val first = value.first
-                    val second = value.second
                     if (first is ClassId) {
-                        val qualifiedName = first.packageFqName.asString() + "." +
-                            first.relativeClassName.asString()
-                        return if (second is Name) {
-                            qualifiedName + "." + second.asString()
-                        } else {
-                            qualifiedName
-                        }
+                        return first.packageFqName.asString() + "." + first.relativeClassName.asString()
                     }
                 }
             }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
index 4077b2a..c9665b2 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiAnnotationItem.kt
@@ -32,12 +32,11 @@
 import com.android.tools.metalava.model.psi.CodePrinter.Companion.constantToExpression
 import com.android.tools.metalava.model.psi.CodePrinter.Companion.constantToSource
 import com.intellij.psi.PsiAnnotation
-import com.intellij.psi.PsiAnnotationMemberValue
 import com.intellij.psi.PsiAnnotationMethod
+import com.intellij.psi.PsiAnnotationMemberValue
 import com.intellij.psi.PsiArrayInitializerMemberValue
 import com.intellij.psi.PsiBinaryExpression
 import com.intellij.psi.PsiClass
-import com.intellij.psi.PsiClassObjectAccessExpression
 import com.intellij.psi.PsiExpression
 import com.intellij.psi.PsiField
 import com.intellij.psi.PsiLiteral
@@ -49,9 +48,13 @@
 class PsiAnnotationItem private constructor(
     override val codebase: PsiBasedCodebase,
     val psiAnnotation: PsiAnnotation,
-    override val originalName: String?
+    private val originalName: String?
 ) : DefaultAnnotationItem(codebase) {
-    override val qualifiedName: String? = AnnotationItem.mapName(codebase, originalName)
+    private val qualifiedName = AnnotationItem.mapName(codebase, originalName)
+
+    private var attributes: List<AnnotationAttribute>? = null
+
+    override fun originalName(): String? = originalName
 
     override fun toString(): String = toSource()
 
@@ -75,16 +78,37 @@
         return super.isNonNull()
     }
 
-    override val attributes: List<PsiAnnotationAttribute> by lazy {
-        psiAnnotation.parameterList.attributes.mapNotNull { attribute ->
-            attribute.value?.let { value ->
-                PsiAnnotationAttribute(codebase, attribute.name ?: ATTR_VALUE, value)
+    override fun qualifiedName() = qualifiedName
+
+    override fun attributes(): List<AnnotationAttribute> {
+        if (attributes == null) {
+            val psiAttributes = psiAnnotation.parameterList.attributes
+            attributes = if (psiAttributes.isEmpty()) {
+                emptyList()
+            } else {
+                val list = mutableListOf<AnnotationAttribute>()
+                for (parameter in psiAttributes) {
+                    list.add(
+                        PsiAnnotationAttribute(
+                            codebase,
+                            parameter.name ?: ATTR_VALUE, parameter.value ?: continue
+                        )
+                    )
+                }
+                list
             }
-        }.toList()
+        }
+
+        return attributes!!
     }
 
-    override val targets: Set<AnnotationTarget> by lazy {
-        AnnotationItem.computeTargets(this, codebase::findOrCreateClass)
+    override fun targets(): Set<AnnotationTarget> {
+        if (targets == null) {
+            targets = AnnotationItem.computeTargets(this) { className ->
+                codebase.findOrCreateClass(className)
+            }
+        }
+        return targets!!
     }
 
     companion object {
@@ -111,7 +135,7 @@
         }
 
         private fun getAttributes(annotation: PsiAnnotation, showDefaultAttrs: Boolean):
-            List<Pair<String?, PsiAnnotationMemberValue?>> {
+                List<Pair<String?, PsiAnnotationMemberValue?>> {
             val annotationClass = annotation.nameReferenceElement?.resolve() as? PsiClass
             val list = mutableListOf<Pair<String?, PsiAnnotationMemberValue?>>()
             if (annotationClass != null && showDefaultAttrs) {
@@ -178,7 +202,7 @@
             // because that may not use fully qualified names, e.g. the source may say
             //  @RequiresPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
             // and we want to compute
-            //  @androidx.annotation.RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
+            //  @android.support.annotation.RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
             when (value) {
                 null -> sb.append("null")
                 is PsiLiteral -> sb.append(constantToSource(value.value))
@@ -194,8 +218,7 @@
                                 if (initializer != null) {
                                     val fieldItem = cls.findField(resolved.name)
                                     if (fieldItem == null || fieldItem.isHiddenOrRemoved() ||
-                                        !fieldItem.isPublic
-                                    ) {
+                                            !fieldItem.isPublic) {
                                         // Use the literal value instead
                                         val source = getConstantSource(initializer)
                                         if (source != null) {
@@ -300,12 +323,6 @@
                 return value
             }
 
-            if (psiValue is PsiClassObjectAccessExpression) {
-                // The value of a class literal expression like String.class or String::class
-                // is the fully qualified name, java.lang.String
-                return psiValue.operand.type.canonicalText
-            }
-
             return psiValue.text ?: psiValue.text.removeSurrounding("\"")
         }
 
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt
index 74b35d4..16579f5 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiBasedCodebase.kt
@@ -23,12 +23,12 @@
 import com.android.tools.metalava.Issues
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.DefaultCodebase
-import com.android.tools.metalava.model.FieldItem
 import com.android.tools.metalava.model.Item
 import com.android.tools.metalava.model.MethodItem
 import com.android.tools.metalava.model.PackageDocs
 import com.android.tools.metalava.model.PackageItem
 import com.android.tools.metalava.model.PackageList
+import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.options
 import com.android.tools.metalava.reporter
 import com.android.tools.metalava.tick
@@ -56,50 +56,29 @@
 import com.intellij.psi.javadoc.PsiDocTag
 import com.intellij.psi.search.GlobalSearchScope
 import com.intellij.psi.util.PsiTreeUtil
-import org.jetbrains.kotlin.psi.KtElement
-import org.jetbrains.kotlin.resolve.BindingContext
 import org.jetbrains.uast.UFile
 import org.jetbrains.uast.UastFacade
-import org.jetbrains.uast.kotlin.KotlinUastResolveProviderService
 import java.io.File
 import java.io.IOException
+import java.util.ArrayList
+import java.util.HashMap
 import java.util.zip.ZipFile
 
 const val PACKAGE_ESTIMATE = 500
 const val CLASS_ESTIMATE = 15000
 const val METHOD_ESTIMATE = 1000
 
-/**
- * A codebase containing Java, Kotlin, or UAST PSI classes
- *
- * After creation, a list of PSI file or a JAR file is passed to [initialize]. This creates package
- * and class items along with their members. This process is broken into two phases:
- *
- * First, [initializing] is set to true, and class items are created from the supplied sources.
- * These are main classes of the codebase and have [ClassItem.emit] set to true and
- * [ClassItem.isFromClassPath] set to false. While creating these, package names are reserved and
- * associated with their classes in [packageClasses].
- *
- * Next, package items are created for source classes based on the contents of [packageClasses]
- * with [PackageItem.emit] set to true.
- *
- * Then [initializing] is set to false and the second pass begins. This path iteratively resolves
- * supertypes of class items until all are fully resolved, creating new class and package items as
- * needed. Since all the source class and package items have been created, new items are assumed to
- * originate from the classpath and have [Item.emit] set to false and [Item.isFromClassPath] set to
- * true.
- */
-open class PsiBasedCodebase(
-    location: File,
-    override var description: String = "Unknown"
-) : DefaultCodebase(location) {
+open class PsiBasedCodebase(location: File, override var description: String = "Unknown") : DefaultCodebase(location) {
     lateinit var uastEnvironment: UastEnvironment
     val project: Project
         get() = uastEnvironment.ideaProject
 
-    /** Map from class name to class item. Classes are added via [registerClass] */
+    /** Map from class name to class item */
     private val classMap: MutableMap<String, PsiClassItem> = HashMap(CLASS_ESTIMATE)
 
+    /** Map from psi type to type item */
+    private val typeMap: MutableMap<PsiType, TypeItem> = HashMap(400)
+
     /**
      * Map from classes to the set of methods for each (but only for classes where we've
      * called [findMethod]
@@ -109,7 +88,7 @@
     /** Map from package name to the corresponding package item */
     private lateinit var packageMap: MutableMap<String, PsiPackageItem>
 
-    /** Map from package name to list of classes in that package. Only used during [initialize]. */
+    /** Map from package name to list of classes in that package */
     private lateinit var packageClasses: MutableMap<String, MutableList<PsiClassItem>>
 
     /** A set of packages to hide */
@@ -119,18 +98,8 @@
      * A list of the top-level classes declared in the codebase's source (rather than on its
      * classpath).
      */
-    private lateinit var topLevelClassesFromSource: MutableList<PsiClassItem>
+    private lateinit var topLevelClassesFromSource: MutableList<ClassItem>
 
-    /**
-     * Set to true in [initialize] for the first pass of creating class items for all classes in
-     * the codebase sources and false for the second pass of creating class items for the
-     * supertypes of the codebase classes. New class items created in the supertypes pass must come
-     * from the classpath (dependencies) since all source classes have been created.
-     *
-     * This information is used in [createClass] to set [ClassItem.emit] to true for source classes
-     * and [ClassItem.isFromClassPath] to true for classpath classes. It is also used in
-     * [registerPackage] to set [PackageItem.emit] to true for source packages.
-     */
     private var initializing = false
 
     override fun trustedApi(): Boolean = false
@@ -141,13 +110,9 @@
 
     private lateinit var emptyPackage: PsiPackageItem
 
-    fun initialize(
-        uastEnvironment: UastEnvironment,
-        psiFiles: List<PsiFile>,
-        packages: PackageDocs,
-    ) {
+    fun initialize(uastEnvironment: UastEnvironment, units: List<PsiFile>, packages: PackageDocs) {
         initializing = true
-        this.units = psiFiles
+        this.units = units
         packageDocs = packages
 
         this.uastEnvironment = uastEnvironment
@@ -165,11 +130,11 @@
         this.methodMap = HashMap(METHOD_ESTIMATE)
         topLevelClassesFromSource = ArrayList(CLASS_ESTIMATE)
 
-        // Make sure we only process the files once; sometimes there's overlap in the source lists
-        for (psiFile in psiFiles.asSequence().distinct()) {
+        // Make sure we only process the units once; sometimes there's overlap in the source lists
+        for (unit in units.asSequence().distinct()) {
             tick() // show progress
 
-            psiFile.accept(object : JavaRecursiveElementVisitor() {
+            unit.accept(object : JavaRecursiveElementVisitor() {
                 override fun visitImportStatement(element: PsiImportStatement) {
                     super.visitImportStatement(element)
                     if (element.resolve() == null) {
@@ -182,54 +147,54 @@
                 }
             })
 
-            var classes = (psiFile as? PsiClassOwner)?.classes?.toList() ?: emptyList()
+            var classes = (unit as? PsiClassOwner)?.classes?.toList() ?: emptyList()
             if (classes.isEmpty()) {
-                val uFile = UastFacade.convertElementWithParent(psiFile, UFile::class.java) as? UFile?
+                val uFile = UastFacade.convertElementWithParent(unit, UFile::class.java) as? UFile?
                 classes = uFile?.classes?.map { it }?.toList() ?: emptyList()
             }
-            when {
-                classes.isEmpty() && psiFile is PsiJavaFile -> {
-                    // package-info.java ?
-                    val packageStatement = psiFile.packageStatement
-                    // Look for javadoc on the package statement; this is NOT handed to us on
-                    // the PsiPackage!
-                    if (packageStatement != null) {
-                        val comment = PsiTreeUtil.getPrevSiblingOfType(
-                            packageStatement,
-                            PsiDocComment::class.java
-                        )
-                        if (comment != null) {
-                            val packageName = packageStatement.packageName
-                            val text = comment.text
-                            if (text.contains("@hide")) {
-                                this.hiddenPackages[packageName] = true
-                            }
-                            if (packageDocs[packageName] != null) {
-                                reporter.report(
-                                    Issues.BOTH_PACKAGE_INFO_AND_HTML,
-                                    psiFile,
-                                    "It is illegal to provide both a package-info.java file and " +
-                                        "a package.html file for the same package"
-                                )
-                            }
-                            packageDocs[packageName] = text
+            var packageName: String? = null
+            if (classes.isEmpty() && unit is PsiJavaFile) {
+                // package-info.java ?
+                val packageStatement = unit.packageStatement
+                // Look for javadoc on the package statement; this is NOT handed to us on
+                // the PsiPackage!
+                if (packageStatement != null) {
+                    packageName = packageStatement.packageName
+                    val comment = PsiTreeUtil.getPrevSiblingOfType(packageStatement, PsiDocComment::class.java)
+                    if (comment != null) {
+                        val text = comment.text
+                        if (text.contains("@hide")) {
+                            this.hiddenPackages[packageName] = true
                         }
+                        if (packageDocs[packageName] != null) {
+                            reporter.report(
+                                Issues.BOTH_PACKAGE_INFO_AND_HTML,
+                                unit,
+                                "It is illegal to provide both a package-info.java file and a " +
+                                    "package.html file for the same package"
+                            )
+                        }
+                        packageDocs[packageName] = text
                     }
                 }
-                else -> {
-                    for (psiClass in classes) {
-                        psiClass.accept(object : JavaRecursiveElementVisitor() {
-                            override fun visitErrorElement(element: PsiErrorElement) {
-                                super.visitErrorElement(element)
-                                reporter.report(
-                                    Issues.INVALID_SYNTAX,
-                                    element,
-                                    "Syntax error: `${element.errorDescription}`"
-                                )
-                            }
-                        })
+            } else {
+                for (psiClass in classes) {
+                    psiClass.accept(object : JavaRecursiveElementVisitor() {
+                        override fun visitErrorElement(element: PsiErrorElement) {
+                            super.visitErrorElement(element)
+                            reporter.report(
+                                Issues.INVALID_SYNTAX,
+                                element,
+                                "Syntax error: `${element.errorDescription}`"
+                            )
+                        }
+                    })
 
-                        topLevelClassesFromSource += createClass(psiClass)
+                    val classItem = createClass(psiClass)
+                    topLevelClassesFromSource.add(classItem)
+
+                    if (packageName == null) {
+                        packageName = getPackageName(psiClass)
                     }
                 }
             }
@@ -247,6 +212,7 @@
             val sortedClasses = classes.toMutableList().sortedWith(ClassItem.fullNameComparator)
             registerPackage(psiPackage, sortedClasses, packageDocs[pkgName], pkgName)
         }
+
         initializing = false
 
         emptyPackage = findPackage("")!!
@@ -271,8 +237,6 @@
         // Point to "parent" packages, since doclava treats packages as nested (e.g. an @hide on
         // android.foo will also apply to android.foo.bar)
         addParentPackages(packageMap.values)
-
-        packageClasses.clear() // Not used after this point
     }
 
     override fun dispose() {
@@ -302,7 +266,8 @@
             val psiPackage = JavaPsiFacade.getInstance(project).findPackage(pkgName) ?: continue
             val sortedClasses = emptyList<PsiClassItem>()
             val packageHtml = null
-            registerPackage(psiPackage, sortedClasses, packageHtml, pkgName)
+            val pkg = registerPackage(psiPackage, sortedClasses, packageHtml, pkgName)
+            pkg.emit = false // don't expose these packages in the API signature files, stubs, etc
         }
 
         // Connect up all the package items
@@ -331,10 +296,7 @@
         packageHtml: String?,
         pkgName: String
     ): PsiPackageItem {
-        val packageItem = PsiPackageItem
-            .create(this, psiPackage, packageHtml, fromClassPath = !initializing)
-        packageItem.emit = initializing
-
+        val packageItem = PsiPackageItem.create(this, psiPackage, packageHtml)
         packageMap[pkgName] = packageItem
         if (isPackageHidden(pkgName)) {
             packageItem.hidden = true
@@ -441,15 +403,13 @@
         for (pkg in packageMap.values) {
             pkg.finishInitialization()
         }
-
-        packageClasses.clear() // Not used after this point
     }
 
     fun dumpStats() {
         options.stdout.println(
             "INTERNAL STATS: Size of classMap=${classMap.size} and size of " +
                 "methodMap=${methodMap.size} and size of packageMap=${packageMap.size}, and the " +
-                "size of packageClasses=${packageClasses.size} "
+                "typemap size is ${typeMap.size}, and the packageClasses size is ${packageClasses.size} "
         )
     }
 
@@ -491,12 +451,14 @@
     }
 
     private fun createClass(clz: PsiClass): PsiClassItem {
-        // If initializing is true, this class is from source
-        val classItem = PsiClassItem.create(this, clz, fromClassPath = !initializing)
-        // Set emit to true for source classes but false for classpath classes
-        classItem.emit = initializing
+        val classItem = PsiClassItem.create(this, clz)
 
         if (!initializing) {
+            // This class is found while we're no longer initializing all the source units:
+            // that means it must be found on the classpath instead. These should be treated
+            // as hidden; we don't want to generate code for them.
+            classItem.emit = false
+
             // Workaround: we're pulling in .aidl files from .jar files. These are
             // marked @hide, but since we only see the .class files we don't know that.
             if (classItem.simpleName().startsWith("I") &&
@@ -515,12 +477,15 @@
             classItem.finishInitialization()
             return classItem
         }
+        val qualifiedName: String = clz.qualifiedName ?: clz.name!!
+        classMap[qualifiedName] = classItem
 
         // TODO: Cache for adjacent files!
         val packageName = getPackageName(clz)
         registerPackageClass(packageName, classItem)
 
         if (!initializing) {
+            classItem.emit = false
             classItem.finishInitialization()
             val pkgName = getPackageName(clz)
             val pkg = findPackage(pkgName)
@@ -532,6 +497,8 @@
                 val psiPackage = JavaPsiFacade.getInstance(project).findPackage(pkgName)
                 if (psiPackage != null) {
                     val packageItem = registerPackage(psiPackage, null, packageHtml, pkgName)
+                    // Don't include packages from API that isn't directly included in the API
+                    packageItem.emit = false
                     packageItem.addClass(classItem)
                 }
             } else {
@@ -693,7 +660,7 @@
         return methodItem
     }
 
-    fun findField(field: PsiField): FieldItem? {
+    fun findField(field: PsiField): Item? {
         val containingClass = field.containingClass ?: return null
         val cls = findOrCreateClass(containingClass)
         return cls.findField(field.name)
@@ -767,17 +734,9 @@
 
     override fun toString(): String = description
 
-    /** Add a class to the codebase. Called from [createClass] and [PsiClassItem.create]. */
-    internal fun registerClass(cls: PsiClassItem) {
-        classMap[cls.qualifiedName()] = cls
-    }
+    fun registerClass(cls: PsiClassItem) {
+        assert(classMap[cls.qualifiedName()] == null || classMap[cls.qualifiedName()] == cls)
 
-    /** Get a Kotlin [BindingContext] at [element]
-     *
-     * Do not cache returned binding context for longer than the lifetime of this codebase
-     */
-    fun bindingContext(element: KtElement): BindingContext {
-        return checkNotNull(project.getService(KotlinUastResolveProviderService::class.java))
-            .getBindingContext(element)
+        classMap[cls.qualifiedName()] = cls
     }
 }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt
index 1573c61..84f3798 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiClassItem.kt
@@ -16,17 +16,15 @@
 
 package com.android.tools.metalava.model.psi
 
-import com.android.tools.metalava.JAVA_RETENTION
-import com.android.tools.metalava.KT_RETENTION
-import com.android.tools.metalava.isRetention
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.AnnotationRetention
 import com.android.tools.metalava.model.ClassItem
+import com.android.tools.metalava.model.CompilationUnit
 import com.android.tools.metalava.model.ConstructorItem
 import com.android.tools.metalava.model.FieldItem
 import com.android.tools.metalava.model.MethodItem
 import com.android.tools.metalava.model.PackageItem
 import com.android.tools.metalava.model.PropertyItem
-import com.android.tools.metalava.model.SourceFileItem
 import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.TypeParameterList
 import com.android.tools.metalava.model.VisibilityLevel
@@ -47,7 +45,9 @@
 import org.jetbrains.kotlin.psi.psiUtil.isPropertyParameter
 import org.jetbrains.uast.UClass
 import org.jetbrains.uast.UFile
+import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.getParentOfType
+import org.jetbrains.uast.kotlin.KotlinUClass
 
 open class PsiClassItem(
     override val codebase: PsiBasedCodebase,
@@ -58,17 +58,14 @@
     private val hasImplicitDefaultConstructor: Boolean,
     val classType: ClassType,
     modifiers: PsiModifierItem,
-    documentation: String,
-    /** True if this class is from the class path (dependencies). Exposed in [isFromClassPath]. */
-    private val fromClassPath: Boolean
+    documentation: String
 ) :
     PsiItem(
         codebase = codebase,
         modifiers = modifiers,
         documentation = documentation,
         element = psiClass
-    ),
-    ClassItem {
+    ), ClassItem {
 
     lateinit var containingPackage: PsiPackageItem
 
@@ -80,7 +77,6 @@
     override fun isInterface(): Boolean = classType == ClassType.INTERFACE
     override fun isAnnotationType(): Boolean = classType == ClassType.ANNOTATION_TYPE
     override fun isEnum(): Boolean = classType == ClassType.ENUM
-    override fun isFromClassPath(): Boolean = fromClassPath
     override fun hasImplicitDefaultConstructor(): Boolean = hasImplicitDefaultConstructor
 
     private var superClass: ClassItem? = null
@@ -171,9 +167,6 @@
     override fun properties(): List<PropertyItem> = properties
     override fun fields(): List<FieldItem> = fields
 
-    final override var primaryConstructor: PsiConstructorItem? = null
-        private set
-
     override fun toType(): TypeItem {
         return PsiTypeItem.create(codebase, codebase.getClassType(psiClass))
     }
@@ -183,8 +176,7 @@
     override fun typeParameterList(): TypeParameterList {
         if (psiClass.hasTypeParameters()) {
             return PsiTypeParameterList(
-                codebase,
-                psiClass.typeParameterList
+                codebase, psiClass.typeParameterList
                     ?: return TypeParameterList.NONE
             )
         } else {
@@ -202,7 +194,7 @@
     override val isTypeParameter: Boolean
         get() = psiClass is PsiTypeParameter
 
-    override fun getSourceFile(): SourceFileItem? {
+    override fun getCompilationUnit(): CompilationUnit? {
         if (isInnerClass()) {
             return null
         }
@@ -218,8 +210,7 @@
             } else {
                 null
             }
-
-        return PsiSourceFileItem(codebase, containingFile, uFile)
+        return PsiCompilationUnit(codebase, uFile, containingFile)
     }
 
     override fun finishInitialization() {
@@ -265,21 +256,19 @@
         // Add interfaces. If this class is an interface, it can implement both
         // classes from the extends clause and from the implements clause.
         val interfaces = psiClass.implementsListTypes
-        setInterfaces(
-            if (interfaces.isEmpty() && extendsListTypes.size <= 1) {
-                emptyList()
-            } else {
-                val result = ArrayList<PsiTypeItem>(interfaces.size + extendsListTypes.size - 1)
-                val create: (PsiClassType) -> PsiTypeItem = {
-                    val type = PsiTypeItem.create(codebase, it)
-                    type.asClass() // ensure that we initialize classes eagerly too such that they're registered etc
-                    type
-                }
-                (1 until extendsListTypes.size).mapTo(result) { create(extendsListTypes[it]) }
-                interfaces.mapTo(result) { create(it) }
-                result
+        setInterfaces(if (interfaces.isEmpty() && extendsListTypes.size <= 1) {
+            emptyList()
+        } else {
+            val result = ArrayList<PsiTypeItem>(interfaces.size + extendsListTypes.size - 1)
+            val create: (PsiClassType) -> PsiTypeItem = {
+                val type = PsiTypeItem.create(codebase, it)
+                type.asClass() // ensure that we initialize classes eagerly too such that they're registered etc
+                type
             }
-        )
+            (1 until extendsListTypes.size).mapTo(result) { create(extendsListTypes[it]) }
+            interfaces.mapTo(result) { create(it) }
+            result
+        })
 
         for (inner in innerClasses) {
             inner.initializeSuperClasses()
@@ -400,15 +389,11 @@
     override fun toString(): String = "class ${qualifiedName()}"
 
     companion object {
-        private fun hasExplicitRetention(
-            modifiers: PsiModifierItem,
-            psiClass: PsiClass,
-            isKotlin: Boolean
-        ): Boolean {
-            if (modifiers.findAnnotation(JAVA_RETENTION) != null) {
+        private fun hasExplicitRetention(modifiers: PsiModifierItem, psiClass: PsiClass, isKotlin: Boolean): Boolean {
+            if (modifiers.findAnnotation("java.lang.annotation.Retention") != null) {
                 return true
             }
-            if (modifiers.findAnnotation(KT_RETENTION) != null) {
+            if (modifiers.findAnnotation("kotlin.annotation.Retention") != null) {
                 return true
             }
             if (isKotlin && psiClass is UClass) {
@@ -416,20 +401,18 @@
                 // a @DslMarker annotation will imply a runtime annotation which is present
                 // in the java facade, not in the source list of annotations
                 val modifierList = psiClass.modifierList
-                if (modifierList != null &&
-                    modifierList.annotations.any { isRetention(it.qualifiedName) }
-                ) {
+                if (modifierList != null && modifierList.annotations.any {
+                        val qualifiedName = it.qualifiedName
+                        qualifiedName == "kotlin.annotation.Retention" ||
+                            qualifiedName == "java.lang.annotation.Retention"
+                    }) {
                     return true
                 }
             }
             return false
         }
 
-        fun create(
-            codebase: PsiBasedCodebase,
-            psiClass: PsiClass,
-            fromClassPath: Boolean
-        ): PsiClassItem {
+        fun create(codebase: PsiBasedCodebase, psiClass: PsiClass): PsiClassItem {
             if (psiClass is PsiTypeParameter) {
                 return PsiTypeParameterItem.create(codebase, psiClass)
             }
@@ -440,8 +423,7 @@
             val classType = ClassType.getClassType(psiClass)
 
             val commentText = PsiItem.javadoc(psiClass)
-            val modifiers = PsiModifierItem.create(codebase, psiClass, commentText)
-
+            val modifiers = modifiers(codebase, psiClass, commentText)
             val item = PsiClassItem(
                 codebase = codebase,
                 psiClass = psiClass,
@@ -451,21 +433,27 @@
                 classType = classType,
                 hasImplicitDefaultConstructor = hasImplicitDefaultConstructor,
                 documentation = commentText,
-                modifiers = modifiers,
-                fromClassPath = fromClassPath
+                modifiers = modifiers
             )
-            item.modifiers.setOwner(item)
-
-            // Register this class now so it's present when calling Codebase.findOrCreateClass for
-            // inner classes below
             codebase.registerClass(item)
+            item.modifiers.setOwner(item)
 
             // Construct the children
             val psiMethods = psiClass.methods
             val methods: MutableList<PsiMethodItem> = ArrayList(psiMethods.size)
             val isKotlin = isKotlin(psiClass)
 
-            if (classType == ClassType.ANNOTATION_TYPE &&
+            if (classType == ClassType.ENUM) {
+                // In compatibility mode we want explicit valueOf and values methods.
+                // UAST recently started including these in the AST (as synthetic elements),
+                // so we no longer need to create those here, but we still need to create
+                // the synthetic constructor
+                if (compatibility.defaultEnumMethods) {
+                    // Also add a private constructor; used when emitting the private API
+                    val psiMethod = codebase.createConstructor("private ${psiClass.name}", psiClass)
+                    methods.add(PsiConstructorItem.create(codebase, item, psiMethod))
+                }
+            } else if (classType == ClassType.ANNOTATION_TYPE && compatibility.explicitlyListClassRetention &&
                 !hasExplicitRetention(modifiers, psiClass, isKotlin)
             ) {
                 // By policy, include explicit retention policy annotation if missing
@@ -497,34 +485,26 @@
                     } else {
                         constructors.add(constructor)
                     }
-                } else if (classType == ClassType.ENUM && psiMethod is SyntheticElement) {
+                } else if (classType == ClassType.ENUM &&
+                    !compatibility.defaultEnumMethods &&
+                    psiMethod is SyntheticElement
+                ) {
                     // skip
                 } else {
                     val method = PsiMethodItem.create(codebase, item, psiMethod)
                     methods.add(method)
                 }
             }
-
-            // Add the no-arg constructor back in if no constructors have only optional arguments
-            // or if an all-optional constructor created it as part of @JvmOverloads
-            if (noArgConstructor != null && (
-                !hasConstructorWithOnlyOptionalArgs ||
-                    noArgConstructor.modifiers.isAnnotatedWith("kotlin.jvm.JvmOverloads")
-                )
-            ) {
+            if (noArgConstructor != null && !hasConstructorWithOnlyOptionalArgs) {
                 constructors.add(noArgConstructor)
             }
 
-            // Note that this is dependent on the constructor filtering above. UAST sometimes
-            // reports duplicate primary constructors, e.g.: the implicit no-arg constructor
-            constructors.singleOrNull { it.isPrimary }?.let { item.primaryConstructor = it }
-
             if (hasImplicitDefaultConstructor) {
                 assert(constructors.isEmpty())
                 constructors.add(PsiConstructorItem.createDefaultConstructor(codebase, item, psiClass))
             }
 
-            val fields: MutableList<PsiFieldItem> = mutableListOf()
+            val fields: MutableList<FieldItem> = mutableListOf()
             val psiFields = psiClass.fields
             if (psiFields.isNotEmpty()) {
                 psiFields.asSequence()
@@ -553,49 +533,41 @@
             item.fields = fields
 
             item.properties = emptyList()
-
-            if (isKotlin && methods.isNotEmpty()) {
-                val getters = mutableMapOf<String, PsiMethodItem>()
-                val setters = mutableMapOf<String, PsiMethodItem>()
-                val backingFields = fields.associateBy { it.name() }
-                val constructorParameters = item.primaryConstructor?.parameters()
-                    ?.filter { (it.sourcePsi as? KtParameter)?.isPropertyParameter() ?: false }
-                    ?.associateBy { it.name() }
-                    .orEmpty()
-
-                for (method in methods) {
-                    if (method.isKotlinProperty()) {
-                        val name = when (val sourcePsi = method.sourcePsi) {
-                            is KtProperty -> sourcePsi.name
-                            is KtPropertyAccessor -> sourcePsi.property.name
-                            is KtParameter -> sourcePsi.name
-                            else -> null
-                        } ?: continue
-
-                        if (method.parameters().isEmpty()) {
-                            if (!method.name().startsWith("component")) {
-                                getters[name] = method
+            if (isKotlin) {
+                // Try to initialize the Kotlin properties
+                val properties = mutableListOf<PsiPropertyItem>()
+                for (method in psiMethods) {
+                    if (method is UMethod) {
+                        if (method.modifierList.hasModifierProperty(PsiModifier.STATIC)) {
+                            // Skip extension properties
+                            continue
+                        }
+                        val sourcePsi = method.sourcePsi
+                        if (sourcePsi is KtProperty ||
+                            sourcePsi is KtPropertyAccessor ||
+                            sourcePsi is KtParameter
+                        ) {
+                            if (method.name.startsWith("set") ||
+                                method.name.startsWith("component")
+                            ) {
+                                continue
                             }
-                        } else {
-                            setters[name] = method
+                            val name =
+                                when (sourcePsi) {
+                                    is KtProperty -> sourcePsi.name
+                                    is KtPropertyAccessor -> sourcePsi.property.name
+                                    is KtParameter -> {
+                                        if (sourcePsi.isPropertyParameter()) {
+                                            sourcePsi.name
+                                        } else null
+                                    }
+                                    else -> null
+                                } ?: continue
+                            val psiType = method.returnType ?: continue
+                            properties.add(PsiPropertyItem.create(codebase, item, name, psiType, method))
                         }
                     }
                 }
-
-                val properties = mutableListOf<PsiPropertyItem>()
-                for ((name, getter) in getters) {
-                    val type = getter.returnType() as? PsiTypeItem ?: continue
-                    properties += PsiPropertyItem.create(
-                        codebase = codebase,
-                        containingClass = item,
-                        name = name,
-                        type = type,
-                        getter = getter,
-                        setter = setters[name],
-                        constructorParameter = constructorParameters[name],
-                        backingField = backingFields[name]
-                    )
-                }
                 item.properties = properties
             }
 
@@ -646,7 +618,7 @@
                 //     @file:JvmName("-ViewModelExtensions") // Hide from Java sources in the IDE.
                 return false
             }
-            if (psiClass is UClass && psiClass.sourcePsi == null) {
+            if (psiClass is KotlinUClass && psiClass.sourcePsi == null) {
                 // Top level kt classes (FooKt for Foo.kt) do not have implicit default constructor
                 return false
             }
@@ -778,8 +750,6 @@
 fun PsiModifierListOwner.isPrivate(): Boolean = modifierList?.hasExplicitModifier(PsiModifier.PRIVATE) == true
 fun PsiModifierListOwner.isPackagePrivate(): Boolean {
     val modifiers = modifierList ?: return false
-    return !(
-        modifiers.hasModifierProperty(PsiModifier.PUBLIC) ||
-            modifiers.hasModifierProperty(PsiModifier.PROTECTED)
-        )
+    return !(modifiers.hasModifierProperty(PsiModifier.PUBLIC) ||
+        modifiers.hasModifierProperty(PsiModifier.PROTECTED))
 }
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiSourceFileItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiCompilationUnit.kt
similarity index 89%
rename from src/main/java/com/android/tools/metalava/model/psi/PsiSourceFileItem.kt
rename to src/main/java/com/android/tools/metalava/model/psi/PsiCompilationUnit.kt
index 6d39e63..7817da9 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiSourceFileItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiCompilationUnit.kt
@@ -17,10 +17,10 @@
 package com.android.tools.metalava.model.psi
 
 import com.android.tools.metalava.model.ClassItem
+import com.android.tools.metalava.model.CompilationUnit
 import com.android.tools.metalava.model.Item
 import com.android.tools.metalava.model.MemberItem
 import com.android.tools.metalava.model.PackageItem
-import com.android.tools.metalava.model.SourceFileItem
 import com.android.tools.metalava.model.visitors.ItemVisitor
 import com.google.common.collect.ArrayListMultimap
 import com.google.common.collect.Multimap
@@ -43,11 +43,11 @@
 /** Whether we should limit import statements to symbols found in class docs  */
 private const val ONLY_IMPORT_CLASSES_REFERENCED_IN_DOCS = true
 
-class PsiSourceFileItem(
-    codebase: PsiBasedCodebase,
-    val file: PsiFile,
-    val uFile: UFile? = null
-) : SourceFileItem, PsiItem(codebase, file, PsiModifierItem(codebase), documentation = "") {
+class PsiCompilationUnit(
+    val codebase: PsiBasedCodebase,
+    uFile: UFile?,
+    containingFile: PsiFile
+) : CompilationUnit(containingFile, uFile) {
     override fun getHeaderComments(): String? {
         if (uFile != null) {
             var comment: String? = null
@@ -167,7 +167,7 @@
                 // We keep the wildcard imports since we don't know which ones of those are relevant
                 imports.filterIsInstance<PackageItem>().forEach { result.add(it) }
 
-                for (cls in classes().filter { predicate.test(it) }) {
+                for (cls in classes(predicate)) {
                     cls.accept(object : ItemVisitor() {
                         override fun visitItem(item: Item) {
                             // Do not let documentation on hidden items affect the imports.
@@ -209,29 +209,20 @@
         return emptyList()
     }
 
-    override fun classes(): Sequence<ClassItem> {
-        return (file as? PsiClassOwner)?.classes?.asSequence()
-            ?.mapNotNull { codebase.findClass(it) }
-            .orEmpty()
-    }
-
-    override fun containingPackage(strict: Boolean): PackageItem? {
-        return when {
-            uFile != null -> codebase.findPackage(uFile.packageName)
-            file is PsiJavaFile -> codebase.findPackage(file.packageName)
-            else -> null
+    private fun classes(predicate: Predicate<Item>): List<ClassItem> {
+        val topLevel = mutableListOf<ClassItem>()
+        if (file is PsiClassOwner) {
+            for (psiClass in file.classes) {
+                val classItem = codebase.findClass(psiClass) ?: continue
+                if (predicate.test(classItem)) {
+                    topLevel.add(classItem)
+                }
+            }
         }
+
+        return topLevel
     }
 
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        return other is PsiSourceFileItem && file == other.file
-    }
-
-    override fun hashCode(): Int = file.hashCode()
-
-    override fun toString(): String = "file ${file.virtualFile?.path}"
-
     companion object {
         // Cache pattern compilation across source files
         private val regexMap = HashMap<String, Regex>()
@@ -249,4 +240,4 @@
             return regex.find(doc) != null
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt
index c513ef8..69d77a5 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiConstructorItem.kt
@@ -27,9 +27,6 @@
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.PsiMethodCallExpression
 import com.intellij.psi.PsiWhiteSpace
-import org.jetbrains.kotlin.psi.KtClassOrObject
-import org.jetbrains.kotlin.psi.KtPrimaryConstructor
-import org.jetbrains.uast.UMethod
 
 class PsiConstructorItem(
     codebase: PsiBasedCodebase,
@@ -40,8 +37,7 @@
     documentation: String,
     parameters: List<PsiParameterItem>,
     returnType: PsiTypeItem,
-    val implicitConstructor: Boolean = false,
-    override val isPrimary: Boolean = false
+    val implicitConstructor: Boolean = false
 ) :
     PsiMethodItem(
         codebase = codebase,
@@ -52,8 +48,7 @@
         name = name,
         returnType = returnType,
         parameters = parameters
-    ),
-    ConstructorItem {
+    ), ConstructorItem {
 
     init {
         if (implicitConstructor) {
@@ -127,8 +122,7 @@
                 modifiers = modifiers,
                 parameters = parameters,
                 returnType = codebase.getType(containingClass.psiClass),
-                implicitConstructor = false,
-                isPrimary = (psiMethod as? UMethod)?.isPrimaryConstructor ?: false
+                implicitConstructor = false
             )
             constructor.modifiers.setOwner(constructor)
             return constructor
@@ -160,8 +154,5 @@
             modifiers.setOwner(item)
             return item
         }
-
-        private val UMethod.isPrimaryConstructor: Boolean
-            get() = sourcePsi is KtPrimaryConstructor || sourcePsi is KtClassOrObject
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt
index d8bf548..7a47d42 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiFieldItem.kt
@@ -41,10 +41,7 @@
         modifiers = modifiers,
         documentation = documentation,
         element = psiField
-    ),
-    FieldItem {
-
-    override var property: PsiPropertyItem? = null
+    ), FieldItem {
 
     override fun type(): TypeItem = fieldType
     override fun initialValue(requireConstant: Boolean): Any? {
@@ -140,4 +137,4 @@
             return field
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt
index df9fd1a..0f30c63 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiItem.kt
@@ -16,6 +16,8 @@
 
 package com.android.tools.metalava.model.psi
 
+import kotlin.properties.ReadWriteProperty
+import kotlin.reflect.KProperty
 import com.android.tools.metalava.model.DefaultItem
 import com.android.tools.metalava.model.MutableModifierList
 import com.android.tools.metalava.model.ParameterItem
@@ -25,11 +27,8 @@
 import com.intellij.psi.PsiModifierListOwner
 import org.jetbrains.kotlin.idea.KotlinLanguage
 import org.jetbrains.kotlin.kdoc.psi.api.KDoc
-import org.jetbrains.kotlin.psi.KtDeclaration
 import org.jetbrains.uast.UElement
 import org.jetbrains.uast.sourcePsiElement
-import kotlin.properties.ReadWriteProperty
-import kotlin.reflect.KProperty
 
 abstract class PsiItem(
     override val codebase: PsiBasedCodebase,
@@ -48,9 +47,6 @@
 
     override val synthetic = false
 
-    /** The source PSI provided by UAST */
-    val sourcePsi: PsiElement? = (element as? UElement)?.sourcePsi
-
     // a property with a lazily calculated default value
     inner class LazyDelegate<T>(
         val defaultValueProvider: () -> T
@@ -72,12 +68,10 @@
     override var originallyHidden: Boolean by LazyDelegate {
         documentation.contains('@') &&
 
-            (
-                documentation.contains("@hide") ||
-                    documentation.contains("@pending") ||
-                    // KDoc:
-                    documentation.contains("@suppress")
-                ) ||
+            (documentation.contains("@hide") ||
+                documentation.contains("@pending") ||
+                // KDoc:
+                documentation.contains("@suppress")) ||
             modifiers.hasHideAnnotations()
     }
 
@@ -85,8 +79,13 @@
 
     override fun psi(): PsiElement? = element
 
+    // TODO: Consider only doing this in tests!
     override fun isFromClassPath(): Boolean {
-        return containingClass()?.isFromClassPath() ?: false
+        return if (element is UElement) {
+            (element.sourcePsi ?: element.javaPsi) is PsiCompiledElement
+        } else {
+            element is PsiCompiledElement
+        }
     }
 
     override fun isCloned(): Boolean = false
@@ -190,8 +189,7 @@
 
         var end = documentation.lastIndexOf("*/")
         while (end > 0 && documentation[end - 1].isWhitespace() &&
-            documentation[end - 1] != '\n'
-        ) {
+            documentation[end - 1] != '\n') {
             end--
         }
         // The comment ends with:
@@ -249,10 +247,6 @@
                 return ""
             }
 
-            if (element is KtDeclaration) {
-                return element.docComment?.text.orEmpty()
-            }
-
             if (element is UElement) {
                 val comments = element.comments
                 if (comments.isNotEmpty()) {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt
index 167173f..7726146 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiMethodItem.kt
@@ -16,10 +16,12 @@
 
 package com.android.tools.metalava.model.psi
 
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.AnnotationTarget
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.MethodItem
 import com.android.tools.metalava.model.ModifierList
+import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.TypeParameterList
 import com.intellij.psi.PsiAnnotationMethod
@@ -27,18 +29,21 @@
 import com.intellij.psi.PsiClass
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.util.PsiTypesUtil
+import com.intellij.psi.util.TypeConversionUtil
 import org.intellij.lang.annotations.Language
 import org.jetbrains.kotlin.psi.KtNamedFunction
 import org.jetbrains.kotlin.psi.KtParameter
 import org.jetbrains.kotlin.psi.KtProperty
 import org.jetbrains.kotlin.psi.KtPropertyAccessor
-import org.jetbrains.uast.UAnnotationMethod
 import org.jetbrains.uast.UClass
 import org.jetbrains.uast.UElement
+import org.jetbrains.uast.UExpression
 import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.UThrowExpression
 import org.jetbrains.uast.UTryExpression
+import org.jetbrains.uast.UastFacade
 import org.jetbrains.uast.getParentOfType
+import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
 import org.jetbrains.uast.visitor.AbstractUastVisitor
 import java.io.StringWriter
 
@@ -57,8 +62,7 @@
         modifiers = modifiers,
         documentation = documentation,
         element = psiMethod
-    ),
-    MethodItem {
+    ), MethodItem {
 
     init {
         for (parameter in parameters) {
@@ -78,8 +82,6 @@
     override var inheritedMethod: Boolean = false
     override var inheritedFrom: ClassItem? = null
 
-    override var property: PsiPropertyItem? = null
-
     override fun name(): String = name
     override fun containingClass(): PsiClassItem = containingClass
 
@@ -112,7 +114,7 @@
 
     override fun returnType(): TypeItem? = returnType
 
-    override fun parameters(): List<PsiParameterItem> = parameters
+    override fun parameters(): List<ParameterItem> = parameters
 
     override val synthetic: Boolean get() = isEnumSyntheticMethod()
 
@@ -130,8 +132,7 @@
     override fun typeParameterList(): TypeParameterList {
         if (psiMethod.hasTypeParameters()) {
             return PsiTypeParameterList(
-                codebase,
-                psiMethod.typeParameterList
+                codebase, psiMethod.typeParameterList
                     ?: return TypeParameterList.NONE
             )
         } else {
@@ -167,7 +168,7 @@
     override fun isExtensionMethod(): Boolean {
         if (isKotlin()) {
             val ktParameters =
-                ((psiMethod as? UMethod)?.sourcePsi as? KtNamedFunction)?.valueParameters
+                ((psiMethod as? KotlinUMethod)?.sourcePsi as? KtNamedFunction)?.valueParameters
                     ?: return false
             return ktParameters.size < parameters.size
         }
@@ -176,11 +177,10 @@
     }
 
     override fun isKotlinProperty(): Boolean {
-        return psiMethod is UMethod && (
+        return psiMethod is KotlinUMethod && (
             psiMethod.sourcePsi is KtProperty ||
-                psiMethod.sourcePsi is KtPropertyAccessor ||
-                psiMethod.sourcePsi is KtParameter && (psiMethod.sourcePsi as KtParameter).hasValOrVar()
-            )
+            psiMethod.sourcePsi is KtPropertyAccessor ||
+            psiMethod.sourcePsi is KtParameter && (psiMethod.sourcePsi as KtParameter).hasValOrVar())
     }
 
     override fun findThrownExceptions(): Set<ClassItem> {
@@ -237,19 +237,29 @@
     }
 
     override fun defaultValue(): String {
-        return when (psiMethod) {
-            is UAnnotationMethod -> {
-                psiMethod.uastDefaultValue?.let {
-                    codebase.printer.toSourceString(it)
-                } ?: ""
+        if (psiMethod is PsiAnnotationMethod) {
+            val value = psiMethod.defaultValue
+            if (value != null) {
+                if (isKotlin(value)) {
+                    val defaultExpression: UExpression = UastFacade.convertElement(
+                        value, null,
+                        UExpression::class.java
+                    ) as? UExpression ?: return ""
+                    val constant = defaultExpression.evaluate()
+                    return if (constant != null) {
+                        CodePrinter.constantToSource(constant)
+                    } else {
+                        // Expression: Compute from UAST rather than just using the source text
+                        // such that we can ensure references are fully qualified etc.
+                        codebase.printer.toSourceString(defaultExpression) ?: ""
+                    }
+                } else {
+                    return codebase.printer.toSourceExpression(value, this)
+                }
             }
-            is PsiAnnotationMethod -> {
-                psiMethod.defaultValue?.let {
-                    codebase.printer.toSourceExpression(it, this)
-                } ?: super.defaultValue()
-            }
-            else -> super.defaultValue()
         }
+
+        return super.defaultValue()
     }
 
     override fun duplicate(targetContainingClass: ClassItem): PsiMethodItem {
@@ -267,7 +277,7 @@
         if (targetContainingClass.docOnly) {
             duplicated.docOnly = true
         }
-        if (targetContainingClass.deprecated) {
+        if (targetContainingClass.deprecated && compatibility.propagateDeprecatedMembers) {
             duplicated.deprecated = true
         }
         duplicated.throwsTypes = throwsTypes
@@ -455,6 +465,12 @@
 
             val result = ArrayList<ClassItem>(interfaces.size)
             for (cls in interfaces) {
+                if (compatibility.useErasureInThrows) {
+                    val erased = TypeConversionUtil.erasure(cls)
+                    result.add(codebase.findClass(erased) ?: continue)
+                    continue
+                }
+
                 result.add(codebase.findClass(cls) ?: continue)
             }
 
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt
index a94e5ae..26545f1 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiModifierItem.kt
@@ -17,15 +17,13 @@
 package com.android.tools.metalava.model.psi
 
 import com.android.tools.metalava.ANDROIDX_VISIBLE_FOR_TESTING
-import com.android.tools.metalava.ANDROID_DEPRECATED_FOR_SDK
-import com.android.tools.metalava.ATTR_ALLOW_IN
+import com.android.tools.metalava.ANDROID_SUPPORT_VISIBLE_FOR_TESTING
 import com.android.tools.metalava.ATTR_OTHERWISE
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.Codebase
 import com.android.tools.metalava.model.DefaultModifierList
 import com.android.tools.metalava.model.ModifierList
 import com.android.tools.metalava.model.MutableModifierList
-import com.android.tools.metalava.options
 import com.intellij.psi.PsiDocCommentOwner
 import com.intellij.psi.PsiModifier
 import com.intellij.psi.PsiModifierList
@@ -33,28 +31,19 @@
 import com.intellij.psi.PsiPrimitiveType
 import com.intellij.psi.PsiReferenceExpression
 import com.intellij.psi.impl.light.LightModifierList
-import org.jetbrains.annotations.NotNull
-import org.jetbrains.annotations.Nullable
 import org.jetbrains.kotlin.asJava.elements.KtLightModifierList
 import org.jetbrains.kotlin.asJava.elements.KtLightNullabilityAnnotation
-import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
-import org.jetbrains.kotlin.descriptors.EffectiveVisibility
-import org.jetbrains.kotlin.descriptors.effectiveVisibility
 import org.jetbrains.kotlin.lexer.KtTokens
-import org.jetbrains.kotlin.psi.KtAnnotated
-import org.jetbrains.kotlin.psi.KtElement
 import org.jetbrains.kotlin.psi.KtModifierList
 import org.jetbrains.kotlin.psi.KtModifierListOwner
 import org.jetbrains.kotlin.psi.KtNamedFunction
 import org.jetbrains.kotlin.psi.KtPropertyAccessor
 import org.jetbrains.kotlin.psi.psiUtil.hasFunModifier
-import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
-import org.jetbrains.kotlin.resolve.BindingContext
 import org.jetbrains.uast.UAnnotated
-import org.jetbrains.uast.UAnnotation
-import org.jetbrains.uast.UElement
 import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.UVariable
+import org.jetbrains.uast.kotlin.KotlinNullabilityUAnnotation
+import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
 
 class PsiModifierItem(
     codebase: Codebase,
@@ -62,11 +51,7 @@
     annotations: MutableList<AnnotationItem>? = null
 ) : DefaultModifierList(codebase, flags, annotations), ModifierList, MutableModifierList {
     companion object {
-        fun create(
-            codebase: PsiBasedCodebase,
-            element: PsiModifierListOwner,
-            documentation: String?
-        ): PsiModifierItem {
+        fun create(codebase: PsiBasedCodebase, element: PsiModifierListOwner, documentation: String?): PsiModifierItem {
             val modifiers =
                 if (element is UAnnotated) {
                     create(codebase, element, element)
@@ -75,9 +60,7 @@
                 }
             if (documentation?.contains("@deprecated") == true ||
                 // Check for @Deprecated annotation
-                ((element as? PsiDocCommentOwner)?.isDeprecated == true) ||
-                // Check for @Deprecated on sourcePsi
-                isDeprecatedFromSourcePsi(element)
+                ((element as? PsiDocCommentOwner)?.isDeprecated == true)
             ) {
                 modifiers.setDeprecated(true)
             }
@@ -85,17 +68,13 @@
             return modifiers
         }
 
-        private fun isDeprecatedFromSourcePsi(element: PsiModifierListOwner): Boolean {
-            return ((element as? UElement)?.sourcePsi as? KtAnnotated)?.annotationEntries?.any {
-                it.shortName?.toString() == "Deprecated"
-            } ?: false
-        }
-
-        private fun computeFlag(
-            codebase: PsiBasedCodebase,
-            element: PsiModifierListOwner,
-            modifierList: PsiModifierList
-        ): Int {
+        private fun computeFlag(element: PsiModifierListOwner, modifierList: PsiModifierList): Int {
+            var visibilityFlags = when {
+                modifierList.hasModifierProperty(PsiModifier.PUBLIC) -> PUBLIC
+                modifierList.hasModifierProperty(PsiModifier.PROTECTED) -> PROTECTED
+                modifierList.hasModifierProperty(PsiModifier.PRIVATE) -> PRIVATE
+                else -> PACKAGE_PRIVATE
+            }
             var flags = 0
             if (modifierList.hasModifierProperty(PsiModifier.STATIC)) {
                 flags = flags or STATIC
@@ -127,57 +106,24 @@
 
             // Look for special Kotlin keywords
             var ktModifierList: KtModifierList? = null
-            val sourcePsi = (element as? UElement)?.sourcePsi
             if (modifierList is KtLightModifierList<*>) {
                 ktModifierList = modifierList.kotlinOrigin
-            } else if (modifierList is LightModifierList && element is UMethod) {
-                if (sourcePsi is KtModifierListOwner) {
-                    ktModifierList = sourcePsi.modifierList
-                }
-            }
-            var visibilityFlags = when {
-                modifierList.hasModifierProperty(PsiModifier.PUBLIC) -> PUBLIC
-                modifierList.hasModifierProperty(PsiModifier.PROTECTED) -> PROTECTED
-                modifierList.hasModifierProperty(PsiModifier.PRIVATE) -> PRIVATE
-                ktModifierList != null -> when {
-                    ktModifierList.hasModifier(KtTokens.PRIVATE_KEYWORD) -> PRIVATE
-                    ktModifierList.hasModifier(KtTokens.PROTECTED_KEYWORD) -> PROTECTED
-                    ktModifierList.hasModifier(KtTokens.INTERNAL_KEYWORD) -> INTERNAL
-                    else -> PUBLIC
-                }
-                else -> PACKAGE_PRIVATE
+            } else if (modifierList is LightModifierList && element is KotlinUMethod) {
+                ktModifierList = element.sourcePsi?.modifierList
             }
             if (ktModifierList != null) {
-                if (ktModifierList.hasModifier(KtTokens.INTERNAL_KEYWORD)) {
-                    // Reset visibilityFlags to INTERNAL if the internal modifier is explicitly
-                    // present on the element
-                    visibilityFlags = INTERNAL
-                } else if (
-                    ktModifierList.hasModifier(KtTokens.OVERRIDE_KEYWORD) &&
-                    ktModifierList.visibilityModifier() == null &&
-                    sourcePsi is KtElement
-                ) {
-                    // Reset visibilityFlags to INTERNAL if the element has no explicit visibility
-                    // modifier, but overrides an internal declaration. Adapted from
-                    // org.jetbrains.kotlin.asJava.classes.UltraLightMembersCreator.isInternal
-                    val descriptor = codebase.bindingContext(sourcePsi)
-                        .get(BindingContext.DECLARATION_TO_DESCRIPTOR, sourcePsi)
-
-                    if (descriptor is DeclarationDescriptorWithVisibility) {
-                        val effectiveVisibility =
-                            descriptor.visibility.effectiveVisibility(descriptor, false)
-
-                        if (effectiveVisibility == EffectiveVisibility.Internal) {
-                            visibilityFlags = INTERNAL
-                        }
-                    }
-                }
                 if (ktModifierList.hasModifier(KtTokens.VARARG_KEYWORD)) {
                     flags = flags or VARARG
                 }
                 if (ktModifierList.hasModifier(KtTokens.SEALED_KEYWORD)) {
                     flags = flags or SEALED
                 }
+                if (ktModifierList.hasModifier(KtTokens.INTERNAL_KEYWORD)) {
+                    // Also remove public flag which at the UAST levels it promotes these
+                    // methods to, e.g. "internal myVar" gets turned into
+                    //    public final boolean getMyHiddenVar$lintWithKotlin()
+                    visibilityFlags = INTERNAL
+                }
                 if (ktModifierList.hasModifier(KtTokens.INFIX_KEYWORD)) {
                     flags = flags or INFIX
                 }
@@ -191,7 +137,7 @@
                     flags = flags or INLINE
 
                     // Workaround for b/117565118:
-                    val func = sourcePsi as? KtNamedFunction
+                    val func = (element as? UMethod)?.sourcePsi as? KtNamedFunction
                     if (func != null &&
                         (func.typeParameterList?.text ?: "").contains("reified") &&
                         !ktModifierList.hasModifier(KtTokens.PRIVATE_KEYWORD) &&
@@ -201,9 +147,6 @@
                         visibilityFlags = PUBLIC
                     }
                 }
-                if (ktModifierList.hasModifier(KtTokens.VALUE_KEYWORD)) {
-                    flags = flags or VALUE
-                }
                 if (ktModifierList.hasModifier(KtTokens.SUSPEND_KEYWORD)) {
                     flags = flags or SUSPEND
                 }
@@ -213,9 +156,6 @@
                 if (ktModifierList.hasFunModifier()) {
                     flags = flags or FUN
                 }
-                if (ktModifierList.hasModifier(KtTokens.DATA_KEYWORD)) {
-                    flags = flags or DATA
-                }
             }
             // Methods that are property accessors inherit visibility from the source element
             if (element is UMethod && (element.sourceElement is KtPropertyAccessor)) {
@@ -238,18 +178,20 @@
 
         private fun create(codebase: PsiBasedCodebase, element: PsiModifierListOwner): PsiModifierItem {
             val modifierList = element.modifierList ?: return PsiModifierItem(codebase)
-            var flags = computeFlag(codebase, element, modifierList)
+
+            var flags = computeFlag(element, modifierList)
 
             val psiAnnotations = modifierList.annotations
             return if (psiAnnotations.isEmpty()) {
                 PsiModifierItem(codebase, flags)
             } else {
                 val annotations: MutableList<AnnotationItem> =
-                    // psi sometimes returns duplicate annotations, using distinct() to counter that.
+                    // psi sometimes returns duplicate annotations, using distint() to counter that.
                     psiAnnotations.distinct().map {
                         val qualifiedName = it.qualifiedName
                         // Consider also supporting com.android.internal.annotations.VisibleForTesting?
-                        if (qualifiedName == ANDROIDX_VISIBLE_FOR_TESTING) {
+                        if (qualifiedName == ANDROIDX_VISIBLE_FOR_TESTING ||
+                            qualifiedName == ANDROID_SUPPORT_VISIBLE_FOR_TESTING) {
                             val otherwise = it.findAttributeValue(ATTR_OTHERWISE)
                             val ref = when {
                                 otherwise is PsiReferenceExpression -> otherwise.referenceName ?: ""
@@ -260,7 +202,7 @@
                         }
 
                         PsiAnnotationItem.create(codebase, it, qualifiedName)
-                    }.filter { !it.isDeprecatedForSdk() }.toMutableList()
+                    }.toMutableList()
                 PsiModifierItem(codebase, flags, annotations)
             }
         }
@@ -271,10 +213,9 @@
             annotated: UAnnotated
         ): PsiModifierItem {
             val modifierList = element.modifierList ?: return PsiModifierItem(codebase)
+            var flags = computeFlag(element, modifierList)
             val uAnnotations = annotated.uAnnotations
 
-            var flags = computeFlag(codebase, element, modifierList)
-
             return if (uAnnotations.isEmpty()) {
                 val psiAnnotations = modifierList.annotations
                 if (psiAnnotations.isNotEmpty()) {
@@ -289,15 +230,12 @@
 
                 val annotations: MutableList<AnnotationItem> = uAnnotations
                     // Uast sometimes puts nullability annotations on primitives!?
-                    .filter {
-                        !isPrimitiveVariable ||
-                            it.qualifiedName == null ||
-                            !it.isKotlinNullabilityAnnotation
-                    }
+                    .filter { !isPrimitiveVariable || it !is KotlinNullabilityUAnnotation }
                     .map {
 
                         val qualifiedName = it.qualifiedName
-                        if (qualifiedName == ANDROIDX_VISIBLE_FOR_TESTING) {
+                        if (qualifiedName == ANDROIDX_VISIBLE_FOR_TESTING ||
+                            qualifiedName == ANDROID_SUPPORT_VISIBLE_FOR_TESTING) {
                             val otherwise = it.findAttributeValue(ATTR_OTHERWISE)
                             val ref = when {
                                 otherwise is PsiReferenceExpression -> otherwise.referenceName ?: ""
@@ -308,7 +246,7 @@
                         }
 
                         UAnnotationItem.create(codebase, it, qualifiedName)
-                    }.filter { !it.isDeprecatedForSdk() }.toMutableList()
+                    }.toMutableList()
 
                 if (!isPrimitiveVariable) {
                     val psiAnnotations = modifierList.annotations
@@ -324,30 +262,6 @@
             }
         }
 
-        /** Returns whether this is a `@DeprecatedForSdk` annotation **that should be skipped**. */
-        private fun AnnotationItem.isDeprecatedForSdk(): Boolean {
-            if (originalName != ANDROID_DEPRECATED_FOR_SDK) {
-                return false
-            }
-
-            val allowIn = findAttribute(ATTR_ALLOW_IN) ?: return false
-
-            for (api in allowIn.leafValues()) {
-                val annotationName = api.value() as? String ?: continue
-                if (options.showAnnotations.matchesAnnotationName(annotationName)) {
-                    return true
-                }
-            }
-
-            return false
-        }
-
-        private val NOT_NULL = NotNull::class.qualifiedName
-        private val NULLABLE = Nullable::class.qualifiedName
-
-        private val UAnnotation.isKotlinNullabilityAnnotation: Boolean
-            get() = qualifiedName == NOT_NULL || qualifiedName == NULLABLE
-
         /** Modifies the modifier flags based on the VisibleForTesting otherwise constants */
         private fun getVisibilityFlag(ref: String, flags: Int): Int {
             val visibilityFlags = if (ref.endsWith("PROTECTED")) {
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt
index 4de649f..d73899a 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiPackageItem.kt
@@ -26,20 +26,16 @@
     private val psiPackage: PsiPackage,
     private val qualifiedName: String,
     modifiers: PsiModifierItem,
-    documentation: String,
-    /** True if this package is from the classpath (dependencies). Exposed in [isFromClassPath]. */
-    private val fromClassPath: Boolean
+    documentation: String
 ) :
     PsiItem(
         codebase = codebase,
         modifiers = modifiers,
         documentation = documentation,
         element = psiPackage
-    ),
-    PackageItem {
-
+    ), PackageItem {
     // Note - top level classes only
-    private val classes: MutableList<ClassItem> = mutableListOf()
+    private val classes: MutableList<PsiClassItem> = mutableListOf()
 
     override fun topLevelClasses(): Sequence<ClassItem> = classes.toList().asSequence().filter { it.isTopLevelClass() }
 
@@ -121,7 +117,7 @@
         val initialClasses = ArrayList(classes)
         var original = initialClasses.size // classes added after this point will have indices >= original
         for (cls in initialClasses) {
-            if (cls is PsiClassItem) cls.finishInitialization()
+            cls.finishInitialization()
         }
 
         // Finish initialization of any additional classes that were registered during
@@ -130,20 +126,13 @@
             val added = ArrayList(classes.subList(original, classes.size))
             original = classes.size
             for (cls in added) {
-                if (cls is PsiClassItem) cls.finishInitialization()
+                cls.finishInitialization()
             }
         }
     }
 
-    override fun isFromClassPath(): Boolean = fromClassPath
-
     companion object {
-        fun create(
-            codebase: PsiBasedCodebase,
-            psiPackage: PsiPackage,
-            extraDocs: String?,
-            fromClassPath: Boolean
-        ): PsiPackageItem {
+        fun create(codebase: PsiBasedCodebase, psiPackage: PsiPackage, extraDocs: String?): PsiPackageItem {
             val commentText = javadoc(psiPackage) + if (extraDocs != null) "\n$extraDocs" else ""
             val modifiers = modifiers(codebase, psiPackage, commentText)
             if (modifiers.isPackagePrivate()) {
@@ -157,8 +146,7 @@
                 psiPackage = psiPackage,
                 qualifiedName = qualifiedName,
                 documentation = commentText,
-                modifiers = modifiers,
-                fromClassPath = fromClassPath
+                modifiers = modifiers
             )
             pkg.modifiers.setOwner(pkg)
             return pkg
@@ -170,8 +158,7 @@
                 psiPackage = original.psiPackage,
                 qualifiedName = original.qualifiedName,
                 documentation = original.documentation,
-                modifiers = PsiModifierItem.create(codebase, original.modifiers),
-                fromClassPath = original.isFromClassPath()
+                modifiers = PsiModifierItem.create(codebase, original.modifiers)
             )
             pkg.modifiers.setOwner(pkg)
             return pkg
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt
index 17ddda2..2587fc9 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiParameterItem.kt
@@ -26,8 +26,8 @@
 import org.jetbrains.kotlin.psi.KtFunction
 import org.jetbrains.kotlin.psi.KtParameter
 import org.jetbrains.uast.UExpression
-import org.jetbrains.uast.UMethod
 import org.jetbrains.uast.UastFacade
+import org.jetbrains.uast.kotlin.declarations.KotlinUMethod
 
 class PsiParameterItem(
     override val codebase: PsiBasedCodebase,
@@ -42,42 +42,30 @@
     modifiers = modifiers,
     documentation = documentation,
     element = psiParameter
-),
-    ParameterItem {
+), ParameterItem {
     lateinit var containingMethod: PsiMethodItem
 
-    override var property: PsiPropertyItem? = null
-
     override fun name(): String = name
 
     override fun publicName(): String? {
         if (isKotlin(psiParameter)) {
-            // Omit names of some special parameters in Kotlin. None of these parameters may be
-            // set through Kotlin keyword arguments, so there's no need to track their names for
-            // compatibility. This also helps avoid signature file churn if PSI or the compiler
-            // change what name they're using for these parameters.
-
-            // Receiver parameter of extension function
+            // Don't print out names for extension function receiver parameters
             if (isReceiver()) {
                 return null
             }
-            // Property setter parameter
-            if (containingMethod.isKotlinProperty()) {
-                return null
-            }
-            // Continuation parameter of suspend function
+            // Hardcode parameter name for the generated suspend function continuation parameter
             if (containingMethod.modifiers.isSuspend() &&
-                "kotlin.coroutines.Continuation" == type.asClass()?.qualifiedName() &&
-                containingMethod.parameters().size - 1 == parameterIndex
+                    "kotlin.coroutines.Continuation" == type.asClass()?.qualifiedName() &&
+                    containingMethod.parameters().size - 1 == parameterIndex
             ) {
-                return null
+                return "p"
             }
             return name
         } else {
             // Java: Look for @ParameterName annotation
             val annotation = modifiers.annotations().firstOrNull { it.isParameterName() }
             if (annotation != null) {
-                return annotation.attributes.firstOrNull()?.value?.value()?.toString()
+                return annotation.attributes().firstOrNull()?.value?.value()?.toString()
             }
         }
 
@@ -100,7 +88,7 @@
 
     private fun getKtParameter(): KtParameter? {
         val ktParameters =
-            ((containingMethod.psiMethod as? UMethod)?.sourcePsi as? KtFunction)?.valueParameters
+            ((containingMethod.psiMethod as? KotlinUMethod)?.sourcePsi as? KtFunction)?.valueParameters
                 ?: return null
 
         // Perform matching based on parameter names, because indices won't work in the
@@ -175,7 +163,7 @@
             // Java: Look for @ParameterName annotation
             val annotation = modifiers.annotations().firstOrNull { it.isDefaultValue() }
             if (annotation != null) {
-                return annotation.attributes.firstOrNull()?.value?.value()?.toString()
+                return annotation.attributes().firstOrNull()?.value?.value()?.toString()
             }
         }
 
@@ -249,13 +237,12 @@
             return original.map { create(codebase, it as PsiParameterItem) }
         }
 
-        private fun createParameterModifiers(
+        fun createParameterModifiers(
             codebase: PsiBasedCodebase,
             psiParameter: PsiParameter,
             commentText: String
         ): PsiModifierItem {
-            val modifiers = PsiModifierItem
-                .create(codebase, psiParameter, commentText)
+            val modifiers = modifiers(codebase, psiParameter, commentText)
             // Method parameters don't have a visibility level; they are visible to anyone that can
             // call their method. However, Kotlin constructors sometimes appear to specify the
             // visibility of a constructor parameter by putting visibility inside the constructor
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt
index f09db8d..7c416ad 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiPropertyItem.kt
@@ -22,29 +22,24 @@
 import com.android.tools.metalava.model.TypeItem
 import com.intellij.psi.PsiClass
 import com.intellij.psi.PsiMethod
-import org.jetbrains.kotlin.psi.KtPropertyAccessor
+import com.intellij.psi.PsiType
 import org.jetbrains.uast.UClass
 
-class PsiPropertyItem private constructor(
+class PsiPropertyItem(
     override val codebase: PsiBasedCodebase,
     private val psiMethod: PsiMethod,
     private val containingClass: PsiClassItem,
     private val name: String,
     modifiers: PsiModifierItem,
     documentation: String,
-    private val fieldType: PsiTypeItem,
-    override val getter: PsiMethodItem,
-    override val setter: PsiMethodItem?,
-    override val constructorParameter: PsiParameterItem?,
-    override val backingField: PsiFieldItem?
+    private val fieldType: PsiTypeItem
 ) :
     PsiItem(
         codebase = codebase,
         modifiers = modifiers,
         documentation = documentation,
         element = psiMethod
-    ),
-    PropertyItem {
+    ), PropertyItem {
 
     override fun type(): TypeItem = fieldType
     override fun name(): String = name
@@ -76,60 +71,27 @@
     override fun toString(): String = "field ${containingClass.fullName()}.${name()}"
 
     companion object {
-        /**
-         * Creates a new property item, given a [name], [type] and relationships to other items.
-         *
-         * Kotlin properties consist of up to four other declarations: Their accessor functions,
-         * primary constructor parameter, and a backing field. These relationships are useful for
-         * resolving documentation and exposing the model correctly in Kotlin stubs.
-         *
-         * Metalava currently requires all properties to have a [getter]. It does not currently
-         * support private, `const val`, or [JvmField] properties. Mutable `var` properties usually
-         * have a [setter], but properties with a private default setter may use direct field
-         * access instead.
-         *
-         * Properties declared in the primary constructor of a class have an associated
-         * [constructorParameter]. This relationship is important for resolving docs which may
-         * exist on the constructor parameter.
-         *
-         * Most properties on classes without a custom getter have a [backingField] to hold their
-         * value. This is private except for [JvmField] properties.
-         */
         fun create(
             codebase: PsiBasedCodebase,
             containingClass: PsiClassItem,
             name: String,
-            type: PsiTypeItem,
-            getter: PsiMethodItem,
-            setter: PsiMethodItem? = null,
-            constructorParameter: PsiParameterItem? = null,
-            backingField: PsiFieldItem? = null
+            psiType: PsiType,
+            psiMethod: PsiMethod
         ): PsiPropertyItem {
-            val psiMethod = getter.psiMethod
-            val documentation = when (val sourcePsi = getter.sourcePsi) {
-                is KtPropertyAccessor -> javadoc(sourcePsi.property)
-                else -> javadoc(sourcePsi ?: psiMethod)
-            }
-            val modifiers = modifiers(codebase, psiMethod, documentation)
+            val commentText = javadoc(psiMethod)
+            val modifiers = modifiers(codebase, psiMethod, commentText)
+            val typeItem = codebase.getType(psiType)
             val property = PsiPropertyItem(
                 codebase = codebase,
                 psiMethod = psiMethod,
                 containingClass = containingClass,
                 name = name,
-                documentation = documentation,
+                documentation = commentText,
                 modifiers = modifiers,
-                fieldType = type,
-                getter = getter,
-                setter = setter,
-                constructorParameter = constructorParameter,
-                backingField = backingField
+                fieldType = typeItem
             )
-            getter.property = property
-            setter?.property = property
-            constructorParameter?.property = property
-            backingField?.property = property
             property.modifiers.setOwner(property)
             return property
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt
index 23086e3..bfe8511 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeItem.kt
@@ -18,6 +18,7 @@
 
 import com.android.tools.lint.detector.api.getInternalName
 import com.android.tools.metalava.JAVA_LANG_STRING
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.Item
@@ -47,6 +48,7 @@
 import com.intellij.psi.PsiTypeParameter
 import com.intellij.psi.PsiTypeParameterList
 import com.intellij.psi.PsiTypeVisitor
+import com.intellij.psi.PsiWhiteSpace
 import com.intellij.psi.PsiWildcardType
 import com.intellij.psi.util.PsiTypesUtil
 import com.intellij.psi.util.TypeConversionUtil
@@ -342,16 +344,6 @@
         toInnerAnnotatedString = toAnnotatedString
     }
 
-    /**
-     * Returns `true` if `this` type can be assigned from `other` without unboxing the other.
-     */
-    fun isAssignableFromWithoutUnboxing(other: PsiTypeItem): Boolean {
-        if (this.primitive && !other.primitive) {
-            return false
-        }
-        return TypeConversionUtil.isAssignable(psiType, other.psiType)
-    }
-
     companion object {
         private fun getPrimitiveSignature(typeName: String): String? = when (typeName) {
             "boolean" -> "Z"
@@ -473,11 +465,14 @@
                             codebase.getNonNullAnnotationProvider()
                         }
 
-                        // Special handling for implicitly non-null arrays that also have an
-                        // implicitly non-null component type
-                        if (implicitNullness == false && type is PsiArrayType &&
-                            owner != null && owner.impliesNonNullArrayComponents()
+                        if (implicitNullness == false &&
+                            owner is MethodItem &&
+                            (owner.containingClass().isAnnotationType() ||
+                                owner.containingClass().isEnum() && owner.name() == "values") &&
+                            type is PsiArrayType
                         ) {
+                            // For arrays in annotations not only is the method itself non null but so
+                            // is the component type
                             type.componentType.annotate(provider).createArrayType()
                                 .annotate(provider)
                         } else if (implicitNullness == false &&
@@ -520,20 +515,6 @@
             }
         }
 
-        /**
-         * Determine if this item implies that its associated type is a non-null array with
-         * non-null components. This is true for the synthetic `Enum.values()` method and any
-         * annotation properties or accessors.
-         */
-        private fun Item.impliesNonNullArrayComponents(): Boolean {
-            return when (this) {
-                is MemberItem -> containingClass().isAnnotationType() && !modifiers.isStatic()
-                is MethodItem -> containingClass().isEnum() && modifiers.isStatic() &&
-                    name() == "values" && parameters().isEmpty()
-                else -> false
-            }
-        }
-
         fun create(codebase: PsiBasedCodebase, psiType: PsiType): PsiTypeItem {
             return PsiTypeItem(codebase, psiType)
         }
@@ -714,6 +695,11 @@
                             return
                         } else if (element is PsiJavaToken && element.tokenType == JavaTokenType.COMMA) {
                             sb.append(",")
+                            if (compatibility.spaceAfterCommaInTypes) {
+                                if (element.nextSibling == null || element.nextSibling !is PsiWhiteSpace) {
+                                    sb.append(" ")
+                                }
+                            }
                             return
                         }
                         if (element.firstChild == null) { // leaf nodes only
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt
index 2eb2229..de15c4a 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterItem.kt
@@ -16,6 +16,7 @@
 
 package com.android.tools.metalava.model.psi
 
+import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.TypeParameterItem
 import com.android.tools.metalava.model.psi.ClassType.TYPE_PARAMETER
 import com.intellij.psi.PsiTypeParameter
@@ -37,17 +38,15 @@
     hasImplicitDefaultConstructor = false,
     classType = TYPE_PARAMETER,
     modifiers = modifiers,
-    documentation = "",
-    fromClassPath = false
-),
-    TypeParameterItem {
-    override fun typeBounds(): List<PsiTypeItem> = bounds
+    documentation = ""
+), TypeParameterItem {
+    override fun bounds(): List<ClassItem> = bounds
 
     override fun isReified(): Boolean {
         return isReified(element as? PsiTypeParameter)
     }
 
-    private lateinit var bounds: List<PsiTypeItem>
+    private lateinit var bounds: List<ClassItem>
 
     override fun finishInitialization() {
         super.finishInitialization()
@@ -56,7 +55,7 @@
         bounds = if (refs != null && refs.isNotEmpty()) {
             // Omit java.lang.Object since PSI will turn "T extends Comparable" to "T extends Object & Comparable"
             // and this just makes comparisons harder; *everything* extends Object.
-            refs.mapNotNull { PsiTypeItem.create(codebase, it) }.filter { !it.isJavaLangObject() }
+            refs.mapNotNull { PsiTypeItem.create(codebase, it).asClass() }.filter { !it.isJavaLangObject() }
         } else {
             emptyList()
         }
@@ -81,15 +80,14 @@
         fun isReified(element: PsiTypeParameter?): Boolean {
             element ?: return false
             if (element is KtLightTypeParameter &&
-                element.kotlinOrigin.text.startsWith("reified")
-            ) {
+                element.kotlinOrigin.text.startsWith("reified")) {
                 return true
             } else if (element is KotlinLightTypeParameterBuilder) {
-                if (element.origin.text.startsWith("reified")) {
+                if (element.sourcePsi.text.startsWith("reified")) {
                     return true
                 }
             }
             return false
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterList.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterList.kt
index be77428..c7518a8 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterList.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypeParameterList.kt
@@ -42,4 +42,4 @@
         parameters.mapTo(list) { PsiTypeParameterItem.create(codebase, it) }
         return list
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt b/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt
index 0b99b35..4966673 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/PsiTypePrinter.kt
@@ -17,6 +17,7 @@
 package com.android.tools.metalava.model.psi
 
 import com.android.tools.metalava.JAVA_LANG_OBJECT
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.Codebase
 import com.android.tools.metalava.model.Item
@@ -136,16 +137,12 @@
                 return getCanonicalText(type.wildcard, elementAnnotations)
             is PsiDisjunctionType ->
                 // Based on PsiDisjunctionType.getCanonicalText(true)
-                return StringUtil.join(
-                    type.disjunctions,
-                    { psiType ->
-                        getCanonicalText(
-                            psiType,
-                            elementAnnotations
-                        )
-                    },
-                    " | "
-                )
+                return StringUtil.join(type.disjunctions, { psiType ->
+                    getCanonicalText(
+                        psiType,
+                        elementAnnotations
+                    )
+                }, " | ")
             is PsiIntersectionType -> return getCanonicalText(type.conjuncts[0], elementAnnotations)
             else -> return type.getCanonicalText(true)
         }
@@ -165,7 +162,10 @@
         if (suffix == null) {
             sb.append('?')
         } else {
-            if (suffix == JAVA_LANG_OBJECT && type.isExtends) {
+            if (suffix == JAVA_LANG_OBJECT &&
+                !compatibility.includeExtendsObjectInWildcard &&
+                type.isExtends
+            ) {
                 sb.append('?')
             } else {
                 sb.append(if (type.isExtends) EXTENDS_PREFIX else SUPER_PREFIX)
@@ -430,7 +430,7 @@
         sb.append('<')
         for (i in types.indices) {
             if (i > 0) {
-                sb.append(",")
+                sb.append(if (!compatibility.spaceAfterCommaInTypes) "," else ", ")
             }
 
             val type = types[i]
@@ -521,7 +521,7 @@
 
         if (elementAnnotations != null) {
             for (annotation in elementAnnotations) {
-                val name = mapAnnotation(annotation.qualifiedName)
+                val name = mapAnnotation(annotation.qualifiedName())
                 if (name != null) {
                     sb.append(annotation.toSource()).append(' ')
                     updated = true
@@ -624,4 +624,4 @@
             appendNullnessSuffix(annotations, buffer, elementAnnotations)
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt
index c76dfcf..d5d3056 100644
--- a/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/psi/UAnnotationItem.kt
@@ -16,7 +16,7 @@
 
 package com.android.tools.metalava.model.psi
 
-import com.android.SdkConstants.ATTR_VALUE
+import com.android.SdkConstants
 import com.android.tools.lint.detector.api.ConstantEvaluator
 import com.android.tools.metalava.model.AnnotationArrayAttributeValue
 import com.android.tools.metalava.model.AnnotationAttribute
@@ -38,20 +38,22 @@
 import org.jetbrains.uast.UAnnotation
 import org.jetbrains.uast.UBinaryExpression
 import org.jetbrains.uast.UCallExpression
-import org.jetbrains.uast.UClassLiteralExpression
 import org.jetbrains.uast.UElement
 import org.jetbrains.uast.UExpression
 import org.jetbrains.uast.ULiteralExpression
-import org.jetbrains.uast.UQualifiedReferenceExpression
 import org.jetbrains.uast.UReferenceExpression
 import org.jetbrains.uast.util.isArrayInitializer
 
 class UAnnotationItem private constructor(
     override val codebase: PsiBasedCodebase,
     val uAnnotation: UAnnotation,
-    override val originalName: String?
+    private val originalName: String?
 ) : DefaultAnnotationItem(codebase) {
-    override val qualifiedName: String? = AnnotationItem.mapName(codebase, originalName)
+    private val qualifiedName = AnnotationItem.mapName(codebase, originalName)
+
+    private var attributes: List<AnnotationAttribute>? = null
+
+    override fun originalName(): String? = originalName
 
     override fun toString(): String = toSource()
 
@@ -75,14 +77,37 @@
         return super.isNonNull()
     }
 
-    override val attributes: List<UAnnotationAttribute> by lazy {
-        uAnnotation.attributeValues.map { attribute ->
-            UAnnotationAttribute(codebase, attribute.name ?: ATTR_VALUE, attribute.expression)
-        }.toList()
+    override fun qualifiedName() = qualifiedName
+
+    override fun attributes(): List<AnnotationAttribute> {
+        if (attributes == null) {
+            val uAttributes = uAnnotation.attributeValues
+            attributes = if (uAttributes.isEmpty()) {
+                emptyList()
+            } else {
+                val list = mutableListOf<AnnotationAttribute>()
+                for (parameter in uAttributes) {
+                    list.add(
+                        UAnnotationAttribute(
+                            codebase,
+                            parameter.name ?: SdkConstants.ATTR_VALUE, parameter.expression
+                        )
+                    )
+                }
+                list
+            }
+        }
+
+        return attributes!!
     }
 
-    override val targets: Set<AnnotationTarget> by lazy {
-        AnnotationItem.computeTargets(this, codebase::findOrCreateClass)
+    override fun targets(): Set<AnnotationTarget> {
+        if (targets == null) {
+            targets = AnnotationItem.computeTargets(this) { className ->
+                codebase.findOrCreateClass(className)
+            }
+        }
+        return targets!!
     }
 
     companion object {
@@ -95,7 +120,7 @@
         }
 
         private fun getAttributes(annotation: UAnnotation, showDefaultAttrs: Boolean):
-            List<Pair<String?, UExpression?>> {
+                List<Pair<String?, UExpression?>> {
             val annotationClass = annotation.javaPsi?.nameReferenceElement?.resolve() as? PsiClass
             val list = mutableListOf<Pair<String?, UExpression?>>()
             if (annotationClass != null && showDefaultAttrs) {
@@ -132,7 +157,7 @@
             sb.append("@")
             sb.append(qualifiedName)
             sb.append("(")
-            if (attributes.size == 1 && (attributes[0].first == null || attributes[0].first == ATTR_VALUE)) {
+            if (attributes.size == 1 && (attributes[0].first == null || attributes[0].first == SdkConstants.ATTR_VALUE)) {
                 // Special case: omit "value" if it's the only attribute
                 appendValue(codebase, sb, attributes[0].second, target, showDefaultAttrs)
             } else {
@@ -143,7 +168,7 @@
                     } else {
                         sb.append(", ")
                     }
-                    sb.append(attribute.first ?: ATTR_VALUE)
+                    sb.append(attribute.first ?: SdkConstants.ATTR_VALUE)
                     sb.append('=')
                     appendValue(codebase, sb, attribute.second, target, showDefaultAttrs)
                 }
@@ -162,21 +187,42 @@
             // because that may not use fully qualified names, e.g. the source may say
             //  @RequiresPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
             // and we want to compute
-            //  @androidx.annotation.RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
+            //  @android.support.annotation.RequiresPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION)
             when (value) {
                 null -> sb.append("null")
                 is ULiteralExpression -> sb.append(CodePrinter.constantToSource(value.value))
-                is UQualifiedReferenceExpression -> { // the value is a Foo.BAR type of reference.
-                    // expand `Foo` to fully qualified name `com.example.Foo`
-                    appendQualifiedName(codebase, sb, value.receiver as UReferenceExpression)
-                    // append accessor `.`
-                    sb.append(value.accessType.name)
-                    // append `BAR`
-                    sb.append(value.selector.asRenderString())
-                }
                 is UReferenceExpression -> {
-                    // expand Foo to fully qualified name com.example.Foo
-                    appendQualifiedName(codebase, sb, value)
+                    when (val resolved = value.resolve()) {
+                        is PsiField -> {
+                            val containing = resolved.containingClass
+                            if (containing != null) {
+                                // If it's a field reference, see if it looks like the field is hidden; if
+                                // so, inline the value
+                                val cls = codebase.findOrCreateClass(containing)
+                                val initializer = resolved.initializer
+                                if (initializer != null) {
+                                    val fieldItem = cls.findField(resolved.name)
+                                    if (fieldItem == null || fieldItem.isHiddenOrRemoved()) {
+                                        // Use the literal value instead
+                                        val source = getConstantSource(initializer)
+                                        if (source != null) {
+                                            sb.append(source)
+                                            return
+                                        }
+                                    }
+                                }
+                                containing.qualifiedName?.let {
+                                    sb.append(it).append('.')
+                                }
+                            }
+
+                            sb.append(resolved.name)
+                        }
+                        is PsiClass -> resolved.qualifiedName?.let { sb.append(it) }
+                        else -> {
+                            sb.append(value.sourcePsi?.text ?: value.asSourceString())
+                        }
+                    }
                 }
                 is UBinaryExpression -> {
                     appendValue(codebase, sb, value.leftOperand, target, showDefaultAttrs)
@@ -214,40 +260,6 @@
             }
         }
 
-        private fun appendQualifiedName(codebase: PsiBasedCodebase, sb: StringBuilder, value: UReferenceExpression) {
-            when (val resolved = value.resolve()) {
-                is PsiField -> {
-                    val containing = resolved.containingClass
-                    if (containing != null) {
-                        // If it's a field reference, see if it looks like the field is hidden; if
-                        // so, inline the value
-                        val cls = codebase.findOrCreateClass(containing)
-                        val initializer = resolved.initializer
-                        if (initializer != null) {
-                            val fieldItem = cls.findField(resolved.name)
-                            if (fieldItem == null || fieldItem.isHiddenOrRemoved()) {
-                                // Use the literal value instead
-                                val source = getConstantSource(initializer)
-                                if (source != null) {
-                                    sb.append(source)
-                                    return
-                                }
-                            }
-                        }
-                        containing.qualifiedName?.let {
-                            sb.append(it).append('.')
-                        }
-                    }
-
-                    sb.append(resolved.name)
-                }
-                is PsiClass -> resolved.qualifiedName?.let { sb.append(it) }
-                else -> {
-                    sb.append(value.sourcePsi?.text ?: value.asSourceString())
-                }
-            }
-        }
-
         private fun getConstantSource(value: UExpression): String? {
             val constant = value.evaluate()
             return CodePrinter.constantToExpression(constant)
@@ -308,15 +320,6 @@
                 return value
             }
 
-            if (psiValue is UClassLiteralExpression) {
-                // The value of a class literal expression like String.class or String::class
-                // is the fully qualified name, java.lang.String
-                val type = psiValue.type
-                if (type != null) {
-                    return type.canonicalText
-                }
-            }
-
             return getText(psiValue).removeSurrounding("\"")
         }
 
diff --git a/src/main/java/com/android/tools/metalava/model/text/ApiFile.java b/src/main/java/com/android/tools/metalava/model/text/ApiFile.java
new file mode 100644
index 0000000..a3e9146
--- /dev/null
+++ b/src/main/java/com/android/tools/metalava/model/text/ApiFile.java
@@ -0,0 +1,1190 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava.model.text;
+
+import com.android.tools.lint.checks.infrastructure.ClassNameKt;
+import com.android.tools.metalava.FileFormat;
+import com.android.tools.metalava.model.AnnotationItem;
+import com.android.tools.metalava.model.DefaultModifierList;
+import com.android.tools.metalava.model.TypeParameterList;
+import com.android.tools.metalava.model.VisibilityLevel;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.io.Files;
+import kotlin.Pair;
+import kotlin.text.StringsKt;
+import org.jetbrains.annotations.Nullable;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.android.tools.metalava.ConstantsKt.ANDROIDX_NONNULL;
+import static com.android.tools.metalava.ConstantsKt.ANDROIDX_NULLABLE;
+import static com.android.tools.metalava.ConstantsKt.JAVA_LANG_ANNOTATION;
+import static com.android.tools.metalava.ConstantsKt.JAVA_LANG_ENUM;
+import static com.android.tools.metalava.ConstantsKt.JAVA_LANG_STRING;
+import static com.android.tools.metalava.model.FieldItemKt.javaUnescapeString;
+import static kotlin.text.Charsets.UTF_8;
+
+//
+// Copied from doclava1, but adapted to metalava's code model (plus tweaks to handle
+// metalava's richer files, e.g. annotations)
+//
+public class ApiFile {
+    /**
+     * Same as {@link #parseApi(List, boolean)}}, but take a single file for convenience.
+     *
+     * @param file input signature file
+     * @param kotlinStyleNulls if true, we assume the input has a kotlin style nullability markers (e.g. "?").
+     *                         Even if false, we'll allow them if the file format supports them/
+     */
+    public static TextCodebase parseApi(@Nonnull File file, boolean kotlinStyleNulls) throws ApiParseException {
+        final List<File> files = new ArrayList<>(1);
+        files.add(file);
+        return parseApi(files, kotlinStyleNulls);
+    }
+
+    /**
+     * Read API signature files into a {@link TextCodebase}.
+     *
+     * Note: when reading from them multiple files, {@link TextCodebase#getLocation} would refer to the first
+     * file specified. each {@link com.android.tools.metalava.model.text.TextItem#getPosition} would correctly
+     * point out the source file of each item.
+     *
+     * @param files input signature files
+     * @param kotlinStyleNulls if true, we assume the input has a kotlin style nullability markers (e.g. "?").
+     *                         Even if false, we'll allow them if the file format supports them/
+     */
+    public static TextCodebase parseApi(@Nonnull List<File> files, boolean kotlinStyleNulls)
+        throws ApiParseException {
+        if (files.size() == 0) {
+            throw new IllegalArgumentException("files must not be empty");
+        }
+        final TextCodebase api = new TextCodebase(files.get(0));
+        final StringBuilder description = new StringBuilder("Codebase loaded from ");
+
+        boolean first = true;
+        for (File file : files) {
+            if (!first) {
+                description.append(", ");
+            }
+            description.append(file.getPath());
+
+            final String apiText;
+            try {
+                apiText = Files.asCharSource(file, UTF_8).read();
+            } catch (IOException ex) {
+                throw new ApiParseException("Error reading API file", file.getPath(), ex);
+            }
+            parseApiSingleFile(api, !first, file.getPath(), apiText, kotlinStyleNulls);
+            first = false;
+        }
+        api.setDescription(description.toString());
+        api.postProcess();
+        return api;
+    }
+
+    /** @deprecated Exists only for external callers. */
+    @Deprecated
+    public static TextCodebase parseApi(@Nonnull String filename, @Nonnull String apiText,
+                                        Boolean kotlinStyleNulls) throws ApiParseException {
+        return parseApi(filename, apiText, kotlinStyleNulls != null && kotlinStyleNulls);
+    }
+
+    /**
+     * Entry point fo test. Take a filename and content separately.
+     */
+    @VisibleForTesting
+    public static TextCodebase parseApi(@Nonnull String filename, @Nonnull String apiText,
+                                        boolean kotlinStyleNulls) throws ApiParseException {
+        final TextCodebase api = new TextCodebase(new File(filename));
+        api.setDescription("Codebase loaded from " + filename);
+        parseApiSingleFile(api, false, filename, apiText, kotlinStyleNulls);
+        api.postProcess();
+        return api;
+    }
+
+    private static void parseApiSingleFile(TextCodebase api, boolean appending, String filename, String apiText,
+                                           boolean kotlinStyleNulls) throws ApiParseException {
+        // Infer the format.
+        FileFormat format = FileFormat.Companion.parseHeader(apiText);
+
+        // If it's the first file, set the format. Otherwise, make sure the format is the same as the prior files.
+        if (!appending) {
+            // This is the first file to process.
+            api.setFormat(format);
+        } else {
+            // If we're appending to another API file, make sure the format is the same.
+            if (!format.equals(api.getFormat())) {
+                throw new ApiParseException(String.format(
+                    "Cannot merge different formats of signature files. First file format=%s, current file format=%s: file=%s",
+                    api.getFormat(), format, filename));
+            }
+            // When we're appending, and the content is empty, nothing to do.
+            if (StringsKt.isBlank(apiText)) {
+                return;
+            }
+        }
+
+        // Even if kotlinStyleNulls is false, still allow kotlin nullability markers, if the format allows them.
+        if (format.isSignatureFormat()) {
+            if (!kotlinStyleNulls) {
+                kotlinStyleNulls = format.useKotlinStyleNulls();
+            }
+        } else if (StringsKt.isBlank(apiText)) {
+            // Sometimes, signature files are empty, and we do want to accept them.
+        } else {
+            throw new ApiParseException("Unknown file format of " + filename);
+        }
+
+        if (kotlinStyleNulls) {
+            api.setKotlinStyleNulls(true);
+        }
+
+        // Remove the block comments.
+        if (apiText.contains("/*")) {
+            apiText = ClassNameKt.stripComments(apiText, false); // line comments are used to stash field constants
+        }
+
+        final Tokenizer tokenizer = new Tokenizer(filename, apiText.toCharArray());
+        while (true) {
+            String token = tokenizer.getToken();
+            if (token == null) {
+                break;
+            }
+            // TODO: Accept annotations on packages.
+            if ("package".equals(token)) {
+                parsePackage(api, tokenizer);
+            } else {
+                throw new ApiParseException("expected package got " + token, tokenizer);
+            }
+        }
+    }
+
+    private static void parsePackage(TextCodebase api, Tokenizer tokenizer)
+        throws ApiParseException {
+        String token;
+        String name;
+        TextPackageItem pkg;
+
+        token = tokenizer.requireToken();
+
+        // Metalava: including annotations in file now
+        List<String> annotations = getAnnotations(tokenizer, token);
+        TextModifiers modifiers = new TextModifiers(api, DefaultModifierList.PUBLIC, null);
+        if (annotations != null) {
+            modifiers.addAnnotations(annotations);
+        }
+
+        token = tokenizer.getCurrent();
+
+        assertIdent(tokenizer, token);
+        name = token;
+
+        // If the same package showed up multiple times, make sure they have the same modifiers.
+        // (Packages can't have public/private/etc, but they can have annotations, which are part of ModifierList.)
+        // ModifierList doesn't provide equals(), neither does AnnotationItem which ModifierList contains,
+        // so we just use toString() here for equality comparison.
+        // However, ModifierList.toString() throws if the owner is not yet set, so we have to instantiate an
+        // (owner) TextPackageItem here.
+        // If it's a duplicate package, then we'll replace pkg with the existing one in the following if block.
+
+        // TODO: However, currently this parser can't handle annotations on packages, so we will never hit this case.
+        // Once the parser supports that, we should add a test case for this too.
+        pkg = new TextPackageItem(api, name, modifiers, tokenizer.pos());
+
+        final TextPackageItem existing = api.findPackage(name);
+        if (existing != null) {
+            if (!pkg.getModifiers().toString().equals(existing.getModifiers().toString())) {
+                throw new ApiParseException(String.format(
+                    "Contradicting declaration of package %s. Previously seen with modifiers \"%s\", but now with \"%s\"",
+                    name, pkg.getModifiers(), modifiers), tokenizer);
+            }
+            pkg = existing;
+        }
+
+        token = tokenizer.requireToken();
+        if (!"{".equals(token)) {
+            throw new ApiParseException("expected '{' got " + token, tokenizer);
+        }
+        while (true) {
+            token = tokenizer.requireToken();
+            if ("}".equals(token)) {
+                break;
+            } else {
+                parseClass(api, pkg, tokenizer, token);
+            }
+        }
+        api.addPackage(pkg);
+    }
+
+    private static void parseClass(TextCodebase api, TextPackageItem pkg, Tokenizer tokenizer, String token)
+        throws ApiParseException {
+        boolean isInterface = false;
+        boolean isAnnotation = false;
+        boolean isEnum = false;
+        String name;
+        String qualifiedName;
+        String ext = null;
+        TextClassItem cl;
+
+        // Metalava: including annotations in file now
+        List<String> annotations = getAnnotations(tokenizer, token);
+        token = tokenizer.getCurrent();
+
+        TextModifiers modifiers = parseModifiers(api, tokenizer, token, annotations);
+        token = tokenizer.getCurrent();
+
+        if ("class".equals(token)) {
+            token = tokenizer.requireToken();
+        } else if ("interface".equals(token)) {
+            isInterface = true;
+            modifiers.setAbstract(true);
+            token = tokenizer.requireToken();
+        } else if ("@interface".equals(token)) {
+            // Annotation
+            modifiers.setAbstract(true);
+            isAnnotation = true;
+            token = tokenizer.requireToken();
+        } else if ("enum".equals(token)) {
+            isEnum = true;
+            modifiers.setFinal(true);
+            modifiers.setStatic(true);
+            ext = JAVA_LANG_ENUM;
+            token = tokenizer.requireToken();
+        } else {
+            throw new ApiParseException("missing class or interface. got: " + token, tokenizer);
+        }
+        assertIdent(tokenizer, token);
+        name = token;
+        qualifiedName = qualifiedName(pkg.name(), name);
+
+        if (api.findClass(qualifiedName) != null) {
+            throw new ApiParseException("Duplicate class found: " + qualifiedName, tokenizer);
+        }
+
+        final TextTypeItem typeInfo = api.obtainTypeFromString(qualifiedName);
+        // Simple type info excludes the package name (but includes enclosing class names)
+
+        String rawName = name;
+        int variableIndex = rawName.indexOf('<');
+        if (variableIndex != -1) {
+            rawName = rawName.substring(0, variableIndex);
+        }
+
+        token = tokenizer.requireToken();
+
+        cl = new TextClassItem(api, tokenizer.pos(), modifiers, isInterface, isEnum, isAnnotation,
+            typeInfo.toErasedTypeString(null), typeInfo.qualifiedTypeName(),
+            rawName, annotations);
+        cl.setContainingPackage(pkg);
+        cl.setTypeInfo(typeInfo);
+        cl.setDeprecated(modifiers.isDeprecated());
+        if ("extends".equals(token)) {
+            token = tokenizer.requireToken();
+            assertIdent(tokenizer, token);
+            ext = token;
+            token = tokenizer.requireToken();
+        }
+        // Resolve superclass after done parsing
+        api.mapClassToSuper(cl, ext);
+        if ("implements".equals(token) || "extends".equals(token) ||
+                isInterface && ext != null && !token.equals("{")) {
+            if (!token.equals("implements") && !token.equals("extends")) {
+                api.mapClassToInterface(cl, token);
+            }
+            while (true) {
+                token = tokenizer.requireToken();
+                if ("{".equals(token)) {
+                    break;
+                } else {
+                    /// TODO
+                    if (!",".equals(token)) {
+                        api.mapClassToInterface(cl, token);
+                    }
+                }
+            }
+        }
+        if (JAVA_LANG_ENUM.equals(ext)) {
+            cl.setIsEnum(true);
+            // Above we marked all enums as static but for a top level class it's implicit
+            if (!cl.fullName().contains(".")) {
+                cl.getModifiers().setStatic(false);
+            }
+        } else if (isAnnotation) {
+            api.mapClassToInterface(cl, JAVA_LANG_ANNOTATION);
+        } else if (api.implementsInterface(cl, JAVA_LANG_ANNOTATION)) {
+            cl.setIsAnnotationType(true);
+        }
+        if (!"{".equals(token)) {
+            throw new ApiParseException("expected {, was " + token, tokenizer);
+        }
+        token = tokenizer.requireToken();
+        while (true) {
+            if ("}".equals(token)) {
+                break;
+            } else if ("ctor".equals(token)) {
+                token = tokenizer.requireToken();
+                parseConstructor(api, tokenizer, cl, token);
+            } else if ("method".equals(token)) {
+                token = tokenizer.requireToken();
+                parseMethod(api, tokenizer, cl, token);
+            } else if ("field".equals(token)) {
+                token = tokenizer.requireToken();
+                parseField(api, tokenizer, cl, token, false);
+            } else if ("enum_constant".equals(token)) {
+                token = tokenizer.requireToken();
+                parseField(api, tokenizer, cl, token, true);
+            } else if ("property".equals(token)) {
+                token = tokenizer.requireToken();
+                parseProperty(api, tokenizer, cl, token);
+            } else {
+                throw new ApiParseException("expected ctor, enum_constant, field or method", tokenizer);
+            }
+            token = tokenizer.requireToken();
+        }
+        pkg.addClass(cl);
+    }
+
+    private static Pair<String, List<String>> processKotlinTypeSuffix(TextCodebase api, String type, List<String> annotations) throws ApiParseException {
+        boolean varArgs = false;
+        if (type.endsWith("...")) {
+            type = type.substring(0, type.length() - 3);
+            varArgs = true;
+        }
+        if (api.getKotlinStyleNulls()) {
+            if (type.endsWith("?")) {
+                type = type.substring(0, type.length() - 1);
+                annotations = mergeAnnotations(annotations, ANDROIDX_NULLABLE);
+            } else if (type.endsWith("!")) {
+                type = type.substring(0, type.length() - 1);
+            } else if (!type.endsWith("!")) {
+                if (!TextTypeItem.Companion.isPrimitive(type)) { // Don't add nullness on primitive types like void
+                    annotations = mergeAnnotations(annotations, ANDROIDX_NONNULL);
+                }
+            }
+        } else if (type.endsWith("?") || type.endsWith("!")) {
+            throw new ApiParseException("Did you forget to supply --input-kotlin-nulls? Found Kotlin-style null type suffix when parser was not configured " +
+                "to interpret signature file that way: " + type);
+        }
+        if (varArgs) {
+            type = type + "...";
+        }
+        return new Pair<>(type, annotations);
+    }
+
+    private static List<String> getAnnotations(Tokenizer tokenizer, String token) throws ApiParseException {
+        List<String> annotations = null;
+
+        while (true) {
+            if (token.startsWith("@")) {
+                // Annotation
+                String annotation = token;
+
+                // Restore annotations that were shortened on export
+                annotation = AnnotationItem.Companion.unshortenAnnotation(annotation);
+
+                token = tokenizer.requireToken();
+                if (token.equals("(")) {
+                    // Annotation arguments; potentially nested
+                    int balance = 0;
+                    int start = tokenizer.offset() - 1;
+                    while (true) {
+                        if (token.equals("(")) {
+                            balance++;
+                        } else if (token.equals(")")) {
+                            balance--;
+                            if (balance == 0) {
+                                break;
+                            }
+                        }
+                        token = tokenizer.requireToken();
+                    }
+                    annotation += tokenizer.getStringFromOffset(start);
+                    token = tokenizer.requireToken();
+                }
+                if (annotations == null) {
+                    annotations = new ArrayList<>();
+                }
+                annotations.add(annotation);
+            } else {
+                break;
+            }
+        }
+
+        return annotations;
+    }
+
+    private static void parseConstructor(TextCodebase api, Tokenizer tokenizer, TextClassItem cl, String token)
+        throws ApiParseException {
+        String name;
+        TextConstructorItem method;
+
+        // Metalava: including annotations in file now
+        List<String> annotations = getAnnotations(tokenizer, token);
+        token = tokenizer.getCurrent();
+
+        TextModifiers modifiers = parseModifiers(api, tokenizer, token, annotations);
+        token = tokenizer.getCurrent();
+
+        assertIdent(tokenizer, token);
+        name = token.substring(token.lastIndexOf('.') + 1); // For inner classes, strip outer classes from name
+        token = tokenizer.requireToken();
+        if (!"(".equals(token)) {
+            throw new ApiParseException("expected (", tokenizer);
+        }
+        method = new TextConstructorItem(api, name, cl, modifiers, cl.asTypeInfo(), tokenizer.pos());
+        method.setDeprecated(modifiers.isDeprecated());
+        parseParameterList(api, tokenizer, method);
+        token = tokenizer.requireToken();
+        if ("throws".equals(token)) {
+            token = parseThrows(tokenizer, method);
+        }
+        if (!";".equals(token)) {
+            throw new ApiParseException("expected ; found " + token, tokenizer);
+        }
+        cl.addConstructor(method);
+    }
+
+    private static void parseMethod(TextCodebase api, Tokenizer tokenizer, TextClassItem cl, String token)
+        throws ApiParseException {
+        TextTypeItem returnType;
+        String name;
+        TextMethodItem method;
+        TypeParameterList typeParameterList = TypeParameterList.Companion.getNONE();
+
+        // Metalava: including annotations in file now
+        List<String> annotations = getAnnotations(tokenizer, token);
+        token = tokenizer.getCurrent();
+
+        TextModifiers modifiers = parseModifiers(api, tokenizer, token, null);
+        token = tokenizer.getCurrent();
+
+        if ("<".equals(token)) {
+            typeParameterList = parseTypeParameterList(api, tokenizer);
+            token = tokenizer.requireToken();
+        }
+        assertIdent(tokenizer, token);
+
+        Pair<String, List<String>> kotlinTypeSuffix = processKotlinTypeSuffix(api, token, annotations);
+        token = kotlinTypeSuffix.getFirst();
+        annotations = kotlinTypeSuffix.getSecond();
+        modifiers.addAnnotations(annotations);
+        String returnTypeString = token;
+
+        token = tokenizer.requireToken();
+
+        if (returnTypeString.contains("@") && (returnTypeString.indexOf('<') == -1 ||
+                returnTypeString.indexOf('@') < returnTypeString.indexOf('<'))) {
+            returnTypeString += " " + token;
+            token = tokenizer.requireToken();
+        }
+        while (true) {
+            if (token.contains("@") && (token.indexOf('<') == -1 ||
+                   token.indexOf('@') < token.indexOf('<'))) {
+                // Type-use annotations in type; keep accumulating
+                returnTypeString += " " + token;
+                token = tokenizer.requireToken();
+                if (token.startsWith("[")) { // TODO: This isn't general purpose; make requireToken smarter!
+                    returnTypeString += " " + token;
+                    token = tokenizer.requireToken();
+                }
+            } else {
+                break;
+            }
+        }
+
+        returnType = api.obtainTypeFromString(returnTypeString, cl, typeParameterList);
+
+        assertIdent(tokenizer, token);
+        name = token;
+        method = new TextMethodItem(api, name, cl, modifiers, returnType, tokenizer.pos());
+        method.setDeprecated(modifiers.isDeprecated());
+        if (cl.isInterface() && !modifiers.isDefault() && !modifiers.isStatic()) {
+            modifiers.setAbstract(true);
+        }
+        method.setTypeParameterList(typeParameterList);
+        if (typeParameterList instanceof TextTypeParameterList) {
+            ((TextTypeParameterList) typeParameterList).setOwner(method);
+        }
+        token = tokenizer.requireToken();
+        if (!"(".equals(token)) {
+            throw new ApiParseException("expected (, was " + token, tokenizer);
+        }
+        parseParameterList(api, tokenizer, method);
+        token = tokenizer.requireToken();
+        if ("throws".equals(token)) {
+            token = parseThrows(tokenizer, method);
+        }
+        if ("default".equals(token)) {
+            token = parseDefault(tokenizer, method);
+        }
+        if (!";".equals(token)) {
+            throw new ApiParseException("expected ; found " + token, tokenizer);
+        }
+        cl.addMethod(method);
+    }
+
+    private static List<String> mergeAnnotations(List<String> annotations, String annotation) {
+        if (annotations == null) {
+            annotations = new ArrayList<>();
+        }
+        // Reverse effect of TypeItem.shortenTypes(...)
+        String qualifiedName = annotation.indexOf('.') == -1
+            ? "@androidx.annotation" + annotation
+            : "@" + annotation;
+
+        annotations.add(qualifiedName);
+        return annotations;
+    }
+
+    private static void parseField(TextCodebase api, Tokenizer tokenizer, TextClassItem cl, String token, boolean isEnum)
+        throws ApiParseException {
+        List<String> annotations = getAnnotations(tokenizer, token);
+        token = tokenizer.getCurrent();
+
+        TextModifiers modifiers = parseModifiers(api, tokenizer, token, null);
+        token = tokenizer.getCurrent();
+        assertIdent(tokenizer, token);
+
+        Pair<String, List<String>> kotlinTypeSuffix = processKotlinTypeSuffix(api, token, annotations);
+        token = kotlinTypeSuffix.getFirst();
+        annotations = kotlinTypeSuffix.getSecond();
+        modifiers.addAnnotations(annotations);
+
+        String type = token;
+        TextTypeItem typeInfo = api.obtainTypeFromString(type);
+
+        token = tokenizer.requireToken();
+        assertIdent(tokenizer, token);
+        String name = token;
+        token = tokenizer.requireToken();
+        Object value = null;
+        if ("=".equals(token)) {
+            token = tokenizer.requireToken(false);
+            value = parseValue(type, token);
+            token = tokenizer.requireToken();
+        }
+        if (!";".equals(token)) {
+            throw new ApiParseException("expected ; found " + token, tokenizer);
+        }
+        TextFieldItem field = new TextFieldItem(api, name, cl, modifiers, typeInfo, value, tokenizer.pos());
+        field.setDeprecated(modifiers.isDeprecated());
+        if (isEnum) {
+            cl.addEnumConstant(field);
+        } else {
+            cl.addField(field);
+        }
+    }
+
+    private static TextModifiers parseModifiers(
+        TextCodebase api,
+        Tokenizer tokenizer,
+        String token,
+        List<String> annotations) throws ApiParseException {
+
+        TextModifiers modifiers = new TextModifiers(api, DefaultModifierList.PACKAGE_PRIVATE, null);
+
+        processModifiers:
+        while (true) {
+            switch (token) {
+                case "public":
+                    modifiers.setVisibilityLevel(VisibilityLevel.PUBLIC);
+                    token = tokenizer.requireToken();
+                    break;
+                case "protected":
+                    modifiers.setVisibilityLevel(VisibilityLevel.PROTECTED);
+                    token = tokenizer.requireToken();
+                    break;
+                case "private":
+                    modifiers.setVisibilityLevel(VisibilityLevel.PRIVATE);
+                    token = tokenizer.requireToken();
+                    break;
+                case "internal":
+                    modifiers.setVisibilityLevel(VisibilityLevel.INTERNAL);
+                    token = tokenizer.requireToken();
+                    break;
+                case "static":
+                    modifiers.setStatic(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "final":
+                    modifiers.setFinal(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "deprecated":
+                    modifiers.setDeprecated(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "abstract":
+                    modifiers.setAbstract(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "transient":
+                    modifiers.setTransient(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "volatile":
+                    modifiers.setVolatile(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "sealed":
+                    modifiers.setSealed(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "default":
+                    modifiers.setDefault(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "synchronized":
+                    modifiers.setSynchronized(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "native":
+                    modifiers.setNative(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "strictfp":
+                    modifiers.setStrictFp(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "infix":
+                    modifiers.setInfix(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "operator":
+                    modifiers.setOperator(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "inline":
+                    modifiers.setInline(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "suspend":
+                    modifiers.setSuspend(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "vararg":
+                    modifiers.setVarArg(true);
+                    token = tokenizer.requireToken();
+                    break;
+                case "fun":
+                    modifiers.setFunctional(true);
+                    token = tokenizer.requireToken();
+                    break;
+                default:
+                    break processModifiers;
+            }
+        }
+
+        if (annotations != null) {
+            modifiers.addAnnotations(annotations);
+        }
+
+        return modifiers;
+    }
+
+    private static Object parseValue(String type, String val) {
+        if (val != null) {
+            switch (type) {
+                case "boolean":
+                    return "true".equals(val) ? Boolean.TRUE : Boolean.FALSE;
+                case "byte":
+                    return Integer.valueOf(val);
+                case "short":
+                    return Integer.valueOf(val);
+                case "int":
+                    return Integer.valueOf(val);
+                case "long":
+                    return Long.valueOf(val.substring(0, val.length() - 1));
+                case "float":
+                    switch (val) {
+                        case "(1.0f/0.0f)":
+                        case "(1.0f / 0.0f)":
+                            return Float.POSITIVE_INFINITY;
+                        case "(-1.0f/0.0f)":
+                        case "(-1.0f / 0.0f)":
+                            return Float.NEGATIVE_INFINITY;
+                        case "(0.0f/0.0f)":
+                        case "(0.0f / 0.0f)":
+                            return Float.NaN;
+                        default:
+                            return Float.valueOf(val);
+                    }
+                case "double":
+                    switch (val) {
+                        case "(1.0/0.0)":
+                        case "(1.0 / 0.0)":
+                            return Double.POSITIVE_INFINITY;
+                        case "(-1.0/0.0)":
+                        case "(-1.0 / 0.0)":
+                            return Double.NEGATIVE_INFINITY;
+                        case "(0.0/0.0)":
+                        case "(0.0 / 0.0)":
+                            return Double.NaN;
+                        default:
+                            return Double.valueOf(val);
+                    }
+                case "char":
+                    return (char) Integer.parseInt(val);
+                case JAVA_LANG_STRING:
+                case "String":
+                    if ("null".equals(val)) {
+                        return null;
+                    } else {
+                        return javaUnescapeString(val.substring(1, val.length() - 1));
+                    }
+                case "null":
+                    return null;
+                default:
+                    return val;
+            }
+        }
+        return null;
+    }
+
+    private static void parseProperty(TextCodebase api, Tokenizer tokenizer, TextClassItem cl, String token)
+        throws ApiParseException {
+        String type;
+        String name;
+
+        // Metalava: including annotations in file now
+        List<String> annotations = getAnnotations(tokenizer, token);
+        token = tokenizer.getCurrent();
+
+        TextModifiers modifiers = parseModifiers(api, tokenizer, token, null);
+        token = tokenizer.getCurrent();
+        assertIdent(tokenizer, token);
+
+        Pair<String, List<String>> kotlinTypeSuffix = processKotlinTypeSuffix(api, token, annotations);
+        token = kotlinTypeSuffix.getFirst();
+        annotations = kotlinTypeSuffix.getSecond();
+        modifiers.addAnnotations(annotations);
+        type = token;
+        TextTypeItem typeInfo = api.obtainTypeFromString(type);
+
+        token = tokenizer.requireToken();
+        assertIdent(tokenizer, token);
+        name = token;
+        token = tokenizer.requireToken();
+        if (!";".equals(token)) {
+            throw new ApiParseException("expected ; found " + token, tokenizer);
+        }
+
+        TextPropertyItem property = new TextPropertyItem(api, name, cl, modifiers, typeInfo, tokenizer.pos());
+        property.setDeprecated(modifiers.isDeprecated());
+        cl.addProperty(property);
+    }
+
+    private static TypeParameterList parseTypeParameterList(TextCodebase codebase, Tokenizer tokenizer) throws ApiParseException {
+        String token;
+
+        int start = tokenizer.offset() - 1;
+        int balance = 1;
+        while (balance > 0) {
+            token = tokenizer.requireToken();
+            if (token.equals("<")) {
+                balance++;
+            } else if (token.equals(">")) {
+                balance--;
+            }
+        }
+
+        String typeParameterList = tokenizer.getStringFromOffset(start);
+        if (typeParameterList.isEmpty()) {
+            return TypeParameterList.Companion.getNONE();
+        } else {
+            return TextTypeParameterList.Companion.create(codebase, null, typeParameterList);
+        }
+    }
+
+    private static void parseParameterList(TextCodebase api, Tokenizer tokenizer, TextMethodItem method)
+                                           throws ApiParseException {
+        String token = tokenizer.requireToken();
+        int index = 0;
+        while (true) {
+            if (")".equals(token)) {
+                return;
+            }
+
+            // Each item can be
+            // optional annotations optional-modifiers type-with-use-annotations-and-generics optional-name optional-equals-default-value
+
+            // Used to represent the presence of a default value, instead of showing the entire
+            // default value
+            boolean hasDefaultValue = token.equals("optional");
+            if (hasDefaultValue) { token = tokenizer.requireToken(); }
+
+            // Metalava: including annotations in file now
+            List<String> annotations = getAnnotations(tokenizer, token);
+            token = tokenizer.getCurrent();
+
+            TextModifiers modifiers = parseModifiers(api, tokenizer, token, null);
+            token = tokenizer.getCurrent();
+
+            // Token should now represent the type
+            String type = token;
+            token = tokenizer.requireToken();
+            if (token.startsWith("@")) {
+                // Type use annotations within the type, which broke up the tokenizer;
+                // put it back together
+                type += " " + token;
+                token = tokenizer.requireToken();
+                if (token.startsWith("[")) { // TODO: This isn't general purpose; make requireToken smarter!
+                    type += " " + token;
+                    token = tokenizer.requireToken();
+                }
+            }
+
+            Pair<String, List<String>> kotlinTypeSuffix = processKotlinTypeSuffix(api, type, annotations);
+            String typeString = kotlinTypeSuffix.getFirst();
+            annotations = kotlinTypeSuffix.getSecond();
+            modifiers.addAnnotations(annotations);
+            if (typeString.endsWith("...")) {
+                modifiers.setVarArg(true);
+            }
+            TextTypeItem typeInfo = api.obtainTypeFromString(typeString,
+                (TextClassItem) method.containingClass(),
+                method.typeParameterList());
+
+            String name;
+            String publicName;
+            if (isIdent(token) && !token.equals("=")) {
+                name = token;
+                publicName = name;
+                token = tokenizer.requireToken();
+            } else {
+                name = "arg" + (index + 1);
+                publicName = null;
+            }
+
+            String defaultValue = TextParameterItemKt.UNKNOWN_DEFAULT_VALUE;
+            if ("=".equals(token)) {
+                defaultValue = tokenizer.requireToken(true);
+                StringBuilder sb = new StringBuilder(defaultValue);
+                if (defaultValue.equals("{")) {
+                    int balance = 1;
+                    while (balance > 0) {
+                        token = tokenizer.requireToken(false, false);
+                        sb.append(token);
+                        if (token.equals("{")) {
+                            balance++;
+                        } else if (token.equals("}")) {
+                            balance--;
+                            if (balance == 0) {
+                                break;
+                            }
+                        }
+                    }
+                    token = tokenizer.requireToken();
+                } else {
+                    int balance = defaultValue.equals("(") ? 1 : 0;
+                    while (true) {
+                        token = tokenizer.requireToken(true, false);
+                        if ((token.endsWith(",") || token.endsWith(")")) && balance <= 0) {
+                            if (token.length() > 1) {
+                                sb.append(token, 0, token.length() - 1);
+                                token = Character.toString(token.charAt(token.length() - 1));
+                            }
+                            break;
+                        }
+                        sb.append(token);
+                        if (token.equals("(")) {
+                            balance++;
+                        } else if (token.equals(")")) {
+                            balance--;
+                        }
+                    }
+                }
+                defaultValue = sb.toString();
+            }
+
+            if (!defaultValue.equals(TextParameterItemKt.UNKNOWN_DEFAULT_VALUE)) {
+                hasDefaultValue = true;
+            }
+
+            if (",".equals(token)) {
+                token = tokenizer.requireToken();
+            } else if (")".equals(token)) {
+            } else {
+                throw new ApiParseException("expected , or ), found " + token, tokenizer);
+            }
+
+            method.addParameter(new TextParameterItem(api, method, name, publicName, hasDefaultValue, defaultValue, index,
+                typeInfo, modifiers, tokenizer.pos()));
+            if (modifiers.isVarArg()) {
+                method.setVarargs(true);
+            }
+            index++;
+        }
+    }
+
+    private static String parseDefault(Tokenizer tokenizer, TextMethodItem method)
+        throws ApiParseException {
+        StringBuilder sb = new StringBuilder();
+        while (true) {
+            String token = tokenizer.requireToken();
+            if (";".equals(token)) {
+                method.setAnnotationDefault(sb.toString());
+                return token;
+            } else {
+                sb.append(token);
+            }
+        }
+    }
+
+    private static String parseThrows(Tokenizer tokenizer, TextMethodItem method)
+        throws ApiParseException {
+        String token = tokenizer.requireToken();
+        boolean comma = true;
+        while (true) {
+            if (";".equals(token)) {
+                return token;
+            } else if (",".equals(token)) {
+                if (comma) {
+                    throw new ApiParseException("Expected exception, got ','", tokenizer);
+                }
+                comma = true;
+            } else {
+                if (!comma) {
+                    throw new ApiParseException("Expected ',' or ';' got " + token, tokenizer);
+                }
+                comma = false;
+                method.addException(token);
+            }
+            token = tokenizer.requireToken();
+        }
+    }
+
+    private static String qualifiedName(String pkg, String className) {
+        return pkg + "." + className;
+    }
+
+    private static boolean isIdent(String token) {
+        return isIdent(token.charAt(0));
+    }
+
+    private static void assertIdent(Tokenizer tokenizer, String token) throws ApiParseException {
+        if (!isIdent(token.charAt(0))) {
+            throw new ApiParseException("Expected identifier: " + token, tokenizer);
+        }
+    }
+
+    static class Tokenizer {
+        final char[] mBuf;
+        final String mFilename;
+        int mPos;
+        int mLine = 1;
+
+        Tokenizer(String filename, char[] buf) {
+            mFilename = filename;
+            mBuf = buf;
+        }
+
+        SourcePositionInfo pos() {
+            return new SourcePositionInfo(mFilename, mLine);
+        }
+
+        public int getLine() {
+            return mLine;
+        }
+
+        boolean eatWhitespace() {
+            boolean ate = false;
+            while (mPos < mBuf.length && isSpace(mBuf[mPos])) {
+                if (mBuf[mPos] == '\n') {
+                    mLine++;
+                }
+                mPos++;
+                ate = true;
+            }
+            return ate;
+        }
+
+        boolean eatComment() {
+            if (mPos + 1 < mBuf.length) {
+                if (mBuf[mPos] == '/' && mBuf[mPos + 1] == '/') {
+                    mPos += 2;
+                    while (mPos < mBuf.length && !isNewline(mBuf[mPos])) {
+                        mPos++;
+                    }
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        void eatWhitespaceAndComments() {
+            while (eatWhitespace() || eatComment()) {
+            }
+        }
+
+        String requireToken() throws ApiParseException {
+            return requireToken(true);
+        }
+
+        String requireToken(boolean parenIsSep) throws ApiParseException {
+            return requireToken(parenIsSep, true);
+        }
+
+        String requireToken(boolean parenIsSep, boolean eatWhitespace) throws ApiParseException {
+            final String token = getToken(parenIsSep, eatWhitespace);
+            if (token != null) {
+                return token;
+            } else {
+                throw new ApiParseException("Unexpected end of file", this);
+            }
+        }
+
+        String getToken() throws ApiParseException {
+            return getToken(true);
+        }
+
+        int offset() {
+            return mPos;
+        }
+
+        String getStringFromOffset(int offset) {
+            return new String(mBuf, offset, mPos - offset);
+        }
+
+        String getToken(boolean parenIsSep) throws ApiParseException {
+            return getToken(parenIsSep, true);
+        }
+
+        String getCurrent() {
+            return mCurrent;
+        }
+
+        private String mCurrent = null;
+
+        String getToken(boolean parenIsSep, boolean eatWhitespace) throws ApiParseException {
+            if (eatWhitespace) {
+                eatWhitespaceAndComments();
+            }
+            if (mPos >= mBuf.length) {
+                return null;
+            }
+            final int line = mLine;
+            final char c = mBuf[mPos];
+            final int start = mPos;
+            mPos++;
+            if (c == '"') {
+                final int STATE_BEGIN = 0;
+                final int STATE_ESCAPE = 1;
+                int state = STATE_BEGIN;
+                while (true) {
+                    if (mPos >= mBuf.length) {
+                        throw new ApiParseException("Unexpected end of file for \" starting at " + line, this);
+                    }
+                    final char k = mBuf[mPos];
+                    if (k == '\n' || k == '\r') {
+                        throw new ApiParseException("Unexpected newline for \" starting at " + line +" in " + mFilename, this);
+                    }
+                    mPos++;
+                    switch (state) {
+                        case STATE_BEGIN:
+                            switch (k) {
+                                case '\\':
+                                    state = STATE_ESCAPE;
+                                    break;
+                                case '"':
+                                    mCurrent = new String(mBuf, start, mPos - start);
+                                    return mCurrent;
+                            }
+                            break;
+                        case STATE_ESCAPE:
+                            state = STATE_BEGIN;
+                            break;
+                    }
+                }
+            } else if (isSeparator(c, parenIsSep)) {
+                mCurrent = Character.toString(c);
+                return mCurrent;
+            } else {
+                int genericDepth = 0;
+                do {
+                    while (mPos < mBuf.length) {
+                        char d = mBuf[mPos];
+                        if (isSpace(d) || isSeparator(d, parenIsSep)) {
+                            break;
+                        } else if (d == '"') {
+                            // String literal in token: skip the full thing
+                            mPos++;
+                            while (mPos < mBuf.length) {
+                                if (mBuf[mPos] == '"') {
+                                    mPos++;
+                                    break;
+                                } else if (mBuf[mPos] == '\\') {
+                                    mPos++;
+                                }
+                                mPos++;
+                            }
+                            continue;
+                        }
+                        mPos++;
+                    }
+                    if (mPos < mBuf.length) {
+                        if (mBuf[mPos] == '<') {
+                            genericDepth++;
+                            mPos++;
+                        } else if (genericDepth != 0) {
+                            if (mBuf[mPos] == '>') {
+                                genericDepth--;
+                            }
+                            mPos++;
+                        }
+                    }
+                } while (mPos < mBuf.length
+                    && ((!isSpace(mBuf[mPos]) && !isSeparator(mBuf[mPos], parenIsSep)) || genericDepth != 0));
+                if (mPos >= mBuf.length) {
+                    throw new ApiParseException("Unexpected end of file for \" starting at " + line, this);
+                }
+                mCurrent = new String(mBuf, start, mPos - start);
+                return mCurrent;
+            }
+        }
+
+        @Nullable
+        public String getFileName() {
+            return mFilename;
+        }
+    }
+
+    private static boolean isSpace(char c) {
+        return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+    }
+
+    private static boolean isNewline(char c) {
+        return c == '\n' || c == '\r';
+    }
+
+    private static boolean isSeparator(char c, boolean parenIsSep) {
+        if (parenIsSep) {
+            if (c == '(' || c == ')') {
+                return true;
+            }
+        }
+        return c == '{' || c == '}' || c == ',' || c == ';' || c == '<' || c == '>';
+    }
+
+    private static boolean isIdent(char c) {
+        return c != '"' && !isSeparator(c, true);
+    }
+}
diff --git a/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt b/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
deleted file mode 100644
index 5766605..0000000
--- a/src/main/java/com/android/tools/metalava/model/text/ApiFile.kt
+++ /dev/null
@@ -1,1167 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.metalava.model.text
-
-import com.android.SdkConstants.DOT_TXT
-import com.android.tools.lint.checks.infrastructure.stripComments
-import com.android.tools.metalava.ANDROIDX_NONNULL
-import com.android.tools.metalava.ANDROIDX_NULLABLE
-import com.android.tools.metalava.FileFormat.Companion.parseHeader
-import com.android.tools.metalava.JAVA_LANG_ANNOTATION
-import com.android.tools.metalava.JAVA_LANG_ENUM
-import com.android.tools.metalava.JAVA_LANG_STRING
-import com.android.tools.metalava.model.AnnotationItem.Companion.unshortenAnnotation
-import com.android.tools.metalava.model.DefaultModifierList
-import com.android.tools.metalava.model.TypeParameterList
-import com.android.tools.metalava.model.TypeParameterList.Companion.NONE
-import com.android.tools.metalava.model.VisibilityLevel
-import com.android.tools.metalava.model.javaUnescapeString
-import com.android.tools.metalava.model.text.TextTypeItem.Companion.isPrimitive
-import com.android.tools.metalava.model.text.TextTypeParameterList.Companion.create
-import com.google.common.annotations.VisibleForTesting
-import com.google.common.io.Files
-import java.io.File
-import java.io.IOException
-import javax.annotation.Nonnull
-import kotlin.text.Charsets.UTF_8
-
-object ApiFile {
-    /**
-     * Same as [.parseApi]}, but take a single file for convenience.
-     *
-     * @param file input signature file
-     * @param kotlinStyleNulls if true, we assume the input has a kotlin style nullability markers (e.g. "?").
-     * Even if false, we'll allow them if the file format supports them/
-     */
-    @Throws(ApiParseException::class)
-    fun parseApi(@Nonnull file: File, kotlinStyleNulls: Boolean): TextCodebase {
-        val files: MutableList<File> = ArrayList(1)
-        files.add(file)
-        return parseApi(files, kotlinStyleNulls)
-    }
-
-    /**
-     * Read API signature files into a [TextCodebase].
-     *
-     * Note: when reading from them multiple files, [TextCodebase.location] would refer to the first
-     * file specified. each [com.android.tools.metalava.model.text.TextItem.position] would correctly
-     * point out the source file of each item.
-     *
-     * @param files input signature files
-     * @param kotlinStyleNulls if true, we assume the input has a kotlin style nullability markers (e.g. "?").
-     * Even if false, we'll allow them if the file format supports them/
-     */
-    @Throws(ApiParseException::class)
-    fun parseApi(@Nonnull files: List<File>, kotlinStyleNulls: Boolean): TextCodebase {
-        require(files.isNotEmpty()) { "files must not be empty" }
-        val api = TextCodebase(files[0])
-        val description = StringBuilder("Codebase loaded from ")
-        var first = true
-        for (file in files) {
-            if (!first) {
-                description.append(", ")
-            }
-            description.append(file.path)
-            val apiText: String = try {
-                Files.asCharSource(file, UTF_8).read()
-            } catch (ex: IOException) {
-                throw ApiParseException("Error reading API file", file.path, ex)
-            }
-            parseApiSingleFile(api, !first, file.path, apiText, kotlinStyleNulls)
-            first = false
-        }
-        api.description = description.toString()
-        api.postProcess()
-        return api
-    }
-
-    @Deprecated("Exists only for external callers. ")
-    @JvmStatic
-    @Throws(ApiParseException::class)
-    fun parseApi(
-        filename: String,
-        apiText: String,
-        kotlinStyleNulls: Boolean?
-    ): TextCodebase {
-        return parseApi(filename, apiText, kotlinStyleNulls != null && kotlinStyleNulls)
-    }
-
-    /**
-     * Entry point fo test. Take a filename and content separately.
-     */
-    @VisibleForTesting
-    @Throws(ApiParseException::class)
-    fun parseApi(
-        @Nonnull filename: String,
-        @Nonnull apiText: String,
-        kotlinStyleNulls: Boolean
-    ): TextCodebase {
-        val api = TextCodebase(File(filename))
-        api.description = "Codebase loaded from $filename"
-        parseApiSingleFile(api, false, filename, apiText, kotlinStyleNulls)
-        api.postProcess()
-        return api
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseApiSingleFile(
-        api: TextCodebase,
-        appending: Boolean,
-        filename: String,
-        apiText: String,
-        kotlinStyleNulls: Boolean
-    ) {
-        // Infer the format.
-        val format = parseHeader(apiText)
-
-        // If it's the first file, set the format. Otherwise, make sure the format is the same as the prior files.
-        if (!appending) {
-            // This is the first file to process.
-            api.format = format
-        } else {
-            // If we're appending to another API file, make sure the format is the same.
-            if (format != api.format) {
-                throw ApiParseException(
-                    String.format(
-                        "Cannot merge different formats of signature files. First file format=%s, current file format=%s: file=%s",
-                        api.format, format, filename
-                    )
-                )
-            }
-            // When we're appending, and the content is empty, nothing to do.
-            if (apiText.isBlank()) {
-                return
-            }
-        }
-
-        var signatureFormatUsesKotlinStyleNull = false
-        if (format.isSignatureFormat()) {
-            if (!kotlinStyleNulls) {
-                signatureFormatUsesKotlinStyleNull = format.useKotlinStyleNulls()
-            }
-        } else if (apiText.isBlank()) {
-            // Sometimes, signature files are empty, and we do want to accept them.
-        } else {
-            throw ApiParseException("Unknown file format of $filename")
-        }
-        if (kotlinStyleNulls || signatureFormatUsesKotlinStyleNull) {
-            api.kotlinStyleNulls = true
-        }
-
-        // Remove the block comments.
-        val strippedApiText = if (apiText.contains("/*")) {
-            stripComments(apiText, DOT_TXT, false) // line comments are used to stash field constants
-        } else {
-            apiText
-        }
-        val tokenizer = Tokenizer(filename, strippedApiText.toCharArray())
-        while (true) {
-            val token = tokenizer.getToken() ?: break
-            // TODO: Accept annotations on packages.
-            if ("package" == token) {
-                parsePackage(api, tokenizer)
-            } else {
-                throw ApiParseException("expected package got $token", tokenizer)
-            }
-        }
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parsePackage(api: TextCodebase, tokenizer: Tokenizer) {
-        var pkg: TextPackageItem
-        var token: String = tokenizer.requireToken()
-
-        // Metalava: including annotations in file now
-        val annotations: List<String> = getAnnotations(tokenizer, token)
-        val modifiers = TextModifiers(api, DefaultModifierList.PUBLIC, null)
-        modifiers.addAnnotations(annotations)
-        token = tokenizer.current
-        assertIdent(tokenizer, token)
-        val name: String = token
-
-        // If the same package showed up multiple times, make sure they have the same modifiers.
-        // (Packages can't have public/private/etc, but they can have annotations, which are part of ModifierList.)
-        // ModifierList doesn't provide equals(), neither does AnnotationItem which ModifierList contains,
-        // so we just use toString() here for equality comparison.
-        // However, ModifierList.toString() throws if the owner is not yet set, so we have to instantiate an
-        // (owner) TextPackageItem here.
-        // If it's a duplicate package, then we'll replace pkg with the existing one in the following if block.
-
-        // TODO: However, currently this parser can't handle annotations on packages, so we will never hit this case.
-        // Once the parser supports that, we should add a test case for this too.
-        pkg = TextPackageItem(api, name, modifiers, tokenizer.pos())
-        val existing = api.findPackage(name)
-        if (existing != null) {
-            if (pkg.modifiers.toString() != existing.modifiers.toString()) {
-                throw ApiParseException(
-                    String.format(
-                        "Contradicting declaration of package %s. Previously seen with modifiers \"%s\", but now with \"%s\"",
-                        name, pkg.modifiers, modifiers
-                    ),
-                    tokenizer
-                )
-            }
-            pkg = existing
-        }
-        token = tokenizer.requireToken()
-        if ("{" != token) {
-            throw ApiParseException("expected '{' got $token", tokenizer)
-        }
-        while (true) {
-            token = tokenizer.requireToken()
-            if ("}" == token) {
-                break
-            } else {
-                parseClass(api, pkg, tokenizer, token)
-            }
-        }
-        api.addPackage(pkg)
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseClass(
-        api: TextCodebase,
-        pkg: TextPackageItem,
-        tokenizer: Tokenizer,
-        startingToken: String
-    ) {
-        var token = startingToken
-        var isInterface = false
-        var isAnnotation = false
-        var isEnum = false
-        val qualifiedName: String
-        var ext: String? = null
-        val cl: TextClassItem
-
-        // Metalava: including annotations in file now
-        val annotations: List<String> = getAnnotations(tokenizer, token)
-        token = tokenizer.current
-        val modifiers = parseModifiers(api, tokenizer, token, annotations)
-        token = tokenizer.current
-        when (token) {
-            "class" -> {
-                token = tokenizer.requireToken()
-            }
-            "interface" -> {
-                isInterface = true
-                modifiers.setAbstract(true)
-                token = tokenizer.requireToken()
-            }
-            "@interface" -> {
-                // Annotation
-                modifiers.setAbstract(true)
-                isAnnotation = true
-                token = tokenizer.requireToken()
-            }
-            "enum" -> {
-                isEnum = true
-                modifiers.setFinal(true)
-                modifiers.setStatic(true)
-                ext = JAVA_LANG_ENUM
-                token = tokenizer.requireToken()
-            }
-            else -> {
-                throw ApiParseException("missing class or interface. got: $token", tokenizer)
-            }
-        }
-        assertIdent(tokenizer, token)
-        val name: String = token
-        qualifiedName = qualifiedName(pkg.name(), name)
-        if (api.findClass(qualifiedName) != null) {
-            throw ApiParseException("Duplicate class found: $qualifiedName", tokenizer)
-        }
-        val typeInfo = api.obtainTypeFromString(qualifiedName)
-        // Simple type info excludes the package name (but includes enclosing class names)
-        var rawName = name
-        val variableIndex = rawName.indexOf('<')
-        if (variableIndex != -1) {
-            rawName = rawName.substring(0, variableIndex)
-        }
-        token = tokenizer.requireToken()
-        cl = TextClassItem(
-            api, tokenizer.pos(), modifiers, isInterface, isEnum, isAnnotation,
-            typeInfo.toErasedTypeString(null), typeInfo.qualifiedTypeName(),
-            rawName, annotations
-        )
-        cl.setContainingPackage(pkg)
-        cl.setTypeInfo(typeInfo)
-        cl.deprecated = modifiers.isDeprecated()
-        if ("extends" == token) {
-            token = tokenizer.requireToken()
-            assertIdent(tokenizer, token)
-            ext = token
-            token = tokenizer.requireToken()
-        }
-        // Resolve superclass after done parsing
-        api.mapClassToSuper(cl, ext)
-        if ("implements" == token || "extends" == token || isInterface && ext != null && token != "{") {
-            if (token != "implements" && token != "extends") {
-                api.mapClassToInterface(cl, token)
-            }
-            while (true) {
-                token = tokenizer.requireToken()
-                if ("{" == token) {
-                    break
-                } else {
-                    // / TODO
-                    if ("," != token) {
-                        api.mapClassToInterface(cl, token)
-                    }
-                }
-            }
-        }
-        if (JAVA_LANG_ENUM == ext) {
-            cl.setIsEnum(true)
-            // Above we marked all enums as static but for a top level class it's implicit
-            if (!cl.fullName().contains(".")) {
-                cl.modifiers.setStatic(false)
-            }
-        } else if (isAnnotation) {
-            api.mapClassToInterface(cl, JAVA_LANG_ANNOTATION)
-        } else if (api.implementsInterface(cl, JAVA_LANG_ANNOTATION)) {
-            cl.setIsAnnotationType(true)
-        }
-        if ("{" != token) {
-            throw ApiParseException("expected {, was $token", tokenizer)
-        }
-        token = tokenizer.requireToken()
-        while (true) {
-            if ("}" == token) {
-                break
-            } else if ("ctor" == token) {
-                token = tokenizer.requireToken()
-                parseConstructor(api, tokenizer, cl, token)
-            } else if ("method" == token) {
-                token = tokenizer.requireToken()
-                parseMethod(api, tokenizer, cl, token)
-            } else if ("field" == token) {
-                token = tokenizer.requireToken()
-                parseField(api, tokenizer, cl, token, false)
-            } else if ("enum_constant" == token) {
-                token = tokenizer.requireToken()
-                parseField(api, tokenizer, cl, token, true)
-            } else if ("property" == token) {
-                token = tokenizer.requireToken()
-                parseProperty(api, tokenizer, cl, token)
-            } else {
-                throw ApiParseException("expected ctor, enum_constant, field or method", tokenizer)
-            }
-            token = tokenizer.requireToken()
-        }
-        pkg.addClass(cl)
-    }
-
-    @Throws(ApiParseException::class)
-    private fun processKotlinTypeSuffix(
-        api: TextCodebase,
-        startingType: String,
-        annotations: MutableList<String>
-    ): Pair<String, MutableList<String>> {
-        var type = startingType
-        var varArgs = false
-        if (type.endsWith("...")) {
-            type = type.substring(0, type.length - 3)
-            varArgs = true
-        }
-        if (api.kotlinStyleNulls) {
-            if (type.endsWith("?")) {
-                type = type.substring(0, type.length - 1)
-                mergeAnnotations(annotations, ANDROIDX_NULLABLE)
-            } else if (type.endsWith("!")) {
-                type = type.substring(0, type.length - 1)
-            } else if (!type.endsWith("!")) {
-                if (!isPrimitive(type)) { // Don't add nullness on primitive types like void
-                    mergeAnnotations(annotations, ANDROIDX_NONNULL)
-                }
-            }
-        } else if (type.endsWith("?") || type.endsWith("!")) {
-            throw ApiParseException(
-                "Did you forget to supply --input-kotlin-nulls? Found Kotlin-style null type suffix when parser was not configured " +
-                    "to interpret signature file that way: " + type
-            )
-        }
-        if (varArgs) {
-            type = "$type..."
-        }
-        return Pair(type, annotations)
-    }
-
-    @Throws(ApiParseException::class)
-    private fun getAnnotations(tokenizer: Tokenizer, startingToken: String): MutableList<String> {
-        var token = startingToken
-        val annotations: MutableList<String> = mutableListOf()
-        while (true) {
-            if (token.startsWith("@")) {
-                // Annotation
-                var annotation = token
-
-                // Restore annotations that were shortened on export
-                annotation = unshortenAnnotation(annotation)
-                token = tokenizer.requireToken()
-                if (token == "(") {
-                    // Annotation arguments; potentially nested
-                    var balance = 0
-                    val start = tokenizer.offset() - 1
-                    while (true) {
-                        if (token == "(") {
-                            balance++
-                        } else if (token == ")") {
-                            balance--
-                            if (balance == 0) {
-                                break
-                            }
-                        }
-                        token = tokenizer.requireToken()
-                    }
-                    annotation += tokenizer.getStringFromOffset(start)
-                    token = tokenizer.requireToken()
-                }
-                annotations.add(annotation)
-            } else {
-                break
-            }
-        }
-        return annotations
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseConstructor(
-        api: TextCodebase,
-        tokenizer: Tokenizer,
-        cl: TextClassItem,
-        startingToken: String
-    ) {
-        var token = startingToken
-        val method: TextConstructorItem
-
-        // Metalava: including annotations in file now
-        val annotations: List<String> = getAnnotations(tokenizer, token)
-        token = tokenizer.current
-        val modifiers = parseModifiers(api, tokenizer, token, annotations)
-        token = tokenizer.current
-        assertIdent(tokenizer, token)
-        val name: String = token.substring(token.lastIndexOf('.') + 1) // For inner classes, strip outer classes from name
-        token = tokenizer.requireToken()
-        if ("(" != token) {
-            throw ApiParseException("expected (", tokenizer)
-        }
-        method = TextConstructorItem(api, name, cl, modifiers, cl.asTypeInfo(), tokenizer.pos())
-        method.deprecated = modifiers.isDeprecated()
-        parseParameterList(api, tokenizer, method)
-        token = tokenizer.requireToken()
-        if ("throws" == token) {
-            token = parseThrows(tokenizer, method)
-        }
-        if (";" != token) {
-            throw ApiParseException("expected ; found $token", tokenizer)
-        }
-        cl.addConstructor(method)
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseMethod(
-        api: TextCodebase,
-        tokenizer: Tokenizer,
-        cl: TextClassItem,
-        startingToken: String
-    ) {
-        var token = startingToken
-        val returnType: TextTypeItem
-        val method: TextMethodItem
-        var typeParameterList = NONE
-
-        // Metalava: including annotations in file now
-        var annotations = getAnnotations(tokenizer, token)
-        token = tokenizer.current
-        val modifiers = parseModifiers(api, tokenizer, token, null)
-        token = tokenizer.current
-        if ("<" == token) {
-            typeParameterList = parseTypeParameterList(api, tokenizer)
-            token = tokenizer.requireToken()
-        }
-        assertIdent(tokenizer, token)
-        val (first, second) = processKotlinTypeSuffix(api, token, annotations)
-        token = first
-        annotations = second
-        modifiers.addAnnotations(annotations)
-        var returnTypeString = token
-        token = tokenizer.requireToken()
-        if (returnTypeString.contains("@") && (
-            returnTypeString.indexOf('<') == -1 ||
-                returnTypeString.indexOf('@') < returnTypeString.indexOf('<')
-            )
-        ) {
-            returnTypeString += " $token"
-            token = tokenizer.requireToken()
-        }
-        while (true) {
-            if (token.contains("@") && (
-                token.indexOf('<') == -1 ||
-                    token.indexOf('@') < token.indexOf('<')
-                )
-            ) {
-                // Type-use annotations in type; keep accumulating
-                returnTypeString += " $token"
-                token = tokenizer.requireToken()
-                if (token.startsWith("[")) { // TODO: This isn't general purpose; make requireToken smarter!
-                    returnTypeString += " $token"
-                    token = tokenizer.requireToken()
-                }
-            } else {
-                break
-            }
-        }
-        returnType = api.obtainTypeFromString(returnTypeString, cl, typeParameterList)
-        assertIdent(tokenizer, token)
-        val name: String = token
-        method = TextMethodItem(api, name, cl, modifiers, returnType, tokenizer.pos())
-        method.deprecated = modifiers.isDeprecated()
-        if (cl.isInterface() && !modifiers.isDefault() && !modifiers.isStatic()) {
-            modifiers.setAbstract(true)
-        }
-        method.setTypeParameterList(typeParameterList)
-        if (typeParameterList is TextTypeParameterList) {
-            typeParameterList.owner = method
-        }
-        token = tokenizer.requireToken()
-        if ("(" != token) {
-            throw ApiParseException("expected (, was $token", tokenizer)
-        }
-        parseParameterList(api, tokenizer, method)
-        token = tokenizer.requireToken()
-        if ("throws" == token) {
-            token = parseThrows(tokenizer, method)
-        }
-        if ("default" == token) {
-            token = parseDefault(tokenizer, method)
-        }
-        if (";" != token) {
-            throw ApiParseException("expected ; found $token", tokenizer)
-        }
-        cl.addMethod(method)
-    }
-
-    private fun mergeAnnotations(
-        annotations: MutableList<String>,
-        annotation: String
-    ): MutableList<String> {
-        // Reverse effect of TypeItem.shortenTypes(...)
-        val qualifiedName =
-            if (annotation.indexOf('.') == -1) "@androidx.annotation$annotation" else "@$annotation"
-        annotations.add(qualifiedName)
-        return annotations
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseField(
-        api: TextCodebase,
-        tokenizer: Tokenizer,
-        cl: TextClassItem,
-        startingToken: String,
-        isEnum: Boolean
-    ) {
-        var token = startingToken
-        var annotations = getAnnotations(tokenizer, token)
-        token = tokenizer.current
-        val modifiers = parseModifiers(api, tokenizer, token, null)
-        token = tokenizer.current
-        assertIdent(tokenizer, token)
-        val (first, second) = processKotlinTypeSuffix(api, token, annotations)
-        token = first
-        annotations = second
-        modifiers.addAnnotations(annotations)
-        val type = token
-        val typeInfo = api.obtainTypeFromString(type)
-        token = tokenizer.requireToken()
-        assertIdent(tokenizer, token)
-        val name = token
-        token = tokenizer.requireToken()
-        var value: Any? = null
-        if ("=" == token) {
-            token = tokenizer.requireToken(false)
-            value = parseValue(type, token)
-            token = tokenizer.requireToken()
-        }
-        if (";" != token) {
-            throw ApiParseException("expected ; found $token", tokenizer)
-        }
-        val field = TextFieldItem(api, name, cl, modifiers, typeInfo, value, tokenizer.pos())
-        field.deprecated = modifiers.isDeprecated()
-        if (isEnum) {
-            cl.addEnumConstant(field)
-        } else {
-            cl.addField(field)
-        }
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseModifiers(
-        api: TextCodebase,
-        tokenizer: Tokenizer,
-        startingToken: String?,
-        annotations: List<String>?
-    ): TextModifiers {
-        var token = startingToken
-        val modifiers = TextModifiers(api, DefaultModifierList.PACKAGE_PRIVATE, null)
-        processModifiers@ while (true) {
-            token = when (token) {
-                "public" -> {
-                    modifiers.setVisibilityLevel(VisibilityLevel.PUBLIC)
-                    tokenizer.requireToken()
-                }
-                "protected" -> {
-                    modifiers.setVisibilityLevel(VisibilityLevel.PROTECTED)
-                    tokenizer.requireToken()
-                }
-                "private" -> {
-                    modifiers.setVisibilityLevel(VisibilityLevel.PRIVATE)
-                    tokenizer.requireToken()
-                }
-                "internal" -> {
-                    modifiers.setVisibilityLevel(VisibilityLevel.INTERNAL)
-                    tokenizer.requireToken()
-                }
-                "static" -> {
-                    modifiers.setStatic(true)
-                    tokenizer.requireToken()
-                }
-                "final" -> {
-                    modifiers.setFinal(true)
-                    tokenizer.requireToken()
-                }
-                "deprecated" -> {
-                    modifiers.setDeprecated(true)
-                    tokenizer.requireToken()
-                }
-                "abstract" -> {
-                    modifiers.setAbstract(true)
-                    tokenizer.requireToken()
-                }
-                "transient" -> {
-                    modifiers.setTransient(true)
-                    tokenizer.requireToken()
-                }
-                "volatile" -> {
-                    modifiers.setVolatile(true)
-                    tokenizer.requireToken()
-                }
-                "sealed" -> {
-                    modifiers.setSealed(true)
-                    tokenizer.requireToken()
-                }
-                "default" -> {
-                    modifiers.setDefault(true)
-                    tokenizer.requireToken()
-                }
-                "synchronized" -> {
-                    modifiers.setSynchronized(true)
-                    tokenizer.requireToken()
-                }
-                "native" -> {
-                    modifiers.setNative(true)
-                    tokenizer.requireToken()
-                }
-                "strictfp" -> {
-                    modifiers.setStrictFp(true)
-                    tokenizer.requireToken()
-                }
-                "infix" -> {
-                    modifiers.setInfix(true)
-                    tokenizer.requireToken()
-                }
-                "operator" -> {
-                    modifiers.setOperator(true)
-                    tokenizer.requireToken()
-                }
-                "inline" -> {
-                    modifiers.setInline(true)
-                    tokenizer.requireToken()
-                }
-                "value" -> {
-                    modifiers.setValue(true)
-                    tokenizer.requireToken()
-                }
-                "suspend" -> {
-                    modifiers.setSuspend(true)
-                    tokenizer.requireToken()
-                }
-                "vararg" -> {
-                    modifiers.setVarArg(true)
-                    tokenizer.requireToken()
-                }
-                "fun" -> {
-                    modifiers.setFunctional(true)
-                    tokenizer.requireToken()
-                }
-                "data" -> {
-                    modifiers.setData(true)
-                    tokenizer.requireToken()
-                }
-                else -> break@processModifiers
-            }
-        }
-        if (annotations != null) {
-            modifiers.addAnnotations(annotations)
-        }
-        return modifiers
-    }
-
-    private fun parseValue(type: String?, value: String?): Any? {
-        return if (value != null) {
-            when (type) {
-                "boolean" -> if ("true" == value) java.lang.Boolean.TRUE else java.lang.Boolean.FALSE
-                "byte" -> Integer.valueOf(value)
-                "short" -> Integer.valueOf(value)
-                "int" -> Integer.valueOf(value)
-                "long" -> java.lang.Long.valueOf(value.substring(0, value.length - 1))
-                "float" -> when (value) {
-                    "(1.0f/0.0f)", "(1.0f / 0.0f)" -> Float.POSITIVE_INFINITY
-                    "(-1.0f/0.0f)", "(-1.0f / 0.0f)" -> Float.NEGATIVE_INFINITY
-                    "(0.0f/0.0f)", "(0.0f / 0.0f)" -> Float.NaN
-                    else -> java.lang.Float.valueOf(value)
-                }
-                "double" -> when (value) {
-                    "(1.0/0.0)", "(1.0 / 0.0)" -> Double.POSITIVE_INFINITY
-                    "(-1.0/0.0)", "(-1.0 / 0.0)" -> Double.NEGATIVE_INFINITY
-                    "(0.0/0.0)", "(0.0 / 0.0)" -> Double.NaN
-                    else -> java.lang.Double.valueOf(value)
-                }
-                "char" -> value.toInt().toChar()
-                JAVA_LANG_STRING, "String" -> if ("null" == value) {
-                    null
-                } else {
-                    javaUnescapeString(value.substring(1, value.length - 1))
-                }
-                "null" -> null
-                else -> value
-            }
-        } else null
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseProperty(
-        api: TextCodebase,
-        tokenizer: Tokenizer,
-        cl: TextClassItem,
-        startingToken: String
-    ) {
-        var token = startingToken
-
-        // Metalava: including annotations in file now
-        var annotations = getAnnotations(tokenizer, token)
-        token = tokenizer.current
-        val modifiers = parseModifiers(api, tokenizer, token, null)
-        token = tokenizer.current
-        assertIdent(tokenizer, token)
-        val (first, second) = processKotlinTypeSuffix(api, token, annotations)
-        token = first
-        annotations = second
-        modifiers.addAnnotations(annotations)
-        val type: String = token
-        val typeInfo = api.obtainTypeFromString(type)
-        token = tokenizer.requireToken()
-        assertIdent(tokenizer, token)
-        val name: String = token
-        token = tokenizer.requireToken()
-        if (";" != token) {
-            throw ApiParseException("expected ; found $token", tokenizer)
-        }
-        val property = TextPropertyItem(api, name, cl, modifiers, typeInfo, tokenizer.pos())
-        property.deprecated = modifiers.isDeprecated()
-        cl.addProperty(property)
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseTypeParameterList(
-        codebase: TextCodebase,
-        tokenizer: Tokenizer
-    ): TypeParameterList {
-        var token: String
-        val start = tokenizer.offset() - 1
-        var balance = 1
-        while (balance > 0) {
-            token = tokenizer.requireToken()
-            if (token == "<") {
-                balance++
-            } else if (token == ">") {
-                balance--
-            }
-        }
-        val typeParameterList = tokenizer.getStringFromOffset(start)
-        return if (typeParameterList.isEmpty()) {
-            NONE
-        } else {
-            create(codebase, null, typeParameterList)
-        }
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseParameterList(
-        api: TextCodebase,
-        tokenizer: Tokenizer,
-        method: TextMethodItem
-    ) {
-        var token: String = tokenizer.requireToken()
-        var index = 0
-        while (true) {
-            if (")" == token) {
-                return
-            }
-
-            // Each item can be
-            // optional annotations optional-modifiers type-with-use-annotations-and-generics optional-name optional-equals-default-value
-
-            // Used to represent the presence of a default value, instead of showing the entire
-            // default value
-            var hasDefaultValue = token == "optional"
-            if (hasDefaultValue) {
-                token = tokenizer.requireToken()
-            }
-
-            // Metalava: including annotations in file now
-            var annotations = getAnnotations(tokenizer, token)
-            token = tokenizer.current
-            val modifiers = parseModifiers(api, tokenizer, token, null)
-            token = tokenizer.current
-
-            // Token should now represent the type
-            var type = token
-            token = tokenizer.requireToken()
-            if (token.startsWith("@")) {
-                // Type use annotations within the type, which broke up the tokenizer;
-                // put it back together
-                type += " $token"
-                token = tokenizer.requireToken()
-                if (token.startsWith("[")) { // TODO: This isn't general purpose; make requireToken smarter!
-                    type += " $token"
-                    token = tokenizer.requireToken()
-                }
-            }
-            val (typeString, second) = processKotlinTypeSuffix(api, type, annotations)
-            annotations = second
-            modifiers.addAnnotations(annotations)
-            if (typeString.endsWith("...")) {
-                modifiers.setVarArg(true)
-            }
-            val typeInfo = api.obtainTypeFromString(
-                typeString,
-                (method.containingClass() as TextClassItem),
-                method.typeParameterList()
-            )
-            var name: String
-            var publicName: String?
-            if (isIdent(token) && token != "=") {
-                name = token
-                publicName = name
-                token = tokenizer.requireToken()
-            } else {
-                name = "arg" + (index + 1)
-                publicName = null
-            }
-            var defaultValue = UNKNOWN_DEFAULT_VALUE
-            if ("=" == token) {
-                defaultValue = tokenizer.requireToken(true)
-                val sb = StringBuilder(defaultValue)
-                if (defaultValue == "{") {
-                    var balance = 1
-                    while (balance > 0) {
-                        token = tokenizer.requireToken(parenIsSep = false, eatWhitespace = false)
-                        sb.append(token)
-                        if (token == "{") {
-                            balance++
-                        } else if (token == "}") {
-                            balance--
-                            if (balance == 0) {
-                                break
-                            }
-                        }
-                    }
-                    token = tokenizer.requireToken()
-                } else {
-                    var balance = if (defaultValue == "(") 1 else 0
-                    while (true) {
-                        token = tokenizer.requireToken(parenIsSep = true, eatWhitespace = false)
-                        if ((token.endsWith(",") || token.endsWith(")")) && balance <= 0) {
-                            if (token.length > 1) {
-                                sb.append(token, 0, token.length - 1)
-                                token = token[token.length - 1].toString()
-                            }
-                            break
-                        }
-                        sb.append(token)
-                        if (token == "(") {
-                            balance++
-                        } else if (token == ")") {
-                            balance--
-                        }
-                    }
-                }
-                defaultValue = sb.toString()
-            }
-            if (defaultValue != UNKNOWN_DEFAULT_VALUE) {
-                hasDefaultValue = true
-            }
-            when (token) {
-                "," -> {
-                    token = tokenizer.requireToken()
-                }
-                ")" -> {
-                    // closing parenthesis
-                }
-                else -> {
-                    throw ApiParseException("expected , or ), found $token", tokenizer)
-                }
-            }
-            method.addParameter(
-                TextParameterItem(
-                    api, method, name, publicName, hasDefaultValue, defaultValue, index,
-                    typeInfo, modifiers, tokenizer.pos()
-                )
-            )
-            if (modifiers.isVarArg()) {
-                method.setVarargs(true)
-            }
-            index++
-        }
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseDefault(tokenizer: Tokenizer, method: TextMethodItem): String {
-        val sb = StringBuilder()
-        while (true) {
-            val token = tokenizer.requireToken()
-            if (";" == token) {
-                method.setAnnotationDefault(sb.toString())
-                return token
-            } else {
-                sb.append(token)
-            }
-        }
-    }
-
-    @Throws(ApiParseException::class)
-    private fun parseThrows(tokenizer: Tokenizer, method: TextMethodItem): String {
-        var token = tokenizer.requireToken()
-        var comma = true
-        while (true) {
-            when (token) {
-                ";" -> {
-                    return token
-                }
-                "," -> {
-                    if (comma) {
-                        throw ApiParseException("Expected exception, got ','", tokenizer)
-                    }
-                    comma = true
-                }
-                else -> {
-                    if (!comma) {
-                        throw ApiParseException("Expected ',' or ';' got $token", tokenizer)
-                    }
-                    comma = false
-                    method.addException(token)
-                }
-            }
-            token = tokenizer.requireToken()
-        }
-    }
-
-    private fun qualifiedName(pkg: String, className: String): String {
-        return "$pkg.$className"
-    }
-
-    private fun isIdent(token: String): Boolean {
-        return isIdent(token[0])
-    }
-
-    @Throws(ApiParseException::class)
-    private fun assertIdent(tokenizer: Tokenizer, token: String) {
-        if (!isIdent(token[0])) {
-            throw ApiParseException("Expected identifier: $token", tokenizer)
-        }
-    }
-
-    private fun isSpace(c: Char): Boolean {
-        return c == ' ' || c == '\t' || c == '\n' || c == '\r'
-    }
-
-    private fun isNewline(c: Char): Boolean {
-        return c == '\n' || c == '\r'
-    }
-
-    private fun isSeparator(c: Char, parenIsSep: Boolean): Boolean {
-        if (parenIsSep) {
-            if (c == '(' || c == ')') {
-                return true
-            }
-        }
-        return c == '{' || c == '}' || c == ',' || c == ';' || c == '<' || c == '>'
-    }
-
-    private fun isIdent(c: Char): Boolean {
-        return c != '"' && !isSeparator(c, true)
-    }
-
-    internal class Tokenizer(val fileName: String, private val buffer: CharArray) {
-        var position = 0
-        var line = 1
-        fun pos(): SourcePositionInfo {
-            return SourcePositionInfo(fileName, line)
-        }
-
-        private fun eatWhitespace(): Boolean {
-            var ate = false
-            while (position < buffer.size && isSpace(buffer[position])) {
-                if (buffer[position] == '\n') {
-                    line++
-                }
-                position++
-                ate = true
-            }
-            return ate
-        }
-
-        private fun eatComment(): Boolean {
-            if (position + 1 < buffer.size) {
-                if (buffer[position] == '/' && buffer[position + 1] == '/') {
-                    position += 2
-                    while (position < buffer.size && !isNewline(buffer[position])) {
-                        position++
-                    }
-                    return true
-                }
-            }
-            return false
-        }
-
-        private fun eatWhitespaceAndComments() {
-            while (eatWhitespace() || eatComment()) {
-                // intentionally consume whitespace and comments
-            }
-        }
-
-        @Throws(ApiParseException::class)
-        fun requireToken(parenIsSep: Boolean = true, eatWhitespace: Boolean = true): String {
-            val token = getToken(parenIsSep, eatWhitespace)
-            return token ?: throw ApiParseException("Unexpected end of file", this)
-        }
-
-        fun offset(): Int {
-            return position
-        }
-
-        fun getStringFromOffset(offset: Int): String {
-            return String(buffer, offset, position - offset)
-        }
-
-        lateinit var current: String
-
-        @Throws(ApiParseException::class)
-        fun getToken(parenIsSep: Boolean = true, eatWhitespace: Boolean = true): String? {
-            if (eatWhitespace) {
-                eatWhitespaceAndComments()
-            }
-            if (position >= buffer.size) {
-                return null
-            }
-            val line = line
-            val c = buffer[position]
-            val start = position
-            position++
-            if (c == '"') {
-                val STATE_BEGIN = 0
-                val STATE_ESCAPE = 1
-                var state = STATE_BEGIN
-                while (true) {
-                    if (position >= buffer.size) {
-                        throw ApiParseException(
-                            "Unexpected end of file for \" starting at $line",
-                            this
-                        )
-                    }
-                    val k = buffer[position]
-                    if (k == '\n' || k == '\r') {
-                        throw ApiParseException(
-                            "Unexpected newline for \" starting at $line in $fileName",
-                            this
-                        )
-                    }
-                    position++
-                    when (state) {
-                        STATE_BEGIN -> when (k) {
-                            '\\' -> state = STATE_ESCAPE
-                            '"' -> {
-                                current = String(buffer, start, position - start)
-                                return current
-                            }
-                        }
-                        STATE_ESCAPE -> state = STATE_BEGIN
-                    }
-                }
-            } else if (isSeparator(c, parenIsSep)) {
-                current = c.toString()
-                return current
-            } else {
-                var genericDepth = 0
-                do {
-                    while (position < buffer.size) {
-                        val d = buffer[position]
-                        if (isSpace(d) || isSeparator(d, parenIsSep)) {
-                            break
-                        } else if (d == '"') {
-                            // String literal in token: skip the full thing
-                            position++
-                            while (position < buffer.size) {
-                                if (buffer[position] == '"') {
-                                    position++
-                                    break
-                                } else if (buffer[position] == '\\') {
-                                    position++
-                                }
-                                position++
-                            }
-                            continue
-                        }
-                        position++
-                    }
-                    if (position < buffer.size) {
-                        if (buffer[position] == '<') {
-                            genericDepth++
-                            position++
-                        } else if (genericDepth != 0) {
-                            if (buffer[position] == '>') {
-                                genericDepth--
-                            }
-                            position++
-                        }
-                    }
-                } while (position < buffer.size &&
-                    (
-                        !isSpace(buffer[position]) && !isSeparator(
-                                buffer[position],
-                                parenIsSep
-                            ) || genericDepth != 0
-                        )
-                )
-                if (position >= buffer.size) {
-                    throw ApiParseException("Unexpected end of file for \" starting at $line", this)
-                }
-                current = String(buffer, start, position - start)
-                return current
-            }
-        }
-    }
-}
diff --git a/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt b/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt
index 63f3300..47151d8 100644
--- a/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/ApiParseException.kt
@@ -43,4 +43,4 @@
             sb.append(super.message)
             return sb.toString()
         }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/SourcePositionInfo.kt b/src/main/java/com/android/tools/metalava/model/text/SourcePositionInfo.kt
index ce22cbf..c81dc3b 100644
--- a/src/main/java/com/android/tools/metalava/model/text/SourcePositionInfo.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/SourcePositionInfo.kt
@@ -63,4 +63,4 @@
             )
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt
index fce3a9d..e741a80 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextBackedAnnotationItem.kt
@@ -28,10 +28,10 @@
     source: String,
     mapName: Boolean = true
 ) : DefaultAnnotationItem(codebase) {
-    override val originalName: String
-    override val qualifiedName: String?
+    private val originalName: String
+    private val qualifiedName: String?
     private val full: String
-    override val attributes: List<AnnotationAttribute>
+    private val attributes: List<AnnotationAttribute>
 
     init {
         val index = source.indexOf("(")
@@ -56,5 +56,8 @@
         }
     }
 
+    override fun originalName(): String? = originalName
+    override fun qualifiedName(): String? = qualifiedName
+    override fun attributes(): List<AnnotationAttribute> = attributes
     override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String = full
 }
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextClassItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextClassItem.kt
index dffe723..b13b09a 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextClassItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextClassItem.kt
@@ -46,9 +46,7 @@
     codebase = codebase,
     position = position,
     modifiers = modifiers
-),
-    ClassItem,
-    TypeParameterListOwner {
+), ClassItem, TypeParameterListOwner {
 
     init {
         @Suppress("LeakingThis")
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextCodebase.kt b/src/main/java/com/android/tools/metalava/model/text/TextCodebase.kt
index 815d688..1d8f9a9 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextCodebase.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextCodebase.kt
@@ -24,6 +24,7 @@
 import com.android.tools.metalava.JAVA_LANG_ENUM
 import com.android.tools.metalava.JAVA_LANG_OBJECT
 import com.android.tools.metalava.JAVA_LANG_THROWABLE
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.Codebase
@@ -331,86 +332,87 @@
         fun computeDelta(
             baseFile: File,
             baseApi: Codebase,
-            signatureApi: Codebase
+            signatureApi: Codebase,
+            includeFieldsInApiDiff: Boolean = compatibility.includeFieldsInApiDiff
         ): TextCodebase {
             // Compute just the delta
             val delta =
                 TextCodebase(baseFile)
             delta.description = "Delta between $baseApi and $signatureApi"
 
-            CodebaseComparator().compare(
-                object : ComparisonVisitor() {
-                    override fun added(new: PackageItem) {
-                        delta.addPackage(new as TextPackageItem)
-                    }
+            CodebaseComparator().compare(object : ComparisonVisitor() {
+                override fun added(new: PackageItem) {
+                    delta.addPackage(new as TextPackageItem)
+                }
 
-                    override fun added(new: ClassItem) {
-                        val pkg = getOrAddPackage(new.containingPackage().qualifiedName())
-                        pkg.addClass(new as TextClassItem)
-                    }
+                override fun added(new: ClassItem) {
+                    val pkg = getOrAddPackage(new.containingPackage().qualifiedName())
+                    pkg.addClass(new as TextClassItem)
+                }
 
-                    override fun added(new: ConstructorItem) {
-                        val cls = getOrAddClass(new.containingClass())
-                        cls.addConstructor(new as TextConstructorItem)
-                    }
+                override fun added(new: ConstructorItem) {
+                    val cls = getOrAddClass(new.containingClass())
+                    cls.addConstructor(new as TextConstructorItem)
+                }
 
-                    override fun added(new: MethodItem) {
-                        val cls = getOrAddClass(new.containingClass())
-                        cls.addMethod(new as TextMethodItem)
-                    }
+                override fun added(new: MethodItem) {
+                    val cls = getOrAddClass(new.containingClass())
+                    cls.addMethod(new as TextMethodItem)
+                }
 
-                    override fun added(new: FieldItem) {
-                        val cls = getOrAddClass(new.containingClass())
-                        cls.addField(new as TextFieldItem)
+                override fun added(new: FieldItem) {
+                    if (!includeFieldsInApiDiff) {
+                        return
                     }
+                    val cls = getOrAddClass(new.containingClass())
+                    cls.addField(new as TextFieldItem)
+                }
 
-                    override fun added(new: PropertyItem) {
-                        val cls = getOrAddClass(new.containingClass())
-                        cls.addProperty(new as TextPropertyItem)
-                    }
+                override fun added(new: PropertyItem) {
+                    val cls = getOrAddClass(new.containingClass())
+                    cls.addProperty(new as TextPropertyItem)
+                }
 
-                    private fun getOrAddClass(fullClass: ClassItem): TextClassItem {
-                        val cls = delta.findClass(fullClass.qualifiedName())
-                        if (cls != null) {
-                            return cls
-                        }
-                        val textClass = fullClass as TextClassItem
-                        val newClass = TextClassItem(
-                            delta,
-                            SourcePositionInfo.UNKNOWN,
-                            textClass.modifiers,
-                            textClass.isInterface(),
-                            textClass.isEnum(),
-                            textClass.isAnnotationType(),
-                            textClass.qualifiedName,
-                            textClass.qualifiedName,
-                            textClass.name,
-                            textClass.annotations
-                        )
-                        val pkg = getOrAddPackage(fullClass.containingPackage().qualifiedName())
-                        pkg.addClass(newClass)
-                        newClass.setContainingPackage(pkg)
-                        delta.registerClass(newClass)
-                        return newClass
+                private fun getOrAddClass(fullClass: ClassItem): TextClassItem {
+                    val cls = delta.findClass(fullClass.qualifiedName())
+                    if (cls != null) {
+                        return cls
                     }
+                    val textClass = fullClass as TextClassItem
+                    val newClass = TextClassItem(
+                        delta,
+                        SourcePositionInfo.UNKNOWN,
+                        textClass.modifiers,
+                        textClass.isInterface(),
+                        textClass.isEnum(),
+                        textClass.isAnnotationType(),
+                        textClass.qualifiedName,
+                        textClass.qualifiedName,
+                        textClass.name,
+                        textClass.annotations
+                    )
+                    val pkg = getOrAddPackage(fullClass.containingPackage().qualifiedName())
+                    pkg.addClass(newClass)
+                    newClass.setContainingPackage(pkg)
+                    delta.registerClass(newClass)
+                    return newClass
+                }
 
-                    private fun getOrAddPackage(pkgName: String): TextPackageItem {
-                        val pkg = delta.findPackage(pkgName)
-                        if (pkg != null) {
-                            return pkg
-                        }
-                        val newPkg = TextPackageItem(
-                            delta,
-                            pkgName,
-                            TextModifiers(delta, DefaultModifierList.PUBLIC),
-                            SourcePositionInfo.UNKNOWN
-                        )
-                        delta.addPackage(newPkg)
-                        return newPkg
+                private fun getOrAddPackage(pkgName: String): TextPackageItem {
+                    val pkg = delta.findPackage(pkgName)
+                    if (pkg != null) {
+                        return pkg
                     }
-                },
-                baseApi, signatureApi, ApiType.ALL.getReferenceFilter()
-            )
+                    val newPkg = TextPackageItem(
+                        delta,
+                        pkgName,
+                        TextModifiers(delta, DefaultModifierList.PUBLIC),
+                        SourcePositionInfo.UNKNOWN
+                    )
+                    delta.addPackage(newPkg)
+                    return newPkg
+                }
+            }, baseApi, signatureApi, ApiType.ALL.getReferenceFilter())
 
             delta.postProcess()
             return delta
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextFieldItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextFieldItem.kt
index 1b9d947..7358a76 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextFieldItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextFieldItem.kt
@@ -83,4 +83,4 @@
     fun setEnumConstant(isEnumConstant: Boolean) {
         this.isEnumConstant = isEnumConstant
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextItem.kt
index 05e4c90..7f7a3db 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextItem.kt
@@ -41,4 +41,4 @@
     override var deprecated = false
 
     override fun isCloned(): Boolean = false
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextMemberItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextMemberItem.kt
index c2024d6..7e3003c 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextMemberItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextMemberItem.kt
@@ -29,4 +29,4 @@
 
     override fun name(): String = name
     override fun containingClass(): ClassItem = containingClass
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt
index 9dba79a..a7ca1d7 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextMethodItem.kt
@@ -16,6 +16,7 @@
 
 package com.android.tools.metalava.model.text
 
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.Item
 import com.android.tools.metalava.model.MethodItem
@@ -36,9 +37,7 @@
 ) : TextMemberItem(
     codebase, name, containingClass, position,
     modifiers = modifiers
-),
-    MethodItem,
-    TypeParameterListOwner {
+), MethodItem, TypeParameterListOwner {
     init {
         @Suppress("LeakingThis")
         modifiers.setOwner(this)
@@ -152,7 +151,7 @@
         if (targetContainingClass.docOnly) {
             duplicated.docOnly = true
         }
-        if (targetContainingClass.deprecated) {
+        if (targetContainingClass.deprecated && compatibility.propagateDeprecatedMembers) {
             duplicated.deprecated = true
         }
 
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt b/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt
index 2c72a0d..1aca065 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextModifiers.kt
@@ -44,7 +44,8 @@
         return TextModifiers(codebase, flags, newAnnotations)
     }
 
-    fun addAnnotations(annotationSources: List<String>) {
+    fun addAnnotations(annotationSources: List<String>?) {
+        annotationSources ?: return
         if (annotationSources.isEmpty()) {
             return
         }
@@ -68,9 +69,9 @@
                 }
             val codebase = codebase
             val item = object : DefaultAnnotationItem(codebase) {
-                override val attributes: List<AnnotationAttribute> = attributes
-                override val originalName: String? = originalName
-                override val qualifiedName: String? = qualifiedName
+                override fun attributes(): List<AnnotationAttribute> = attributes
+                override fun originalName(): String? = originalName
+                override fun qualifiedName(): String? = qualifiedName
                 override fun toSource(target: AnnotationTarget, showDefaultAttrs: Boolean): String = source
             }
             annotations.add(item)
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextParameterItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextParameterItem.kt
index 9bc47d1..5802e44 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextParameterItem.kt
@@ -32,35 +32,35 @@
     private var type: TextTypeItem,
     modifiers: TextModifiers,
     position: SourcePositionInfo
-) :
+)
 // TODO: We need to pass in parameter modifiers here (synchronized etc)
-        TextItem(codebase, position, modifiers = modifiers), ParameterItem {
+    : TextItem(codebase, position, modifiers = modifiers), ParameterItem {
 
-        init {
-            modifiers.setOwner(this)
-        }
-
-        override fun isVarArgs(): Boolean {
-            return type.toString().contains("...")
-        }
-
-        override val synthetic: Boolean get() = containingMethod.isEnumSyntheticMethod()
-        override fun type(): TextTypeItem = type
-        override fun name(): String = name
-        override fun publicName(): String? = publicName
-        override fun hasDefaultValue(): Boolean = hasDefaultValue
-        override fun isDefaultValueKnown(): Boolean = defaultValueBody != UNKNOWN_DEFAULT_VALUE
-        override fun defaultValue(): String? = defaultValueBody
-        override fun containingMethod(): MethodItem = containingMethod
-
-        override fun equals(other: Any?): Boolean {
-            if (this === other) return true
-            if (other !is ParameterItem) return false
-
-            return parameterIndex == other.parameterIndex
-        }
-
-        override fun hashCode(): Int = parameterIndex
-
-        override fun toString(): String = "parameter ${name()}"
+    init {
+        modifiers.setOwner(this)
     }
+
+    override fun isVarArgs(): Boolean {
+        return type.toString().contains("...")
+    }
+
+    override val synthetic: Boolean get() = containingMethod.isEnumSyntheticMethod()
+    override fun type(): TextTypeItem = type
+    override fun name(): String = name
+    override fun publicName(): String? = publicName
+    override fun hasDefaultValue(): Boolean = hasDefaultValue
+    override fun isDefaultValueKnown(): Boolean = defaultValueBody != UNKNOWN_DEFAULT_VALUE
+    override fun defaultValue(): String? = defaultValueBody
+    override fun containingMethod(): MethodItem = containingMethod
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is ParameterItem) return false
+
+        return parameterIndex == other.parameterIndex
+    }
+
+    override fun hashCode(): Int = parameterIndex
+
+    override fun toString(): String = "parameter ${name()}"
+}
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextPropertyItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextPropertyItem.kt
index ec9bcf6..5161a46 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextPropertyItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextPropertyItem.kt
@@ -49,4 +49,4 @@
     override fun type(): TypeItem = type
 
     override fun toString(): String = "Field ${containingClass().fullName()}.${name()}"
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextTypeItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextTypeItem.kt
index 0ba6abc..84608e6 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextTypeItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextTypeItem.kt
@@ -74,7 +74,7 @@
             when (nullable) {
                 null -> return "$typeString!"
                 true -> return "$typeString?"
-                else -> { /* non-null: nothing to add */ }
+                // else: non-null: nothing to add
             }
         }
         return typeString
@@ -141,10 +141,10 @@
         return dimensions
     }
 
-    private fun findTypeVariableBounds(typeParameterList: TypeParameterList, name: String): List<TypeItem> {
+    private fun findTypeVariableBounds(typeParameterList: TypeParameterList, name: String): List<ClassItem> {
         for (p in typeParameterList.typeParameters()) {
             if (p.simpleName() == name) {
-                val bounds = p.typeBounds()
+                val bounds = p.bounds()
                 if (bounds.isNotEmpty()) {
                     return bounds
                 }
@@ -154,7 +154,7 @@
         return emptyList()
     }
 
-    private fun findTypeVariableBounds(context: Item?, name: String): List<TypeItem> {
+    private fun findTypeVariableBounds(context: Item?, name: String): List<ClassItem> {
         if (context is MethodItem) {
             val bounds = findTypeVariableBounds(context.typeParameterList(), name)
             if (bounds.isNotEmpty()) {
@@ -173,7 +173,7 @@
             val typeParameter =
                 TextTypeParameterItem.create(codebase, context as? TypeParameterListOwner, toTypeString())
 
-            if (context != null && typeParameter.typeBounds().isEmpty()) {
+            if (context != null && typeParameter.bounds().isEmpty()) {
                 val bounds = findTypeVariableBounds(context, typeParameter.simpleName())
                 if (bounds.isNotEmpty()) {
                     val filtered = bounds.filter { !it.isJavaLangObject() }
@@ -239,7 +239,7 @@
         ): String {
             return if (erased) {
                 val raw = eraseTypeArguments(type)
-                val concrete = eraseTypeArguments(substituteTypeParameters(raw, context))
+                val concrete = substituteTypeParameters(raw, context)
                 if (outerAnnotations && innerAnnotations) {
                     concrete
                 } else {
@@ -264,9 +264,9 @@
                     val v = s.substring(0, end)
                     val parameter = context.resolveParameter(v)
                     if (parameter != null) {
-                        val bounds = parameter.typeBounds()
+                        val bounds = parameter.bounds()
                         if (bounds.isNotEmpty()) {
-                            return bounds.first().toTypeString() + s.substring(end)
+                            return bounds.first().qualifiedName() + s.substring(end)
                         }
                         @Suppress("ConstantConditionIf")
                         if (ASSUME_TYPE_VARS_EXTEND_OBJECT) {
@@ -437,4 +437,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterItem.kt b/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterItem.kt
index 11de657..389caa4 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterItem.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterItem.kt
@@ -16,8 +16,8 @@
 
 package com.android.tools.metalava.model.text
 
+import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.DefaultModifierList
-import com.android.tools.metalava.model.TypeItem
 import com.android.tools.metalava.model.TypeParameterItem
 import com.android.tools.metalava.model.TypeParameterListOwner
 
@@ -26,7 +26,7 @@
     private val owner: TypeParameterListOwner?,
     private val typeParameterString: String,
     name: String,
-    private var bounds: List<TypeItem>? = null
+    private var bounds: List<ClassItem>? = null
 ) :
     TextClassItem(
         codebase = codebase,
@@ -36,14 +36,19 @@
     ),
     TypeParameterItem {
 
-    override fun typeBounds(): List<TypeItem> {
+    override fun bounds(): List<ClassItem> {
         if (bounds == null) {
             val boundsString = bounds(typeParameterString, owner)
             bounds = if (boundsString.isEmpty()) {
                 emptyList()
             } else {
                 boundsString.mapNotNull {
-                    codebase.obtainTypeFromString(it)
+                    val clz = codebase.findClass(it)
+                    if (clz == null && it.contains(".")) {
+                        codebase.getOrCreateClass(it)
+                    } else {
+                        clz
+                    }
                 }.filter {
                     !it.isJavaLangObject()
                 }
@@ -61,7 +66,7 @@
             codebase: TextCodebase,
             owner: TypeParameterListOwner?,
             typeParameterString: String,
-            bounds: List<TypeItem>? = null
+            bounds: List<ClassItem>? = null
         ): TextTypeParameterItem {
             val length = typeParameterString.length
             var nameEnd = length
@@ -91,27 +96,29 @@
                     ?: return emptyList()
                 for (p in parameters) {
                     if (p.simpleName() == s) {
-                        return p.typeBounds().filter { !it.isJavaLangObject() }.map { it.toTypeString() }
+                        return p.bounds().filter { !it.isJavaLangObject() }.map { it.qualifiedName() }
                     }
                 }
 
                 return emptyList()
             }
             val list = mutableListOf<String>()
-            var angleBracketBalance = 0
+            var balance = 0
             var start = index + "extends ".length
             val length = s.length
             for (i in start until length) {
                 val c = s[i]
-                if (c == '&' && angleBracketBalance == 0) {
+                if (c == '&' && balance == 0) {
                     add(list, typeString, start, i)
                     start = i + 1
                 } else if (c == '<') {
-                    angleBracketBalance++
+                    balance++
+                    if (balance == 1) {
+                        add(list, typeString, start, i)
+                    }
                 } else if (c == '>') {
-                    angleBracketBalance--
-                    if (angleBracketBalance == 0) {
-                        add(list, typeString, start, i + 1)
+                    balance--
+                    if (balance == 0) {
                         start = i + 1
                     }
                 }
@@ -143,4 +150,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterList.kt b/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterList.kt
index 384c40f..d6fd800 100644
--- a/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterList.kt
+++ b/src/main/java/com/android/tools/metalava/model/text/TextTypeParameterList.kt
@@ -102,4 +102,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/model/visitors/ApiVisitor.kt b/src/main/java/com/android/tools/metalava/model/visitors/ApiVisitor.kt
index cc8c27e..64aca53 100644
--- a/src/main/java/com/android/tools/metalava/model/visitors/ApiVisitor.kt
+++ b/src/main/java/com/android/tools/metalava/model/visitors/ApiVisitor.kt
@@ -16,8 +16,8 @@
 
 package com.android.tools.metalava.model.visitors
 
-import com.android.tools.metalava.ApiPredicate
 import com.android.tools.metalava.Options
+import com.android.tools.metalava.ApiPredicate
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.FieldItem
 import com.android.tools.metalava.model.Item
diff --git a/src/main/java/com/android/tools/metalava/model/visitors/ItemVisitor.kt b/src/main/java/com/android/tools/metalava/model/visitors/ItemVisitor.kt
index 191bf92..530bb6c 100644
--- a/src/main/java/com/android/tools/metalava/model/visitors/ItemVisitor.kt
+++ b/src/main/java/com/android/tools/metalava/model/visitors/ItemVisitor.kt
@@ -18,6 +18,7 @@
 
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.Codebase
+import com.android.tools.metalava.model.CompilationUnit
 import com.android.tools.metalava.model.ConstructorItem
 import com.android.tools.metalava.model.FieldItem
 import com.android.tools.metalava.model.Item
@@ -25,7 +26,6 @@
 import com.android.tools.metalava.model.PackageItem
 import com.android.tools.metalava.model.ParameterItem
 import com.android.tools.metalava.model.PropertyItem
-import com.android.tools.metalava.model.SourceFileItem
 
 open class ItemVisitor(
     /**
@@ -53,7 +53,7 @@
 
     open fun visitCodebase(codebase: Codebase) {}
     open fun visitPackage(pkg: PackageItem) {}
-    open fun visitSourceFile(sourceFile: SourceFileItem) {}
+    open fun visitCompilationUnit(unit: CompilationUnit) {}
     open fun visitClass(cls: ClassItem) {}
     open fun visitConstructor(constructor: ConstructorItem) {
         if (visitConstructorsAsMethods) {
@@ -69,7 +69,7 @@
     open fun afterVisitItem(item: Item) {}
     open fun afterVisitCodebase(codebase: Codebase) {}
     open fun afterVisitPackage(pkg: PackageItem) {}
-    open fun afterVisitSourceFile(sourceFile: SourceFileItem) {}
+    open fun afterVisitCompilationUnit(unit: CompilationUnit) {}
     open fun afterVisitClass(cls: ClassItem) {}
     open fun afterVisitConstructor(constructor: ConstructorItem) {
         if (visitConstructorsAsMethods) {
diff --git a/src/main/java/com/android/tools/metalava/model/visitors/TypeVisitor.kt b/src/main/java/com/android/tools/metalava/model/visitors/TypeVisitor.kt
index f827d38..510d2b6 100644
--- a/src/main/java/com/android/tools/metalava/model/visitors/TypeVisitor.kt
+++ b/src/main/java/com/android/tools/metalava/model/visitors/TypeVisitor.kt
@@ -23,4 +23,4 @@
     open fun skip(item: Item): Boolean = false
     open fun visitType(type: TypeItem, owner: Item) {}
     open fun afterVisitType(type: TypeItem, owner: Item) {}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/stub/JavaStubWriter.kt b/src/main/java/com/android/tools/metalava/stub/JavaStubWriter.kt
index 08d6d32..f0e3aac 100644
--- a/src/main/java/com/android/tools/metalava/stub/JavaStubWriter.kt
+++ b/src/main/java/com/android/tools/metalava/stub/JavaStubWriter.kt
@@ -16,6 +16,7 @@
 
 package com.android.tools.metalava.stub
 
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.model.AnnotationTarget
 import com.android.tools.metalava.model.ClassItem
 import com.android.tools.metalava.model.ConstructorItem
@@ -53,7 +54,8 @@
                 // All the classes referenced in the stubs are fully qualified, so no imports are
                 // needed. However, in some cases for javadoc, replacement with fully qualified name
                 // fails and thus we need to include imports for the stubs to compile.
-                cls.getSourceFile()?.getImportStatements(filterReference)?.let {
+                val compilationUnit = cls.getCompilationUnit()
+                compilationUnit?.getImportStatements(filterReference)?.let {
                     for (item in it) {
                         when (item) {
                             is PackageItem ->
@@ -158,6 +160,7 @@
         ModifierList.write(
             writer, modifiers, item,
             target = annotationTarget,
+            includeAnnotations = true,
             includeDeprecated = true,
             runtimeAnnotationsOnly = !generateAnnotations,
             removeAbstract = removeAbstract,
@@ -218,6 +221,8 @@
                 writer.print(" ")
                 writer.print(type.toTypeString())
             }
+        } else if (compatibility.classForAnnotations && cls.isAnnotationType()) {
+            writer.print(" implements java.lang.annotation.Annotation")
         }
     }
 
diff --git a/src/main/java/com/android/tools/metalava/stub/KotlinStubWriter.kt b/src/main/java/com/android/tools/metalava/stub/KotlinStubWriter.kt
index 98440df..154d8ce 100644
--- a/src/main/java/com/android/tools/metalava/stub/KotlinStubWriter.kt
+++ b/src/main/java/com/android/tools/metalava/stub/KotlinStubWriter.kt
@@ -48,7 +48,8 @@
                 writer.println("package $qualifiedName")
                 writer.println()
             }
-            cls.getSourceFile()?.getImportStatements(filterReference)?.let {
+            val compilationUnit = cls.getCompilationUnit()
+            compilationUnit?.getImportStatements(filterReference)?.let {
                 for (item in it) {
                     when (item) {
                         is PackageItem ->
@@ -114,6 +115,7 @@
         ModifierList.write(
             writer, modifiers, item,
             target = annotationTarget,
+            includeAnnotations = true,
             skipNullnessAnnotations = true,
             includeDeprecated = true,
             runtimeAnnotationsOnly = !generateAnnotations,
@@ -297,4 +299,4 @@
             writer.print(")")
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/metalava/stub/StubWriter.kt b/src/main/java/com/android/tools/metalava/stub/StubWriter.kt
index e11d8ef..2418379 100644
--- a/src/main/java/com/android/tools/metalava/stub/StubWriter.kt
+++ b/src/main/java/com/android/tools/metalava/stub/StubWriter.kt
@@ -201,7 +201,8 @@
             }
 
             // Copyright statements from the original file?
-            cls.getSourceFile()?.getHeaderComments()?.let { textWriter.println(it) }
+            val compilationUnit = cls.getCompilationUnit()
+            compilationUnit?.getHeaderComments()?.let { textWriter.println(it) }
         }
         stubWriter?.visitClass(cls)
     }
@@ -255,4 +256,4 @@
             writer.println()
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties
index 9829871..87cce1a 100644
--- a/src/main/resources/version.properties
+++ b/src/main/resources/version.properties
@@ -2,4 +2,4 @@
 # Version definition
 # This file is read by gradle build scripts, but also packaged with metalava
 # as a resource for the Version classes to read.
-metalavaVersion=1.0.0-alpha06
+metalavaVersion=1.0.0-alpha03
diff --git a/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt b/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
index 000703e..07fd835 100644
--- a/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
+++ b/src/test/java/com/android/tools/metalava/AndroidApiChecksTest.kt
@@ -23,8 +23,8 @@
     fun `Flag TODO documentation`() {
         check(
             expectedIssues = """
-                src/android/pkg/Test.java:4: lint: Documentation mentions 'TODO' [Todo]
-                src/android/pkg/Test.java:6: lint: Documentation mentions 'TODO' [Todo]
+                src/android/pkg/Test.java:3: lint: Documentation mentions 'TODO' [Todo]
+                src/android/pkg/Test.java:5: lint: Documentation mentions 'TODO' [Todo]
                 """,
             sourceFiles = arrayOf(
                 // Nothing in outside of Android
@@ -66,8 +66,8 @@
     fun `Document Permissions`() {
         check(
             expectedIssues = """
-                src/android/pkg/PermissionTest.java:14: lint: Method 'test0' documentation mentions permissions without declaring @RequiresPermission [RequiresPermission]
-                src/android/pkg/PermissionTest.java:21: lint: Method 'test1' documentation mentions permissions already declared by @RequiresPermission [RequiresPermission]
+                src/android/pkg/PermissionTest.java:10: lint: Method 'test0' documentation mentions permissions without declaring @RequiresPermission [RequiresPermission]
+                src/android/pkg/PermissionTest.java:19: lint: Method 'test1' documentation mentions permissions already declared by @RequiresPermission [RequiresPermission]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -125,9 +125,9 @@
     fun `Document Intent Actions`() {
         check(
             expectedIssues = """
-                src/android/pkg/IntentActionTest.java:30: lint: Field 'BAR_FOO_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) [SdkConstant]
-                src/android/pkg/IntentActionTest.java:19: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @BroadcastBehavior [BroadcastBehavior]
-                src/android/pkg/IntentActionTest.java:19: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) [SdkConstant]
+                src/android/pkg/IntentActionTest.java:27: lint: Field 'BAR_FOO_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) [SdkConstant]
+                src/android/pkg/IntentActionTest.java:16: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @BroadcastBehavior [BroadcastBehavior]
+                src/android/pkg/IntentActionTest.java:16: lint: Field 'FOO_BAR_ERROR_ACTION' is missing @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) [SdkConstant]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -176,8 +176,8 @@
         check(
             expectedIssues = """
                 src/android/pkg/NullMentions.java:18: warning: Parameter 'param1' of 'method3' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
-                src/android/pkg/NullMentions.java:21: warning: Return value of 'method4' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
-                src/android/pkg/NullMentions.java:9: warning: Field 'field2' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
+                src/android/pkg/NullMentions.java:19: warning: Return value of 'method4' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
+                src/android/pkg/NullMentions.java:8: warning: Field 'field2' documentation mentions 'null' without declaring @NonNull or @Nullable [Nullable]
                 """,
             extraArguments = arrayOf(ARG_WARNING, "Nullable"), // Hidden by default
             sourceFiles = arrayOf(
@@ -220,7 +220,7 @@
     fun `Check IntDef Warnings`() {
         check(
             expectedIssues = """
-                src/android/pkg/NullMentions.java:16: warning: Field 'field1' documentation mentions constants without declaring an @IntDef [IntDef]
+                src/android/pkg/NullMentions.java:15: warning: Field 'field1' documentation mentions constants without declaring an @IntDef [IntDef]
                 """,
             extraArguments = arrayOf(ARG_WARNING, "IntDef"), // Hidden by default
             sourceFiles = arrayOf(
diff --git a/src/test/java/com/android/tools/metalava/AnnotationStatisticsTest.kt b/src/test/java/com/android/tools/metalava/AnnotationStatisticsTest.kt
new file mode 100644
index 0000000..78a96ef
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/AnnotationStatisticsTest.kt
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava
+
+import com.android.tools.lint.checks.infrastructure.TestFiles.base64gzip
+import com.android.tools.lint.checks.infrastructure.TestFiles.jar
+import org.junit.Test
+
+class AnnotationStatisticsTest : DriverTest() {
+    @Test
+    fun `Test emitting annotation statistics`() {
+        check(
+            extraArguments = arrayOf(ARG_ANNOTATION_COVERAGE_STATS),
+            expectedOutput = """
+                Nullness Annotation Coverage Statistics:
+                0 out of 1 eligible fields (out of 2 total fields) were annotated (0%)
+                0 out of 0 eligible methods (out of 2 total methods) were fully annotated (100%)
+                    0 out of 0 eligible method returns were annotated (100%)
+                    0 out of 0 eligible parameters were annotated (100%)
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+
+                    @SuppressWarnings("ALL")
+                    public class Foo {
+                        public final static String foo1 = "constant";
+                        public final static String foo2 = System.getProperty("not.constant");
+                        public void test() {
+                            String foo1 = foo1();
+                            String foo2 = foo2();
+                            test();
+
+                        }
+                    }
+                    """
+                )
+            ),
+            compatibilityMode = false
+        )
+    }
+
+    @Test
+    fun `Static final initialized fields are not nullable`() {
+        check(
+            extraArguments = arrayOf(ARG_ANNOTATION_COVERAGE_STATS),
+            expectedOutput = """
+                Nullness Annotation Coverage Statistics:
+                0 out of 0 eligible fields (out of 0 total fields) were annotated (100%)
+                4 out of 5 eligible methods (out of 6 total methods) were fully annotated (80%)
+                    4 out of 5 eligible method returns were annotated (80%)
+                    4 out of 5 eligible parameters were annotated (80%)
+                """,
+            compatibilityMode = false,
+            signatureSource = """
+                package test.pkg {
+                  public class MyTest {
+                    ctor public MyTest();
+                    method public java.lang.Double convert0(java.lang.Float);
+                    method @androidx.annotation.Nullable public java.lang.Double convert1(@androidx.annotation.NonNull java.lang.Float);
+                    method @androidx.annotation.Nullable public java.lang.Double convert2(@androidx.annotation.NonNull java.lang.Float);
+                    method @androidx.annotation.Nullable public java.lang.Double convert3(@androidx.annotation.NonNull java.lang.Float);
+                    method @androidx.annotation.Nullable public java.lang.Double convert4(@androidx.annotation.NonNull java.lang.Float);
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
+    fun `Test counting annotation usages of missing APIs`() {
+        check(
+            coverageJars = arrayOf(
+                /*
+                    package test.pkg;
+
+                    public class ApiUsage {
+                        ApiUsage() {
+                            new ApiSurface(null).annotated1("Hello");
+                            new ApiSurface(null).missing1(null);
+                        }
+
+                        Number myField = new ApiSurface(null, 5).missingField1;
+
+                        public void usage() {
+                            ApiSurface apiSurface = new ApiSurface(null, 5);
+                            apiSurface.annotated1("Hello");
+                            apiSurface.missing1(null);
+                            apiSurface.missing2(null, 5);
+                            apiSurface.missing3(5);
+                            apiSurface.missing4(null);
+                            apiSurface.missing5("Hello");
+                        }
+                    }
+                 */
+                jar(
+                    "libs/api-usage.jar",
+                    base64gzip(
+                        "test/pkg/ApiUsage.class", "" +
+                            "H4sIAAAAAAAAAH1Ta28SQRQ9Q4Fd1qW0VPD9KNZKWe0WaH3VmBiTRpKNfqiW" +
+                            "+HGgIw4uu4RdTPzqPzJRSDTxB/ijjHcGWqqlZjNn5945c86du7O/fn//CaCO" +
+                            "xxZyuG7ghoUEbmYIVjNYREmFt0ysqfdtBesK7igoK9hQUDHgGLjLYPQ+7Unh" +
+                            "HzLkvS7/yF2fBx335bDXEoNdhvQTGcj4KcNCeeOAIfk8PBQMOU8GYsJ5zVu+" +
+                            "UJvDNvcP+ECqeJpMxu9lxLDixSKK3f6HjvusL99EvCNIOTVUEwaL9+X+cPCO" +
+                            "tyko/EWdpols7YfDQVvsSSWbPVLZVAXbyGOFTOZsVEv3bGxi2caSgjxcMn4h" +
+                            "fD+0sYWqjRrqNraxY+M+Hth4qHKPUGVYPlUzw9KsQa9aXdGOGYpl79/kbkN1" +
+                            "KtuTUSSDjm4u6RXmEBXP4kEQxjwWirQ+j3Q6xWBO1c8SbswotbOKPMGpK5nG" +
+                            "f522Z9MdrNI9y9ElZDSosYQJGvQdKHOeZl2k9NpWZQxW+YHEW2aOsfAVyW9I" +
+                            "6XCMdN4YwWweRWyETPOLVioQFkkBSNKTIcUUSkjDhUF5wJ5o4wIu6houHft+" +
+                            "Jr6qpHZs6TkTG0frO8wcwWo6hOd0ym7q9ewJ5xJM7WEhSydbJBf6y+iUaxRV" +
+                            "6IxVcivqCrXTtAoLZVzGFaqD4arWuvYH9nECI6kDAAA="
+                    )
+                )
+            ),
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+
+                    import androidx.annotation.NonNull;
+                    import androidx.annotation.Nullable;
+
+                    public class ApiSurface {
+                        ApiSurface(Object param) {
+                        }
+
+                        ApiSurface(@Nullable Object param, int param2) {
+                        }
+
+                        @Nullable public Object annotated1(@NonNull Object param1) { return null; }
+                        public int annotated2(@NonNull Object param1, int param2) { return 1; }
+
+                        @NonNull public String annotatedField1 = "";
+                        public int annotatedField2;
+                        public Number missingField1;
+                        public Number missingField2;
+
+                        public int missing1(Object param1) { return 0; }
+                        public int missing2(Object param1, int param2) { return 0; }
+                        public Object missing3(int param1) { return null; }
+                        @Nullable public Object missing4(Object param1) { return null; }
+                        public Object missing5(@NonNull Object param1) { return null; }
+
+                        public class InnerClass {
+                            @Nullable public Object annotated3(@NonNull Object param1) { return null; }
+                            public int annotated4(@NonNull Object param1, int param2) { return 1; }
+                            public int missing1(Object param1) { return 0; }
+                            public int missing2(Object param1, int param2) { return 0; }
+                        }
+                    }
+                    """
+                ),
+                androidxNonNullSource,
+                androidxNullableSource
+            ),
+            expectedOutput = """
+                6 methods and fields were missing nullness annotations out of 8 total API references.
+                API nullness coverage is 25%
+
+
+                Top referenced un-annotated classes:
+
+                | Qualified Class Name                                         |      Usage Count |
+                |--------------------------------------------------------------|-----------------:|
+                | test.pkg.ApiSurface                                          |                7 |
+
+                Top referenced un-annotated members:
+
+                | Member                                                       |      Usage Count |
+                |--------------------------------------------------------------|-----------------:|
+                | ApiSurface.missing1(Object)                                  |                2 |
+                | ApiSurface.missingField1                                     |                1 |
+                | ApiSurface.missing2(Object, int)                             |                1 |
+                | ApiSurface.missing3(int)                                     |                1 |
+                | ApiSurface.missing4(Object)                                  |                1 |
+                | ApiSurface.missing5(Object)                                  |                1 |
+                """,
+            compatibilityMode = false
+        )
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/AnnotationsDifferTest.kt b/src/test/java/com/android/tools/metalava/AnnotationsDifferTest.kt
index 702e2af..1b09cf4 100644
--- a/src/test/java/com/android/tools/metalava/AnnotationsDifferTest.kt
+++ b/src/test/java/com/android/tools/metalava/AnnotationsDifferTest.kt
@@ -30,10 +30,8 @@
 
     @Test
     fun `Write diff`() {
-        options = Options(arrayOf(ARG_CLASS_PATH, DriverTest.getAndroidJar().path))
         val codebase = ApiFile.parseApi(
-            "old.txt",
-            """
+            "old.txt", """
                 package test.pkg {
                   public interface Appendable {
                     method public test.pkg.Appendable append(java.lang.CharSequence?);
@@ -44,38 +42,34 @@
                     method public test.pkg.Appendable append(java.lang.CharSequence);
                   }
                 }
-            """.trimIndent(),
-            true
+        """.trimIndent(), true
         )
 
         val codebase2 = ApiFile.parseApi(
-            "new.txt",
-            """
+            "new.txt", """
         package test.pkg {
           public interface Appendable {
             method @androidx.annotation.NonNull public test.pkg.Appendable append(@androidx.annotation.Nullable java.lang.CharSequence);
             method public test.pkg.Appendable append2(java.lang.CharSequence);
           }
         }
-            """.trimIndent(),
-            false
+        """.trimIndent(), false
         )
 
         val apiFile = temporaryFolder.newFile("diff.txt")
-        options = Options(arrayOf(ARG_CLASS_PATH, DriverTest.getAndroidJar().path))
+        compatibility = Compatibility(true)
+        options = Options(emptyArray())
         AnnotationsDiffer(codebase, codebase2).writeDiffSignature(apiFile)
         assertTrue(apiFile.exists())
         val actual = apiFile.readText(UTF_8)
         assertEquals(
             """
-            // Signature format: 2.0
             package test.pkg {
-              public interface Appendable {
-                method @NonNull public test.pkg.Appendable append2(@Nullable CharSequence);
+              public abstract interface Appendable {
+                method public abstract test.pkg.Appendable append2(java.lang.CharSequence);
               }
             }
-            """.trimIndent(),
-            actual.trim()
+        """.trimIndent(), actual.trim()
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/AnnotationsMergerTest.kt b/src/test/java/com/android/tools/metalava/AnnotationsMergerTest.kt
index 3ade649..8193640 100644
--- a/src/test/java/com/android/tools/metalava/AnnotationsMergerTest.kt
+++ b/src/test/java/com/android/tools/metalava/AnnotationsMergerTest.kt
@@ -28,9 +28,10 @@
     @Test
     fun `Signature files contain annotations`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             includeSystemApiAnnotations = false,
+            omitCommonPackages = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -57,14 +58,15 @@
             extraArguments = arrayOf(
                 ARG_HIDE_PACKAGE, "android.annotation",
                 ARG_HIDE_PACKAGE, "androidx.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
             api = """
                 package test.pkg {
-                  @UiThread public class MyTest {
+                  @androidx.annotation.UiThread public class MyTest {
                     ctor public MyTest();
-                    method @IntRange(from=10, to=20) public int clamp(int);
-                    method @Nullable public Double convert(@NonNull Float);
-                    field @Nullable public Number myNumber;
+                    method @androidx.annotation.IntRange(from=10, to=20) public int clamp(int);
+                    method @androidx.annotation.Nullable public java.lang.Double convert(@androidx.annotation.NonNull java.lang.Float);
+                    field @androidx.annotation.Nullable public java.lang.Number myNumber;
                   }
                 }
                 """
@@ -74,7 +76,6 @@
     @Test
     fun `Merged class and method annotations with no arguments`() {
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -88,23 +89,25 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeXmlAnnotations = """<?xml version="1.0" encoding="UTF-8"?>
                 <root>
                   <item name="test.pkg.MyTest">
-                    <annotation name="androidx.annotation.UiThread" />
+                    <annotation name="android.support.annotation.UiThread" />
                   </item>
                   <item name="test.pkg.MyTest java.lang.Double convert(java.lang.Float)">
-                    <annotation name="androidx.annotation.Nullable" />
+                    <annotation name="android.support.annotation.Nullable" />
                   </item>
                   <item name="test.pkg.MyTest java.lang.Double convert(java.lang.Float) 0">
-                    <annotation name="androidx.annotation.NonNull" />
+                    <annotation name="android.support.annotation.NonNull" />
                   </item>
                   <item name="test.pkg.MyTest myNumber">
-                    <annotation name="androidx.annotation.Nullable" />
+                    <annotation name="android.support.annotation.Nullable" />
                   </item>
                   <item name="test.pkg.MyTest int clamp(int)">
-                    <annotation name="androidx.annotation.IntRange">
+                    <annotation name="android.support.annotation.IntRange">
                       <val name="from" val="10" />
                       <val name="to" val="20" />
                     </annotation>
@@ -119,11 +122,11 @@
                 """,
             api = """
                 package test.pkg {
-                  @UiThread public class MyTest {
+                  @androidx.annotation.UiThread public class MyTest {
                     ctor public MyTest();
-                    method @IntRange(from=10, to=20) public int clamp(@IntRange(from=-1L, to=java.lang.Integer.MAX_VALUE) int);
-                    method @Nullable public Double convert(@NonNull Float);
-                    field @Nullable public Number myNumber;
+                    method @androidx.annotation.IntRange(from=10, to=20) public int clamp(@androidx.annotation.IntRange(from=-1L, to=java.lang.Integer.MAX_VALUE) int);
+                    method @androidx.annotation.Nullable public java.lang.Double convert(@androidx.annotation.NonNull java.lang.Float);
+                    field @androidx.annotation.Nullable public java.lang.Number myNumber;
                   }
                 }
                 """
@@ -133,7 +136,6 @@
     @Test
     fun `Merge signature files`() {
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -145,8 +147,10 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             inputKotlinStyleNulls = true,
+            omitCommonPackages = false,
             mergeSignatureAnnotations = """
                 package test.pkg {
                   public interface Appendable {
@@ -162,7 +166,7 @@
             api = """
                 package test.pkg {
                   public interface Appendable {
-                    method @NonNull public test.pkg.Appendable append(@Nullable CharSequence);
+                    method @androidx.annotation.NonNull public test.pkg.Appendable append(@androidx.annotation.Nullable java.lang.CharSequence);
                   }
                 }
                 """,
@@ -177,7 +181,6 @@
     @Test
     fun `Merge qualifier annotations from Java stub files`() {
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -191,7 +194,9 @@
                 libcoreNonNullSource,
                 libcoreNullableSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -205,7 +210,7 @@
             api = """
                 package test.pkg {
                   public interface Appendable {
-                    method @NonNull public test.pkg.Appendable append(@Nullable CharSequence);
+                    method @androidx.annotation.NonNull public test.pkg.Appendable append(@androidx.annotation.Nullable java.lang.CharSequence);
                   }
                 }
                 """,
@@ -243,7 +248,9 @@
                 libcoreNonNullSource,
                 libcoreNullableSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -293,7 +300,6 @@
     fun `Merge type use qualifier annotations from Java stub files`() {
         // See b/123223339
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -308,7 +314,9 @@
                 libcoreNonNullSource,
                 libcoreNullableSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -319,7 +327,7 @@
             api = """
                 package test.pkg {
                   public class Test {
-                    method public void foo(@NonNull java.lang.Object...);
+                    method public void foo(@androidx.annotation.NonNull java.lang.Object...);
                   }
                 }
                 """,
@@ -330,7 +338,6 @@
     @Test
     fun `Merge qualifier annotations from Java stub files making sure they apply to public members of hidden superclasses`() {
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -351,7 +358,9 @@
                 libcoreNonNullSource,
                 libcoreNullableSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -366,7 +375,7 @@
                 package test.pkg {
                   public class PublicClass {
                     ctor public PublicClass();
-                    method @NonNull public String publicMethod(@Nullable Object);
+                    method @androidx.annotation.NonNull public java.lang.String publicMethod(@androidx.annotation.Nullable java.lang.Object);
                   }
                 }
                 """,
@@ -402,7 +411,9 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             hideAnnotations = arrayOf("test.annotation.Hide"),
             showAnnotations = arrayOf("test.annotation.Show"),
             showUnannotated = true,
@@ -447,7 +458,9 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             extraArguments = arrayOf(
                 ARG_HIDE_ANNOTATION, "test.annotation.Hide",
                 ARG_SHOW_SINGLE_ANNOTATION, "test.annotation.Show"
@@ -489,7 +502,9 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             extraArguments = arrayOf(
                 ARG_SHOW_SINGLE_ANNOTATION, "test.annotation.Show"
             ),
@@ -550,6 +565,7 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             extraArguments = arrayOf(
                 ARG_SHOW_SINGLE_ANNOTATION, "libcore.api.CorePlatformApi"
             ),
@@ -568,7 +584,6 @@
         // This is a contrived test that verifies that even if Child no longer directly declares
         // method1, the inherited method1 is still found
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -588,6 +603,7 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -610,155 +626,4 @@
             expectedIssues = "" // should not report that Child.method1 is undefined
         )
     }
-
-    @Test
-    fun `Merge Contract and Language annotations from XML files`() {
-        check(
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package android.text;
-
-                    public class TextUtils {
-                        public static boolean isEmpty(CharSequence str) {
-                            return str == null || str.length() == 0;
-                        }
-                    }
-                    """
-                ),
-                java(
-                    """
-                    package android.graphics;
-                    public class RuntimeShader {
-                        public RuntimeShader(@NonNull String sksl) {
-                        }
-                    }
-                    """
-                )
-            ),
-            outputKotlinStyleNulls = false,
-            mergeXmlAnnotations = """<?xml version="1.0" encoding="UTF-8"?>
-                <root>
-                  <item name="android.text.TextUtils boolean isEmpty(java.lang.CharSequence)">
-                    <annotation name="org.jetbrains.annotations.Contract">
-                      <val name="value" val="&quot;null-&gt;true&quot;" />
-                    </annotation>
-                  </item>
-                  <item name="android.text.TextUtils boolean isEmpty(java.lang.CharSequence) 0">
-                    <annotation name="androidx.annotation.Nullable" />
-                  </item>
-                  <item name="android.graphics.RuntimeShader RuntimeShader(java.lang.String) 0">
-                    <annotation name="org.intellij.lang.annotations.Language">
-                      <val name="value" val="&quot;AGSL&quot;" />
-                    </annotation>
-                  </item>
-                  <item name="android.graphics.RuntimeShader RuntimeShader(java.lang.String, boolean) 0">
-                    <annotation name="org.intellij.lang.annotations.Language">
-                      <val name="value" val="&quot;AGSL&quot;" />
-                    </annotation>
-                  </item>
-                </root>
-                """,
-            api = """
-                // Signature format: 4.0
-                package android.graphics {
-                  public class RuntimeShader {
-                    ctor public RuntimeShader(String);
-                  }
-                }
-                package android.text {
-                  public class TextUtils {
-                    ctor public TextUtils();
-                    method public static boolean isEmpty(CharSequence?);
-                  }
-                }
-                """,
-            extractAnnotations = mapOf(
-                "android.text" to """
-                <?xml version="1.0" encoding="UTF-8"?>
-                <root>
-                  <item name="android.text.TextUtils boolean isEmpty(java.lang.CharSequence)">
-                    <annotation name="org.jetbrains.annotations.Contract">
-                      <val name="value" val="&quot;null-&gt;true&quot;" />
-                    </annotation>
-                  </item>
-                </root>
-                """,
-                "android.graphics" to """
-                <?xml version="1.0" encoding="UTF-8"?>
-                <root>
-                  <item name="android.graphics.RuntimeShader RuntimeShader(java.lang.String) 0">
-                    <annotation name="org.intellij.lang.annotations.Language">
-                      <val name="value" val="&quot;AGSL&quot;" />
-                    </annotation>
-                  </item>
-                </root>
-                """
-            )
-        )
-    }
-
-    @Test
-    fun `Merge Contract and Language annotations from signature files`() {
-        check(
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package android.text;
-
-                    public class TextUtils {
-                        public static boolean isEmpty(CharSequence str) {
-                            return str == null || str.length() == 0;
-                        }
-                    }
-                    """
-                ),
-                java(
-                    """
-                    package android.graphics;
-                    public class RuntimeShader {
-                        public RuntimeShader(@NonNull String sksl) {
-                        }
-                    }
-                    """
-                )
-            ),
-            outputKotlinStyleNulls = false,
-            mergeSignatureAnnotations = """
-                // Signature format: 4.0
-                package android.graphics {
-                  public class RuntimeShader {
-                    ctor public RuntimeShader(@org.intellij.lang.annotations.Language("AGSL") String);
-                  }
-                }
-                package android.text {
-                  public class TextUtils {
-                    method @org.jetbrains.annotations.Contract("null->true") public static boolean isEmpty(CharSequence?);
-                  }
-                }
-            """,
-            extractAnnotations = mapOf(
-                "android.text" to """
-                <?xml version="1.0" encoding="UTF-8"?>
-                <root>
-                  <item name="android.text.TextUtils boolean isEmpty(java.lang.CharSequence)">
-                    <annotation name="org.jetbrains.annotations.Contract">
-                      <val name="value" val="&quot;null-&gt;true&quot;" />
-                    </annotation>
-                  </item>
-                </root>
-                """,
-                "android.graphics" to """
-                <?xml version="1.0" encoding="UTF-8"?>
-                <root>
-                  <item name="android.graphics.RuntimeShader RuntimeShader(java.lang.String) 0">
-                    <annotation name="org.intellij.lang.annotations.Language">
-                      <val name="value" val="&quot;AGSL&quot;" />
-                    </annotation>
-                  </item>
-                </root>
-                """
-            )
-        )
-    }
 }
diff --git a/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt b/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt
index 1adf181..db32742 100644
--- a/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiAnalyzerTest.kt
@@ -24,13 +24,12 @@
         check(
             showAnnotations = arrayOf("android.annotation.SystemApi"),
             expectedIssues = """
-                src/test/pkg/SystemApiClass.java:7: error: badAbstractHiddenMethod cannot be hidden and abstract when SystemApiClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
-                src/test/pkg/PublicClass.java:5: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/SystemApiClass.java:6: error: badAbstractHiddenMethod cannot be hidden and abstract when SystemApiClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/PublicClass.java:4: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
                 src/test/pkg/PublicClass.java:6: error: badPackagePrivateMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
             """,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import android.annotation.SystemApi;
                     public abstract class PublicClass {
@@ -47,8 +46,7 @@
                     }
                 """
                 ),
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import android.annotation.SystemApi;
                     public abstract class PublicClassWithHiddenConstructor {
@@ -58,8 +56,7 @@
                     }
                 """
                 ),
-                java(
-                    """
+                java("""
                    package test.pkg;
                    import android.annotation.SystemApi;
                    /** @hide */
@@ -77,8 +74,7 @@
                    }
                """
                 ),
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import android.annotation.SystemApi;
                     /** This class is OK because it is all hidden @hide */
@@ -96,13 +92,12 @@
     fun `Hidden abstract method for public API`() {
         check(
             expectedIssues = """
-                src/test/pkg/PublicClass.java:5: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/PublicClass.java:4: error: badAbstractHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
                 src/test/pkg/PublicClass.java:6: error: badPackagePrivateMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
-                src/test/pkg/PublicClass.java:9: error: badAbstractSystemHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
+                src/test/pkg/PublicClass.java:7: error: badAbstractSystemHiddenMethod cannot be hidden and abstract when PublicClass has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
             """,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import android.annotation.SystemApi;
                     public abstract class PublicClass {
@@ -119,4 +114,4 @@
             )
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/ApiFileTest.kt b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
index 131071a..05d72ae 100644
--- a/src/test/java/com/android/tools/metalava/ApiFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFileTest.kt
@@ -85,6 +85,7 @@
     fun `Parameter Names in Java`() {
         // Java code which explicitly specifies parameter names
         check(
+            compatibilityMode = false, // parameter names only in v2
             sourceFiles = arrayOf(
                 java(
                     """
@@ -151,6 +152,7 @@
         // Kotlin code which explicitly specifies parameter names
         check(
             format = FileFormat.V3,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -293,6 +295,7 @@
     fun `Basic Kotlin class`() {
         check(
             format = FileFormat.V1,
+            extraArguments = arrayOf("--parameter-names=true"),
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -333,29 +336,29 @@
             api = """
                 package test.pkg {
                   public final class Kotlin extends test.pkg.Parent {
-                    ctor public Kotlin(@NonNull String property1, int arg2);
-                    method @NonNull public String getProperty1();
-                    method @Nullable public String getProperty2();
+                    ctor public Kotlin(java.lang.String property1, int arg2);
+                    method public java.lang.String getProperty1();
+                    method public java.lang.String getProperty2();
                     method public void otherMethod(boolean ok, int times);
-                    method public void setProperty2(@Nullable String);
-                    property @NonNull public final String property1;
-                    property @Nullable public final String property2;
-                    field @NonNull public static final test.pkg.Kotlin.Companion Companion;
+                    method public void setProperty2(java.lang.String property2);
+                    property public final java.lang.String property1;
+                    property public final java.lang.String property2;
+                    field public static final test.pkg.Kotlin.Companion Companion;
                     field public static final int MY_CONST = 42; // 0x2a
                     field public int someField2;
                   }
                   public static final class Kotlin.Companion {
                   }
                   public final class KotlinKt {
-                    method @NonNull public static inline operator String component1(@NonNull String);
+                    method public static inline operator java.lang.String component1(java.lang.String);
                     method public static inline int getRed(int);
                     method public static inline boolean isSrgb(long);
                   }
                   public class Parent {
                     ctor public Parent();
-                    method @Nullable public String method();
-                    method @Nullable public String method2(boolean value, @Nullable Boolean value);
-                    method public int method3(@Nullable Integer value, int value2);
+                    method public java.lang.String method();
+                    method public java.lang.String method2(boolean value, java.lang.Boolean value);
+                    method public int method3(java.lang.Integer value, int value2);
                   }
                 }
                 """
@@ -365,7 +368,6 @@
     @Test
     fun `Kotlin Reified Methods`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -392,11 +394,11 @@
                 package test.pkg {
                   public class Context {
                     ctor public Context();
-                    method public final <T> T getSystemService(Class<T>);
+                    method public final <T> T getSystemService(java.lang.Class<T>);
                   }
-                  public final class TestKt {
-                    method public static inline <reified T> T systemService1(@NonNull test.pkg.Context);
-                    method public static inline String systemService2(@NonNull test.pkg.Context);
+                  public final class _java_Kt {
+                    method public static inline <reified T> T systemService1(test.pkg.Context);
+                    method public static inline java.lang.String systemService2(test.pkg.Context);
                   }
                 }
                 """
@@ -406,7 +408,7 @@
     @Test
     fun `Kotlin Reified Methods 2`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -439,7 +441,7 @@
     @Test
     fun `Suspend functions`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -454,8 +456,8 @@
             api = """
                 package test.pkg {
                   public final class TestKt {
-                    method @Nullable public static suspend inline Object hello(int foo, @NonNull kotlin.coroutines.Continuation<? super kotlin.Unit>);
-                    method @Nullable public static suspend Object helloTwoContinuations(@NonNull kotlin.coroutines.Continuation<java.lang.Object> myContinuation, @NonNull kotlin.coroutines.Continuation<? super kotlin.Unit>);
+                    method @Nullable public static suspend inline Object hello(int foo, @NonNull kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+                    method @Nullable public static suspend Object helloTwoContinuations(@NonNull kotlin.coroutines.Continuation<java.lang.Object> myContinuation, @NonNull kotlin.coroutines.Continuation<? super kotlin.Unit> p);
                   }
                 }
                 """
@@ -512,6 +514,7 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             api = """
                 // Signature format: 3.0
                 package test.pkg {
@@ -530,6 +533,7 @@
     @Test
     fun `Nullness in reified signatures`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 kotlin(
                     "src/test/pkg/test.kt",
@@ -589,8 +593,7 @@
                 ARG_HIDE_PACKAGE, "test.pkg2",
                 ARG_HIDE, "ReferencesHidden",
                 ARG_HIDE, "UnavailableSymbol",
-                ARG_HIDE, "HiddenTypeParameter",
-                ARG_HIDE, "HiddenSuperclass"
+                ARG_HIDE, "HiddenTypeParameter"
             )
         )
     }
@@ -598,6 +601,7 @@
     @Test
     fun `Nullness in varargs`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -692,6 +696,7 @@
     @Test
     fun `Propagate Platform types in Kotlin`() {
         check(
+            compatibilityMode = false,
             format = FileFormat.V3,
             sourceFiles = arrayOf(
                 kotlin(
@@ -821,7 +826,7 @@
         // Don't emit platform types for some unannotated elements that we know the
         // nullness for: annotation type members, equals-parameters, initialized constants, etc.
         check(
-            format = FileFormat.V3,
+            compatibilityMode = false,
             outputKotlinStyleNulls = true,
             sourceFiles = arrayOf(
                 java(
@@ -975,6 +980,7 @@
         // Regression test for https://github.com/android/android-ktx/issues/366
         check(
             format = FileFormat.V3,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -1081,7 +1087,7 @@
                   public final class SimpleClass {
                     ctor public SimpleClass();
                     method public int getNonJvmField();
-                    method public void setNonJvmField(int);
+                    method public void setNonJvmField(int nonJvmField);
                     property public final int nonJvmField;
                     field public int jvmField;
                   }
@@ -1115,8 +1121,8 @@
                     ctor public SimpleClass();
                     method public int getAnotherProperty();
                     method public int myPropertyJvmGetter();
-                    method public void setAnotherProperty(int);
-                    method public void setMyProperty(int);
+                    method public void setAnotherProperty(int anotherProperty);
+                    method public void setMyProperty(int myProperty);
                     property public final int anotherProperty;
                     property public final int myProperty;
                   }
@@ -1154,7 +1160,7 @@
             api = """
                 // Signature format: 3.0
                 package test.pkg {
-                  @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalBar {
+                  @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalBar {
                   }
                   @test.pkg.ExperimentalBar public final class FancyBar {
                     ctor public FancyBar();
@@ -1199,8 +1205,7 @@
                     }
                 """
                 ),
-                kotlin(
-                    """
+                kotlin("""
                     package androidx.annotation.experimental
 
                     import kotlin.annotation.Retention
@@ -1226,16 +1231,15 @@
                          */
                         vararg val markerClass: KClass<out Annotation>
                     )
-                """
-                )
+                """)
             ),
             format = FileFormat.V3,
             api = """
                 // Signature format: 3.0
                 package androidx.annotation.experimental {
-                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.PROPERTY, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FILE, kotlin.annotation.AnnotationTarget.TYPEALIAS}) public @interface UseExperimental {
+                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface UseExperimental {
                     method public abstract kotlin.reflect.KClass<? extends java.lang.annotation.Annotation>[] markerClass();
-                    property public abstract kotlin.reflect.KClass<? extends java.lang.annotation.Annotation>[] markerClass;
+                    property public abstract kotlin.reflect.KClass<? extends java.lang.annotation.Annotation>![] markerClass;
                   }
                 }
                 package test.pkg {
@@ -1243,7 +1247,7 @@
                     ctor public AnotherSimpleClass();
                     method public void methodUsingFancyBar();
                   }
-                  @kotlin.Experimental @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalBar {
+                  @kotlin.Experimental @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface ExperimentalBar {
                   }
                   @test.pkg.ExperimentalBar public final class FancyBar {
                     ctor public FancyBar();
@@ -1264,7 +1268,6 @@
         // correctly (in particular, using fully qualified names instead of what appears in
         // the source code.)
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1274,16 +1277,14 @@
                             extends MyBaseInterface {
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package a.b.c;
                     @SuppressWarnings("ALL")
                     public interface MyStream<T, S extends MyStream<T, S>> extends test.pkg.AutoCloseable {
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     @SuppressWarnings("ALL")
@@ -1322,27 +1323,27 @@
             ),
             api = """
                     package a.b.c {
-                      public interface MyStream<T, S extends a.b.c.MyStream<T, S>> extends test.pkg.AutoCloseable {
+                      public abstract interface MyStream<T, S extends a.b.c.MyStream<T, S>> implements test.pkg.AutoCloseable {
                       }
                     }
                     package test.pkg {
-                      public interface AutoCloseable {
+                      public abstract interface AutoCloseable {
                       }
-                      public interface MyBaseInterface {
-                        method public void fun(int, String);
+                      public abstract interface MyBaseInterface {
+                        method public abstract void fun(int, java.lang.String);
                       }
-                      public interface MyInterface<T> extends test.pkg.MyBaseInterface {
+                      public abstract interface MyInterface<T> implements test.pkg.MyBaseInterface {
                       }
-                      public interface MyInterface2<T extends java.lang.Number> extends test.pkg.MyBaseInterface {
+                      public abstract interface MyInterface2<T extends java.lang.Number> implements test.pkg.MyBaseInterface {
                       }
-                      public abstract static class MyInterface2.Range<T extends java.lang.Comparable<? super T>> {
+                      public static abstract class MyInterface2.Range<T extends java.lang.Comparable<? super T>> {
                         ctor public MyInterface2.Range();
-                        field protected String myString;
+                        field protected java.lang.String myString;
                       }
                       public static class MyInterface2.TtsSpan<C extends test.pkg.MyInterface<?>> {
                         ctor public MyInterface2.TtsSpan();
                       }
-                      public interface MyOtherInterface extends test.pkg.MyBaseInterface test.pkg.AutoCloseable {
+                      public abstract interface MyOtherInterface implements test.pkg.AutoCloseable test.pkg.MyBaseInterface {
                       }
                     }
                 """,
@@ -1409,7 +1410,6 @@
         // Interface: makes sure the right modifiers etc are shown (and that "package private" methods
         // in the interface are taken to be public etc)
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1423,8 +1423,8 @@
             ),
             api = """
                 package test.pkg {
-                  public interface Foo {
-                    method public void foo();
+                  public abstract interface Foo {
+                    method public abstract void foo();
                   }
                 }
                 """
@@ -1433,8 +1433,9 @@
 
     @Test
     fun `Enum class extraction`() {
+        // Interface: makes sure the right modifiers etc are shown (and that "package private" methods
+        // in the interface are taken to be public etc)
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1448,7 +1449,9 @@
             ),
             api = """
                 package test.pkg {
-                  public enum Foo {
+                  public final class Foo extends java.lang.Enum {
+                    method public static test.pkg.Foo valueOf(java.lang.String) throws java.lang.IllegalArgumentException;
+                    method public static final test.pkg.Foo[] values();
                     enum_constant public static final test.pkg.Foo A;
                     enum_constant public static final test.pkg.Foo B;
                   }
@@ -1458,7 +1461,9 @@
     }
 
     @Test
-    fun `Enum class`() {
+    fun `Enum class, non-compat mode`() {
+        // Interface: makes sure the right modifiers etc are shown (and that "package private" methods
+        // in the interface are taken to be public etc)
         check(
             sourceFiles = arrayOf(
                 java(
@@ -1471,6 +1476,7 @@
                     """
                 )
             ),
+            compatibilityMode = false,
             api = """
                 package test.pkg {
                   public enum Foo {
@@ -1513,13 +1519,80 @@
             ),
             api = """
                 package android.annotation {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface SuppressLint {
-                    method public abstract String[] value();
+                  public abstract class SuppressLint implements java.lang.annotation.Annotation {
                   }
                 }
                 package test.pkg {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Foo {
-                    method public abstract String value();
+                  public abstract class Foo implements java.lang.annotation.Annotation {
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
+    fun `Do not include inherited public methods from private parents in compat mode`() {
+        // Real life example: StringBuilder.setLength, in compat mode
+        check(
+            compatibilityMode = true,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    public class MyStringBuilder extends AbstractMyStringBuilder {
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    class AbstractMyStringBuilder {
+                        public void setLength(int length) {
+                        }
+                    }
+                    """
+                )
+            ),
+            api = """
+                package test.pkg {
+                  public class MyStringBuilder {
+                    ctor public MyStringBuilder();
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
+    fun `Include inherited public methods from private parents`() {
+        // In non-compat mode, include public methods from hidden parents too.
+        // Real life example: StringBuilder.setLength
+        // This is just like the above test, but with compat mode disabled.
+        check(
+            compatibilityMode = false,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    public class MyStringBuilder extends AbstractMyStringBuilder {
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    class AbstractMyStringBuilder {
+                        public void setLength(int length) {
+                        }
+                    }
+                    """
+                )
+            ),
+            api = """
+                package test.pkg {
+                  public class MyStringBuilder {
+                    ctor public MyStringBuilder();
+                    method public void setLength(int);
                   }
                 }
                 """
@@ -1528,12 +1601,14 @@
 
     @Test
     fun `Skip inherited package private methods from private parents`() {
-        // Include public methods from hidden parents too.
+        // In non-compat mode, include public methods from hidden parents too.
         // Real life example: StringBuilder.setLength
+        // This is just like the above test, but with compat mode disabled.
         check(
             expectedIssues = """
                 src/test/pkg/PublicSuper.java:3: error: isContiguous cannot be hidden and abstract when PublicSuper has a visible constructor, in case a third-party attempts to subclass it. [HiddenAbstractMethod]
             """,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1584,12 +1659,55 @@
     }
 
     @Test
+    fun `Annotation class extraction, non-compat mode`() {
+        // Interface: makes sure the right modifiers etc are shown (and that "package private" methods
+        // in the interface are taken to be public etc)
+        check(
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    public @interface Foo {
+                        String value();
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package android.annotation;
+                    import static java.lang.annotation.ElementType.*;
+                    import java.lang.annotation.*;
+                    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
+                    @Retention(RetentionPolicy.CLASS)
+                    @SuppressWarnings("ALL")
+                    public @interface SuppressLint {
+                        String[] value();
+                    }
+                    """
+                )
+            ),
+            compatibilityMode = false,
+            api = """
+                package android.annotation {
+                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface SuppressLint {
+                    method public abstract String[] value();
+                  }
+                }
+                package test.pkg {
+                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Foo {
+                    method public abstract String value();
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
     fun `Annotation retention`() {
         // For annotations where the java.lang.annotation classes themselves are not
         // part of the source tree, ensure that we compute the right retention (runtime, meaning
         // it should show up in the stubs file.).
         check(
-            format = FileFormat.V3,
             extraArguments = arrayOf(ARG_EXCLUDE_ALL_ANNOTATIONS),
             sourceFiles = arrayOf(
                 java(
@@ -1626,6 +1744,7 @@
                     """.trimIndent()
                 )
             ),
+            format = FileFormat.V3,
             api = """
             // Signature format: 3.0
             package android.annotation {
@@ -1634,7 +1753,7 @@
               }
             }
             package test.pkg {
-              @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.RUNTIME) public @interface ExplicitRuntimeRetention {
+              @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) public @interface ExplicitRuntimeRetention {
               }
               @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Foo {
                 method public abstract String value();
@@ -1643,6 +1762,7 @@
               }
             }
             """.trimIndent(),
+            compatibilityMode = true,
             stubFiles = arrayOf(
                 // For annotations where the java.lang.annotation classes themselves are not
                 // part of the source tree, ensure that we compute the right retention (runtime, meaning
@@ -1716,7 +1836,6 @@
     @Test
     fun `Extract fields with types and initial values`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1751,7 +1870,7 @@
                 package test.pkg {
                   public class Foo {
                     ctor public Foo();
-                    field public static final String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef";
+                    field public static final java.lang.String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef";
                     field public static final char HEX_INPUT = 61184; // 0xef00 '\uef00'
                     field protected int field00;
                     field public static final boolean field01 = true;
@@ -1762,7 +1881,7 @@
                     field public static final char field06 = 99; // 0x0063 'c'
                     field public static final float field07 = 98.5f;
                     field public static final double field08 = 98.5;
-                    field public static final String field09 = "String with \"escapes\" and \u00a9...";
+                    field public static final java.lang.String field09 = "String with \"escapes\" and \u00a9...";
                     field public static final double field10 = (0.0/0.0);
                     field public static final double field11 = (1.0/0.0);
                   }
@@ -1779,7 +1898,6 @@
         // Note also how the "protected" modifier on the interface method gets
         // promoted to public.
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1814,18 +1932,18 @@
                     package test.pkg {
                       public abstract class Foo {
                         ctor public Foo();
-                        method @Deprecated public static final void method1();
-                        method @Deprecated public static final void method2();
+                        method public static final deprecated synchronized void method1();
+                        method public static final deprecated synchronized void method2();
                       }
-                      @Deprecated protected static final class Foo.Inner1 {
-                        ctor @Deprecated protected Foo.Inner1();
+                      protected static final deprecated class Foo.Inner1 {
+                        ctor protected Foo.Inner1();
                       }
-                      @Deprecated protected abstract static class Foo.Inner2 {
-                        ctor @Deprecated protected Foo.Inner2();
+                      protected static abstract deprecated class Foo.Inner2 {
+                        ctor protected Foo.Inner2();
                       }
-                      @Deprecated protected static interface Foo.Inner3 {
-                        method @Deprecated public default void method3();
-                        method @Deprecated public static void method4(int);
+                      protected static abstract deprecated interface Foo.Inner3 {
+                        method public default void method3();
+                        method public static void method4(int);
                       }
                     }
                 """
@@ -1840,7 +1958,7 @@
         // Note also how the "protected" modifier on the interface method gets
         // promoted to public.
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             sourceFiles = arrayOf(
                 java(
@@ -1873,6 +1991,55 @@
     }
 
     @Test
+    fun `Check all modifiers, non-compat mode`() {
+        // Like testModifiers but turns off compat mode, such that we have
+        // a modifier order more in line with standard code conventions
+        check(
+            compatibilityMode = false,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+
+                    @SuppressWarnings("ALL")
+                    public abstract class Foo {
+                        @Deprecated private static final long field1 = 5;
+                        @Deprecated private static volatile long field2 = 5;
+                        /** @deprecated */ @Deprecated public static strictfp final synchronized void method1() { }
+                        /** @deprecated */ @Deprecated public static final synchronized native void method2();
+                        /** @deprecated */ @Deprecated protected static final class Inner1 { }
+                        /** @deprecated */ @Deprecated protected static abstract class Inner2 { }
+                        /** @deprecated */ @Deprecated protected interface Inner3 {
+                            protected default void method3() { }
+                            static void method4(final int arg) { }
+                        }
+                    }
+                    """
+                )
+            ),
+            api = """
+                package test.pkg {
+                  public abstract class Foo {
+                    ctor public Foo();
+                    method @Deprecated public static final void method1();
+                    method @Deprecated public static final void method2();
+                  }
+                  @Deprecated protected static final class Foo.Inner1 {
+                    ctor @Deprecated protected Foo.Inner1();
+                  }
+                  @Deprecated protected abstract static class Foo.Inner2 {
+                    ctor @Deprecated protected Foo.Inner2();
+                  }
+                  @Deprecated protected static interface Foo.Inner3 {
+                    method @Deprecated public default void method3();
+                    method @Deprecated public static void method4(int);
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
     fun `Package with only hidden classes should be removed from signature files`() {
         // Checks that if we have packages that are hidden, or contain only hidden or doconly
         // classes, the entire package is omitted from the signature file. Note how the test.pkg1.sub
@@ -1951,7 +2118,6 @@
         // and that they are listed separately.
 
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1976,8 +2142,10 @@
             ),
             api = """
                 package test.pkg {
-                  public enum FooBar {
+                  public class FooBar extends java.lang.Enum {
                     method protected abstract void foo();
+                    method public static test.pkg.FooBar valueOf(java.lang.String) throws java.lang.IllegalArgumentException;
+                    method public static final test.pkg.FooBar[] values();
                     enum_constant public static final test.pkg.FooBar ABC;
                     enum_constant public static final test.pkg.FooBar DEF;
                     field public static int field1;
@@ -1989,9 +2157,12 @@
     }
 
     @Test
-    fun `Check correct throws list for generics`() {
+    fun `Check erasure in throws-list`() {
+        // Makes sure that when we have a generic signature in the throws list we take
+        // the erasure instead (in compat mode); "Throwable" instead of "X" in the below
+        // test. Real world example: Optional.orElseThrow.
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2012,7 +2183,7 @@
                 package test.pkg {
                   public final class Test<T> {
                     ctor public Test();
-                    method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws X;
+                    method public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X>) throws java.lang.Throwable;
                   }
                 }
                 """
@@ -2023,7 +2194,6 @@
     fun `Check various generics signature subtleties`() {
         // Some additional declarations where PSI default type handling diffs from doclava1
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2054,6 +2224,29 @@
                     """
                 )
             ),
+
+            // This is the output from doclava1; I'm not quite matching this yet (sorting order differs,
+            // and my heuristic to remove "extends java.lang.Object" is somehow preserved here. I'm
+            // not clear on when they do it and when they don't.
+            /*
+            api = """
+            package test.pkg {
+              public abstract class Collections {
+                ctor public Collections();
+                method public abstract <T extends java.util.Collection<java.lang.String>> T addAllTo(T);
+                method public static <T & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>);
+              }
+              public final class Collections.Range<T extends java.lang.Comparable<? super T>> {
+                ctor public Collections.Range();
+              }
+              public class MoreAsserts {
+                ctor public MoreAsserts();
+                method public static void assertEquals(java.util.Set<? extends java.lang.Object>, java.util.Set<? extends java.lang.Object>);
+                method public static void assertEquals(java.lang.String, java.util.Set<? extends java.lang.Object>, java.util.Set<? extends java.lang.Object>);
+              }
+            }
+            """,
+            */
             api = """
                 package test.pkg {
                   public abstract class Collections {
@@ -2066,7 +2259,7 @@
                   }
                   public class MoreAsserts {
                     ctor public MoreAsserts();
-                    method public static void assertEquals(String, java.util.Set<?>, java.util.Set<?>);
+                    method public static void assertEquals(java.lang.String, java.util.Set<?>, java.util.Set<?>);
                     method public static void assertEquals(java.util.Set<?>, java.util.Set<?>);
                   }
                 }
@@ -2080,7 +2273,6 @@
         // correctly (there's some special casing around enums to insert extra methods
         // that was broken, as exposed by ChronoUnit#toString)
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2120,15 +2312,17 @@
             importedPackages = emptyList(),
             api = """
                 package test.pkg {
-                  public enum ChronUnit implements test.pkg.TempUnit {
-                    method public String valueOf(int);
-                    method public String values(String);
+                  public final class ChronUnit extends java.lang.Enum implements test.pkg.TempUnit {
+                    method public java.lang.String valueOf(int);
+                    method public static test.pkg.ChronUnit valueOf(java.lang.String) throws java.lang.IllegalArgumentException;
+                    method public final java.lang.String values(java.lang.String);
+                    method public static final test.pkg.ChronUnit[] values();
                     enum_constant public static final test.pkg.ChronUnit A;
                     enum_constant public static final test.pkg.ChronUnit B;
                     enum_constant public static final test.pkg.ChronUnit C;
                   }
-                  public interface TempUnit {
-                    method public String toString();
+                  public abstract interface TempUnit {
+                    method public abstract java.lang.String toString();
                   }
                 }
                 """
@@ -2140,8 +2334,8 @@
         // Checks sorting order of enum constant values
         val source = """
             package java.nio.file.attribute {
-              public enum AclEntryPermission {
-                method public static java.nio.file.attribute.AclEntryPermission valueOf(String);
+              public final class AclEntryPermission extends java.lang.Enum {
+                method public static java.nio.file.attribute.AclEntryPermission valueOf(java.lang.String);
                 method public static final java.nio.file.attribute.AclEntryPermission[] values();
                 enum_constant public static final java.nio.file.attribute.AclEntryPermission APPEND_DATA;
                 enum_constant public static final java.nio.file.attribute.AclEntryPermission DELETE;
@@ -2164,15 +2358,78 @@
             }
                     """
         check(
-            format = FileFormat.V1,
             signatureSource = source,
             api = source
         )
     }
 
     @Test
+    fun `Superclass filtering, should skip intermediate hidden classes`() {
+        check(
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    @SuppressWarnings("ALL")
+                    public class MyClass extends HiddenParent {
+                        public void method4() { }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    /** @hide */
+                    @SuppressWarnings("ALL")
+                    public class HiddenParent extends HiddenParent2 {
+                        public static final String CONSTANT = "MyConstant";
+                        protected int mContext;
+                        public void method3() { }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    /** @hide */
+                    @SuppressWarnings("ALL")
+                    public class HiddenParent2 extends PublicParent {
+                        public void method2() { }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    @SuppressWarnings("ALL")
+                    public class PublicParent {
+                        public void method1() { }
+                    }
+                    """
+                )
+            ),
+            // Notice how the intermediate methods (method2, method3) have been removed
+            includeStrippedSuperclassWarnings = true,
+            expectedIssues = "src/test/pkg/MyClass.java:2: warning: Public class test.pkg.MyClass stripped of unavailable superclass test.pkg.HiddenParent [HiddenSuperclass]",
+            api = """
+                package test.pkg {
+                  public class MyClass extends test.pkg.PublicParent {
+                    ctor public MyClass();
+                    method public void method4();
+                  }
+                  public class PublicParent {
+                    ctor public PublicParent();
+                    method public void method1();
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
     fun `Inheriting from package private classes, package private class should be included`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2212,7 +2469,7 @@
     @Test
     fun `Inheriting generic method from package private class`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2252,7 +2509,7 @@
     fun `Type substitution for generic method referencing parent type parameter`() {
         // Type parameters from parent classes need to be replaced with their bounds in the child.
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2287,10 +2544,54 @@
     }
 
     @Test
+    fun `Using compatibility flag manually`() {
+        // Like previous test, but using compatibility mode and explicitly turning on
+        // the hidden super class compatibility flag. This test is mostly intended
+        // to test the flag handling for individual compatibility flags.
+        check(
+            compatibilityMode = true,
+            extraArguments = arrayOf("--skip-inherited-methods=false"),
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    @SuppressWarnings("ALL")
+                    public class MyClass extends HiddenParent {
+                        public void method1() { }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg;
+                    @SuppressWarnings("ALL")
+                    class HiddenParent {
+                        public static final String CONSTANT = "MyConstant";
+                        protected int mContext;
+                        public void method2() { }
+                    }
+                    """
+                )
+            ),
+            expectedIssues = "",
+            api = """
+                    package test.pkg {
+                      public class MyClass {
+                        ctor public MyClass();
+                        method public void method1();
+                        method public void method2();
+                      }
+                    }
+            """
+        )
+    }
+
+    @Test
     fun `When implementing rather than extending package private class, inline members instead`() {
         // If you implement a package private interface, we just remove it and inline the members into
         // the subclass
         check(
+            compatibilityMode = true,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2325,10 +2626,10 @@
                     ctor public MyClass();
                     method public void method();
                     method public void other();
-                    field public static final String CONSTANT = "MyConstant";
+                    field public static final java.lang.String CONSTANT = "MyConstant";
                   }
-                  public interface OtherInterface {
-                    method public void other();
+                  public abstract interface OtherInterface {
+                    method public abstract void other();
                   }
                 }
                 """
@@ -2336,11 +2637,13 @@
     }
 
     @Test
-    fun `Implementing package private class`() {
-        // Include all the non-hidden public interfaces into the signature
+    fun `Implementing package private class, non-compat mode`() {
+        // Like the previous test, but in non compat mode we correctly
+        // include all the non-hidden public interfaces into the signature
 
         // BUG: Note that we need to implement the parent
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2390,7 +2693,6 @@
         // If signatures vary only by the "default" modifier in the interface, don't show it on the implementing
         // class
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2420,8 +2722,8 @@
                     ctor public MyClass();
                     method public void method();
                   }
-                  public interface SuperInterface {
-                    method public void method();
+                  public abstract interface SuperInterface {
+                    method public abstract void method();
                     method public default void method2();
                   }
                 }
@@ -2479,7 +2781,6 @@
         // class. This is an issue for example for the ZonedDateTime#getLong method
         // implementing the TemporalAccessor#getLong method
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2506,7 +2807,7 @@
               public class Foo implements test.pkg.SomeInterface2 {
                 ctor public Foo();
               }
-              public interface SomeInterface2 {
+              public abstract interface SomeInterface2 {
                 method public default long getLong();
               }
             }
@@ -2517,7 +2818,6 @@
     @Test
     fun `Implementing interface method 2`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2552,10 +2852,10 @@
                   public class Foo implements test.pkg.SomeInterface test.pkg.SomeInterface2 {
                     ctor public Foo();
                   }
-                  public interface SomeInterface {
-                    method public long getLong();
+                  public abstract interface SomeInterface {
+                    method public abstract long getLong();
                   }
-                  public interface SomeInterface2 {
+                  public abstract interface SomeInterface2 {
                     method public default long getLong();
                   }
                 }
@@ -2623,7 +2923,16 @@
                     field public int removed;
                   }
                 }
-                """
+                """,
+            removedDexApi = "" +
+                "Ltest/pkg/Bar;-><init>()V\n" +
+                "Ltest/pkg/Bar;->removedMethod()V\n" +
+                "Ltest/pkg/Bar;->removedField:I\n" +
+                "Ltest/pkg/Bar\$Inner;\n" +
+                "Ltest/pkg/Bar\$Inner;-><init>()V\n" +
+                "Ltest/pkg/Bar\$Inner2\$Inner3\$Inner4;\n" +
+                "Ltest/pkg/Bar\$Inner2\$Inner3\$Inner4;-><init>()V\n" +
+                "Ltest/pkg/Bar\$Inner5\$Inner6\$Inner7;->removed:I"
         )
     }
 
@@ -2631,7 +2940,6 @@
     fun `Check @remove class`() {
         // Test removing classes
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2714,7 +3022,6 @@
     @Test
     fun `Test include overridden @Deprecated even if annotated with @hide`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2753,7 +3060,7 @@
                     package test.pkg {
                       public class Child extends test.pkg.Parent {
                         ctor public Child();
-                        method @Deprecated public String toString();
+                        method public deprecated java.lang.String toString();
                       }
                       public class Parent {
                         ctor public Parent();
@@ -2775,7 +3082,6 @@
     fun `Test invalid class name`() {
         // Regression test for b/73018978
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 kotlin(
                     "src/test/pkg/Foo.kt",
@@ -2792,7 +3098,7 @@
             api = """
                 package test.pkg {
                   public final class -Foo {
-                    method public static inline void printHelloWorld(@NonNull String);
+                    method public static inline void printHelloWorld(java.lang.String);
                   }
                 }
                 """
@@ -2896,9 +3202,6 @@
                     """
                 )
             ),
-            expectedIssues = """
-                src/android/net/http/HttpResponseCache.java:7: warning: Public class android.net.http.HttpResponseCache stripped of unavailable superclass com.squareup.okhttp.OkCacheContainer [HiddenSuperclass]
-            """,
             api = """
                 package android.net.http {
                   public final class HttpResponseCache implements java.io.Closeable {
@@ -2913,7 +3216,6 @@
     fun `Extend from multiple interfaces`() {
         // Real-world example: XmlResourceParser
         check(
-            format = FileFormat.V1,
             checkCompilation = true,
             sourceFiles = arrayOf(
                 java(
@@ -2955,20 +3257,20 @@
             ),
             api = """
                 package android.content.res {
-                  public interface XmlResourceParser extends org.xmlpull.v1.XmlPullParser android.util.AttributeSet my.AutoCloseable {
-                    method public void close();
+                  public abstract interface XmlResourceParser implements android.util.AttributeSet my.AutoCloseable org.xmlpull.v1.XmlPullParser {
+                    method public abstract void close();
                   }
                 }
                 package android.util {
-                  public interface AttributeSet {
+                  public abstract interface AttributeSet {
                   }
                 }
                 package my {
-                  public interface AutoCloseable {
+                  public abstract interface AutoCloseable {
                   }
                 }
                 package org.xmlpull.v1 {
-                  public interface XmlPullParser {
+                  public abstract interface XmlPullParser {
                   }
                 }
                 """
@@ -3021,6 +3323,7 @@
     fun `Check skipping implicit final or deprecated override`() {
         // Regression test for 122358225
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3103,6 +3406,7 @@
     @Test
     fun `Ignore synchronized differences`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3145,6 +3449,7 @@
         check(
             // Simulate test-mock scenario for getIContentProvider
             extraArguments = arrayOf("--stub-packages", "android.test.mock"),
+            compatibilityMode = false,
             expectedIssues = "src/android/test/mock/MockContentProvider.java:6: warning: Public class android.test.mock.MockContentProvider stripped of unavailable superclass android.content.ContentProvider [HiddenSuperclass]",
             sourceFiles = arrayOf(
                 java(
@@ -3227,7 +3532,6 @@
         // Use the otherwise= visibility in signatures
         // Regression test for issue 118763806
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3294,10 +3598,10 @@
             api = """
                 package test.pkg {
                   public class ProductionCodeJava {
-                    method @VisibleForTesting(otherwise=androidx.annotation.VisibleForTesting.PROTECTED) protected void shouldBeProtected();
+                    method protected void shouldBeProtected();
                   }
                   public class ProductionCodeKotlin {
-                    method @VisibleForTesting(otherwise=androidx.annotation.VisibleForTesting.PROTECTED) protected final void shouldBeProtected();
+                    method protected final void shouldBeProtected();
                   }
                 }
                 """,
@@ -3399,8 +3703,7 @@
         check(
             format = FileFormat.V3,
             sourceFiles = arrayOf(
-                kotlin(
-                    "src/main/java/test/pkg/Foo.kt",
+                kotlin("src/main/java/test/pkg/Foo.kt",
                     """
                     package test.pkg
                     fun myCall() : Boolean = false
@@ -3425,6 +3728,7 @@
     @Test
     fun `Test inherited hidden methods for descendant classes - Package private`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3484,6 +3788,7 @@
     @Test
     fun `Test inherited hidden methods for descendant classes - Hidden annotation`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3545,7 +3850,7 @@
     @Test
     fun `Test inherited methods that use generics`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3578,7 +3883,7 @@
             extraArguments = arrayOf(ARG_HIDE_PACKAGE, "androidx.annotation"),
             expectedIssues = "",
             api =
-            """
+                """
                 package test.pkg {
                   public class Class2 {
                     ctor public Class2();
@@ -3626,7 +3931,7 @@
                 method public void method1();
               }
               public final class Class2 {
-                method public void method1(String);
+                method public void method1(java.lang.String);
               }
             }
             package Test.pkg1 {
@@ -3636,12 +3941,11 @@
             }
             package Test.pkg2 {
               public final class Class1 {
-                method public void method1(String, String);
+                method public void method1(java.lang.String, java.lang.String);
               }
             }
                     """
         check(
-            format = FileFormat.V1,
             signatureSources = arrayOf(source1, source2),
             api = expected
         )
@@ -3705,14 +4009,13 @@
         val expected = """
             package test.pkg {
               public final class Class1 {
-                method public void method1(test.pkg.Class2 arg);
+                method public void method1(test.pkg.Class2);
               }
               public final class Class2 {
               }
             }
                     """
         check(
-            format = FileFormat.V1,
             signatureSources = arrayOf(source1, source2),
             api = expected
         )
@@ -3834,8 +4137,7 @@
                     annotation class Composable
                  */
                 base64gzip(
-                    "test.jar",
-                    "" +
+                    "test.jar", "" +
                         "UEsDBAoAAAgIAKx6s1AAAAAAAgAAAAAAAAAJAAAATUVUQS1JTkYvAwBQSwMECgAACAgAZ3qzULJ/" +
                         "Au4bAAAAGQAAABQAAABNRVRBLUlORi9NQU5JRkVTVC5NRvNNzMtMSy0u0Q1LLSrOzM+zUjDUM+Dl" +
                         "4uUCAFBLAwQKAAAICABnerNQDArdZgwAAAAQAAAAGwAAAE1FVEEtSU5GL3RlbXAua290bGluX21v" +
@@ -3902,8 +4204,7 @@
                     annotation class ExternalExperimentalAnnotation
                  */
                 base64gzip(
-                    "test.jar",
-                    "" +
+                    "test.jar", "" +
                         "UEsDBAoAAAgIADt2U1IAAAAAAgAAAAAAAAAJAAAATUVUQS1JTkYvAwBQSwMECgAACAgAFXZ" +
                         "TUrJ/Au4bAAAAGQAAABQAAABNRVRBLUlORi9NQU5JRkVTVC5NRvNNzMtMSy0u0Q1LLSrOzM" +
                         "+zUjDUM+Dl4uUCAFBLAwQKAAAICAA7dlNSDWpm1BUAAAAYAAAAGwAAAE1FVEEtSU5GL3Rlc" +
@@ -3968,8 +4269,7 @@
         check(
             format = FileFormat.V3,
             sourceFiles = arrayOf(
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
 
                     import androidx.annotation.IntRange
@@ -3987,10 +4287,10 @@
                 // Signature format: 3.0
                 package test.pkg {
                   public final class KotlinClass {
-                    ctor public KotlinClass(@IntRange(from=1L) int param);
-                    ctor public KotlinClass(@IntRange(from=2L) int differentParam);
+                    ctor public KotlinClass(@IntRange(from=1) int param);
+                    ctor public KotlinClass(@IntRange(from=2) int differentParam);
                     method public int getParam();
-                    method public void myMethod(@IntRange(from=3L) int methodParam);
+                    method public void myMethod(@IntRange(from=3) int methodParam);
                     property public final int param;
                   }
                 }
@@ -4003,11 +4303,10 @@
         check(
             format = FileFormat.V2,
             sourceFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
+                java("""
+                    package test.pkg
 
-                    import androidx.annotation.IntRange;
+                    import androidx.annotation.IntRange
 
                     public final class ApiClass {
                         private int hiddenConstant = 1;
@@ -4036,8 +4335,7 @@
         check(
             format = FileFormat.V3,
             sourceFiles = arrayOf(
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
 
                     import androidx.annotation.IntRange
@@ -4071,8 +4369,7 @@
         check(
             format = FileFormat.V3,
             sourceFiles = arrayOf(
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
                     sealed class MyClass(
                         val firstConstructorProperty: Int,
@@ -4082,15 +4379,13 @@
                     }
                     """
                 ),
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
                     data class MyDataClass(
                         val constructorProperty: String,
                         internal val internalConstructorProperty: String
                     )
-                """
-                )
+                """)
             ),
             api = """
                 // Signature format: 3.0
@@ -4155,6 +4450,7 @@
         // Kotlin code which explicitly specifies parameter names
         check(
             format = FileFormat.V4,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -4296,8 +4592,7 @@
     @Test
     fun `Test type erasure and dexApi from signature`() {
         check(
-            signatureSources = arrayOf(
-                """
+            signatureSources = arrayOf("""
                 package android.widget {
 
                   @android.widget.RemoteViews.RemoteView public class ListView extends android.widget.AbsListView {
@@ -4306,8 +4601,7 @@
                   }
 
                 }
-"""
-            ),
+"""),
             dexApi = """
             Landroid/widget/ListView;
             Landroid/widget/ListView;->findViewTraversal(I)Landroid/view/View;
@@ -4321,8 +4615,7 @@
         check(
             format = FileFormat.V4,
             sourceFiles = arrayOf(
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
 
                     fun interface FunctionalInterface {
@@ -4346,333 +4639,4 @@
             """
         )
     }
-
-    @Test
-    fun `Inline class`() {
-        check(
-            format = FileFormat.V4,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                    package test.pkg
-
-                    inline class Dp(val value: Float) : Comparable<Dp> {
-                        inline operator fun plus(other: Dp) = Dp(value = this.value + other.value)
-                        inline operator fun minus(other: Dp) = Dp(value = this.value - other.value)
-                        // Not tracked due to https://youtrack.jetbrains.com/issue/KTIJ-11559
-                        val someBits
-                            get() = value && 0x00ff
-                        // Not tracked due to https://youtrack.jetbrains.com/issue/KTIJ-11559
-                        fun doSomething() {}
-                    }
-                """
-                )
-            ),
-            api = """
-                // Signature format: 4.0
-                package test.pkg {
-                  public final inline class Dp implements java.lang.Comparable<test.pkg.Dp> {
-                    ctor public Dp();
-                    method public float getValue();
-                    method public inline operator float minus(float other);
-                    method public inline operator float plus(float other);
-                    property public final float value;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Value class`() {
-        check(
-            format = FileFormat.V4,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                    package test.pkg
-                    @JvmInline
-                    value class Dp(val value: Float) : Comparable<Dp> {
-                        inline operator fun plus(other: Dp) = Dp(value = this.value + other.value)
-                        inline operator fun minus(other: Dp) = Dp(value = this.value - other.value)
-                        val someBits
-                            get() = value && 0x00ff
-                        fun doSomething() {}
-                    }
-                """
-                )
-            ),
-            api = """
-                // Signature format: 4.0
-                package test.pkg {
-                  @kotlin.jvm.JvmInline public final value class Dp implements java.lang.Comparable<test.pkg.Dp> {
-                    ctor public Dp(float value);
-                    method public void doSomething();
-                    method public boolean getSomeBits();
-                    method public float getValue();
-                    method public inline operator float minus(float other);
-                    method public inline operator float plus(float other);
-                    property public final boolean someBits;
-                    property public final float value;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Kotlin doesn't expand java named constants`() {
-        check(
-            format = FileFormat.V3,
-            sourceFiles =
-            arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        annotation class Foo(val bar: Long = java.lang.Long.MIN_VALUE)
-                    """
-                )
-            ),
-            api =
-            """
-                // Signature format: 3.0
-                package test.pkg {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Foo {
-                    method public abstract long bar() default java.lang.Long.MIN_VALUE;
-                    property public abstract long bar;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Kotlin constructors with JvmOverloads`() {
-        check(
-            format = FileFormat.V4,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-
-                        class AllOptionalJvmOverloads @JvmOverloads constructor(
-                            private val foo: Int = 0,
-                            private val bar: Int = 0
-                        )
-
-                        class AllOptionalNoJvmOverloads(
-                            private val foo: Int = 0,
-                            private val bar: Int = 0
-                        )
-
-                        class SomeOptionalJvmOverloads @JvmOverloads constructor(
-                            private val foo: Int,
-                            private val bar: Int = 0
-                        )
-
-                        class SomeOptionalNoJvmOverloads(
-                            private val foo: Int,
-                            private val bar: Int = 0
-                        )
-                    """
-                )
-            ),
-            api = """
-                // Signature format: 4.0
-                package test.pkg {
-                  public final class AllOptionalJvmOverloads {
-                    ctor public AllOptionalJvmOverloads(optional int foo, optional int bar);
-                    ctor public AllOptionalJvmOverloads(optional int foo);
-                    ctor public AllOptionalJvmOverloads();
-                  }
-                  public final class AllOptionalNoJvmOverloads {
-                    ctor public AllOptionalNoJvmOverloads(optional int foo, optional int bar);
-                  }
-                  public final class SomeOptionalJvmOverloads {
-                    ctor public SomeOptionalJvmOverloads(int foo, optional int bar);
-                    ctor public SomeOptionalJvmOverloads(int foo);
-                  }
-                  public final class SomeOptionalNoJvmOverloads {
-                    ctor public SomeOptionalNoJvmOverloads(int foo, optional int bar);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Kotlin public methods with DeprecationLevel HIDDEN are public API`() {
-        check(
-            format = FileFormat.V3,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        @Deprecated(
-                            message = "So much regret",
-                            level = DeprecationLevel.HIDDEN
-                        )
-                        fun myMethod() { TODO() }
-                        @Deprecated(
-                            message = "So much regret",
-                            level = DeprecationLevel.HIDDEN
-                        )
-                        internal fun myInternalMethod() { TODO() }
-                        @Deprecated(
-                            message = "So much regret",
-                            level = DeprecationLevel.HIDDEN
-                        )
-                        private fun myPrivateMethod() { TODO() }
-                        @Deprecated(
-                            message = "So much regret",
-                            level = DeprecationLevel.WARNING
-                        )
-                        fun myNormalDeprecatedMethod() { TODO() }
-                    """
-                )
-            ),
-            api = """
-                // Signature format: 3.0
-                package test.pkg {
-                  public final class TestKt {
-                    method @Deprecated public static void myMethod();
-                    method @Deprecated public static void myNormalDeprecatedMethod();
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Annotations aren't dropped when DeprecationLevel is HIDDEN`() {
-        check(
-            format = FileFormat.V3,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        @Deprecated(
-                            message = "So much regret",
-                            level = DeprecationLevel.HIDDEN
-                        )
-                        @IntRange(from=0)
-                        fun myMethod() { TODO() }
-                    """
-                )
-            ),
-            api = """
-                // Signature format: 3.0
-                package test.pkg {
-                  public final class TestKt {
-                    method @Deprecated @kotlin.ranges.IntRange public static void myMethod();
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Constants in a file scope annotation`() {
-        check(
-            format = FileFormat.V4,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                    @file:RestrictTo(RestrictTo.Scope.LIBRARY)
-                    package test.pkg
-                    import androidx.annotation.RestrictTo
-                    private fun veryFun(): Boolean = true
-                """
-                ),
-                restrictToSource
-            ),
-            extraArguments = arrayOf(ARG_HIDE_PACKAGE, "androidx.annotation"),
-            api = """
-                // Signature format: 4.0
-                package test.pkg {
-                  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY}) public final class TestKt {
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `RestrictTo on a file hiding it`() {
-        check(
-            format = FileFormat.V4,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                    @file:RestrictTo(RestrictTo.Scope.LIBRARY)
-                    package test.pkg
-                    import androidx.annotation.RestrictTo
-                    private fun veryFun(): Boolean = true
-                """
-                ),
-                restrictToSource
-            ),
-            extraArguments = arrayOf(ARG_HIDE_PACKAGE, "androidx.annotation", "--show-unannotated"),
-            hideAnnotations = arrayOf(
-                "androidx.annotation.RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY)"
-            ),
-            api = """
-                // Signature format: 4.0
-            """
-        )
-    }
-
-    /** Regression test for b/202968090 */
-    @Test
-    fun `annotation arrays should be non-null`() {
-        check(
-            format = FileFormat.V4,
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        annotation class Foo (
-                            val bar: Array<String>,
-                            vararg val baz: String
-                        )
-                    """
-                )
-            ),
-            api = """
-                // Signature format: 4.0
-                package test.pkg {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Foo {
-                    method public abstract String[] bar();
-                    method public abstract String[] baz();
-                    property public abstract String[] bar;
-                    property public abstract String[] baz;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `property setter parameters are unnamed`() {
-        check(
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        class Foo(var bar: Int)
-                    """
-                )
-            ),
-            api = """
-                package test.pkg {
-                  public final class Foo {
-                    ctor public Foo(int bar);
-                    method public int getBar();
-                    method public void setBar(int);
-                    property public final int bar;
-                  }
-                }
-            """
-        )
-    }
 }
diff --git a/src/test/java/com/android/tools/metalava/ApiFromTextTest.kt b/src/test/java/com/android/tools/metalava/ApiFromTextTest.kt
index 4d26ad4..2143883 100644
--- a/src/test/java/com/android/tools/metalava/ApiFromTextTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiFromTextTest.kt
@@ -28,15 +28,15 @@
                   public class MyTest {
                     ctor public MyTest();
                     method public int clamp(int);
-                    method public Double convert(Float);
-                    field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
-                    field public Number myNumber;
+                    method public java.lang.Double convert(java.lang.Float);
+                    field public static final java.lang.String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                    field public java.lang.Number myNumber;
                   }
                 }
                 """
 
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -56,6 +56,7 @@
 
         check(
             format = FileFormat.V3,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             signatureSource = source,
             includeSignatureVersion = true,
@@ -76,6 +77,7 @@
 
         check(
             format = FileFormat.V3,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             signatureSource = source,
             includeSignatureVersion = true,
@@ -110,6 +112,7 @@
 
         check(
             format = FileFormat.V3,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             signatureSource = source,
             includeSignatureVersion = true,
@@ -143,6 +146,7 @@
 
         check(
             format = FileFormat.V3,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             signatureSource = source,
             includeSignatureVersion = true,
@@ -162,7 +166,7 @@
                 }
                 """
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = source,
             api = source
@@ -181,6 +185,7 @@
                 }
                 """
         check(
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = source,
             api = source
@@ -190,6 +195,7 @@
     @Test
     fun `Native and strictfp keywords`() {
         check(
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = """
                     package test.pkg {
@@ -213,7 +219,7 @@
     @Test
     fun `Type use annotations`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = """
                 package test.pkg {
@@ -253,6 +259,7 @@
                 }
                 """
         check(
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = source
         )
@@ -261,7 +268,8 @@
     @Test
     fun `Infer fully qualified names from shorter names`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
+            extraArguments = arrayOf("--annotations-in-signatures"),
             signatureSource = """
                 package test.pkg {
                   public class MyTest {
@@ -276,7 +284,7 @@
                   public class MyTest {
                     ctor public MyTest();
                     method public int clamp(int);
-                    method public double convert(@Nullable Float, byte[], Iterable<java.io.File>);
+                    method public double convert(@androidx.annotation.Nullable java.lang.Float, byte[], java.lang.Iterable<java.io.File>);
                   }
                 }
                 """
@@ -296,14 +304,14 @@
                 }
                 """
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = source,
             api = """
                 package test.pkg {
-                  @Deprecated public class MyTest {
-                    ctor @Deprecated public MyTest(int, int);
-                    method @Deprecated public static final void edit(android.content.SharedPreferences, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
-                    field @Deprecated public static java.util.List<java.lang.String> LIST;
+                  public deprecated class MyTest {
+                    ctor public deprecated MyTest(int, int);
+                    method public static final deprecated void edit(android.content.SharedPreferences, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit>);
+                    field public static deprecated java.util.List<java.lang.String> LIST;
                   }
                 }
                 """
@@ -314,25 +322,25 @@
     fun `Test generics, superclasses and interfaces`() {
         val source = """
             package a.b.c {
-              public interface MyStream<T, S extends a.b.c.MyStream<T, S>> {
+              public abstract interface MyStream<T, S extends a.b.c.MyStream<T, S>> {
               }
             }
             package test.pkg {
-              public enum Foo {
+              public final class Foo extends java.lang.Enum {
                 ctor public Foo(int);
                 ctor public Foo(int, int);
-                method public static test.pkg.Foo valueOf(String);
+                method public static test.pkg.Foo valueOf(java.lang.String);
                 method public static final test.pkg.Foo[] values();
                 enum_constant public static final test.pkg.Foo A;
                 enum_constant public static final test.pkg.Foo B;
               }
-              public interface MyBaseInterface {
+              public abstract interface MyBaseInterface {
               }
-              public interface MyInterface<T> extends test.pkg.MyBaseInterface {
+              public abstract interface MyInterface<T> implements test.pkg.MyBaseInterface {
               }
-              public interface MyInterface2<T extends java.lang.Number> extends test.pkg.MyBaseInterface {
+              public abstract interface MyInterface2<T extends java.lang.Number> implements test.pkg.MyBaseInterface {
               }
-              public abstract static class MyInterface2.Range<T extends java.lang.Comparable<? super T>> {
+              public static abstract class MyInterface2.Range<T extends java.lang.Comparable<? super T>> {
                 ctor public MyInterface2.Range();
               }
               public static class MyInterface2.TtsSpan<C extends test.pkg.MyInterface<?>> {
@@ -349,7 +357,7 @@
             """
 
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -361,7 +369,7 @@
                 package test.pkg {
                   public class Foo2 {
                     ctor public Foo2();
-                    field public static final String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef";
+                    field public static final java.lang.String GOOD_IRI_CHAR = "a-zA-Z0-9\u00a0-\ud7ff\uf900-\ufdcf\ufdf0-\uffef";
                     field public static final char HEX_INPUT = 61184; // 0xef00 '\uef00'
                     field protected int field00;
                     field public static final boolean field01 = true;
@@ -372,7 +380,7 @@
                     field public static final char field06 = 99; // 0x0063 'c'
                     field public static final float field07 = 98.5f;
                     field public static final double field08 = 98.5;
-                    field public static final String field09 = "String with \"escapes\" and \u00a9...";
+                    field public static final java.lang.String field09 = "String with \"escapes\" and \u00a9...";
                     field public static final double field10 = (0.0/0.0);
                     field public static final double field11 = (1.0/0.0);
                   }
@@ -380,6 +388,7 @@
                 """
 
         check(
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -391,23 +400,24 @@
                 package test.pkg {
                   public abstract class Foo {
                     ctor public Foo();
-                    method @Deprecated public static final void method1();
-                    method @Deprecated public static final void method2();
+                    method public static final deprecated synchronized void method1();
+                    method public static final deprecated synchronized void method2();
                   }
-                  @Deprecated protected static final class Foo.Inner1 {
+                  protected static final deprecated class Foo.Inner1 {
                     ctor protected Foo.Inner1();
                   }
-                  @Deprecated protected abstract static class Foo.Inner2 {
+                  protected static abstract deprecated class Foo.Inner2 {
                     ctor protected Foo.Inner2();
                   }
-                  @Deprecated protected static interface Foo.Inner3 {
+                  protected static abstract deprecated interface Foo.Inner3 {
                     method public default void method3();
-                    method public abstract static void method4(int);
+                    method public static abstract void method4(int);
                   }
                 }
                 """
 
         check(
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -425,7 +435,7 @@
                 """
 
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -454,8 +464,16 @@
     }
 
     @Test
-    fun `Enums`() {
+    fun `Enums and annotations`() {
+        // In non-compat mode we write interfaces out as "@interface" (instead of abstract class)
+        // and similarly for enums we write "enum" instead of "class extends java.lang.Enum".
+        // Make sure we can also read this back in.
         val source = """
+                package android.annotation {
+                  public @interface SuppressLint {
+                    method public abstract String[] value();
+                  }
+                }
                 package test.pkg {
                   public enum Foo {
                     enum_constant public static final test.pkg.Foo A;
@@ -465,23 +483,7 @@
                 """
 
         check(
-            outputKotlinStyleNulls = false,
-            signatureSource = source,
-            api = source
-        )
-    }
-
-    @Test
-    fun `Annotations`() {
-        val source = """
-                package android.annotation {
-                  public @interface SuppressLint {
-                    method public abstract String[] value();
-                  }
-                }
-                """
-
-        check(
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = source,
             api = source
@@ -499,6 +501,7 @@
                 """
 
         check(
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             signatureSource = source,
             api = source
@@ -506,9 +509,42 @@
     }
 
     @Test
+    fun `Enums and annotations exported to compat`() {
+        val source = """
+                package android.annotation {
+                  public @interface SuppressLint {
+                  }
+                }
+                package test.pkg {
+                  public final enum Foo {
+                    enum_constant public static final test.pkg.Foo A;
+                    enum_constant public static final test.pkg.Foo B;
+                  }
+                }
+                """
+
+        check(
+            compatibilityMode = true,
+            signatureSource = source,
+            api = """
+                package android.annotation {
+                  public abstract class SuppressLint implements java.lang.annotation.Annotation {
+                  }
+                }
+                package test.pkg {
+                  public final class Foo extends java.lang.Enum {
+                    enum_constant public static final test.pkg.Foo A;
+                    enum_constant public static final test.pkg.Foo B;
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
     fun `Sort throws list by full name`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = """
                     package android.accounts {
                       public abstract interface AccountManagerFuture<V> {
@@ -526,12 +562,12 @@
                     """,
             api = """
                     package android.accounts {
-                      public interface AccountManagerFuture<V> {
-                        method public boolean cancel(boolean);
-                        method public V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
-                        method public V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
-                        method public boolean isCancelled();
-                        method public boolean isDone();
+                      public abstract interface AccountManagerFuture<V> {
+                        method public abstract boolean cancel(boolean);
+                        method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
+                        method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException;
+                        method public abstract boolean isCancelled();
+                        method public abstract boolean isDone();
                       }
                       public class AuthenticatorException extends java.lang.Throwable {
                       }
@@ -607,6 +643,7 @@
 
         check(
             format = FileFormat.V2,
+            compatibilityMode = false,
             signatureSource = source,
             api = source
         )
@@ -653,7 +690,7 @@
                 """
 
         check(
-            format = FileFormat.V3,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
             signatureSource = source,
@@ -699,7 +736,7 @@
                 }
                 """
         check(
-            format = FileFormat.V3,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
             signatureSource = source,
@@ -722,7 +759,7 @@
                 """
 
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -734,13 +771,13 @@
                 package test.pkg {
                   public final class TestKt {
                     ctor public TestKt();
-                    method public static suspend inline Object hello(kotlin.coroutines.experimental.Continuation<? super kotlin.Unit>);
+                    method public static suspend inline java.lang.Object hello(kotlin.coroutines.experimental.Continuation<? super kotlin.Unit>);
                   }
                 }
                 """
 
         check(
-            format = FileFormat.V2,
+            compatibilityMode = true,
             signatureSource = source,
             api = source
         )
@@ -765,8 +802,9 @@
                 """
 
         check(
+            compatibilityMode = false,
             signatureSource = source,
             api = expectedApi
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/ApiLintBaselineTest.kt b/src/test/java/com/android/tools/metalava/ApiLintBaselineTest.kt
index cc2414c..8cf7c0d 100644
--- a/src/test/java/com/android/tools/metalava/ApiLintBaselineTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiLintBaselineTest.kt
@@ -26,6 +26,7 @@
     fun `Test with global baseline`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             baseline = """
                 // Baseline format: 1.0
                 Enum: android.pkg.MyEnum:
@@ -49,6 +50,7 @@
     fun `Test with api-lint specific baseline`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             baselineApiLint = """
                 // Baseline format: 1.0
                 Enum: android.pkg.MyEnum:
@@ -72,6 +74,7 @@
     fun `Test with api-lint specific baseline with update`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             baselineApiLint = """
                 """,
             updateBaselineApiLint = """
@@ -97,6 +100,7 @@
     fun `Test with non-api-lint specific baseline`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             baselineCheckCompatibilityReleased = """
                 // Baseline format: 1.0
                 Enum: android.pkg.MyEnum:
@@ -124,6 +128,7 @@
     fun `Test api-lint error message`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             baselineApiLint = "",
             errorMessageApiLint = "*** api-lint failed ***",
             expectedIssues = """
@@ -152,6 +157,7 @@
     fun `Test no api-lint error message`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             baselineApiLint = "",
             expectedIssues = """
                 src/android/pkg/MyClassImpl.java:3: error: Don't expose your implementation details: `MyClassImpl` ends with `Impl` [EndsWithImpl] [See https://s.android.com/api-guidelines#dont-end-with-impl]
@@ -170,4 +176,4 @@
             expectedOutput = DefaultLintErrorMessage
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/ApiLintTest.kt b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
index 2ac7c0a..712da27 100644
--- a/src/test/java/com/android/tools/metalava/ApiLintTest.kt
+++ b/src/test/java/com/android/tools/metalava/ApiLintTest.kt
@@ -32,6 +32,7 @@
                 "java.",
                 ARG_HIDE, "MissingNullability"
             ),
+            compatibilityMode = false,
             expectedIssues = """
                 src/Dp.kt:3: warning: Acronyms should not be capitalized in method names: was `badCALL`, should this be `badCall`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
                 src/android/pkg/ALL_CAPS.java:3: warning: Acronyms should not be capitalized in class names: was `ALL_CAPS`, should this be `AllCaps`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
@@ -41,7 +42,7 @@
                 src/android/pkg/badlyNamedClass.java:7: error: Method name must start with lowercase char: BadlyNamedMethod1 [StartWithLower] [See https://s.android.com/api-guidelines#style-conventions]
                 src/android/pkg/badlyNamedClass.java:9: warning: Acronyms should not be capitalized in method names: was `fromHTMLToHTML`, should this be `fromHtmlToHtml`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
                 src/android/pkg/badlyNamedClass.java:10: warning: Acronyms should not be capitalized in method names: was `toXML`, should this be `toXml`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
-                src/android/pkg/badlyNamedClass.java:12: warning: Acronyms should not be capitalized in method names: was `getID`, should this be `getId`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
+                src/android/pkg/badlyNamedClass.java:11: warning: Acronyms should not be capitalized in method names: was `getID`, should this be `getId`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
                 src/android/pkg/badlyNamedClass.java:6: error: Constant field names must be named with only upper case characters: `android.pkg.badlyNamedClass#BadlyNamedField`, should be `BADLY_NAMED_FIELD`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
                 """,
             expectedFail = DefaultLintErrorMessage,
@@ -145,13 +146,11 @@
                     }
                     """
                 ),
-                kotlin(
-                    """
+                kotlin("""
                     inline class Dp(val value: Float)
                     fun greatCall(width: Dp)
                     fun badCALL(width: Dp)
-                """
-                ),
+                """),
                 androidxNullableSource
             )
             /*
@@ -178,6 +177,7 @@
                   }
                 }
             """.trimIndent(),
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/badlyNamedClass.java:8: warning: Acronyms should not be capitalized in method names: was `toXML2`, should this be `toXmL2`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
                 src/android/pkg2/HTMLWriter.java:3: warning: Acronyms should not be capitalized in class names: was `HTMLWriter`, should this be `HtmlWriter`? [AcronymName] [See https://s.android.com/api-guidelines#acronyms-in-method-name]
@@ -215,12 +215,13 @@
     fun `Test constants`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/Constants.java:14: error: All constants must be defined at compile time: android.pkg.Constants#FOO [CompileTimeConstant]
+                src/android/pkg/Constants.java:13: error: All constants must be defined at compile time: android.pkg.Constants#FOO [CompileTimeConstant]
                 src/android/pkg/Constants.java:12: warning: If min/max could change in future, make them dynamic methods: android.pkg.Constants#MAX_FOO [MinMaxConstant] [See https://s.android.com/api-guidelines#min-max-constants]
                 src/android/pkg/Constants.java:11: warning: If min/max could change in future, make them dynamic methods: android.pkg.Constants#MIN_FOO [MinMaxConstant] [See https://s.android.com/api-guidelines#min-max-constants]
-                src/android/pkg/Constants.java:10: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#myStrings`, should be `MY_STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
-                src/android/pkg/Constants.java:8: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#strings`, should be `STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
+                src/android/pkg/Constants.java:9: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#myStrings`, should be `MY_STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
+                src/android/pkg/Constants.java:7: error: Constant field names must be named with only upper case characters: `android.pkg.Constants#strings`, should be `STRINGS`? [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -253,6 +254,7 @@
     fun `No enums`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyEnum.java:3: error: Enums are discouraged in Android APIs [Enum] [See https://s.android.com/api-guidelines#avoid-enum]
                 """,
@@ -275,6 +277,7 @@
     fun `Test callbacks`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyCallback.java:9: error: Callback method names must follow the on<Something> style: bar [CallbackMethodName] [See https://s.android.com/api-guidelines#callback-method-naming]
                 src/android/pkg/MyCallbacks.java:3: error: Callback class names should be singular: MyCallbacks [SingularCallback] [See https://s.android.com/api-guidelines#callback-class-singular]
@@ -343,6 +346,7 @@
     fun `Test listeners`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClassListener.java:3: error: Listeners should be an interface, or otherwise renamed Callback: MyClassListener [ListenerInterface] [See https://s.android.com/api-guidelines#callbacks-listener]
                 src/android/pkg/MyListener.java:6: error: Listener method names must follow the on<Something> style: bar [CallbackMethodName] [See https://s.android.com/api-guidelines#callback-method-naming]
@@ -407,6 +411,7 @@
     fun `Test actions`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/accounts/Actions.java:7: error: Intent action constant name must be ACTION_FOO: ACCOUNT_ADDED [IntentName] [See https://s.android.com/api-guidelines#use-standard-prefixes-for-constants]
                 src/android/accounts/Actions.java:6: error: Inconsistent action value; expected `android.accounts.action.ACCOUNT_OPENED`, was `android.accounts.ACCOUNT_OPENED` [ActionValue]
@@ -435,6 +440,7 @@
     fun `Test extras`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/accounts/Extras.java:5: error: Inconsistent extra value; expected `android.accounts.extra.AUTOMATIC_RULE_ID`, was `android.app.extra.AUTOMATIC_RULE_ID` [ActionValue]
                 src/android/accounts/Extras.java:7: error: Intent extra constant name must be EXTRA_FOO: RULE_ID [IntentName] [See https://s.android.com/api-guidelines#use-standard-prefixes-for-constants]
@@ -462,6 +468,7 @@
     fun `Test equals and hashCode`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MissingEquals.java:4: error: Must override both equals and hashCode; missing one in android.pkg.MissingEquals [EqualsAndHashCode] [See https://s.android.com/api-guidelines#equals-and-hashcode]
                 src/android/pkg/MissingHashCode.java:7: error: Must override both equals and hashCode; missing one in android.pkg.MissingHashCode [EqualsAndHashCode] [See https://s.android.com/api-guidelines#equals-and-hashcode]
@@ -525,6 +532,7 @@
     fun `Test Parcelable`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MissingCreator.java:5: error: Parcelable requires a `CREATOR` field; missing in android.pkg.MissingCreator [ParcelCreator] [See https://s.android.com/api-guidelines#parcelable-creator]
                 src/android/pkg/MissingDescribeContents.java:5: error: Parcelable requires `public int describeContents()`; missing in android.pkg.MissingDescribeContents [ParcelCreator] [See https://s.android.com/api-guidelines#parcelable-creator]
@@ -614,6 +622,7 @@
     fun `No protected methods or fields are allowed`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:6: error: Protected methods not allowed; must be public: method android.pkg.MyClass.wrong()} [ProtectedMember] [See https://s.android.com/api-guidelines#avoid-protected]
                 src/android/pkg/MyClass.java:8: error: Protected fields not allowed; must be public: field android.pkg.MyClass.wrong} [ProtectedMember] [See https://s.android.com/api-guidelines#avoid-protected]
@@ -642,6 +651,7 @@
     fun `Fields must be final and properly named`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:11: error: Non-static field ALSO_BAD_CONSTANT must be named using fooBar style [StartWithLower] [See https://s.android.com/api-guidelines#style-conventions]
                 src/android/pkg/MyClass.java:11: error: Constant ALSO_BAD_CONSTANT must be marked static final [AllUpper] [See https://s.android.com/api-guidelines#constant-naming]
@@ -704,6 +714,7 @@
     fun `Only android_net_Uri allowed`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:7: error: Use android.net.Uri instead of java.net.URL (method android.pkg.MyClass.bad1()) [AndroidUri] [See https://s.android.com/api-guidelines#android-uri]
                 src/android/pkg/MyClass.java:8: error: Use android.net.Uri instead of java.net.URI (parameter param in android.pkg.MyClass.bad2(java.util.List<java.net.URI> param)) [AndroidUri] [See https://s.android.com/api-guidelines#android-uri]
@@ -734,14 +745,15 @@
     fun `CompletableFuture and plain Future not allowed`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/MyClass.java:9: error: Use ListenableFuture (library), or a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.CompletableFuture (method android.pkg.MyClass.bad1()) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
-                src/android/pkg/MyClass.java:10: error: Use ListenableFuture (library), or a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.CompletableFuture (parameter param in android.pkg.MyClass.bad2(java.util.concurrent.CompletableFuture<java.lang.String> param)) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
-                src/android/pkg/MyClass.java:11: error: Use ListenableFuture (library), or a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.Future (method android.pkg.MyClass.bad3()) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
-                src/android/pkg/MyClass.java:12: error: Use ListenableFuture (library), or a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.Future (parameter param in android.pkg.MyClass.bad4(java.util.concurrent.Future<java.lang.String> param)) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
-                src/android/pkg/MyClass.java:21: error: BadCompletableFuture should not extend `java.util.concurrent.CompletableFuture`. In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal`. [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
-                src/android/pkg/MyClass.java:17: error: BadFuture should not extend `java.util.concurrent.Future`. In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal`. [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
-                src/android/pkg/MyClass.java:19: error: BadFutureClass should not implement `java.util.concurrent.Future`. In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of OutcomeReceiver<R,E>, Executor, and CancellationSignal`. [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:9: error: Use ListenableFuture (library), or a combination of Consumer<T>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.CompletableFuture (method android.pkg.MyClass.bad1()) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:10: error: Use ListenableFuture (library), or a combination of Consumer<T>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.CompletableFuture (parameter param in android.pkg.MyClass.bad2(java.util.concurrent.CompletableFuture<java.lang.String> param)) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:11: error: Use ListenableFuture (library), or a combination of Consumer<T>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.Future (method android.pkg.MyClass.bad3()) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:12: error: Use ListenableFuture (library), or a combination of Consumer<T>, Executor, and CancellationSignal (platform) instead of java.util.concurrent.Future (parameter param in android.pkg.MyClass.bad4(java.util.concurrent.Future<java.lang.String> param)) [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:21: error: BadCompletableFuture should not extend `java.util.concurrent.CompletableFuture`. In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of Consumer<T>, Executor, and CancellationSignal`. [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:17: error: BadFuture should not extend `java.util.concurrent.Future`. In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of Consumer<T>, Executor, and CancellationSignal`. [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
+                src/android/pkg/MyClass.java:19: error: BadFutureClass should not implement `java.util.concurrent.Future`. In AndroidX, use (but do not extend) ListenableFuture. In platform, use a combination of Consumer<T>, Executor, and CancellationSignal`. [BadFuture] [See https://s.android.com/api-guidelines#bad-future]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -760,7 +772,7 @@
                         public @Nullable Future<String> bad3() { return null; }
                         public void bad4(@Nullable Future<String> param) { }
 
-                        public @Nullable ListenableFuture<String> okAsync() { return null; }
+                        public @Nullable ListenableFuture<String> ok1() { return null; }
                         public void ok2(@Nullable ListenableFuture<String> param) { }
 
                         public interface BadFuture<T> extends Future<T> {
@@ -788,10 +800,11 @@
     fun `Typedef must be hidden`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/MyClass.java:19: error: Don't expose @IntDef: SomeInt must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
-                src/android/pkg/MyClass.java:24: error: Don't expose @LongDef: SomeLong must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
-                src/android/pkg/MyClass.java:14: error: Don't expose @StringDef: SomeString must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
+                src/android/pkg/MyClass.java:15: error: Don't expose @IntDef: SomeInt must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
+                src/android/pkg/MyClass.java:20: error: Don't expose @LongDef: SomeLong must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
+                src/android/pkg/MyClass.java:10: error: Don't expose @StringDef: SomeString must be hidden. [PublicTypedef] [See https://s.android.com/api-guidelines#no-public-typedefs]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -832,6 +845,7 @@
     fun `Ensure registration methods are matched`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/RegistrationInterface.java:6: error: Found registerOverriddenUnpairedCallback but not unregisterOverriddenUnpairedCallback in android.pkg.RegistrationInterface [PairedRegistration] [See https://s.android.com/api-guidelines#callbacks-symmetry]
                 src/android/pkg/RegistrationMethods.java:8: error: Found registerUnpairedCallback but not unregisterUnpairedCallback in android.pkg.RegistrationMethods [PairedRegistration] [See https://s.android.com/api-guidelines#callbacks-symmetry]
@@ -888,6 +902,7 @@
     fun `Api methods should not be synchronized in their signature`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/CheckSynchronization.java:12: error: Internal locks must not be exposed: method android.pkg.CheckSynchronization.errorMethod1(Runnable) [VisiblySynchronized] [See https://s.android.com/api-guidelines#avoid-synchronized]
                 src/android/pkg/CheckSynchronization.java:14: error: Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.pkg.CheckSynchronization.errorMethod2() [VisiblySynchronized] [See https://s.android.com/api-guidelines#avoid-synchronized]
@@ -970,9 +985,10 @@
     fun `Check intent builder names`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/IntentBuilderNames.java:9: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `makeMyIntent` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
-                src/android/pkg/IntentBuilderNames.java:11: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `createIntentNow` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
+                src/android/pkg/IntentBuilderNames.java:8: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `makeMyIntent` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
+                src/android/pkg/IntentBuilderNames.java:10: warning: Methods creating an Intent should be named `create<Foo>Intent()`, was `createIntentNow` [IntentBuilderName] [See https://s.android.com/api-guidelines#intent-builder-createintent]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1000,6 +1016,7 @@
     fun `Check helper classes`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass1.java:3: error: Inconsistent class name; should be `<Foo>Activity`, was `MyClass1` [ContextNameSuffix] [See https://s.android.com/api-guidelines#classes-subclass-naming]
                 src/android/pkg/MyClass1.java:6: warning: Methods implemented by developers should follow the on<Something> style, was `badlyNamedAbstractMethod` [OnNameExpected] [See https://s.android.com/api-guidelines#callback-method-naming]
@@ -1069,20 +1086,21 @@
     fun `Check builders`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/Bad.java:12: warning: Builder must be final: android.pkg.Bad.BadBuilder [StaticFinalBuilder] [See https://s.android.com/api-guidelines#builders-static-inner]
                 src/android/pkg/Bad.java:12: warning: Builder must be static: android.pkg.Bad.BadBuilder [StaticFinalBuilder] [See https://s.android.com/api-guidelines#builders-static-inner]
                 src/android/pkg/Bad.java:13: warning: Builder constructor arguments must be mandatory (i.e. not @Nullable): parameter badParameter in android.pkg.Bad.BadBuilder(String badParameter) [OptionalBuilderConstructorArgument] [See https://s.android.com/api-guidelines#builders-nonnull-constructors]
-                src/android/pkg/Bad.java:37: warning: Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.pkg.Bad.BadBuilder.withBadSetterStyle(boolean) [BuilderSetStyle] [See https://s.android.com/api-guidelines#builder-method-naming]
-                src/android/pkg/Bad.java:40: warning: Builder setter must be @NonNull: method android.pkg.Bad.BadBuilder.setReturnsNullable(boolean) [SetterReturnsThis]
+                src/android/pkg/Bad.java:36: warning: Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.pkg.Bad.BadBuilder.withBadSetterStyle(boolean) [BuilderSetStyle] [See https://s.android.com/api-guidelines#builder-method-naming]
+                src/android/pkg/Bad.java:39: warning: Builder setter must be @NonNull: method android.pkg.Bad.BadBuilder.setReturnsNullable(boolean) [SetterReturnsThis]
                 src/android/pkg/Bad.java:42: warning: Getter should be on the built object, not the builder: method android.pkg.Bad.BadBuilder.getOnBuilder() [GetterOnBuilder] [See https://s.android.com/api-guidelines#getter-on-builder]
                 src/android/pkg/Bad.java:44: warning: Methods must return the builder object (return type android.pkg.Bad.BadBuilder instead of void): method android.pkg.Bad.BadBuilder.setNotReturningBuilder(boolean) [SetterReturnsThis]
-                src/android/pkg/Bad.java:19: warning: android.pkg.Bad does not declare a `getWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addWithoutMatchingGetter(String) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:22: warning: android.pkg.Bad does not declare a `isWithoutMatchingGetter()` method matching method android.pkg.Bad.BadBuilder.setWithoutMatchingGetter(boolean) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:25: warning: android.pkg.Bad does not declare a `getPluralWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetter(Collection<String>) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:31: warning: android.pkg.Bad does not declare a getter method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetters(Collection<String>) (expected one of: [getPluralWithoutMatchingGetters(), getPluralWithoutMatchingGetterses()]) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:18: warning: android.pkg.Bad does not declare a `getWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addWithoutMatchingGetter(String) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:21: warning: android.pkg.Bad does not declare a `isWithoutMatchingGetter()` method matching method android.pkg.Bad.BadBuilder.setWithoutMatchingGetter(boolean) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:24: warning: android.pkg.Bad does not declare a `getPluralWithoutMatchingGetters()` method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetter(Collection<String>) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
+                src/android/pkg/Bad.java:30: warning: android.pkg.Bad does not declare a getter method matching method android.pkg.Bad.BadBuilder.addPluralWithoutMatchingGetters(Collection<String>) (expected one of: [getPluralWithoutMatchingGetters(), getPluralWithoutMatchingGetterses()]) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
                 src/android/pkg/Bad.java:44: warning: android.pkg.Bad does not declare a `isNotReturningBuilder()` method matching method android.pkg.Bad.BadBuilder.setNotReturningBuilder(boolean) [MissingGetterMatchingBuilder] [See https://s.android.com/api-guidelines#builders-symmetric-setters]
-                src/android/pkg/Bad.java:56: warning: Methods must return the builder object (return type android.pkg.Bad.BadGenericBuilder<T> instead of T): method android.pkg.Bad.BadGenericBuilder.setBoolean(boolean) [SetterReturnsThis]
+                src/android/pkg/Bad.java:55: warning: Methods must return the builder object (return type android.pkg.Bad.BadGenericBuilder<T> instead of T): method android.pkg.Bad.BadGenericBuilder.setBoolean(boolean) [SetterReturnsThis]
                 src/android/pkg/Bad.java:50: warning: android.pkg.Bad.NoBuildMethodBuilder does not declare a `build()` method, but builder classes are expected to [MissingBuildMethod] [See https://s.android.com/api-guidelines#builder-must-declare-build]
                 src/android/pkg/TopLevelBuilder.java:3: warning: Builder should be defined as inner class: android.pkg.TopLevelBuilder [TopLevelBuilder] [See https://s.android.com/api-guidelines#builders-static-inner]
                 src/android/pkg/TopLevelBuilder.java:3: warning: android.pkg.TopLevelBuilder does not declare a `build()` method, but builder classes are expected to [MissingBuildMethod] [See https://s.android.com/api-guidelines#builder-must-declare-build]
@@ -1273,12 +1291,13 @@
     fun `Check suppress works on inherited methods`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 warning: Should avoid odd sized primitives; use `int` instead of `short` in method android.pkg.Ok.Public.shouldFail(PublicT) [NoByteOrShort] [See https://s.android.com/api-guidelines#avoid-short-byte]
                 """,
             sourceFiles = arrayOf(
                 java(
-                    """
+                """
                 package android.pkg;
 
                 import androidx.annotation.NonNull;
@@ -1306,6 +1325,7 @@
     fun `Raw AIDL`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass1.java:3: error: Raw AIDL interfaces must not be exposed: MyClass1 extends Binder [RawAidl] [See https://s.android.com/api-guidelines#no-public-binder]
                 src/android/pkg/MyClass2.java:3: error: Raw AIDL interfaces must not be exposed: MyClass2 implements IInterface [RawAidl] [See https://s.android.com/api-guidelines#no-public-binder]
@@ -1344,6 +1364,7 @@
     fun `Internal packages`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/com/android/pkg/MyClass.java:3: error: Internal classes must not be exposed [InternalClasses]
                 """,
@@ -1365,6 +1386,7 @@
     fun `Check package layering`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/content/MyClass1.java:8: warning: Field type `android.view.View` violates package layering: nothing in `package android.content` should depend on `package android.view` [PackageLayering]
                 src/android/content/MyClass1.java:8: warning: Method return type `android.view.View` violates package layering: nothing in `package android.content` should depend on `package android.view` [PackageLayering]
@@ -1404,8 +1426,9 @@
     fun `Check boolean getter and setter naming patterns`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                    src/android/pkg/MyClass.java:21: error: Symmetric method for `isVisibleBad` must be named `setVisibleBad`; was `setIsVisibleBad` [GetterSetterNames]
+                    src/android/pkg/MyClass.java:20: error: Symmetric method for `isVisibleBad` must be named `setVisibleBad`; was `setIsVisibleBad` [GetterSetterNames]
                     src/android/pkg/MyClass.java:24: error: Symmetric method for `hasTransientStateBad` must be named `setHasTransientStateBad`; was `setTransientStateBad` [GetterSetterNames]
                     src/android/pkg/MyClass.java:28: error: Symmetric method for `setHasTransientStateAlsoBad` must be named `hasTransientStateAlsoBad`; was `isHasTransientStateAlsoBad` [GetterSetterNames]
                     src/android/pkg/MyClass.java:31: error: Symmetric method for `setCanRecordBad` must be named `canRecordBad`; was `isCanRecordBad` [GetterSetterNames]
@@ -1468,9 +1491,10 @@
     fun `Check banned collections`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:6: error: Parameter type is concrete collection (`java.util.HashMap`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
-                src/android/pkg/MyClass.java:10: error: Return type is concrete collection (`java.util.Vector`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
+                src/android/pkg/MyClass.java:9: error: Return type is concrete collection (`java.util.Vector`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
                 src/android/pkg/MyClass.java:10: error: Parameter type is concrete collection (`java.util.LinkedList`); must be higher-level interface [ConcreteCollection] [See https://s.android.com/api-guidelines#classes-collections]
                 """,
             expectedFail = DefaultLintErrorMessage,
@@ -1501,12 +1525,12 @@
     fun `Check nullable collections`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/MySubClass.java:5: warning: Public class android.pkg.MySubClass stripped of unavailable superclass android.pkg.MyHiddenInterface [HiddenSuperclass]
                 src/android/pkg/MyCallback.java:4: warning: Type of parameter list in android.pkg.MyCallback.onFoo(java.util.List<java.lang.String> list) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
-                src/android/pkg/MyClass.java:9: warning: Return type of method android.pkg.MyClass.getList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
-                src/android/pkg/MyClass.java:13: warning: Type of field android.pkg.MyClass.STRINGS is a nullable collection (`java.lang.String[]`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
-                src/android/pkg/MySubClass.java:14: warning: Return type of method android.pkg.MySubClass.getOtherList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
+                src/android/pkg/MyClass.java:8: warning: Return type of method android.pkg.MyClass.getList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
+                src/android/pkg/MyClass.java:12: warning: Type of field android.pkg.MyClass.STRINGS is a nullable collection (`java.lang.String[]`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
+                src/android/pkg/MySubClass.java:12: warning: Return type of method android.pkg.MySubClass.getOtherList(java.util.List<java.lang.String>) is a nullable collection (`java.util.List`); must be non-null [NullableCollection] [See https://s.android.com/api-guidelines#methods-prefer-non-null-collections]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1591,6 +1615,7 @@
     fun `Check non-overlapping flags`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/accounts/OverlappingFlags.java:19: warning: Found overlapping flag constant values: `TEST1_FLAG_SECOND` with value 3 (0x3) and overlapping flag value 1 (0x1) from `TEST1_FLAG_FIRST` [OverlappingConstants] [See https://s.android.com/api-guidelines#overlapping-constants]
                 """,
@@ -1632,10 +1657,13 @@
                 // Conflicting advice:
                 ARG_HIDE, "BannedThrow"
             ),
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:6: error: Methods must not throw generic exceptions (`java.lang.Exception`) [GenericException] [See https://s.android.com/api-guidelines#appropriate-exception]
                 src/android/pkg/MyClass.java:7: error: Methods must not throw generic exceptions (`java.lang.Throwable`) [GenericException] [See https://s.android.com/api-guidelines#appropriate-exception]
                 src/android/pkg/MyClass.java:8: error: Methods must not throw generic exceptions (`java.lang.Error`) [GenericException] [See https://s.android.com/api-guidelines#appropriate-exception]
+                src/android/pkg/MyClass.java:9: warning: Methods taking no arguments should throw `IllegalStateException` instead of `java.lang.IllegalArgumentException` [IllegalStateException] [See https://s.android.com/api-guidelines#appropriate-exception]
+                src/android/pkg/MyClass.java:10: warning: Methods taking no arguments should throw `IllegalStateException` instead of `java.lang.NullPointerException` [IllegalStateException] [See https://s.android.com/api-guidelines#appropriate-exception]
                 src/android/pkg/MyClass.java:11: error: Methods calling system APIs should rethrow `RemoteException` as `RuntimeException` (but do not list it in the throws clause) [RethrowRemoteException] [See https://s.android.com/api-guidelines#appropriate-exception]
                 """,
             expectedFail = DefaultLintErrorMessage,
@@ -1665,6 +1693,7 @@
     fun `Check no mentions of Google in APIs`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:4: error: Must never reference Google (`MyGoogleService`) [MentionsGoogle] [See https://s.android.com/api-guidelines#mentions-google]
                 src/android/pkg/MyClass.java:5: error: Must never reference Google (`callGoogle`) [MentionsGoogle] [See https://s.android.com/api-guidelines#mentions-google]
@@ -1690,10 +1719,11 @@
     fun `Check no usages of heavy BitSet`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/MyClass.java:9: error: Type must not be heavy BitSet (method android.pkg.MyClass.reverse(java.util.BitSet)) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
+                src/android/pkg/MyClass.java:8: error: Type must not be heavy BitSet (method android.pkg.MyClass.reverse(java.util.BitSet)) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
                 src/android/pkg/MyClass.java:9: error: Type must not be heavy BitSet (parameter bitset in android.pkg.MyClass.reverse(java.util.BitSet bitset)) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
-                src/android/pkg/MyClass.java:7: error: Type must not be heavy BitSet (field android.pkg.MyClass.bitset) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
+                src/android/pkg/MyClass.java:6: error: Type must not be heavy BitSet (field android.pkg.MyClass.bitset) [HeavyBitSet] [See https://s.android.com/api-guidelines#avoid-bitset]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -1720,9 +1750,10 @@
     fun `Check Manager related issues`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyFirstManager.java:6: error: Managers must always be obtained from Context; no direct constructors [ManagerConstructor]
-                src/android/pkg/MyFirstManager.java:9: error: Managers must always be obtained from Context (`get`) [ManagerLookup]
+                src/android/pkg/MyFirstManager.java:8: error: Managers must always be obtained from Context (`get`) [ManagerLookup]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -1761,14 +1792,15 @@
     fun `Check boxed types`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/test/pkg/KotlinClass.kt:4: error: Must avoid boxed primitives (`java.lang.Double`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 src/test/pkg/KotlinClass.kt:6: error: Must avoid boxed primitives (`java.lang.Boolean`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 src/test/pkg/MyClass.java:9: error: Must avoid boxed primitives (`java.lang.Long`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
-                src/test/pkg/MyClass.java:12: error: Must avoid boxed primitives (`java.lang.Short`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
+                src/test/pkg/MyClass.java:11: error: Must avoid boxed primitives (`java.lang.Short`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 src/test/pkg/MyClass.java:12: error: Must avoid boxed primitives (`java.lang.Double`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
-                src/test/pkg/MyClass.java:14: error: Must avoid boxed primitives (`java.lang.Boolean`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
-                src/test/pkg/MyClass.java:7: error: Must avoid boxed primitives (`java.lang.Integer`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
+                src/test/pkg/MyClass.java:13: error: Must avoid boxed primitives (`java.lang.Boolean`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
+                src/test/pkg/MyClass.java:6: error: Must avoid boxed primitives (`java.lang.Integer`) [AutoBoxing] [See https://s.android.com/api-guidelines#auto-boxing]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -1791,8 +1823,7 @@
                     }
                     """
                 ),
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
                     class KotlinClass {
                         fun getIntegerOk(): Double { TODO() }
@@ -1800,8 +1831,7 @@
                         fun getBooleanOk(): Boolean { TODO() }
                         fun getBooleanBad(): Boolean? { TODO() }
                     }
-                """
-                ),
+                """),
                 androidxNullableSource
             )
         )
@@ -1811,6 +1841,7 @@
     fun `Check static utilities`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyUtils1.java:3: error: Fully-static utility classes must not have constructor [StaticUtils]
                 src/android/pkg/MyUtils2.java:3: error: Fully-static utility classes must not have constructor [StaticUtils]
@@ -1876,6 +1907,7 @@
     fun `Check context first`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:11: error: Context is distinct, so it must be the first argument (method `wrong`) [ContextFirst]
                 src/android/pkg/MyClass.java:12: error: ContentResolver is distinct, so it must be the first argument (method `wrong`) [ContextFirst]
@@ -1908,6 +1940,7 @@
     fun `Check listener last`() {
         check(
             extraArguments = arrayOf(ARG_API_LINT, ARG_HIDE, "ExecutorRegistration"),
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:7: warning: Listeners should always be at end of argument list (method `MyClass`) [ListenerLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
                 src/android/pkg/MyClass.java:10: warning: Listeners should always be at end of argument list (method `wrong`) [ListenerLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
@@ -1947,6 +1980,7 @@
         // TODO: This check is not yet hooked up
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 """,
             sourceFiles = arrayOf(
@@ -1988,6 +2022,7 @@
     fun `Check Callback Handlers`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:16: warning: Registration methods should have overload that accepts delivery Executor: `registerWrongCallback` [ExecutorRegistration] [See https://s.android.com/api-guidelines#callbacks-listener]
                 src/android/pkg/MyClass.java:6: warning: Registration methods should have overload that accepts delivery Executor: `MyClass` [ExecutorRegistration] [See https://s.android.com/api-guidelines#callbacks-listener]
@@ -2046,6 +2081,7 @@
     fun `Check resource names`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/R.java:11: error: Expected resource name in `android.R.id` to be in the `fooBarBaz` style, was `wrong_style` [ResourceValueFieldName]
                 src/android/R.java:17: error: Expected config name to be in the `config_fooBarBaz` style, was `config_wrong_config_style` [ConfigFieldName]
@@ -2099,6 +2135,7 @@
     fun `Check files`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/CheckFiles.java:13: warning: Methods accepting `File` should also accept `FileDescriptor` or streams: method android.pkg.CheckFiles.error(int,java.io.File) [StreamFiles]
                 src/android/pkg/CheckFiles.java:9: warning: Methods accepting `File` should also accept `FileDescriptor` or streams: constructor android.pkg.CheckFiles(android.content.Context,java.io.File) [StreamFiles]
@@ -2131,6 +2168,7 @@
     fun `Check parcelable lists`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/CheckFiles.java:13: warning: Methods accepting `File` should also accept `FileDescriptor` or streams: method android.pkg.CheckFiles.error(int,java.io.File) [StreamFiles]
                 src/android/pkg/CheckFiles.java:9: warning: Methods accepting `File` should also accept `FileDescriptor` or streams: constructor android.pkg.CheckFiles(android.content.Context,java.io.File) [StreamFiles]
@@ -2163,6 +2201,7 @@
     fun `Check abstract inner`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyManager.java:9: warning: Abstract inner classes should be static to improve testability: class android.pkg.MyManager.MyInnerManager [AbstractInner]
                 """,
@@ -2191,9 +2230,37 @@
     }
 
     @Test
+    fun `Check for banned runtime exceptions`() {
+        check(
+            apiLint = "", // enabled
+            compatibilityMode = false,
+            expectedIssues = """
+                src/android/pkg/MyClass.java:7: error: Methods must not mention RuntimeException subclasses in throws clauses (was `java.lang.SecurityException`) [BannedThrow]
+                src/android/pkg/MyClass.java:6: error: Methods must not mention RuntimeException subclasses in throws clauses (was `java.lang.ClassCastException`) [BannedThrow]
+                """,
+            expectedFail = DefaultLintErrorMessage,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package android.pkg;
+
+                    public class MyClass {
+                         private MyClass() throws NullPointerException {} // OK, private
+                         @SuppressWarnings("RedundantThrows") public MyClass(int i) throws java.io.IOException {} // OK, not runtime exception
+                         public MyClass(double l) throws ClassCastException {} // error
+                         public void foo() throws SecurityException {} // error
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
     fun `Check for extending errors`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyClass.java:3: error: Trouble must be reported through an `Exception`, not an `Error` (`MyClass` extends `Error`) [ExtendsError]
                 src/android/pkg/MySomething.java:3: error: Exceptions must be named `FooException`, was `MySomething` [ExceptionName]
@@ -2224,6 +2291,7 @@
     fun `Check units and method names`() {
         check(
             extraArguments = arrayOf(ARG_API_LINT, ARG_HIDE, "NoByteOrShort"),
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/UnitNameTest.java:7: error: Expected method name units to be `Hours`, was `Hr` in `getErrorHr` [MethodNameUnits] [See https://s.android.com/api-guidelines#unit-names]
                 src/android/pkg/UnitNameTest.java:8: error: Expected method name units to be `Nanos`, was `Ns` in `getErrorNs` [MethodNameUnits] [See https://s.android.com/api-guidelines#unit-names]
@@ -2285,6 +2353,7 @@
     fun `Check closeable`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyErrorClass1.java:3: warning: Classes that release resources (close()) should implement AutoClosable and CloseGuard: class android.pkg.MyErrorClass1 [NotCloseable]
                 src/android/pkg/MyErrorClass2.java:3: warning: Classes that release resources (finalize(), shutdown()) should implement AutoClosable and CloseGuard: class android.pkg.MyErrorClass2 [NotCloseable]
@@ -2345,6 +2414,7 @@
     fun `Check closeable for minSdkVersion 19`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyErrorClass1.java:3: warning: Classes that release resources (close()) should implement AutoClosable and CloseGuard: class android.pkg.MyErrorClass1 [NotCloseable]
                 src/android/pkg/MyErrorClass2.java:3: warning: Classes that release resources (finalize(), shutdown()) should implement AutoClosable and CloseGuard: class android.pkg.MyErrorClass2 [NotCloseable]
@@ -2382,6 +2452,7 @@
     fun `Do not check closeable for minSdkVersion less than 19`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = "",
             manifest = """<?xml version="1.0" encoding="UTF-8"?>
                 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
@@ -2416,8 +2487,9 @@
     fun `Check ICU types for minSdkVersion 24`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/MyErrorClass1.java:8: warning: Type `java.util.TimeZone` should be replaced with richer ICU type `android.icu.util.TimeZone` [UseIcu]
+                src/android/pkg/MyErrorClass1.java:7: warning: Type `java.util.TimeZone` should be replaced with richer ICU type `android.icu.util.TimeZone` [UseIcu]
             """,
             manifest = """<?xml version="1.0" encoding="UTF-8"?>
                 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
@@ -2449,6 +2521,7 @@
     fun `Do not check ICU types for minSdkVersion less than 24`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = "",
             manifest = """<?xml version="1.0" encoding="UTF-8"?>
                 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
@@ -2480,6 +2553,7 @@
     fun `Check Kotlin keywords`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/KotlinKeywordTest.java:7: error: Avoid method names that are Kotlin hard keywords ("fun"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
                 src/android/pkg/KotlinKeywordTest.java:8: error: Avoid field names that are Kotlin hard keywords ("as"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
@@ -2509,6 +2583,7 @@
     fun `Check Kotlin operators`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/KotlinOperatorTest.java:6: info: Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object) [KotlinOperator]
                 src/android/pkg/KotlinOperatorTest.java:7: info: Method can be invoked with an indexing operator from Kotlin: `set` (this is usually desirable; just make sure it makes sense for this type of object) [KotlinOperator]
@@ -2543,8 +2618,9 @@
     fun `Return collections instead of arrays`() {
         check(
             extraArguments = arrayOf(ARG_API_LINT, ARG_HIDE, "AutoBoxing"),
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/ArrayTest.java:12: warning: Method should return Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]` [ArrayReturn] [See https://s.android.com/api-guidelines#methods-prefer-collection-over-array]
+                src/android/pkg/ArrayTest.java:11: warning: Method should return Collection<Object> (or subclass) instead of raw array; was `java.lang.Object[]` [ArrayReturn] [See https://s.android.com/api-guidelines#methods-prefer-collection-over-array]
                 src/android/pkg/ArrayTest.java:13: warning: Method parameter should be Collection<Number> (or subclass) instead of raw array; was `java.lang.Number[]` [ArrayReturn] [See https://s.android.com/api-guidelines#methods-prefer-collection-over-array]
                 """,
             sourceFiles = arrayOf(
@@ -2567,12 +2643,10 @@
                     }
                     """
                 ),
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
                     fun okMethod(vararg values: Integer, foo: Float, bar: Float)
-                    """
-                ),
+                    """),
                 androidxNonNullSource
             )
         )
@@ -2582,6 +2656,7 @@
     fun `Check user handle names`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MyManager.java:7: warning: When a method overload is needed to target a specific UserHandle, callers should be directed to use Context.createPackageContextAsUser() and re-obtain the relevant Manager, and no new API should be added [UserHandle]
                 src/android/pkg/UserHandleTest.java:8: warning: Method taking UserHandle should be named `doFooAsUser` or `queryFooForUser`, was `error` [UserHandleName]
@@ -2621,6 +2696,7 @@
     fun `Check parameters`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/FooOptions.java:3: warning: Classes holding a set of parameters should be called `FooParams`, was `FooOptions` [UserHandleName]
                 """,
@@ -2649,10 +2725,11 @@
     fun `Check service names`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/content/Context.java:11: error: Inconsistent service constant name; expected `SOMETHING_SERVICE`, was `OTHER_MANAGER` [ServiceName]
                 src/android/content/Context.java:12: error: Inconsistent service constant name; expected `OTHER_SERVICE`, was `OTHER_MANAGER_SERVICE` [ServiceName]
-                src/android/content/Context.java:10: error: Inconsistent service value; expected `other`, was `something` (Note: Do not change the name of already released services, which will break tools using `adb shell dumpsys`. Instead add `@SuppressLint("ServiceName"))` [ServiceName]
+                src/android/content/Context.java:9: error: Inconsistent service value; expected `other`, was `something` (Note: Do not change the name of already released services, which will break tools using `adb shell dumpsys`. Instead add `@SuppressLint("ServiceName"))` [ServiceName]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -2695,6 +2772,7 @@
     fun `Check method name tense`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MethodNameTest.java:6: warning: Unexpected tense; probably meant `enabled`, was `fooEnable` [MethodNameTense]
                 src/android/pkg/MethodNameTest.java:7: warning: Unexpected tense; probably meant `enabled`, was `mustEnable` [MethodNameTense]
@@ -2721,8 +2799,9 @@
     fun `Check no clone`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/android/pkg/CloneTest.java:8: error: Provide an explicit copy constructor instead of implementing `clone()` [NoClone] [See https://s.android.com/api-guidelines#avoid-clone]
+                src/android/pkg/CloneTest.java:7: error: Provide an explicit copy constructor instead of implementing `clone()` [NoClone] [See https://s.android.com/api-guidelines#avoid-clone]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -2734,7 +2813,7 @@
 
                     public class CloneTest {
                         public void clone(int i) { } // ok
-                        @NonNull
+                        @Nullable
                         public CloneTest clone() { return super.clone(); } // error
                     }
                     """
@@ -2748,9 +2827,10 @@
     fun `Check ICU types`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/IcuTest.java:6: warning: Type `java.util.TimeZone` should be replaced with richer ICU type `android.icu.util.TimeZone` [UseIcu]
-                src/android/pkg/IcuTest.java:8: warning: Type `java.text.BreakIterator` should be replaced with richer ICU type `android.icu.text.BreakIterator` [UseIcu]
+                src/android/pkg/IcuTest.java:7: warning: Type `java.text.BreakIterator` should be replaced with richer ICU type `android.icu.text.BreakIterator` [UseIcu]
                 src/android/pkg/IcuTest.java:8: warning: Type `java.text.Collator` should be replaced with richer ICU type `android.icu.text.Collator` [UseIcu]
                 """,
             sourceFiles = arrayOf(
@@ -2776,6 +2856,7 @@
     fun `Check using parcel file descriptors`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/PdfTest.java:6: error: Must use ParcelFileDescriptor instead of FileDescriptor in parameter fd in android.pkg.PdfTest.error1(java.io.FileDescriptor fd) [UseParcelFileDescriptor] [See https://s.android.com/api-guidelines#prefer-parcelfiledescriptor]
                 src/android/pkg/PdfTest.java:7: error: Must use ParcelFileDescriptor instead of FileDescriptor in method android.pkg.PdfTest.getFileDescriptor() [UseParcelFileDescriptor] [See https://s.android.com/api-guidelines#prefer-parcelfiledescriptor]
@@ -2809,11 +2890,11 @@
                     """
                     package android.yada;
 
-                    import android.annotation.Nullable;
+                    import android.annotation.NonNull;
 
                     public class YadaService extends android.app.Service {
                         @Override
-                        public final void dump(@Nullable java.io.FileDescriptor fd, @Nullable java.io.PrintWriter pw, @Nullable String[] args) {
+                        public final void dump(@NonNull java.io.FileDescriptor fd, @NonNull java.io.PrintWriter pw, @NonNull String[] args) {
                         }
                     }
                     """
@@ -2828,6 +2909,7 @@
     fun `Check using bytes and shorts`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/ByteTest.java:4: warning: Should avoid odd sized primitives; use `int` instead of `byte` in parameter b in android.pkg.ByteTest.error1(byte b) [NoByteOrShort] [See https://s.android.com/api-guidelines#avoid-short-byte]
                 src/android/pkg/ByteTest.java:5: warning: Should avoid odd sized primitives; use `int` instead of `short` in parameter s in android.pkg.ByteTest.error2(short s) [NoByteOrShort] [See https://s.android.com/api-guidelines#avoid-short-byte]
@@ -2851,6 +2933,7 @@
     fun `Check singleton constructors`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/MySingleton.java:8: error: Singleton classes should use `getInstance()` methods: `MySingleton` [SingletonConstructor] [See https://s.android.com/api-guidelines#singleton-class]
                 """,
@@ -2893,6 +2976,7 @@
     fun `Check forbidden super-classes`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/FirstActivity.java:2: error: FirstActivity should not extend `Activity`. Activity subclasses are impossible to compose. Expose a composable API instead. [ForbiddenSuperClass]
                 src/android/pkg/IndirectActivity.java:2: error: IndirectActivity should not extend `Activity`. Activity subclasses are impossible to compose. Expose a composable API instead. [ForbiddenSuperClass]
@@ -2932,10 +3016,11 @@
     fun `KotlinOperator check only applies when not using operator modifier`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/A.kt:3: info: Note that adding the `operator` keyword would allow calling this method using operator syntax [KotlinOperator]
                 src/android/pkg/Bar.kt:4: info: Note that adding the `operator` keyword would allow calling this method using operator syntax [KotlinOperator]
-                src/android/pkg/Foo.java:8: info: Method can be invoked as a binary operator from Kotlin: `div` (this is usually desirable; just make sure it makes sense for this type of object) [KotlinOperator]
+                src/android/pkg/Foo.java:7: info: Method can be invoked as a binary operator from Kotlin: `div` (this is usually desirable; just make sure it makes sense for this type of object) [KotlinOperator]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -2996,6 +3081,7 @@
         check(
             apiLint = "", // enabled
             extraArguments = arrayOf(ARG_API_LINT, ARG_HIDE, "AllUpper,StaticUtils,Enum"),
+            compatibilityMode = false,
             expectedIssues = """
                 src/android/pkg/Foo.java:11: error: Missing nullability on parameter `name` in method `Foo` [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
                 src/android/pkg/Foo.java:12: error: Missing nullability on parameter `value` in method `setBadValue` [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
@@ -3075,6 +3161,7 @@
     fun `Test equals, toString, non-null constants, enums and annotation members don't require nullability`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = "",
             sourceFiles = arrayOf(
                 java(
@@ -3119,8 +3206,9 @@
     fun `Nullability check for generic methods referencing parent type parameter`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = """
-                src/test/pkg/MyClass.java:14: error: Missing nullability on method `method4` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
+                src/test/pkg/MyClass.java:13: error: Missing nullability on method `method4` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
                 src/test/pkg/MyClass.java:14: error: Missing nullability on parameter `input` in method `method4` [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
             """,
             expectedFail = DefaultLintErrorMessage,
@@ -3135,9 +3223,9 @@
                     public class MyClass extends HiddenParent<String> {
                         public void method1() { }
 
-                        @NonNull
+                        @Nullable
                         @Override
-                        public String method3(@Nullable String input) { return null; }
+                        public String method3(@NonNull String input) { return null; }
 
                         @Override
                         public String method4(String input) { return null; }
@@ -3165,13 +3253,14 @@
     fun `No new setting keys`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             extraArguments = arrayOf(
                 ARG_ERROR,
                 "NoSettingsProvider"
             ),
             expectedIssues = """
                 src/android/provider/Settings.java:9: error: New setting keys are not allowed (Field: BAD1); use getters/setters in relevant manager class [NoSettingsProvider] [See https://s.android.com/api-guidelines#no-settings-provider]
-                src/android/provider/Settings.java:12: error: Bare field okay2 must be marked final, or moved behind accessors if mutable [MutableBareField] [See https://s.android.com/api-guidelines#mutable-bare-field]
+                src/android/provider/Settings.java:11: error: Bare field okay2 must be marked final, or moved behind accessors if mutable [MutableBareField] [See https://s.android.com/api-guidelines#mutable-bare-field]
                 src/android/provider/Settings.java:17: error: New setting keys are not allowed (Field: BAD1); use getters/setters in relevant manager class [NoSettingsProvider] [See https://s.android.com/api-guidelines#no-settings-provider]
                 src/android/provider/Settings.java:21: error: New setting keys are not allowed (Field: BAD1); use getters/setters in relevant manager class [NoSettingsProvider] [See https://s.android.com/api-guidelines#no-settings-provider]
             """,
@@ -3223,6 +3312,7 @@
                   }
                 }
             """.trimIndent(),
+            compatibilityMode = false,
             extraArguments = arrayOf(
                 ARG_API_LINT_IGNORE_PREFIX,
                 "java."
@@ -3248,6 +3338,7 @@
     fun `vararg use in annotations`() {
         check(
             apiLint = "", // enabled
+            compatibilityMode = false,
             expectedIssues = "",
             sourceFiles = arrayOf(
                 kotlin(
@@ -3268,6 +3359,7 @@
     @Test
     fun `Inherited interface constants`() {
         check(
+            compatibilityMode = false,
             expectedIssues = "",
             expectedFail = "",
             apiLint = """
@@ -3326,6 +3418,7 @@
     @Test
     fun `Inherited interface constants inherited through parents into children`() {
         check(
+            compatibilityMode = false,
             expectedIssues = "",
             expectedFail = "",
             apiLint = """
@@ -3370,6 +3463,7 @@
     @Test
     fun `No warnings about nullability on private constructor getters`() {
         check(
+            compatibilityMode = false,
             expectedIssues = "",
             apiLint = "",
             sourceFiles = arrayOf(
@@ -3384,511 +3478,4 @@
             )
         )
     }
-
-    @Test
-    fun `Methods returning ListenableFuture end with async`() {
-        check(
-            apiLint = "", // enabled
-            expectedIssues = """
-                src/android/pkg/MyClass.java:7: error: Methods returning com.google.common.util.concurrent.ListenableFuture should have a suffix *Async to reserve unmodified name for a suspend function [AsyncSuffixFuture]
-            """,
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package android.pkg;
-
-                    import androidx.annotation.Nullable;
-                    import com.google.common.util.concurrent.ListenableFuture;
-
-                    public final class MyClass {
-                        public @Nullable ListenableFuture<String> bad() { return null; }
-                        public @Nullable ListenableFuture<String> goodAsync() { return null; }
-                    }
-                    """
-                ),
-                java(
-                    """
-                    package com.google.common.util.concurrent;
-                    public class ListenableFuture<T> {
-                    }
-                    """
-                ),
-                androidxNullableSource
-            )
-        )
-    }
-
-    @Test
-    fun `Listener replaceable with OutcomeReceiver or ListenableFuture`() {
-        check(
-            apiLint = "", // enabled
-            expectedIssues = """
-                src/android/pkg/Cases.java:7: error: Cases.BadCallback can be replaced with OutcomeReceiver<R,E> (platform) or suspend fun / ListenableFuture (AndroidX). [GenericCallbacks] [See https://s.android.com/api-guidelines#callbacks-sam]
-                src/android/pkg/Cases.java:15: error: Cases.BadGenericListener can be replaced with OutcomeReceiver<R,E> (platform) or suspend fun / ListenableFuture (AndroidX). [GenericCallbacks] [See https://s.android.com/api-guidelines#callbacks-sam]
-                src/android/pkg/Cases.java:11: error: Cases.BadListener can be replaced with OutcomeReceiver<R,E> (platform) or suspend fun / ListenableFuture (AndroidX). [GenericCallbacks] [See https://s.android.com/api-guidelines#callbacks-sam]
-            """,
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package android.pkg;
-
-                    import androidx.annotation.NonNull;
-                    import java.io.IOException;
-
-                    public final class Cases {
-                        public class BadCallback {
-                            public abstract void onSuccess(@NonNull String result);
-                            public void onFailure(@NonNull Throwable error) {}
-                        }
-                        public interface BadListener {
-                            void onResult(@NonNull Object result);
-                            void onError(@NonNull IOException error);
-                        }
-                        public interface BadGenericListener<R, E extends Throwable> {
-                            void onResult(@NonNull R result);
-                            void onError(@NonNull E error);
-                        }
-                        public interface OkListener {
-                            void onResult(@NonNull Object result);
-                            void onError(@NonNull int error);
-                        }
-                        public interface Ok2Listener {
-                            void onResult(@NonNull int result);
-                            void onError(@NonNull Throwable error);
-                        }
-                        public interface Ok3Listener {
-                            void onSuccess(@NonNull String result);
-                            void onOtherThing(@NonNull String result);
-                            void onFailure(@NonNull Throwable error);
-                        }
-                    }
-                    """
-                ),
-                androidxNonNullSource
-            )
-        )
-    }
-
-    @Test
-    fun `No warning on generic return type`() {
-        check(
-            expectedIssues = "",
-            apiLint = "",
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        class SimpleArrayMap<K, V> {
-                            override fun getOrDefault(key: K, defaultValue: V): V {}
-                        }
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `No crash when setter start with numbers`() {
-        check(
-            expectedIssues = "",
-            apiLint = "",
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-                        import androidx.annotation.NonNull;
-                        public class Config {
-                            public boolean is80211mcSupported() { return true; }
-                            public static final class Builder {
-                                @NonNull
-                                public Builder set80211mcSupported(boolean supports80211mc) {
-                                }
-                                @NonNull
-                                public Config build() {
-                                    return Config();
-                                }
-                            }
-                        }
-                    """
-                ),
-                androidxNonNullSource,
-            )
-        )
-    }
-
-    @Test
-    fun `No error for nullability on synthetic methods`() {
-        check(
-            expectedIssues = "",
-            apiLint = "",
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        class Foo {
-                            @JvmSynthetic
-                            fun bar(): String {}
-                        }
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `Constructors return types don't require nullability`() {
-        check(
-            expectedIssues = "",
-            apiLint = "",
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-                        public class Foo() {
-                            // Doesn't require nullability
-                            public Foo(@NonNull String bar);
-                            // Requires nullability
-                            public @NonNull String baz(@NonNull String whatever);
-                        }
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `No nullability allowed on overrides of unannotated methods or parameters`() {
-        check(
-            expectedIssues = """
-                src/test/pkg/Foo.java:10: error: Invalid nullability on method `bar` return. Overrides of unannotated super method cannot be Nullable. [InvalidNullabilityOverride] [See https://s.android.com/api-guidelines#annotations-nullability-overrides]
-                src/test/pkg/Foo.java:10: error: Invalid nullability on parameter `baz` in method `bar`. Parameters of overrides cannot be NonNull if the super parameter is unannotated. [InvalidNullabilityOverride] [See https://s.android.com/api-guidelines#annotations-nullability-overrides]
-                src/test/pkg/Foo.java:5: error: Missing nullability on method `bar` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
-                src/test/pkg/Foo.java:5: error: Missing nullability on parameter `baz` in method `bar` [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
-                """,
-            apiLint = "",
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-
-                        public class Foo {
-                            // Not annotated
-                            public String bar(String baz);
-                        }
-                        // Not allowed to mark override method Nullable if parent is not annotated
-                        // Not allowed to mark override parameter NonNull if parent is not annotated
-                        public class Bar extends Foo {
-                            @Nullable @Override public String bar(@NonNull String baz);
-                        }
-                    """
-                ),
-                androidxNullableSource,
-                androidxNonNullSource
-            )
-        )
-    }
-
-    @Test
-    fun `Override enforcement on kotlin sourced child class`() {
-
-        check(
-            expectedIssues = """
-                src/test/pkg/Bar.kt:5: error: Invalid nullability on parameter `baz` in method `bar`. Parameters of overrides cannot be NonNull if the super parameter is unannotated. [InvalidNullabilityOverride] [See https://s.android.com/api-guidelines#annotations-nullability-overrides]
-                src/test/pkg/Foo.java:5: error: Missing nullability on method `bar` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
-                src/test/pkg/Foo.java:5: error: Missing nullability on parameter `baz` in method `bar` [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
-                """,
-            apiLint = "",
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-
-                        public class Foo {
-                            // Not annotated
-                            public String bar(String baz);
-                        }
-                        """
-                ),
-                kotlin(
-                    """
-                        package test.pkg
-                        // Not allowed to mark override method Nullable if parent is not annotated
-                        // Not allowed to mark override parameter NonNull if parent is not annotated
-                        class Bar : Foo {
-                            override fun bar(baz: String): String
-                        }
-                    """
-                ),
-                androidxNullableSource,
-                androidxNonNullSource
-            )
-        )
-    }
-
-    @Test
-    fun `Overrides of non-null methods cannot be nullable`() {
-        check(
-            expectedIssues = """
-                src/test/pkg/Foo.java:9: error: Invalid nullability on method `bar` return. Overrides of NonNull methods cannot be Nullable. [InvalidNullabilityOverride] [See https://s.android.com/api-guidelines#annotations-nullability-overrides]
-                """,
-            apiLint = "",
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-
-                        public class Foo {
-                            @NonNull public String bar(@Nullable String baz);
-                        }
-
-                        // Not allowed to mark override method Nullable if parent is nonNull
-                        public class Bar extends Foo {
-                            @Nullable @Override public String bar(@Nullable String baz);
-                        }
-                    """
-                ),
-                androidxNullableSource,
-                androidxNonNullSource
-            )
-        )
-    }
-
-    @Test
-    fun `Overrides of nullable parameters cannot be non-null`() {
-        check(
-            expectedIssues = """
-                src/test/pkg/Foo.java:10: error: Invalid nullability on parameter `baz` in method `bar`. Parameters of overrides cannot be NonNull if super parameter is Nullable. [InvalidNullabilityOverride] [See https://s.android.com/api-guidelines#annotations-nullability-overrides]
-                """,
-            apiLint = "",
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-
-                        public class Foo {
-                            // Not annotated
-                            @NonNull public String bar(@Nullable String baz);
-                        }
-
-                        // Not allowed to mark override parameter NonNull if parent is Nullable
-                        public class Bar extends Foo {
-                            @NonNull @Override public String bar(@NonNull String baz);
-                        }
-                    """
-                ),
-                androidxNullableSource,
-                androidxNonNullSource
-            )
-        )
-    }
-
-    @Test
-    fun `Unchecked exceptions not allowed`() {
-        check(
-            expectedIssues = """
-                src/test/pkg/Foo.java:22: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:23: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:24: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:25: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:26: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:27: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:28: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:29: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:30: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:31: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:32: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:33: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:34: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:35: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:36: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:37: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:38: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:39: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:40: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:41: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:42: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:43: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:44: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:45: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:46: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:47: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:48: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:49: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:50: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:51: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:52: error: Methods must not throw unchecked exceptions [BannedThrow]
-                src/test/pkg/Foo.java:53: error: Methods must not throw unchecked exceptions [BannedThrow]
-            """,
-            apiLint = "",
-            expectedFail = DefaultLintErrorMessage,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-                        import java.lang.reflect.UndeclaredThrowableException;
-                        import java.lang.reflect.MalformedParametersException;
-                        import java.lang.reflect.MalformedParameterizedTypeException;
-                        import java.lang.invoke.WrongMethodTypeException;
-                        import java.lang.annotation.AnnotationTypeMismatchException;
-                        import java.lang.annotation.IncompleteAnnotationException;
-                        import java.util.MissingResourceException;
-                        import java.util.EmptyStackException;
-                        import java.util.concurrent.CompletionException;
-                        import java.util.concurrent.RejectedExecutionException;
-                        import java.util.IllformedLocaleException;
-                        import java.util.ConcurrentModificationException;
-                        import java.util.NoSuchElementException;
-                        import java.io.UncheckedIOException;
-                        import java.time.DateTimeException;
-                        import java.security.ProviderException;
-                        import java.nio.BufferUnderflowException;
-                        import java.nio.BufferOverflowException;
-                        public class Foo {
-                            // 32 errors
-                            public void a() throws NullPointerException;
-                            public void b() throws ClassCastException;
-                            public void c() throws IndexOutOfBoundsException;
-                            public void d() throws UndeclaredThrowableException;
-                            public void e() throws MalformedParametersException;
-                            public void f() throws MalformedParameterizedTypeException;
-                            public void g() throws WrongMethodTypeException;
-                            public void h() throws EnumConstantNotPresentException;
-                            public void i() throws IllegalMonitorStateException;
-                            public void j() throws SecurityException;
-                            public void k() throws UnsupportedOperationException;
-                            public void l() throws AnnotationTypeMismatchException;
-                            public void m() throws IncompleteAnnotationException;
-                            public void n() throws TypeNotPresentException;
-                            public void o() throws IllegalStateException;
-                            public void p() throws ArithmeticException;
-                            public void q() throws IllegalArgumentException;
-                            public void r() throws ArrayStoreException;
-                            public void s() throws NegativeArraySizeException;
-                            public void t() throws MissingResourceException;
-                            public void u() throws EmptyStackException;
-                            public void v() throws CompletionException;
-                            public void w() throws RejectedExecutionException;
-                            public void x() throws IllformedLocaleException;
-                            public void y() throws ConcurrentModificationException;
-                            public void z() throws NoSuchElementException;
-                            public void aa() throws UncheckedIOException;
-                            public void ab() throws DateTimeException;
-                            public void ac() throws ProviderException;
-                            public void ad() throws BufferUnderflowException;
-                            public void ae() throws BufferOverflowException;
-                            public void af() throws AssertionError;
-                        }
-                    """
-                ),
-            )
-        )
-    }
-
-    @Test
-    fun `Nullability overrides in unbounded generics should be allowed`() {
-        check(
-            apiLint = "",
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg;
-
-                        interface Base<T> {
-                            fun method1(input: T): T
-                        }
-
-                        class Subject1 : Base<String> {
-                            override fun method1(input: String): String {
-                                TODO()
-                            }
-                        }
-
-                        class Subject2 : Base<String?> {
-                            override fun method1(input: String?): String? {
-                                TODO()
-                            }
-                        }
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `Nullability overrides in unbounded generics (Object to generic and back)`() {
-        check(
-            apiLint = "",
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-
-                        open class SimpleArrayMap<K, V> {
-                            open operator fun get(key: K): V? {
-                                TODO()
-                            }
-                        }
-                    """
-                ),
-                java(
-                    """
-                        package test.pkg;
-                        
-                        import java.util.Map;
-                        
-                        public class ArrayMap<K, V> extends SimpleArrayMap<K, V> implements Map<K, V> {
-                            @Override
-                            @Nullable
-                            public V get(@NonNull Object key) {
-                                return super.get((K) key);
-                            }
-                        }
-                        
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `Nullability overrides in unbounded generics (one super method lacks nullness info)`() {
-        check(
-            apiLint = "",
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-
-                        open class SimpleArrayMap<K, V> {
-                            open operator fun get(key: K): V? {
-                                TODO()
-                            }
-                        }
-                    """
-                ),
-                java(
-                    """
-                        package test.pkg;
-                        
-                        import java.util.Map;
-                        
-                        public class ArrayMap<K, V> extends SimpleArrayMap<K, V> implements Map<K, V> {
-                            @Override
-                            @Nullable
-                            public V get(@Nullable Object key) {
-                                return super.get((K) key);
-                            }
-                        }
-                        
-                    """
-                )
-            )
-        )
-    }
 }
diff --git a/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt b/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt
new file mode 100644
index 0000000..c684645
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/ArtifactTaggerTest.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava
+
+import org.junit.Test
+
+class ArtifactTaggerTest : DriverTest() {
+
+    @Test
+    fun `Tag API`() {
+        check(
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg.foo;
+                    /** My Foo class documentation. */
+                    public class Foo { // registered in both the foo and bar libraries: should get duplicate warnings
+                        public class Inner {
+                        }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg.bar;
+                    /** My Bar class documentation. */
+                    public class Bar {
+                        public class Inner {
+                        }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package test.pkg.baz;
+                    /** Extra class not registered in artifact files: should be flagged */
+                    public class Missing {
+                    }
+                    """
+                )
+            ),
+            artifacts = mapOf(
+                "my.library.group:foo:1.0.0" to """
+                    package test.pkg.foo {
+                      public class Foo {
+                        ctor public Foo();
+                      }
+                      public class Foo.Inner {
+                        ctor public Foo.Inner();
+                      }
+                    }
+                """,
+                "my.library.group:bar:3.1.4" to """
+                    package test.pkg.bar {
+                      public class Bar {
+                        ctor public Bar();
+                      }
+                      public class Bar.Inner {
+                        ctor public Bar.Inner();
+                      }
+                    }
+                    package test.pkg.foo {
+                      public class Foo { // duplicate registration: should generate warning
+                      }
+                    }
+                """
+            ),
+            extraArguments = arrayOf(ARG_ERROR, "NoArtifactData,BrokenArtifactFile"),
+            expectedIssues = """
+                src/test/pkg/foo/Foo.java:2: error: Class test.pkg.foo.Foo belongs to multiple artifacts: my.library.group:foo:1.0.0 and my.library.group:bar:3.1.4 [BrokenArtifactFile]
+                src/test/pkg/foo/Foo.java:4: error: Class test.pkg.foo.Foo.Inner belongs to multiple artifacts: my.library.group:foo:1.0.0 and my.library.group:bar:3.1.4 [BrokenArtifactFile]
+                src/test/pkg/baz/Missing.java:2: error: No registered artifact signature file referenced class test.pkg.baz.Missing [NoArtifactData]
+            """,
+            docStubs = true,
+            stubFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg.foo;
+                    /**
+                     * My Foo class documentation.
+                     * @artifactId my.library.group:foo:1.0.0
+                     */
+                    @SuppressWarnings({"unchecked", "deprecation", "all"})
+                    public class Foo {
+                    public Foo() { throw new RuntimeException("Stub!"); }
+                    /**
+                     * @artifactId my.library.group:foo:1.0.0
+                     */
+                    @SuppressWarnings({"unchecked", "deprecation", "all"})
+                    public class Inner {
+                    public Inner() { throw new RuntimeException("Stub!"); }
+                    }
+                    }
+                    """
+                )
+            )
+
+        )
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/BaselineTest.kt b/src/test/java/com/android/tools/metalava/BaselineTest.kt
index be243fe..ae7f2fa 100644
--- a/src/test/java/com/android/tools/metalava/BaselineTest.kt
+++ b/src/test/java/com/android/tools/metalava/BaselineTest.kt
@@ -24,7 +24,6 @@
     @Test
     fun `Check baseline`() {
         check(
-            format = FileFormat.V1,
             extraArguments = arrayOf(
                 ARG_HIDE,
                 "HiddenSuperclass",
@@ -146,7 +145,7 @@
                     method public <S extends test.pkg.Hidden1, T extends test.pkg.Hidden2> S get(T);
                     method public test.pkg.Hidden1 getHidden1();
                     method public test.pkg.Hidden2 getHidden2();
-                    method public void method(test.pkg.Hidden1, test.pkg.Hidden2);
+                    method public void method(test.pkg.Hidden1, test.pkg.Hidden2) throws test.pkg.Hidden3;
                     field public test.pkg.Hidden1 hidden1;
                     field public test.pkg.Hidden2 hidden2;
                   }
@@ -159,11 +158,11 @@
     fun `Check baseline with show annotations`() {
         // When using show annotations we should only reference errors that are present in the delta
         check(
-            format = FileFormat.V1,
             includeSystemApiAnnotations = true,
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.TestApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation",
                 ARG_API_LINT
             ),
             baseline = """
@@ -225,10 +224,10 @@
             api = """
                 package android.pkg {
                   public class RegistrationMethods {
-                    method public void registerOk2Callback(@Nullable Runnable);
-                    method public void registerUnpaired2Callback(@Nullable Runnable);
-                    method public void unregisterOk2Callback(@Nullable Runnable);
-                    method public void unregisterOk3Callback(@Nullable Runnable);
+                    method public void registerOk2Callback(java.lang.Runnable);
+                    method public void registerUnpaired2Callback(java.lang.Runnable);
+                    method public void unregisterOk2Callback(java.lang.Runnable);
+                    method public void unregisterOk3Callback(java.lang.Runnable);
                   }
                 }
                 """
diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckBaselineTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckBaselineTest.kt
index eb27b39..3be4fa0 100644
--- a/src/test/java/com/android/tools/metalava/CompatibilityCheckBaselineTest.kt
+++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckBaselineTest.kt
@@ -21,12 +21,14 @@
 class CompatibilityCheckBaselineTest : DriverTest() {
     @Test
     fun `Test released-API check, with error message`() {
-        // Global baseline works on released api check.
+        // Global baseline works on both released- and current- check.
         check(
             expectedIssues = """
                 TESTROOT/released-api.txt:1: error: Removed package test.pkg [RemovedPackage]
                 """,
+            compatibilityMode = false,
             errorMessageCheckCompatibilityReleased = "*** release-api check failed ***",
+            errorMessageCheckCompatibilityCurrent = "*** current-api check failed ***",
             checkCompatibilityApiReleased = """
                 package test.pkg {
                   public class MyTest1 {
@@ -43,11 +45,37 @@
     }
 
     @Test
+    fun `Test current-API check, with error message`() {
+        // Global baseline works on both released- and current- check.
+        check(
+            expectedIssues = """
+                TESTROOT/current-api.txt:1: error: Removed package test.pkg [RemovedPackage]
+                """,
+            compatibilityMode = false,
+            errorMessageCheckCompatibilityReleased = "*** release-api check failed ***",
+            errorMessageCheckCompatibilityCurrent = "*** current-api check failed ***",
+            checkCompatibilityApi = """
+                package test.pkg {
+                  public class MyTest1 {
+                  }
+                }
+                """,
+            signatureSource = """
+                """,
+            expectedFail = """
+                Aborting: Found compatibility problems checking the public API (TESTROOT/project/load-api.txt) against the API in TESTROOT/project/current-api.txt
+                *** current-api check failed ***
+                """
+        )
+    }
+
+    @Test
     fun `Test released-API check, with global baseline`() {
-        // Global baseline works on released api check.
+        // Global baseline works on both released- and current- check.
         check(
             expectedIssues = """
                 """,
+            compatibilityMode = false,
             baseline = """
                 // Baseline format: 1.0
                 ChangedScope: test.pkg.MyTest1:
@@ -69,11 +97,39 @@
     }
 
     @Test
+    fun `Test current-API check, with global baseline`() {
+        // Global baseline works on both released- and current- check.
+        check(
+            expectedIssues = """
+                """,
+            compatibilityMode = false,
+            baseline = """
+                // Baseline format: 1.0
+                ChangedScope: test.pkg.MyTest1:
+                    Class test.pkg.MyTest1 changed visibility from public to private
+                """,
+            checkCompatibilityApi = """
+                package test.pkg {
+                  public class MyTest1 {
+                  }
+                }
+                """,
+            signatureSource = """
+                package test.pkg {
+                  private class MyTest1 { // visibility changed
+                  }
+                }
+                """
+        )
+    }
+
+    @Test
     fun `Test released-API check, with compatibility-released baseline`() {
         // Use released-API check baseline, which should work in released-API check.
         check(
             expectedIssues = """
                 """,
+            compatibilityMode = false,
             baselineCheckCompatibilityReleased = """
                 // Baseline format: 1.0
                 ChangedScope: test.pkg.MyTest1:
@@ -100,6 +156,7 @@
         check(
             expectedIssues = """
                 """,
+            compatibilityMode = false,
             baselineCheckCompatibilityReleased = """
                 """,
             updateBaselineCheckCompatibilityReleased = """
@@ -121,4 +178,36 @@
                 """
         )
     }
+
+    @Test
+    fun `Test current-API check, but with compatibility-released baseline`() {
+        // Use released-API check baseline, which shouldn't be used in current-API check.
+        check(
+            compatibilityMode = false,
+            expectedIssues = """
+                TESTROOT/load-api.txt:2: error: Class test.pkg.MyTest1 changed visibility from public to private [ChangedScope]
+                """,
+            // This is a "current" compat check, so this baseline should be ignored.
+            baselineCheckCompatibilityReleased = """
+                // Baseline format: 1.0
+                ChangedScope: test.pkg.MyTest1:
+                    Class test.pkg.MyTest1 changed visibility from public to private
+                """,
+            checkCompatibilityApi = """
+                package test.pkg {
+                  public class MyTest1 {
+                  }
+                }
+                """,
+            signatureSource = """
+                package test.pkg {
+                  private class MyTest1 { // visibility changed
+                  }
+                }
+                """,
+            expectedFail = """
+                Aborting: Found compatibility problems checking the public API (TESTROOT/project/load-api.txt) against the API in TESTROOT/project/current-api.txt
+                """
+        )
+    }
 }
diff --git a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
index 1dc846b..f00d8a0 100644
--- a/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/CompatibilityCheckTest.kt
@@ -30,7 +30,8 @@
                 TESTROOT/load-api.txt:2: error: Class test.pkg.MyTest1 changed class/interface declaration [ChangedClass]
                 TESTROOT/load-api.txt:4: error: Class test.pkg.MyTest2 changed class/interface declaration [ChangedClass]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class MyTest1 {
                   }
@@ -65,7 +66,8 @@
                 TESTROOT/load-api.txt:2: error: Class test.pkg.MyTest1 changed class/interface declaration [ChangedClass]
                 TESTROOT/load-api.txt:4: error: Class test.pkg.MyTest2 changed class/interface declaration [ChangedClass]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class MyTest1 {
                   }
@@ -97,11 +99,12 @@
     fun `Ensure warnings for removed APIs`() {
         check(
             expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.MyTest1.method(Float) [RemovedMethod]
-                TESTROOT/released-api.txt:4: error: Removed field test.pkg.MyTest1.field [RemovedField]
-                TESTROOT/released-api.txt:6: error: Removed class test.pkg.MyTest2 [RemovedClass]
+                TESTROOT/current-api.txt:3: error: Removed method test.pkg.MyTest1.method(Float) [RemovedMethod]
+                TESTROOT/current-api.txt:4: error: Removed field test.pkg.MyTest1.field [RemovedField]
+                TESTROOT/current-api.txt:6: error: Removed class test.pkg.MyTest2 [RemovedClass]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class MyTest1 {
                     method public Double method(Float);
@@ -135,8 +138,9 @@
                 TESTROOT/load-api.txt:7: error: Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter arg1 in test.pkg.MyTest.convert5(Float arg1) [InvalidNullConversion]
                 TESTROOT/load-api.txt:8: error: Attempted to change method return from @NonNull to @Nullable: incompatible change for method test.pkg.MyTest.convert6(Float) [InvalidNullConversion]
                 """,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class MyTest {
                     method public Double convert1(Float);
@@ -181,9 +185,10 @@
                 src/test/pkg/Outer.kt:8: error: Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in test.pkg.Outer.Inner.method2(String string, String maybeString) [InvalidNullConversion]
                 src/test/pkg/Outer.kt:9: error: Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter string in test.pkg.Outer.Inner.method3(String maybeString, String string) [InvalidNullConversion]
                 """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                     package test.pkg {
                       public final class Outer {
                         ctor public Outer();
@@ -222,10 +227,11 @@
     fun `Java Parameter Name Change`() {
         check(
             expectedIssues = """
-                src/test/pkg/JavaClass.java:6: error: Attempted to remove parameter name from parameter newName in test.pkg.JavaClass.method1 [ParameterNameChange]
+                src/test/pkg/JavaClass.java:6: error: Attempted to remove parameter name from parameter newName in test.pkg.JavaClass.method1 in method test.pkg.JavaClass.method1 [ParameterNameChange]
                 src/test/pkg/JavaClass.java:7: error: Attempted to change parameter name from secondParameter to newName in method test.pkg.JavaClass.method2 [ParameterNameChange]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class JavaClass {
                     ctor public JavaClass();
@@ -259,9 +265,10 @@
             expectedIssues = """
                 src/test/pkg/KotlinClass.kt:4: error: Attempted to change parameter name from prevName to newName in method test.pkg.KotlinClass.method1 [ParameterNameChange]
                 """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class KotlinClass {
                     ctor public KotlinClass();
@@ -287,9 +294,10 @@
     fun `Kotlin Coroutines`() {
         check(
             expectedIssues = "",
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class TestKt {
                     ctor public TestKt();
@@ -309,12 +317,46 @@
     }
 
     @Test
+    fun `Add flag new methods but not overrides from platform`() {
+        check(
+            expectedIssues = """
+                src/test/pkg/MyClass.java:6: error: Added method test.pkg.MyClass.method2(String) [AddedMethod]
+                src/test/pkg/MyClass.java:7: error: Added field test.pkg.MyClass.newField [AddedField]
+                """,
+            compatibilityMode = false,
+            checkCompatibilityApi = """
+                package test.pkg {
+                  public class MyClass {
+                    method public String method1(String);
+                  }
+                }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+
+                    public class MyClass  {
+                        private MyClass() { }
+                        public String method1(String newName) { return null; }
+                        public String method2(String newName) { return null; }
+                        public int newField = 5;
+                        public String toString() { return "Hello World"; }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
     fun `Remove operator`() {
         check(
             expectedIssues = """
                 src/test/pkg/Foo.kt:4: error: Cannot remove `operator` modifier from method test.pkg.Foo.plus(String): Incompatible change [OperatorRemoval]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Foo {
                     ctor public Foo();
@@ -342,7 +384,8 @@
             expectedIssues = """
                 src/test/pkg/test.kt:3: error: Changing from varargs to array is an incompatible change: parameter x in test.pkg.TestKt.method2(int[] x) [VarargRemoval]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class TestKt {
                     method public static final void method1(int[] x);
@@ -371,7 +414,8 @@
                 src/test/pkg/Java.java:4: error: Method test.pkg.Java.method has added 'final' qualifier [AddedFinal]
                 src/test/pkg/Kotlin.kt:4: error: Method test.pkg.Kotlin.method has added 'final' qualifier [AddedFinal]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Java {
                     method public void method(int);
@@ -412,7 +456,8 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Cls extends test.pkg.Parent {
                   }
@@ -452,7 +497,8 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Cls extends test.pkg.Parent {
                   }
@@ -489,7 +535,8 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Cls implements test.pkg.Interface {
                     method public void method(int);
@@ -540,7 +587,8 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class AbstractMap<K, V> implements java.util.Map {
                     method public java.util.Set<K> keySet();
@@ -581,8 +629,9 @@
     fun `Added constructor`() {
         // Regression test for issue 116619591
         check(
-            expectedIssues = "",
-            checkCompatibilityApiReleased = """
+            expectedIssues = "src/test/pkg/AbstractMap.java:2: error: Added constructor test.pkg.AbstractMap() [AddedMethod]",
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class AbstractMap<K, V> implements java.util.Map {
                   }
@@ -607,7 +656,8 @@
             expectedIssues = """
                 src/test/pkg/Foo.kt:5: error: Cannot remove `infix` modifier from method test.pkg.Foo.add2(String): Incompatible change [InfixRemoval]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Foo {
                     ctor public Foo();
@@ -639,7 +689,8 @@
             expectedIssues = """
                 src/test/pkg/Foo.kt:2: error: Cannot add 'sealed' modifier to class test.pkg.Foo: Incompatible change [AddSealed]
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Foo {
                   }
@@ -660,12 +711,13 @@
     fun `Remove default parameter`() {
         check(
             expectedIssues = """
-                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
-                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo in constructor test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 in method test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
 
                 """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Foo {
                     ctor public Foo(String? s1 = null);
@@ -697,12 +749,13 @@
     fun `Remove optional parameter`() {
         check(
             expectedIssues = """
-                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
-                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:3: error: Attempted to remove default value from parameter s1 in test.pkg.Foo in constructor test.pkg.Foo [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
+                src/test/pkg/Foo.kt:7: error: Attempted to remove default value from parameter s1 in test.pkg.Foo.method4 in method test.pkg.Foo.method4 [DefaultValueChange] [See https://s.android.com/api-guidelines#default-value-removal]
                 """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class Foo {
                     ctor public Foo(optional String? s1);
@@ -735,7 +788,7 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Child extends test.pkg.Parent {
                     ctor public Child();
@@ -787,10 +840,13 @@
                 src/test/pkg/Parent.java:6: error: Field test.pkg.Parent.field3 has changed type from int to char [ChangedType]
                 src/test/pkg/Parent.java:7: error: Field test.pkg.Parent.field4 has added 'final' qualifier [AddedFinal]
                 src/test/pkg/Parent.java:8: error: Field test.pkg.Parent.field5 has changed 'static' qualifier [ChangedStatic]
+                src/test/pkg/Parent.java:9: error: Field test.pkg.Parent.field6 has changed 'transient' qualifier [ChangedTransient]
                 src/test/pkg/Parent.java:10: error: Field test.pkg.Parent.field7 has changed 'volatile' qualifier [ChangedVolatile]
-                src/test/pkg/Parent.java:20: error: Field test.pkg.Parent.field94 has changed value from 1 to 42 [ChangedValue]
+                src/test/pkg/Parent.java:11: error: Field test.pkg.Parent.field8 has changed deprecation state true --> false [ChangedDeprecated]
+                src/test/pkg/Parent.java:12: error: Field test.pkg.Parent.field9 has changed deprecation state false --> true [ChangedDeprecated]
+                src/test/pkg/Parent.java:19: error: Field test.pkg.Parent.field94 has changed value from 1 to 42 [ChangedValue]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Parent {
                     ctor public Parent();
@@ -851,7 +907,7 @@
                 src/test/pkg/ExportedProperty.java:14: error: Method test.pkg.ExportedProperty.floating has changed value from 1.0f to 1.1f [ChangedValue]
                 src/test/pkg/ExportedProperty.java:13: error: Method test.pkg.ExportedProperty.prefix has changed value from "" to "hello" [ChangedValue]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public @interface ExportedProperty {
                     method public abstract boolean resolveId() default false;
@@ -894,7 +950,7 @@
             expectedIssues = """
                 src/test/pkg/Parent.java:3: error: Class test.pkg.Parent changed class/interface declaration [ChangedClass]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Parent {
                   }
@@ -918,8 +974,9 @@
         check(
             expectedIssues = """
                 src/test/pkg/Parent.java:3: error: Class test.pkg.Parent no longer implements java.io.Closeable [RemovedInterface]
+                src/test/pkg/Parent.java:3: error: Added interface java.util.List to class class test.pkg.Parent [AddedInterface]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class Parent implements java.io.Closeable, java.util.Map {
                   }
@@ -946,7 +1003,7 @@
                 src/test/pkg/Parent.java:3: error: Class test.pkg.Parent changed 'abstract' qualifier [ChangedAbstract]
                 src/test/pkg/Parent.java:3: error: Class test.pkg.Parent changed 'static' qualifier [ChangedStatic]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Parent {
                   }
@@ -971,9 +1028,11 @@
         check(
             expectedIssues = """
                 src/test/pkg/Class1.java:3: error: Class test.pkg.Class1 added 'final' qualifier [AddedFinal]
-                TESTROOT/released-api.txt:3: error: Removed constructor test.pkg.Class1() [RemovedMethod]
+                TESTROOT/current-api.txt:3: error: Removed constructor test.pkg.Class1() [RemovedMethod]
+                src/test/pkg/Class2.java:3: error: Class test.pkg.Class2 added 'final' qualifier but was previously uninstantiable and therefore could not be subclassed [AddedFinalUninstantiable]
+                src/test/pkg/Class3.java:3: error: Class test.pkg.Class3 removed 'final' qualifier [RemovedFinal]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Class1 {
                       ctor public Class1();
@@ -1023,7 +1082,7 @@
                 src/test/pkg/Class1.java:3: error: Class test.pkg.Class1 changed visibility from protected to public [ChangedScope]
                 src/test/pkg/Class2.java:3: error: Class test.pkg.Class2 changed visibility from public to protected [ChangedScope]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   protected class Class1 {
                   }
@@ -1055,12 +1114,39 @@
     }
 
     @Test
+    fun `Incompatible class change -- deprecation`() {
+        check(
+            expectedIssues = """
+                src/test/pkg/Class1.java:3: error: Class test.pkg.Class1 has changed deprecation state false --> true [ChangedDeprecated]
+                """,
+            checkCompatibilityApi = """
+                package test.pkg {
+                  public class Class1 {
+                  }
+                }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+
+                    /** @deprecated */
+                    @Deprecated public class Class1 {
+                        private Class1() {}
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
     fun `Incompatible class change -- superclass`() {
         check(
             expectedIssues = """
                 src/test/pkg/Class3.java:3: error: Class test.pkg.Class3 superclass changed from java.lang.Char to java.lang.Number [ChangedSuperclass]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class Class1 {
                   }
@@ -1103,62 +1189,28 @@
     }
 
     @Test
-    fun `allow adding first type parameter`() {
-        check(
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo<T> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `disallow removing type parameter`() {
+    fun `Incompatible class change -- type variables`() {
         check(
             expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed number of type parameters from 1 to 0 [ChangedType]
-            """,
-            checkCompatibilityApiReleased = """
+                src/test/pkg/Class1.java:3: error: Class test.pkg.Class1 changed number of type parameters from 1 to 2 [ChangedType]
+                """,
+            checkCompatibilityApi = """
                 package test.pkg {
-                    public class Foo<T> {
-                    }
+                  public class Class1<X> {
+                  }
                 }
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """
-        )
-    }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
 
-    @Test
-    fun `disallow changing number of type parameters`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed number of type parameters from 1 to 2 [ChangedType]
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo<A> {
+                    public class Class1<X,Y> {
+                        private Class1() {}
                     }
-                }
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo<A,B> {
-                    }
-                }
-            """
+                    """
+                )
+            )
         )
     }
 
@@ -1168,8 +1220,9 @@
             expectedIssues = """
                 src/test/pkg/MyClass.java:5: error: Method test.pkg.MyClass.myMethod2 has changed 'abstract' qualifier [ChangedAbstract]
                 src/test/pkg/MyClass.java:6: error: Method test.pkg.MyClass.myMethod3 has changed 'static' qualifier [ChangedStatic]
+                src/test/pkg/MyClass.java:7: error: Method test.pkg.MyClass.myMethod4 has changed deprecation state true --> false [ChangedDeprecated]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass {
                       method public void myMethod2();
@@ -1200,8 +1253,9 @@
         check(
             expectedIssues = """
                 src/test/pkg/Outer.java:7: error: Method test.pkg.Outer.Class1.method1 has added 'final' qualifier [AddedFinal]
+                src/test/pkg/Outer.java:19: error: Method test.pkg.Outer.Class4.method4 has removed 'final' qualifier [RemovedFinal]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class Outer {
                   }
@@ -1253,9 +1307,10 @@
     fun `Incompatible method change -- visibility`() {
         check(
             expectedIssues = """
+                src/test/pkg/MyClass.java:5: error: Method test.pkg.MyClass.myMethod1 changed visibility from protected to public [ChangedScope]
                 src/test/pkg/MyClass.java:6: error: Method test.pkg.MyClass.myMethod2 changed visibility from public to protected [ChangedScope]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass {
                       method protected void myMethod1();
@@ -1279,7 +1334,6 @@
         )
     }
 
-    @Ignore("TODO(aurimas) reenable once this is default on")
     @Test
     fun `Incompatible method change -- throws list`() {
         check(
@@ -1290,7 +1344,7 @@
                 src/test/pkg/MyClass.java:9: error: Method test.pkg.MyClass.method3 no longer throws exception java.lang.NumberFormatException [ChangedThrows]
                 src/test/pkg/MyClass.java:9: error: Method test.pkg.MyClass.method3 added thrown exception java.lang.UnsupportedOperationException [ChangedThrows]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass {
                       method public void finalize() throws java.lang.Throwable;
@@ -1328,10 +1382,11 @@
                 src/test/pkg/MyClass.java:7: error: Method test.pkg.MyClass.method3 has changed return type from java.util.List<Integer> to java.util.List<java.lang.Number> [ChangedType]
                 src/test/pkg/MyClass.java:8: error: Method test.pkg.MyClass.method4 has changed return type from String to String[] [ChangedType]
                 src/test/pkg/MyClass.java:9: error: Method test.pkg.MyClass.method5 has changed return type from String[] to String[][] [ChangedType]
+                src/test/pkg/MyClass.java:10: error: Method test.pkg.MyClass.method6 has changed return type from T (extends java.lang.Object) to U (extends java.lang.Number) [ChangedType]
                 src/test/pkg/MyClass.java:11: error: Method test.pkg.MyClass.method7 has changed return type from T to Number [ChangedType]
                 src/test/pkg/MyClass.java:13: error: Method test.pkg.MyClass.method9 has changed return type from X (extends java.lang.Throwable) to U (extends java.lang.Number) [ChangedType]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass<T extends Number> {
                       method public float method1();
@@ -1373,9 +1428,11 @@
     fun `Incompatible field change -- visibility and removing final`() {
         check(
             expectedIssues = """
+                src/test/pkg/MyClass.java:5: error: Field test.pkg.MyClass.myField1 changed visibility from protected to public [ChangedScope]
                 src/test/pkg/MyClass.java:6: error: Field test.pkg.MyClass.myField2 changed visibility from public to protected [ChangedScope]
+                src/test/pkg/MyClass.java:7: error: Field test.pkg.MyClass.myField3 has removed 'final' qualifier [RemovedFinal]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass {
                       field protected int myField1;
@@ -1405,10 +1462,13 @@
     fun `Adding classes, interfaces and packages, and removing these`() {
         check(
             expectedIssues = """
-                TESTROOT/released-api.txt:2: error: Removed class test.pkg.MyOldClass [RemovedClass]
-                TESTROOT/released-api.txt:5: error: Removed package test.pkg3 [RemovedPackage]
+                src/test/pkg/MyClass.java:3: error: Added class test.pkg.MyClass [AddedClass]
+                src/test/pkg/MyInterface.java:3: error: Added class test.pkg.MyInterface [AddedInterface]
+                TESTROOT/current-api.txt:2: error: Removed class test.pkg.MyOldClass [RemovedClass]
+                error: Added package test.pkg2 [AddedPackage]
+                TESTROOT/current-api.txt:5: error: Removed package test.pkg3 [RemovedPackage]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyOldClass {
                   }
@@ -1453,9 +1513,9 @@
     fun `Test removing public constructor`() {
         check(
             expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed constructor test.pkg.MyClass() [RemovedMethod]
+                TESTROOT/current-api.txt:3: error: Removed constructor test.pkg.MyClass() [RemovedMethod]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass {
                     ctor public MyClass();
@@ -1482,7 +1542,7 @@
             expectedIssues = """
                 src/test/pkg/MyClass.java:8: error: Method test.pkg.MyClass.myMethod4 has changed return type from S (extends java.lang.Object) to S (extends java.lang.Float) [ChangedType]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public abstract class MyClass<T extends test.pkg.Number,T_SPLITR> {
                     method public T myMethod1();
@@ -1529,8 +1589,10 @@
         check(
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
+            omitCommonPackages = true,
+            compatibilityMode = false,
             expectedIssues = "",
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package androidx.content {
                   public final class ContentValuesKt {
                     method public static android.content.ContentValues contentValuesOf(kotlin.Pair<String,?>... pairs);
@@ -1576,8 +1638,10 @@
         check(
             inputKotlinStyleNulls = false,
             outputKotlinStyleNulls = true,
+            omitCommonPackages = true,
+            compatibilityMode = false,
             expectedIssues = "",
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package androidx.navigation {
                   public final class NavDestination {
                     ctor public NavDestination();
@@ -1613,7 +1677,7 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class Child1 extends test.pkg.Parent {
                   }
@@ -1713,7 +1777,7 @@
         check(
             includeSystemApiAnnotations = true,
             expectedIssues = """
-                TESTROOT/released-api.txt:4: error: Removed method test.pkg.Bar.Inner1.Inner2.removedMethod() [RemovedMethod]
+                TESTROOT/current-api.txt:4: error: Removed method test.pkg.Bar.Inner1.Inner2.removedMethod() [RemovedMethod]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1761,9 +1825,10 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
-            checkCompatibilityApiReleased =
+            checkCompatibilityApi =
             """
                 package test.pkg {
                   public class Bar.Inner1.Inner2 {
@@ -1783,7 +1848,7 @@
         check(
             includeSystemApiAnnotations = true,
             expectedIssues = """
-                TESTROOT/released-api.txt:4: error: Removed method android.rolecontrollerservice.RoleControllerService.onClearRoleHolders() [RemovedMethod]
+                TESTROOT/current-api.txt:4: error: Removed method android.rolecontrollerservice.RoleControllerService.onClearRoleHolders() [RemovedMethod]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1812,10 +1877,11 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.TestApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
-            checkCompatibilityApiReleased =
-            """
+            checkCompatibilityApi =
+                """
                 package android.rolecontrollerservice {
                   public abstract class RoleControllerService extends android.rolecontrollerservice.Service {
                     ctor public RoleControllerService();
@@ -1879,6 +1945,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             checkCompatibilityApiReleased =
@@ -1898,12 +1965,119 @@
     }
 
     @Test
+    fun `Test verifying simple removed API`() {
+        check(
+            expectedIssues = """
+                TESTROOT/removed-current-api.txt:5: error: Removed method test.pkg.Bar.removedMethod2() [RemovedMethod]
+                """,
+            checkCompatibilityRemovedApiCurrent = """
+                package test.pkg {
+                  public class Bar {
+                    ctor public Bar();
+                    method public void removedMethod();
+                    method public void removedMethod2();
+                  }
+                  public class Bar.Inner {
+                    ctor public Bar.Inner();
+                  }
+                }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    @SuppressWarnings("JavaDoc")
+                    public class Bar {
+                        /** @removed */ // still part of the removed api
+                        public Bar() { }
+                        // no longer part of the removed api
+                        public void removedMethod() { }
+                        /** @removed */
+                        public void newlyRemoved() { }
+
+                        public void newlyAdded() { }
+
+                        /** @removed */ // still part of the removed api
+                        public class Inner { }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
+    fun `Test verifying removed API`() {
+        check(
+            expectedIssues = """
+                """,
+            checkCompatibilityRemovedApiCurrent = """
+                package test.pkg {
+                  public class Bar {
+                    ctor public Bar();
+                    method public void removedMethod();
+                    field public int removedField;
+                  }
+                  public class Bar.Inner {
+                    ctor public Bar.Inner();
+                  }
+                  public class Bar.Inner2.Inner3.Inner4 {
+                    ctor public Bar.Inner2.Inner3.Inner4();
+                  }
+                  public class Bar.Inner5.Inner6.Inner7 {
+                    field public int removed;
+                  }
+                }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    @SuppressWarnings("JavaDoc")
+                    public class Bar {
+                        /** @removed */
+                        public Bar() { }
+                        public int field;
+                        public void test() { }
+                        /** @removed */
+                        public int removedField;
+                        /** @removed */
+                        public void removedMethod() { }
+                        /** @removed and @hide - should not be listed */
+                        public int hiddenField;
+
+                        /** @removed */
+                        public class Inner { }
+
+                        public class Inner2 {
+                            public class Inner3 {
+                                /** @removed */
+                                public class Inner4 { }
+                            }
+                        }
+
+                        public class Inner5 {
+                            public class Inner6 {
+                                public class Inner7 {
+                                    /** @removed */
+                                    public int removed;
+                                }
+                            }
+                        }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
     fun `Regression test for bug 120847535`() {
         // Regression test for
         // 120847535: check-api doesn't fail on method that is in current.txt, but marked @hide @TestApi
         check(
             expectedIssues = """
-                TESTROOT/released-api.txt:6: error: Removed method test.view.ViewTreeObserver.registerFrameCommitCallback(Runnable) [RemovedMethod]
+                TESTROOT/current-api.txt:6: error: Removed method test.view.ViewTreeObserver.registerFrameCommitCallback(Runnable) [RemovedMethod]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -1942,9 +2116,10 @@
             """,
             extraArguments = arrayOf(
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.view {
                   public final class View {
                   }
@@ -1965,7 +2140,7 @@
             expectedIssues = """
                 src/test/pkg/Class1.java:3: error: Class test.pkg.Class1 added 'final' qualifier [AddedFinal]
                 TESTROOT/released-api.txt:3: error: Removed constructor test.pkg.Class1() [RemovedMethod]
-                src/test/pkg/MyClass.java:5: error: Method test.pkg.MyClass.myMethod2 has changed 'abstract' qualifier [ChangedAbstract]
+                src/test/pkg/MyClass.java:5: warning: Method test.pkg.MyClass.myMethod2 has changed 'abstract' qualifier [ChangedAbstract]
                 src/test/pkg/MyClass.java:6: error: Method test.pkg.MyClass.myMethod3 has changed 'static' qualifier [ChangedStatic]
                 TESTROOT/released-api.txt:14: error: Removed class test.pkg.MyOldClass [RemovedClass]
                 TESTROOT/released-api.txt:17: error: Removed package test.pkg3 [RemovedPackage]
@@ -2116,6 +2291,7 @@
     @Test
     fun `Test check a class moving from the released api to the base api`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package test.pkg {
                   public class SomeClass1 {
@@ -2153,8 +2329,9 @@
     @Test
     fun `Implicit nullness`() {
         check(
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 2.0
                 package androidx.annotation {
                   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
@@ -2165,7 +2342,34 @@
                     enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
-                    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+                    enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+                    enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+                  }
+                }
+                """,
+
+            sourceFiles = arrayOf(
+                restrictToSource
+            )
+        )
+    }
+
+    @Test
+    fun `Implicit nullness in compat format`() {
+        // Make sure we put "static" in enum modifier lists when in v1/compat mode
+        check(
+            compatibilityMode = true,
+            inputKotlinStyleNulls = true,
+            checkCompatibilityApi = """
+                package androidx.annotation {
+                  public abstract class RestrictTo implements java.lang.annotation.Annotation {
+                    method public abstract androidx.annotation.RestrictTo.Scope[] value();
+                  }
+
+                  public static final class RestrictTo.Scope extends java.lang.Enum {
+                    enum_constant deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+                    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+                    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
                   }
@@ -2181,8 +2385,9 @@
     @Test
     fun `Java String constants`() {
         check(
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package androidx.browser.browseractions {
                   public class BrowserActionsIntent {
                     field public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
@@ -2208,8 +2413,9 @@
     @Test
     fun `Classes with maps`() {
         check(
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 2.0
                 package androidx.collection {
                   public class SimpleArrayMap<K, V> {
@@ -2234,8 +2440,9 @@
     @Test
     fun `Referencing type parameters in types`() {
         check(
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 2.0
                 package androidx.collection {
                   public class MyMap<Key, Value> {
@@ -2264,15 +2471,17 @@
     @Test
     fun `Comparing annotations with methods with v1 signature files`() {
         check(
-            checkCompatibilityApiReleased = """
+            compatibilityMode = true,
+            checkCompatibilityApi = """
                 package androidx.annotation {
                   public abstract class RestrictTo implements java.lang.annotation.Annotation {
                   }
                   public static final class RestrictTo.Scope extends java.lang.Enum {
+                    method public static androidx.annotation.RestrictTo.Scope valueOf(java.lang.String);
+                    method public static final androidx.annotation.RestrictTo.Scope[] values();
                     enum_constant public static final deprecated androidx.annotation.RestrictTo.Scope GROUP_ID;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
-                    enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
                     enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
                   }
@@ -2288,7 +2497,7 @@
     @Test
     fun `Insignificant type formatting differences`() {
         check(
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class UsageStatsManager {
                     method public java.util.Map<java.lang.String, java.lang.Integer> getAppStandbyBuckets();
@@ -2317,7 +2526,7 @@
             TESTROOT/load-api.txt:7: error: Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter str in test.pkg.Foo.method3(String str, int p, int int2) [InvalidNullConversion]
             """.trimIndent(),
             format = FileFormat.V3,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package test.pkg {
                   public final class Foo {
@@ -2351,7 +2560,7 @@
             src/test/pkg/test.kt:4: error: Attempted to change parameter from @Nullable to @NonNull: incompatible change for parameter str1 in test.pkg.TestKt.fun1(String str1, String str2, java.util.List<java.lang.String> list) [InvalidNullConversion]
             """.trimIndent(),
             format = FileFormat.V3,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package test.pkg {
                   public final class TestKt {
@@ -2376,12 +2585,13 @@
     @Test
     fun `Adding and removing reified`() {
         check(
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             expectedIssues = """
-                src/test/pkg/test.kt:5: error: Method test.pkg.TestKt.add made type variable T reified: incompatible change [AddedReified]
-                src/test/pkg/test.kt:8: error: Method test.pkg.TestKt.two made type variable S reified: incompatible change [AddedReified]
+                src/test/pkg/test.kt:5: error: Method test.pkg.TestKt.add made type variable T reified: incompatible change [ChangedThrows]
+                src/test/pkg/test.kt:8: error: Method test.pkg.TestKt.two made type variable S reified: incompatible change [ChangedThrows]
                 """,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 package test.pkg {
                   public final class TestKt {
                     method public static inline <T> void add(T! t);
@@ -2412,6 +2622,7 @@
     @Test
     fun `Empty prev api with @hide and --show-annotation`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 """,
             sourceFiles = arrayOf(
@@ -2437,8 +2648,7 @@
                     /**
                      * @hide
                      */
-                    @SystemApi
-                    @SuppressWarnings("HiddenSuperclass")
+                    @android.annotation.SystemApi
                     public class MediaPlayer implements SubtitleController.Listener {
                     }
                     """
@@ -2448,6 +2658,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
             expectedIssues = ""
 
@@ -2457,6 +2668,7 @@
     @Test
     fun `Inherited systemApi method in an inner class`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package android.telephony {
                   public class MmTelFeature.Capabilities {
@@ -2501,6 +2713,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
             expectedIssues = ""
         )
@@ -2509,6 +2722,7 @@
     @Test
     fun `Moving removed api back to public api`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityRemovedApiReleased = """
                 package android.content {
                   public class ContextWrapper {
@@ -2553,6 +2767,7 @@
     @Test
     fun `Inherited nullability annotations`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package test.pkg {
                   public final class SAXException extends test.pkg.Parent {
@@ -2611,6 +2826,7 @@
     @Test
     fun `Inherited @removed fields`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityRemovedApiReleased = """
                 package android.provider {
 
@@ -2651,6 +2867,7 @@
     @Test
     fun `Inherited deprecated protected @removed method`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package android.icu.util {
                   public class SpecificCalendar {
@@ -2695,6 +2912,7 @@
     @Test
     fun `Move class from SystemApi to public and then remove a method`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package android.hardware.lights {
                   public static final class LightsRequest.Builder {
@@ -2740,6 +2958,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             expectedIssues = """
@@ -2751,6 +2970,7 @@
     @Test
     fun `Moving a field from SystemApi to public`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package android.content {
                   public class Context {
@@ -2782,6 +3002,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             expectedIssues = """
@@ -2792,6 +3013,7 @@
     @Test
     fun `Compare interfaces when Object is redefined`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package java.lang {
                   public class Object {
@@ -2824,6 +3046,7 @@
     @Test
     fun `Overriding method without redeclaring nullability`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package test.pkg {
                   public class Child extends test.pkg.Parent {
@@ -2868,6 +3091,7 @@
     @Test
     fun `Final class inherits a method`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package java.security {
                   public abstract class BasicPermission extends java.security.Permission {
@@ -2919,6 +3143,7 @@
     @Test
     fun `Implementing undefined interface`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package org.apache.http.conn.scheme {
                   @Deprecated public final class PlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
@@ -2944,6 +3169,7 @@
     @Test
     fun `Inherited abstract method`() {
         check(
+            compatibilityMode = false,
             checkCompatibilityApiReleased = """
                 package test.pkg {
                   public class MeasureFormat {
@@ -3076,7 +3302,16 @@
             }
             println("Checking compatibility from API level ${apiLevel - 1} to $apiLevel...")
             val current = getAndroidJar(apiLevel)
+            if (current == null) {
+                println("Couldn't find $current: Check that pwd for test is correct. Skipping this test.")
+                return
+            }
+
             val previous = getAndroidJar(apiLevel - 1)
+            if (previous == null) {
+                println("Couldn't find $previous: Check that pwd for test is correct. Skipping this test.")
+                return
+            }
             val previousApi = previous.path
 
             // PSI based check
@@ -3087,11 +3322,11 @@
                     ARG_HIDE,
                     suppressLevels[apiLevel]
                         ?: "AddedPackage,AddedClass,AddedMethod,AddedInterface,AddedField,ChangedDeprecated,RemovedField,RemovedClass,RemovedDeprecatedClass" +
-                            (if ((apiLevel == 19 || apiLevel == 20) && loadPrevAsSignature) ",ChangedType" else "")
+                        (if ((apiLevel == 19 || apiLevel == 20) && loadPrevAsSignature) ",ChangedType" else "")
 
                 ),
                 expectedIssues = expected[apiLevel]?.trimIndent() ?: "",
-                checkCompatibilityApiReleased = previousApi,
+                checkCompatibilityApi = previousApi,
                 apiJar = current
             )
 
@@ -3115,7 +3350,7 @@
                             ?: "AddedPackage,AddedClass,AddedMethod,AddedInterface,AddedField,ChangedDeprecated,RemovedField,RemovedClass,RemovedDeprecatedClass"
                     ),
                     expectedIssues = expected[apiLevel]?.trimIndent() ?: "",
-                    checkCompatibilityApiReleased = previousSignatureApi,
+                    checkCompatibilityApi = previousSignatureApi,
                     apiJar = current
                 )
             }
@@ -3127,7 +3362,8 @@
         check(
             expectedIssues = """
                 """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class MyClass {
                     ctor public MyClass();
@@ -3163,12 +3399,67 @@
     }
 
     @Test
+    fun `Fail on compatible changes that affect signature file contents`() {
+        // Regression test for 122916999
+        check(
+            extraArguments = arrayOf(ARG_NO_NATIVE_DIFF),
+            allowCompatibleDifferences = false,
+            expectedFail = """
+                Aborting: Your changes have resulted in differences in the signature file
+                for the public API.
+
+                The changes may be compatible, but the signature file needs to be updated.
+
+                Diffs:
+                @@ -5 +5
+                      ctor public MyClass();
+                -     method public void method2();
+                      method public void method1();
+                @@ -7 +6
+                      method public void method1();
+                +     method public void method2();
+                      method public void method3();
+            """.trimIndent(),
+            compatibilityMode = false,
+            // Methods in order
+            checkCompatibilityApi = """
+                package test.pkg {
+
+                  public class MyClass {
+                    ctor public MyClass();
+                    method public void method2();
+                    method public void method1();
+                    method public void method3();
+                    method public void method4();
+                  }
+
+                }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+
+                    public class MyClass {
+                        public void method1() { }
+                        public void method2() { }
+                        public void method3() { }
+                        public native void method4();
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
     fun `Empty bundle files`() {
         // Regression test for 124333557
         // Makes sure we properly handle conflicting definitions of a java file in separate source roots
         check(
             expectedIssues = "",
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package com.android.location.provider {
                   public class LocationProviderBase1 {
@@ -3229,7 +3520,8 @@
         // Regression test for 130567941
         check(
             expectedIssues = "",
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package androidx.coordinatorlayout.widget {
                   public class CoordinatorLayout {
@@ -3268,9 +3560,10 @@
             expectedIssues = """
             TESTROOT/load-api.txt:7: error: Method test.pkg.sample.SampleClass.convert has changed return type from Number to java.lang.Number [ChangedType]
             """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package test.pkg.sample {
                   public abstract class SampleClass {
@@ -3299,9 +3592,10 @@
         check(
             expectedIssues = """
             """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package androidx.versionedparcelable {
                   public abstract class VersionedParcel {
@@ -3346,7 +3640,7 @@
                 )
             ),
 
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package test.pkg {
                   public class SampleArray<D extends java.util.ArrayList> extends java.util.ArrayList<D[]> {
@@ -3359,15 +3653,53 @@
     }
 
     @Test
+    fun `Check implicit containing class`() {
+        // Regression test for 131633221
+        check(
+            expectedIssues = """
+            src/androidx/core/app/NotificationCompat.java:5: error: Added class androidx.core.app.NotificationCompat [AddedClass]
+            """,
+            compatibilityMode = false,
+            inputKotlinStyleNulls = true,
+            outputKotlinStyleNulls = true,
+            checkCompatibilityApi = """
+                // Signature format: 3.0
+                package androidx.core.app {
+                  public static class NotificationCompat.Builder {
+                    ctor public NotificationCompat.Builder();
+                  }
+                }
+                """,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package androidx.core.app;
+
+                    import android.content.Context;
+
+                    public class NotificationCompat {
+                      private NotificationCompat() {
+                      }
+                      public static class Builder {
+                      }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
     fun `New default method on annotation`() {
         // Regression test for 134754815
         check(
             expectedIssues = """
             src/androidx/room/Relation.java:5: error: Added method androidx.room.Relation.IHaveNoDefault() [AddedAbstractMethod]
             """,
+            compatibilityMode = false,
             inputKotlinStyleNulls = true,
             outputKotlinStyleNulls = true,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 3.0
                 package androidx.room {
                   public @interface Relation {
@@ -3396,7 +3728,8 @@
                 TESTROOT/load-api.txt:11: error: Class test.pkg.ParentClass.AnotherBadInnerClass changed 'static' qualifier [ChangedStatic]
                 TESTROOT/load-api.txt:8: error: Class test.pkg.ParentClass.BadInnerClass changed 'static' qualifier [ChangedStatic]
             """,
-            checkCompatibilityApiReleased = """
+            compatibilityMode = false,
+            checkCompatibilityApi = """
                 package test.pkg {
                   public class ParentClass {
                   }
@@ -3438,7 +3771,7 @@
                 src/test/pkg/FunctionalInterface.kt:3: error: Cannot remove 'fun' modifier from class test.pkg.FunctionalInterface: source incompatible change [FunRemoval]
                 """,
             format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 4.0
                 package test.pkg {
                   public fun interface FunctionalInterface {
@@ -3467,7 +3800,7 @@
                 TESTROOT/load-api.txt:3: error: Cannot remove 'fun' modifier from class test.pkg.FunctionalInterface: source incompatible change [FunRemoval]
                 """,
             format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 4.0
                 package test.pkg {
                   public fun interface FunctionalInterface {
@@ -3491,7 +3824,7 @@
         check(
             expectedIssues = "",
             format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
+            checkCompatibilityApi = """
                 // Signature format: 4.0
                 package androidx.annotation.experimental {
                   public @interface UseExperimental {
@@ -3500,379 +3833,12 @@
                 }
                 """,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package androidx.annotation.experimental;
                     public @interface UseExperimental {
                         Class<?> markerClass() default void.class;
                     }
-                """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `adding methods to interfaces`() {
-        check(
-            expectedIssues = """
-                src/test/pkg/JavaInterface.java:4: error: Added method test.pkg.JavaInterface.noDefault() [AddedAbstractMethod]
-                src/test/pkg/KotlinInterface.kt:5: error: Added method test.pkg.KotlinInterface.hasDefault() [AddedAbstractMethod]
-                src/test/pkg/KotlinInterface.kt:4: error: Added method test.pkg.KotlinInterface.noDefault() [AddedAbstractMethod]
-            """,
-            checkCompatibilityApiReleased = """
-                // Signature format: 3.0
-                package test.pkg {
-                  public interface JavaInterface {
-                  }
-                  public interface KotlinInterface {
-                  }
-                }
-            """,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package test.pkg;
-
-                        public interface JavaInterface {
-                            void noDefault();
-                            default boolean hasDefault() {
-                                return true;
-                            }
-                            static void newStatic();
-                        }
-                    """
-                ),
-                kotlin(
-                    """
-                        package test.pkg
-
-                        interface KotlinInterface {
-                            fun noDefault()
-                            fun hasDefault(): Boolean = true
-                        }
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
-    fun `Changing visibility from public to private`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed visibility from public to private [ChangedScope]
-            """.trimIndent(),
-            signatureSource = """
-                package test.pkg {
-                  private class Foo {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                }
-            """.trimIndent()
-        )
-    }
-
-    @Test
-    fun `Changing class kind`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:11: error: Class test.pkg.AnnotationToClass changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:13: error: Class test.pkg.AnnotationToEnum changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:12: error: Class test.pkg.AnnotationToInterface changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:4: error: Class test.pkg.ClassToAnnotation changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:2: error: Class test.pkg.ClassToEnum changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:3: error: Class test.pkg.ClassToInterface changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:7: error: Class test.pkg.EnumToAnnotation changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:5: error: Class test.pkg.EnumToClass changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:6: error: Class test.pkg.EnumToInterface changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:10: error: Class test.pkg.InterfaceToAnnotation changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:8: error: Class test.pkg.InterfaceToClass changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:9: error: Class test.pkg.InterfaceToEnum changed class/interface declaration [ChangedClass]
-            """.trimIndent(),
-            signatureSource = """
-                package test.pkg {
-                  public enum ClassToEnum {}
-                  public interface ClassToInterface {}
-                  public @interface ClassToAnnotation {}
-                  public class EnumToClass {}
-                  public interface EnumToInterface {}
-                  public @interface EnumToAnnotation {}
-                  public class InterfaceToClass {}
-                  public enum InterfaceToEnum {}
-                  public @interface InterfaceToAnnotation {}
-                  public class  AnnotationToClass {}
-                  public interface AnnotationToInterface {}
-                  public enum AnnotationToEnum {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class ClassToEnum {}
-                  public class ClassToInterface {}
-                  public class ClassToAnnotation {}
-                  public enum EnumToClass {}
-                  public enum EnumToInterface {}
-                  public enum EnumToAnnotation {}
-                  public interface InterfaceToClass {}
-                  public interface InterfaceToEnum {}
-                  public interface InterfaceToAnnotation {}
-                  public @interface  AnnotationToClass {}
-                  public @interface AnnotationToInterface {}
-                  public @interface AnnotationToEnum {}
-                }
-            """.trimIndent()
-        )
-    }
-
-    @Test
-    fun `Allow increased field access for classes`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    field public int bar;
-                    field protected int baz;
-                    field protected int spam;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    field protected int bar;
-                    field private int baz;
-                    field internal int spam;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Block decreased field access in classes`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar changed visibility from public to protected [ChangedScope]
-                TESTROOT/load-api.txt:4: error: Field test.pkg.Foo.baz changed visibility from protected to private [ChangedScope]
-                TESTROOT/load-api.txt:5: error: Field test.pkg.Foo.spam changed visibility from protected to internal [ChangedScope]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    field protected int bar;
-                    field private int baz;
-                    field internal int spam;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    field public int bar;
-                    field protected int baz;
-                    field protected int spam;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Allow increased access`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar();
-                    method protected void baz();
-                    method protected void spam();
-                  }
-                }
-            """,
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method protected void bar();
-                    method private void baz();
-                    method internal void spam();
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Block decreased access`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar changed visibility from public to protected [ChangedScope]
-                TESTROOT/load-api.txt:4: error: Method test.pkg.Foo.baz changed visibility from protected to private [ChangedScope]
-                TESTROOT/load-api.txt:5: error: Method test.pkg.Foo.spam changed visibility from protected to internal [ChangedScope]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method protected void bar();
-                    method private void baz();
-                    method internal void spam();
-                  }
-                }
-            """,
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar();
-                    method protected void baz();
-                    method protected void spam();
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `configuring issue severity`() {
-        check(
-            extraArguments = arrayOf(ARG_HIDE, Issues.REMOVED_METHOD.name),
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                        method public void bar();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `block changing open to abstract`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed 'abstract' qualifier [ChangedAbstract]
-                TESTROOT/load-api.txt:4: error: Method test.pkg.Foo.bar has changed 'abstract' qualifier [ChangedAbstract]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public abstract class Foo {
-                        ctor public Foo();
-                        method public abstract void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                        method public void bar();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `allow changing abstract to open`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                        method public void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public abstract class Foo {
-                        ctor public Foo();
-                        method public abstract void bar();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change default to abstract`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'default' qualifier [ChangedDefault]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method abstract public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method default public void bar(Int);
-                    }
-                  }
-              """
-        )
-    }
-
-    @Test
-    fun `Allow change from non-final to final in sealed class`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  sealed class Foo {
-                    method final public void bar(Int);
-                  }
-                }
-            """,
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  sealed class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `unchanged self-referencing type parameter is compatible`() {
-        check(
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public abstract class Foo<T extends test.pkg.Foo<T>> {
-                            method public static <T extends test.pkg.Foo<T>> T valueOf(Class<T>, String);
-                    }
-                }
-            """,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
-                    import android.annotation.NonNull;
-                    public abstract class Foo<T extends Foo<T>> {
-                        @NonNull
-                        public static <T extends Foo<T>> T valueOf(@NonNull Class<T> fooType, @NonNull String name) {}
-                    }
-                    """
-                ),
-                nonNullSource
+                """)
             )
         )
     }
diff --git a/src/test/java/com/android/tools/metalava/ConvertTest.kt b/src/test/java/com/android/tools/metalava/ConvertTest.kt
index 930f64e..176f82b 100644
--- a/src/test/java/com/android/tools/metalava/ConvertTest.kt
+++ b/src/test/java/com/android/tools/metalava/ConvertTest.kt
@@ -23,6 +23,7 @@
     @Test
     fun `Test conversion flag`() {
         check(
+            compatibilityMode = true,
             convertToJDiff = listOf(
                 ConvertData(
                     """
@@ -34,7 +35,7 @@
                     """,
                     outputFile =
                     """
-                    <api name="convert-output1" xmlns:metalava="http://www.android.com/metalava/">
+                    <api xmlns:metalava="http://www.android.com/metalava/">
                     <package name="test.pkg"
                     >
                     <class name="MyTest1"
@@ -68,7 +69,7 @@
                     """,
                     outputFile =
                     """
-                    <api name="convert-output2" xmlns:metalava="http://www.android.com/metalava/">
+                    <api xmlns:metalava="http://www.android.com/metalava/">
                     <package name="test.pkg"
                     >
                     <class name="MyTest2"
@@ -91,6 +92,7 @@
     @Test
     fun `Test convert new with compat mode and api strip`() {
         check(
+            compatibilityMode = true,
             convertToJDiff = listOf(
                 ConvertData(
                     strip = true,
@@ -130,7 +132,7 @@
                     """,
                     outputFile =
                     """
-                    <api name="convert-output1" xmlns:metalava="http://www.android.com/metalava/">
+                    <api xmlns:metalava="http://www.android.com/metalava/">
                     <package name="test.pkg"
                     >
                     <class name="MyTest1"
@@ -154,17 +156,6 @@
                     <parameter name="null" type="java.lang.Float">
                     </parameter>
                     </method>
-                    <field name="ANY_CURSOR_ITEM_TYPE"
-                     type="java.lang.String"
-                     transient="false"
-                     volatile="false"
-                     value="&quot;vnd.android.cursor.item/*&quot;"
-                     static="true"
-                     final="true"
-                     deprecated="not deprecated"
-                     visibility="public"
-                    >
-                    </field>
                     </class>
                     <class name="MyTest2"
                      extends="java.lang.Object"
@@ -238,6 +229,7 @@
     @Test
     fun `Test convert new without compat mode and no strip`() {
         check(
+            compatibilityMode = false,
             convertToJDiff = listOf(
                 ConvertData(
                     strip = false,
@@ -387,7 +379,8 @@
     @Test
     fun `Test convert nothing new`() {
         check(
-            expectedOutput = "",
+            expectedOutput = "No API change detected, not generating diff",
+            compatibilityMode = true,
             convertToJDiff = listOf(
                 ConvertData(
                     fromApi =
@@ -432,11 +425,419 @@
                     """,
                     outputFile =
                     """
-                    <api name="convert-output1" xmlns:metalava="http://www.android.com/metalava/">
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
+    fun `Test doclava compat`() {
+        // A few more differences
+        check(
+            compatibilityMode = true,
+            convertToJDiff = listOf(
+                ConvertData(
+                    fromApi =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public void method(java.util.List<String>);
+                        field protected static final java.lang.String CRLF = "\r\n";
+                        field protected static final byte[] CRLF_BYTES;
+                      }
+                    }
+                    """,
+                    outputFile =
+                    """
+                    <api xmlns:metalava="http://www.android.com/metalava/">
+                    <package name="test.pkg"
+                    >
+                    <class name="MyTest1"
+                     extends="java.lang.Object"
+                     abstract="false"
+                     static="false"
+                     final="false"
+                     deprecated="not deprecated"
+                     visibility="public"
+                    >
+                    <constructor name="MyTest1"
+                     type="test.pkg.MyTest1"
+                     static="false"
+                     final="false"
+                     deprecated="not deprecated"
+                     visibility="public"
+                    >
+                    </constructor>
+                    <method name="method"
+                     return="void"
+                     abstract="false"
+                     native="false"
+                     synchronized="false"
+                     static="false"
+                     final="false"
+                     deprecated="not deprecated"
+                     visibility="public"
+                    >
+                    <parameter name="null" type="java.util.List&lt;String&gt;">
+                    </parameter>
+                    </method>
+                    <field name="CRLF"
+                     type="java.lang.String"
+                     transient="false"
+                     volatile="false"
+                     value="&quot;\r\n&quot;"
+                     static="true"
+                     final="true"
+                     deprecated="not deprecated"
+                     visibility="protected"
+                    >
+                    </field>
+                    <field name="CRLF_BYTES"
+                     type="byte[]"
+                     transient="false"
+                     volatile="false"
+                     value="null"
+                     static="true"
+                     final="true"
+                     deprecated="not deprecated"
+                     visibility="protected"
+                    >
+                    </field>
+                    </class>
+                    </package>
                     </api>
                     """
                 )
             )
         )
     }
+
+    @Test
+    fun `Test convert new to v2 without compat mode and no strip`() {
+        check(
+            compatibilityMode = false,
+            convertToJDiff = listOf(
+                ConvertData(
+                    strip = false,
+                    format = FileFormat.V2,
+                    fromApi =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public deprecated int clamp(int);
+                        method public java.lang.Double convert(java.lang.Float);
+                        field public static final java.lang.String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field public deprecated java.lang.Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public java.lang.Double convert(java.lang.Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """,
+                    baseApi =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public deprecated int clamp(int);
+                        field public deprecated java.lang.Number myNumber;
+                      }
+                    }
+                    """,
+                    outputFile =
+                    """
+                    // Signature format: 2.0
+                    package test.pkg {
+                      public class MyTest1 {
+                        method public Double convert(Float);
+                        field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public Double convert(Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
+    fun `Test convert new to v1 signatures with compat mode and no strip`() {
+        // Output is similar to the v2 format, but with fully qualified java.lang types
+        // and fields not included
+        check(
+            compatibilityMode = false,
+            convertToJDiff = listOf(
+                ConvertData(
+                    strip = false,
+                    format = FileFormat.V1,
+                    fromApi =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public deprecated int clamp(int);
+                        method public java.lang.Double convert(java.lang.Float);
+                        field public static final java.lang.String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field public deprecated java.lang.Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public java.lang.Double convert(java.lang.Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public abstract interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """,
+                    baseApi =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public deprecated int clamp(int);
+                        field public deprecated java.lang.Number myNumber;
+                      }
+                    }
+                    """,
+                    outputFile =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        method public java.lang.Double convert(java.lang.Float);
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public java.lang.Double convert(java.lang.Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public abstract interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
+    fun `Test convert v2 to v1`() {
+        check(
+            compatibilityMode = false,
+            convertToJDiff = listOf(
+                ConvertData(
+                    strip = false,
+                    format = FileFormat.V1,
+                    fromApi =
+                    """
+                    // Signature format: 2.0
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method @Deprecated public int clamp(int);
+                        method public Double convert(Float);
+                        field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field @Deprecated public Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public Double convert(Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """,
+                    outputFile =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public deprecated int clamp(int);
+                        method public java.lang.Double convert(java.lang.Float);
+                        field public static final java.lang.String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field public deprecated java.lang.Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public java.lang.Double convert(java.lang.Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public abstract interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
+    fun `Test convert v1 to v2`() {
+        check(
+            compatibilityMode = false,
+            convertToJDiff = listOf(
+                ConvertData(
+                    strip = false,
+                    format = FileFormat.V2,
+                    fromApi =
+                    """
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method public deprecated int clamp(int);
+                        method public java.lang.Double convert(java.lang.Float);
+                        field public static final java.lang.String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field public deprecated java.lang.Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public java.lang.Double convert(java.lang.Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public abstract interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """,
+                    outputFile =
+                    """
+                    // Signature format: 2.0
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method @Deprecated public int clamp(int);
+                        method public Double convert(Float);
+                        field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field @Deprecated public Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public Double convert(Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """
+                )
+            )
+        )
+    }
+
+    @Test
+    fun `Test convert v2 to v2`() {
+        check(
+            compatibilityMode = false,
+            convertToJDiff = listOf(
+                ConvertData(
+                    strip = false,
+                    format = FileFormat.V2,
+                    fromApi =
+                    """
+                    // Signature format: 2.0
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method @Deprecated public int clamp(int);
+                        method public Double convert(Float);
+                        field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field @Annot @Annot.Nested @NonNull public String annotationLoaded;
+                        field @Deprecated public Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public Double convert(Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """,
+                    outputFile =
+                    """
+                    // Signature format: 2.0
+                    package test.pkg {
+                      public class MyTest1 {
+                        ctor public MyTest1();
+                        method @Deprecated public int clamp(int);
+                        method public Double convert(Float);
+                        field public static final String ANY_CURSOR_ITEM_TYPE = "vnd.android.cursor.item/*";
+                        field @Annot @Annot.Nested @NonNull public String annotationLoaded;
+                        field @Deprecated public Number myNumber;
+                      }
+                      public class MyTest2 {
+                        ctor public MyTest2();
+                        method public Double convert(Float);
+                      }
+                    }
+                    package test.pkg.new {
+                      public interface MyInterface {
+                      }
+                      public abstract class MyTest3 implements java.util.List {
+                      }
+                      public abstract class MyTest4 implements test.pkg.new.MyInterface {
+                      }
+                    }
+                    """
+                )
+            )
+        )
+    }
 }
diff --git a/src/test/java/com/android/tools/metalava/CoreApiTest.kt b/src/test/java/com/android/tools/metalava/CoreApiTest.kt
index b3429be..5ed3021 100644
--- a/src/test/java/com/android/tools/metalava/CoreApiTest.kt
+++ b/src/test/java/com/android/tools/metalava/CoreApiTest.kt
@@ -27,7 +27,6 @@
     @Test
     fun `Hidden with --hide-annotation`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -78,13 +77,13 @@
             api =
             """
                 package libcore.api {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @libcore.api.IntraCoreApi public @interface IntraCoreApi {
+                  public abstract class IntraCoreApi implements java.lang.annotation.Annotation {
                   }
                 }
                 package test.pkg {
-                  @libcore.api.IntraCoreApi public class Exposed {
-                    method @libcore.api.IntraCoreApi public void exposed();
-                    field @libcore.api.IntraCoreApi public String exposed;
+                  public class Exposed {
+                    method public void exposed();
+                    field public java.lang.String exposed;
                   }
                 }
                 """,
@@ -122,7 +121,6 @@
     @Test
     fun `Hidden with package javadoc and hiding default constructor explicitly`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -172,12 +170,12 @@
             api =
             """
                 package libcore.api {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @libcore.api.IntraCoreApi public @interface IntraCoreApi {
+                  public abstract class IntraCoreApi implements java.lang.annotation.Annotation {
                   }
                 }
                 package test.pkg {
-                  @libcore.api.IntraCoreApi public class Exposed {
-                    method @libcore.api.IntraCoreApi public void exposed();
+                  public class Exposed {
+                    method public void exposed();
                   }
                 }
                 """,
@@ -216,7 +214,6 @@
     @Test
     fun `Complain if annotating a member and the surrounding class is not included`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -259,7 +256,7 @@
             api =
             """
                 package libcore.api {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) @libcore.api.IntraCoreApi public @interface IntraCoreApi {
+                  public abstract class IntraCoreApi implements java.lang.annotation.Annotation {
                   }
                 }
                 """,
@@ -268,9 +265,9 @@
                 ARG_HIDE_ANNOTATION, "libcore.api.LibCoreHidden"
             ),
             expectedIssues = """
-            src/test/pkg/Exposed.java:12: error: Attempting to unhide method test.pkg.Exposed.exposed(), but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
-            src/test/pkg/Exposed.java:15: error: Attempting to unhide field test.pkg.Exposed.exposed, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
-            src/test/pkg/Exposed.java:18: error: Attempting to unhide class test.pkg.Exposed.StillHidden, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
+            src/test/pkg/Exposed.java:11: error: Attempting to unhide method test.pkg.Exposed.exposed(), but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
+            src/test/pkg/Exposed.java:14: error: Attempting to unhide field test.pkg.Exposed.exposed, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
+            src/test/pkg/Exposed.java:17: error: Attempting to unhide class test.pkg.Exposed.StillHidden, but surrounding class test.pkg.Exposed is hidden and should also be annotated with @libcore.api.IntraCoreApi [ShowingMemberInHiddenClass]
             """
         )
     }
@@ -278,7 +275,6 @@
     @Test
     fun `Hidden with --hide-meta-annotation`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -331,16 +327,16 @@
                 libcoreCoreMetaHidden
             ),
             api =
-            """
+                """
                 package libcore.api {
-                  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface LibCoreMetaHidden {
+                  public abstract class LibCoreMetaHidden implements java.lang.annotation.Annotation {
                   }
                 }
                 package test.pkg {
                   public class ExposedClass {
                     ctor public ExposedClass();
                     method public void exposedMethod();
-                    field public String exposedField;
+                    field public java.lang.String exposedField;
                   }
                 }
                 """,
diff --git a/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt b/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt
index de91122..b6897f9 100644
--- a/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt
+++ b/src/test/java/com/android/tools/metalava/DocAnalyzerTest.kt
@@ -3,7 +3,11 @@
 import com.android.tools.lint.checks.infrastructure.TestFiles.source
 import com.android.tools.metalava.model.psi.trimDocIndent
 import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
 import org.junit.Test
+import java.io.File
+import java.nio.file.Files
+import kotlin.text.Charsets.UTF_8
 
 /** Tests for the [DocAnalyzer] which enhances the docs */
 class DocAnalyzerTest : DriverTest() {
@@ -129,7 +133,6 @@
 
     @Test
     fun `Fix typo replacement`() {
-        // common_typos_disable
         check(
             sourceFiles = arrayOf(
                 java(
@@ -146,7 +149,7 @@
             ),
             checkCompilation = true,
             docStubs = true,
-            expectedIssues = "src/test/pkg/Foo.java:3: warning: Replaced Andriod with Android in the documentation for class test.pkg.Foo [Typo]",
+            expectedIssues = "src/test/pkg/Foo.java:2: warning: Replaced Andriod with Android in the documentation for class test.pkg.Foo [Typo]",
             stubFiles = arrayOf(
                 java(
                     """
@@ -161,7 +164,6 @@
                 )
             )
         )
-        // common_typos_enable
     }
 
     @Test
@@ -202,7 +204,7 @@
                         }
 
                         // Typo in marker
-                        @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, "carier priviliges"}) // NOTYPO
+                        @RequiresPermission(anyOf = {Manifest.permission.ACCESS_COARSE_LOCATION, "carier priviliges"})
                         public void test6() {
                         }
                     }
@@ -225,9 +227,8 @@
                 requiresPermissionSource
             ),
             checkCompilation = false, // needs androidx.annotations in classpath
-            expectedIssues = "src/test/pkg/PermissionTest.java:33: lint: Unrecognized permission `carier priviliges`; did you mean `carrier privileges`? [MissingPermission]", // NOTYPO
+            expectedIssues = "src/test/pkg/PermissionTest.java:31: lint: Unrecognized permission `carier priviliges`; did you mean `carrier privileges`? [MissingPermission]",
             stubFiles = arrayOf(
-                // common_typos_disable
                 java(
                     """
                     package test.pkg;
@@ -270,7 +271,6 @@
                     }
                     """
                 )
-                // common_typos_enable
             )
         )
     }
@@ -446,7 +446,7 @@
                 workerThreadSource
             ),
             checkCompilation = true,
-            expectedIssues = "src/test/pkg/RangeTest.java:6: lint: Found more than one threading annotation on method test.pkg.RangeTest.test1(); the auto-doc feature does not handle this correctly [MultipleThreadAnnotations]",
+            expectedIssues = "src/test/pkg/RangeTest.java:5: lint: Found more than one threading annotation on method test.pkg.RangeTest.test1(); the auto-doc feature does not handle this correctly [MultipleThreadAnnotations]",
             docStubs = true,
             stubFiles = arrayOf(
                 java(
@@ -475,7 +475,7 @@
     @Test
     fun `Merge Multiple sections`() {
         check(
-            expectedIssues = "src/android/widget/Toolbar2.java:18: error: Documentation should not specify @apiSince manually; it's computed and injected at build time by metalava [ForbiddenTag]",
+            expectedIssues = "src/android/widget/Toolbar2.java:14: error: Documentation should not specify @apiSince manually; it's computed and injected at build time by metalava [ForbiddenTag]",
             sourceFiles = arrayOf(
                 java(
                     """
@@ -741,7 +741,7 @@
             ),
             checkCompilation = true,
             docStubs = true,
-            expectedIssues = "src/test/pkg/RangeTest.java:5: lint: Cannot find permission field for \"MyPermission\" required by method test.pkg.RangeTest.test1() (may be hidden or removed) [MissingPermission]",
+            expectedIssues = "src/test/pkg/RangeTest.java:4: lint: Cannot find permission field for \"MyPermission\" required by method test.pkg.RangeTest.test1() (may be hidden or removed) [MissingPermission]",
             stubFiles = arrayOf(
                 java(
                     """
@@ -1161,7 +1161,7 @@
          * This is a comment
          * This is a second comment
          */
-                """.trimIndent()
+        """.trimIndent()
             )
         )
     }
@@ -1273,7 +1273,6 @@
                     @SuppressWarnings({"unchecked", "deprecation", "all"})
                     @Deprecated
                     public class Camera {
-                    @Deprecated
                     public Camera() { throw new RuntimeException("Stub!"); }
                     /**
                      * @deprecated Use something else.
@@ -1758,7 +1757,6 @@
                     public final class Foo {
                     @Deprecated
                     public Foo() { throw new RuntimeException("Stub!"); }
-                    @Deprecated
                     public void foo() { throw new RuntimeException("Stub!"); }
                     /**
                      * {@inheritDoc}
@@ -1845,6 +1843,101 @@
     }
 
     @Test
+    fun `Rewrite external links for 129765390`() {
+        // Tests rewriting links that go to {@docRoot}/../platform/ or {@docRoot}/../technotes,
+        // which are hosted elsewhere. http://b/129765390
+        check(
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package javax.security;
+                    /**
+                     * <a href="{@docRoot}/../technotes/guides/security/StandardNames.html#Cipher">Cipher Section</a>
+                     * <p>This class is a member of the
+                     * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+                     * Java Collections Framework</a>.
+                     * <a href="../../../platform/serialization/spec/security.html">
+                     *     Security Appendix</a>
+                     * <a   href =
+                     *  "../../../technotes/Example.html">valid</a>
+                     *
+                     *
+                     * The following examples are not touched.
+                     *
+                     * <a href="../../../foobar/Example.html">wrong directory<a/>
+                     * <a href="../ArrayList.html">wrong directory</a.
+                     * <a href="http://example.com/index.html">wrong directory/host</a>
+                     */
+                    public class Example { }
+                    """
+                ),
+                java(
+                    """
+                    package not.part.of.ojluni;
+                    /**
+                     * <p>This class is a member of the
+                     * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+                     * Java Collections Framework</a>.
+                     */
+                    public class TestCollection { }
+                    """
+                )
+            ),
+            checkCompilation = true,
+            expectedIssues = null, // be unopinionated about whether there should be warnings
+            docStubs = true,
+            stubFiles = arrayOf(
+                java(
+                    """
+                    package javax.security;
+                    /**
+                     * <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">Cipher Section</a>
+                     * <p>This class is a member of the
+                     * <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html">
+                     * Java Collections Framework</a>.
+                     * <a href="https://docs.oracle.com/javase/8/docs/platform/serialization/spec/security.html">
+                     *     Security Appendix</a>
+                     * <a   href =
+                     *  "https://docs.oracle.com/javase/8/docs/technotes/Example.html">valid</a>
+                     *
+                     *
+                     * The following examples are not touched.
+                     *
+                     * <a href="../../../foobar/Example.html">wrong directory<a/>
+                     * <a href="../ArrayList.html">wrong directory</a.
+                     * <a href="http://example.com/index.html">wrong directory/host</a>
+                     */
+                    @SuppressWarnings({"unchecked", "deprecation", "all"})
+                    public class Example {
+                    public Example() { throw new RuntimeException("Stub!"); }
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package not.part.of.ojluni;
+                    /**
+                     * <p>This class is a member of the
+                     * <a href="{@docRoot}/../technotes/guides/collections/index.html">
+                     * Java Collections Framework</a>.
+                     */
+                    @SuppressWarnings({"unchecked", "deprecation", "all"})
+                    public class TestCollection {
+                    public TestCollection() { throw new RuntimeException("Stub!"); }
+                    }
+                    """
+                )
+            ),
+            extraArguments = arrayOf(
+                ARG_REPLACE_DOCUMENTATION,
+                "com.sun:java:javax:jdk.net:sun",
+                """(<a\s+href\s?=[\*\s]*")(?:(?:\{@docRoot\}/\.\./)|(?:(?:\.\./)+))((?:platform|technotes).+)">""",
+                """$1https://docs.oracle.com/javase/8/docs/$2">"""
+            )
+        )
+    }
+
+    @Test
     fun `Annotation annotating itself indirectly`() {
         check(
             sourceFiles = arrayOf(
@@ -1884,7 +1977,6 @@
                      * Documentation 1 here
                      */
                     @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)
                     @test.pkg.MyAnnotation2
                     public @interface MyAnnotation1 {
                     }
@@ -1897,7 +1989,6 @@
                      * Documentation 2 here
                      */
                     @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)
                     @test.pkg.MyAnnotation1
                     public @interface MyAnnotation2 {
                     }
@@ -1908,6 +1999,114 @@
     }
 
     @Test
+    fun `Invoke external documentation tool`() {
+        val jdkPath = getJdkPath()
+        if (jdkPath == null) {
+            println("Ignoring external doc test: JDK not found")
+            return
+        }
+
+        val version = System.getProperty("java.version")
+        if (!version.startsWith("1.8.")) {
+            println("Javadoc invocation test does not work on Java 1.9 and later; bootclasspath not supported")
+            return
+        }
+
+        val javadoc = File(jdkPath, "bin/javadoc")
+        if (!javadoc.isFile) {
+            println("Ignoring external doc test: javadoc not found *or* not running on Linux/OSX")
+            return
+        }
+        val androidJar = getAndroidJar(API_LEVEL)?.path
+        if (androidJar == null) {
+            println("Ignoring external doc test: android.jar not found")
+            return
+        }
+
+        val dir = Files.createTempDirectory(null).toFile()
+        val html = "$dir/javadoc"
+        val sourceList = "$dir/sources.txt"
+
+        check(
+            extraArguments = arrayOf(
+                ARG_DOC_STUBS_SOURCE_LIST,
+                sourceList,
+                ARG_GENERATE_DOCUMENTATION,
+                javadoc.path,
+                "-sourcepath",
+                "STUBS_DIR",
+                "-d",
+                html,
+                "-bootclasspath",
+                androidJar,
+                "STUBS_SOURCE_LIST"
+            ),
+            docStubs = true,
+            sourceFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    import android.annotation.RequiresFeature;
+                    import android.content.pm.PackageManager;
+                    @SuppressWarnings("WeakerAccess")
+                    @RequiresFeature(PackageManager.FEATURE_LOCATION)
+                    public class LocationManager {
+                    }
+                    """
+                ),
+                java(
+                    """
+                    package android.content.pm;
+                    public abstract class PackageManager {
+                        public static final String FEATURE_LOCATION = "android.hardware.location";
+                        public boolean hasSystemFeature(String name) {
+                            return false;
+                        }
+                    }
+                    """
+                ),
+
+                requiresFeatureSource
+            ),
+            checkCompilation = true,
+
+            stubFiles = arrayOf(
+                java(
+                    """
+                    package test.pkg;
+                    import android.content.pm.PackageManager;
+                    /**
+                     * Requires the {@link android.content.pm.PackageManager#FEATURE_LOCATION PackageManager#FEATURE_LOCATION} feature which can be detected using {@link android.content.pm.PackageManager#hasSystemFeature(String) PackageManager.hasSystemFeature(String)}.
+                     */
+                    @SuppressWarnings({"unchecked", "deprecation", "all"})
+                    public class LocationManager {
+                    public LocationManager() { throw new RuntimeException("Stub!"); }
+                    }
+                    """
+                )
+            )
+        )
+
+        val doc = File(html, "test/pkg/LocationManager.html").readText(UTF_8)
+        assertTrue(
+            "Did not find matching javadoc fragment in LocationManager.html: actual content is\n$doc",
+            doc.contains(
+                """
+                <hr>
+                <br>
+                <pre>public class <span class="typeNameLabel">LocationManager</span>
+                extends java.lang.Object</pre>
+                <div class="block">Requires the <a href="../../android/content/pm/PackageManager.html#FEATURE_LOCATION"><code>PackageManager#FEATURE_LOCATION</code></a> feature which can be detected using <a href="../../android/content/pm/PackageManager.html#hasSystemFeature-java.lang.String-"><code>PackageManager.hasSystemFeature(String)</code></a>.</div>
+                </li>
+                </ul>
+                """.trimIndent()
+            )
+        )
+
+        dir.deleteRecursively()
+    }
+
+    @Test
     fun `Test Column annotation`() {
         // Bug: 120429729
         check(
@@ -1946,7 +2145,7 @@
             ),
             checkCompilation = false, // stubs contain Cursor.NONEXISTENT so it does not compile
             expectedIssues = """
-                src/test/pkg/ColumnTest.java:13: warning: Cannot find feature field for Cursor.NONEXISTENT required by field ColumnTest.BOGUS (may be hidden or removed) [MissingColumn]
+                src/test/pkg/ColumnTest.java:12: warning: Cannot find feature field for Cursor.NONEXISTENT required by field ColumnTest.BOGUS (may be hidden or removed) [MissingColumn]
                 """,
             docStubs = true,
             stubFiles = arrayOf(
@@ -2033,8 +2232,7 @@
     fun `memberDoc crash`() {
         check(
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import java.lang.annotation.ElementType;
                     import java.lang.annotation.Retention;
@@ -2048,18 +2246,14 @@
                     @Target({ ElementType.FIELD })
                     @Retention(RetentionPolicy.SOURCE)
                     public @interface Foo { }
-                """
-                ),
-                java(
-                    """
+                """),
+                java("""
                     package another.pkg;
                     public class Bar {
                         public String BAR = "BAAAAR";
                     }
-                """
-                ),
-                java(
-                    """
+                """),
+                java("""
                     package yetonemore.pkg;
                     public class Fun {
                         /**
@@ -2068,13 +2262,11 @@
                         @test.pkg.Foo
                         public static final String FUN = "FUN";
                     }
-                """
-                )
+                """)
             ),
             docStubs = true,
             stubFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package yetonemore.pkg;
                     @SuppressWarnings({"unchecked", "deprecation", "all"})
                     public class Fun {
@@ -2087,8 +2279,7 @@
                      */
                     public static final java.lang.String FUN = "FUN";
                     }
-                """
-                )
+                """)
             )
         )
     }
diff --git a/src/test/java/com/android/tools/metalava/DriverTest.kt b/src/test/java/com/android/tools/metalava/DriverTest.kt
index b8f2f85..9f45870 100644
--- a/src/test/java/com/android/tools/metalava/DriverTest.kt
+++ b/src/test/java/com/android/tools/metalava/DriverTest.kt
@@ -18,8 +18,6 @@
 
 import com.android.SdkConstants
 import com.android.SdkConstants.DOT_KT
-import com.android.SdkConstants.DOT_TXT
-import com.android.SdkConstants.DOT_XML
 import com.android.ide.common.process.DefaultProcessExecutor
 import com.android.ide.common.process.LoggedProcessOutputHandler
 import com.android.ide.common.process.ProcessException
@@ -29,6 +27,7 @@
 import com.android.tools.lint.checks.ApiLookup
 import com.android.tools.lint.checks.infrastructure.ClassName
 import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestFiles
 import com.android.tools.lint.checks.infrastructure.TestFiles.java
 import com.android.tools.lint.checks.infrastructure.TestFiles.kotlin
 import com.android.tools.lint.checks.infrastructure.stripComments
@@ -37,6 +36,7 @@
 import com.android.tools.metalava.model.defaultConfiguration
 import com.android.tools.metalava.model.parseDocument
 import com.android.tools.metalava.model.text.ApiFile
+import com.android.utils.FileUtils
 import com.android.utils.SdkUtils
 import com.android.utils.StdLogger
 import com.google.common.io.ByteStreams
@@ -65,7 +65,7 @@
 
 abstract class DriverTest {
     @get:Rule
-    val temporaryFolder = TemporaryFolder()
+    var temporaryFolder = TemporaryFolder()
 
     @get:Rule
     val errorCollector = ErrorCollector()
@@ -186,6 +186,25 @@
         }
     }
 
+    private fun findKotlinStdlibPath(): List<String> {
+        val classPath: String = System.getProperty("java.class.path")
+        val paths = mutableListOf<String>()
+        for (path in classPath.split(':')) {
+            val file = File(path)
+            val name = file.name
+            if (name.startsWith("kotlin-stdlib") ||
+                name.startsWith("kotlin-reflect") ||
+                name.startsWith("kotlin-script-runtime")
+            ) {
+                paths.add(file.path)
+            }
+        }
+        if (paths.isEmpty()) {
+            error("Did not find kotlin-stdlib-jre8 in $PROGRAM_NAME classpath: $classPath")
+        }
+        return paths
+    }
+
     protected fun getJdkPath(): String? {
         val javaHome = System.getProperty("java.home")
         if (javaHome != null) {
@@ -216,6 +235,7 @@
         val outputFile: String,
         val baseApi: String? = null,
         val strip: Boolean = true,
+        val format: FileFormat = FileFormat.JDIFF
     )
 
     protected fun check(
@@ -231,6 +251,8 @@
         dexApi: String? = null,
         /** The removed API (corresponds to --removed-api) */
         removedApi: String? = null,
+        /** The removed dex API (corresponds to --removed-dex-api) */
+        removedDexApi: String? = null,
         /** The subtract api signature content (corresponds to --subtract-api) */
         @Language("TEXT")
         subtractApi: String? = null,
@@ -244,7 +266,9 @@
          * whether the stubs include @doconly elements, uses rewritten/migration annotations, etc */
         docStubs: Boolean = false,
         /** Signature file format */
-        format: FileFormat = FileFormat.latest,
+        format: FileFormat? = null,
+        /** Whether to run in doclava1 compat mode */
+        compatibilityMode: Boolean = format == null || format == FileFormat.V1,
         /** Whether to trim the output (leading/trailing whitespace removal) */
         trim: Boolean = true,
         /** Whether to remove blank lines in the output (the signature file usually contains a lot of these) */
@@ -277,15 +301,23 @@
         signatureSource: String? = null,
         /** An optional API jar file content to load **instead** of Java/Kotlin source files */
         apiJar: File? = null,
+        /** An optional API signature to check the current API's compatibility with */
+        @Language("TEXT")
+        checkCompatibilityApi: String? = null,
         /** An optional API signature to check the last released API's compatibility with */
         @Language("TEXT")
         checkCompatibilityApiReleased: String? = null,
+        /** An optional API signature to check the current removed API's compatibility with */
+        @Language("TEXT")
+        checkCompatibilityRemovedApiCurrent: String? = null,
         /** An optional API signature to check the last released removed API's compatibility with */
         @Language("TEXT")
         checkCompatibilityRemovedApiReleased: String? = null,
         /** An optional API signature to use as the base API codebase during compat checks */
         @Language("TEXT")
         checkCompatibilityBaseApi: String? = null,
+        /** An optional API signature to compute nullness migration status from */
+        allowCompatibleDifferences: Boolean = true,
         @Language("TEXT")
         migrateNullsApi: String? = null,
         /** An optional Proguard keep file to generate */
@@ -304,13 +336,17 @@
         /** Additional arguments to supply */
         extraArguments: Array<String> = emptyArray(),
         /** Whether we should emit Kotlin-style null signatures */
-        outputKotlinStyleNulls: Boolean = format.useKotlinStyleNulls(),
+        outputKotlinStyleNulls: Boolean = format != null && format.useKotlinStyleNulls(),
         /** Whether we should interpret API files being read as having Kotlin-style nullness types */
         inputKotlinStyleNulls: Boolean = false,
+        /** Whether we should omit java.lang. etc from signature files */
+        omitCommonPackages: Boolean = !compatibilityMode,
         /** Expected output (stdout and stderr combined). If null, don't check. */
         expectedOutput: String? = null,
         /** Expected fail message and state, if any */
         expectedFail: String? = null,
+        /** List of extra jar files to record annotation coverage from */
+        coverageJars: Array<TestFile>? = null,
         /** Optional manifest to load and associate with the codebase */
         @Language("XML")
         manifest: String? = null,
@@ -340,6 +376,8 @@
         sdk_features: String? = null,
         /** Corresponds to SDK constants file widgets.txt */
         sdk_widgets: String? = null,
+        /** Map from artifact id to artifact descriptor */
+        artifacts: Map<String, String>? = null,
         /** Extract annotations and check that the given packages contain the given extracted XML files */
         extractAnnotations: Map<String, String>? = null,
         /** Creates the nullability annotations validator, and check that the report has the given lines (does not define files to be validated) */
@@ -386,6 +424,8 @@
         errorMessageApiLint: String? = null,
         /** [ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_RELEASED] */
         errorMessageCheckCompatibilityReleased: String? = null,
+        /** [ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_CURRENT] */
+        errorMessageCheckCompatibilityCurrent: String? = null,
 
         /**
          * If non null, enable API lint. If non-blank, a codebase where only new APIs not in the codebase
@@ -410,19 +450,45 @@
         // Ensure that lint infrastructure (for UAST) knows it's dealing with a test
         LintCliClient(LintClient.CLIENT_UNIT_TESTS)
 
+        if (compatibilityMode && mergeXmlAnnotations != null) {
+            fail(
+                "Can't specify both compatibilityMode and mergeXmlAnnotations: there were no " +
+                    "annotations output in doclava1"
+            )
+        }
+        if (compatibilityMode && mergeSignatureAnnotations != null) {
+            fail(
+                "Can't specify both compatibilityMode and mergeSignatureAnnotations: there were no " +
+                    "annotations output in doclava1"
+            )
+        }
+        if (compatibilityMode && mergeJavaStubAnnotations != null) {
+            fail(
+                "Can't specify both compatibilityMode and mergeJavaStubAnnotations: there were no " +
+                    "annotations output in doclava1"
+            )
+        }
+        if (compatibilityMode && mergeInclusionAnnotations != null) {
+            fail(
+                "Can't specify both compatibilityMode and mergeInclusionAnnotations"
+            )
+        }
         defaultConfiguration.reset()
 
-        val actualExpectedFail = when {
-            expectedFail != null -> expectedFail
-            (checkCompatibilityApiReleased != null || checkCompatibilityRemovedApiReleased != null) &&
-                expectedIssues != null && expectedIssues.trim().isNotEmpty() -> {
-                "Aborting: Found compatibility problems with --check-compatibility"
-            }
-            else -> ""
+        @Suppress("NAME_SHADOWING")
+        val expectedFail = expectedFail ?: if ((checkCompatibilityApi != null ||
+            checkCompatibilityApiReleased != null ||
+            checkCompatibilityRemovedApiCurrent != null ||
+            checkCompatibilityRemovedApiReleased != null) &&
+            (expectedIssues != null && expectedIssues.trim().isNotEmpty())
+        ) {
+            "Aborting: Found compatibility problems with --check-compatibility"
+        } else {
+            ""
         }
 
         // Unit test which checks that a signature file is as expected
-        val androidJar = getAndroidJar()
+        val androidJar = getPlatformFile("android.jar")
 
         val project = createProject(*sourceFiles)
 
@@ -545,6 +611,19 @@
             emptyArray()
         }
 
+        val checkCompatibilityApiFile = if (checkCompatibilityApi != null) {
+            val jar = File(checkCompatibilityApi)
+            if (jar.isFile) {
+                jar
+            } else {
+                val file = File(project, "current-api.txt")
+                file.writeText(checkCompatibilityApi.trimIndent())
+                file
+            }
+        } else {
+            null
+        }
+
         val checkCompatibilityApiReleasedFile = if (checkCompatibilityApiReleased != null) {
             val jar = File(checkCompatibilityApiReleased)
             if (jar.isFile) {
@@ -558,6 +637,19 @@
             null
         }
 
+        val checkCompatibilityRemovedApiCurrentFile = if (checkCompatibilityRemovedApiCurrent != null) {
+            val jar = File(checkCompatibilityRemovedApiCurrent)
+            if (jar.isFile) {
+                jar
+            } else {
+                val file = File(project, "removed-current-api.txt")
+                file.writeText(checkCompatibilityRemovedApiCurrent.trimIndent())
+                file
+            }
+        } else {
+            null
+        }
+
         val checkCompatibilityRemovedApiReleasedFile = if (checkCompatibilityRemovedApiReleased != null) {
             val jar = File(checkCompatibilityRemovedApiReleased)
             if (jar.isFile) {
@@ -611,6 +703,17 @@
             emptyArray()
         }
 
+        val checkCompatibilityArguments = if (checkCompatibilityApiFile != null) {
+            val extra: Array<String> = if (allowCompatibleDifferences) {
+                arrayOf(ARG_ALLOW_COMPATIBLE_DIFFERENCES)
+            } else {
+                emptyArray()
+            }
+            arrayOf(ARG_CHECK_COMPATIBILITY_API_CURRENT, checkCompatibilityApiFile.path, *extra)
+        } else {
+            emptyArray()
+        }
+
         val checkCompatibilityApiReleasedArguments = if (checkCompatibilityApiReleasedFile != null) {
             arrayOf(ARG_CHECK_COMPATIBILITY_API_RELEASED, checkCompatibilityApiReleasedFile.path)
         } else {
@@ -623,6 +726,17 @@
             emptyArray()
         }
 
+        val checkCompatibilityRemovedCurrentArguments = if (checkCompatibilityRemovedApiCurrentFile != null) {
+            val extra: Array<String> = if (allowCompatibleDifferences) {
+                arrayOf(ARG_ALLOW_COMPATIBLE_DIFFERENCES)
+            } else {
+                emptyArray()
+            }
+            arrayOf(ARG_CHECK_COMPATIBILITY_REMOVED_CURRENT, checkCompatibilityRemovedApiCurrentFile.path, *extra)
+        } else {
+            emptyArray()
+        }
+
         val checkCompatibilityRemovedReleasedArguments = if (checkCompatibilityRemovedApiReleasedFile != null) {
             arrayOf(ARG_CHECK_COMPATIBILITY_REMOVED_RELEASED, checkCompatibilityRemovedApiReleasedFile.path)
         } else {
@@ -636,6 +750,22 @@
             emptyArray()
         }
 
+        val coverageStats = if (coverageJars != null && coverageJars.isNotEmpty()) {
+            val sb = StringBuilder()
+            val root = File(project, "coverageJars")
+            root.mkdirs()
+            for (jar in coverageJars) {
+                if (sb.isNotEmpty()) {
+                    sb.append(File.pathSeparator)
+                }
+                val file = jar.createFile(root)
+                sb.append(file.path)
+            }
+            arrayOf(ARG_ANNOTATION_COVERAGE_OF, sb.toString())
+        } else {
+            emptyArray()
+        }
+
         var proguardFile: File? = null
         val proguardKeepArguments = if (proguard != null) {
             proguardFile = File(project, "proguard.cfg")
@@ -718,6 +848,14 @@
             emptyArray()
         }
 
+        var removedDexApiFile: File? = null
+        val removedDexArgs = if (removedDexApi != null) {
+            removedDexApiFile = temporaryFolder.newFile("removed-dex.txt")
+            arrayOf(ARG_REMOVED_DEX_API, removedDexApiFile.path)
+        } else {
+            emptyArray()
+        }
+
         var apiFile: File? = null
         val apiArgs = if (api != null) {
             apiFile = temporaryFolder.newFile("public-api.txt")
@@ -760,7 +898,7 @@
                 val base = convert.baseApi
                 val convertSig = temporaryFolder.newFile("convert-signatures$index.txt")
                 convertSig.writeText(signature.trimIndent(), UTF_8)
-                val extension = FileFormat.JDIFF.preferredExtension()
+                val extension = convert.format.preferredExtension()
                 val output = temporaryFolder.newFile("convert-output$index$extension")
                 val baseFile = if (base != null) {
                     val baseFile = temporaryFolder.newFile("convert-signatures$index-base.txt")
@@ -769,12 +907,15 @@
                 } else {
                     null
                 }
-                convertFiles += Options.ConvertFile(convertSig, output, baseFile, strip = true)
+                convertFiles += Options.ConvertFile(convertSig, output, baseFile,
+                    strip = true, outputFormat = convert.format)
                 index++
 
                 if (baseFile != null) {
                     args +=
                         when {
+                            convert.format == FileFormat.V1 -> ARG_CONVERT_NEW_TO_V1
+                            convert.format == FileFormat.V2 -> ARG_CONVERT_NEW_TO_V2
                             convert.strip -> "-new_api"
                             else -> ARG_CONVERT_NEW_TO_JDIFF
                         }
@@ -782,6 +923,8 @@
                 } else {
                     args +=
                         when {
+                            convert.format == FileFormat.V1 -> ARG_CONVERT_TO_V1
+                            convert.format == FileFormat.V2 -> ARG_CONVERT_TO_V2
                             convert.strip -> "-convert2xml"
                             else -> ARG_CONVERT_TO_JDIFF
                         }
@@ -847,15 +990,10 @@
                 if (!(updateContent != null || merge)) {
                     return Pair(arrayOf(argBaseline, baselineFile.path), baselineFile)
                 } else {
-                    return Pair(
-                        arrayOf(
-                            argBaseline,
-                            baselineFile.path,
-                            if (mergeBaseline != null) argMergeBaseline else argUpdateBaseline,
-                            baselineFile.path
-                        ),
-                        baselineFile
-                    )
+                    return Pair(arrayOf(argBaseline,
+                        baselineFile.path,
+                        if (mergeBaseline != null) argMergeBaseline else argUpdateBaseline,
+                        baselineFile.path), baselineFile)
                 }
             } else {
                 return Pair(emptyArray(), null)
@@ -889,7 +1027,15 @@
             skipEmitPackagesArgs.add(it)
         }
 
-        val kotlinPathArgs = findKotlinStdlibPathArgs(sourceList)
+        val kotlinPath = findKotlinStdlibPath()
+        val kotlinPathArgs =
+            if (kotlinPath.isNotEmpty() &&
+                sourceList.asSequence().any { it.endsWith(DOT_KT) }
+            ) {
+                arrayOf(ARG_CLASS_PATH, kotlinPath.joinToString(separator = File.pathSeparator) { it })
+            } else {
+                emptyArray()
+            }
 
         val sdkFilesDir: File?
         val sdkFilesArgs: Array<String>
@@ -908,6 +1054,23 @@
             sdkFilesDir = null
         }
 
+        val artifactArgs = if (artifacts != null) {
+            val args = mutableListOf<String>()
+            var index = 1
+            for ((artifactId, signatures) in artifacts) {
+                val signatureFile = temporaryFolder.newFile("signature-file-$index.txt")
+                signatureFile.writeText(signatures.trimIndent())
+                index++
+
+                args.add(ARG_REGISTER_ARTIFACT)
+                args.add(signatureFile.path)
+                args.add(artifactId)
+            }
+            args.toTypedArray()
+        } else {
+            emptyArray()
+        }
+
         val extractedAnnotationsZip: File?
         val extractAnnotationsArgs = if (extractAnnotations != null) {
             extractedAnnotationsZip = temporaryFolder.newFile("extracted-annotations.zip")
@@ -939,12 +1102,21 @@
             emptyArray()
         }
 
+        val signatureFormatArgs = if (format != null) {
+            arrayOf(format.outputFlag())
+        } else {
+            emptyArray()
+        }
+
         val errorMessageApiLintArgs = buildOptionalArgs(errorMessageApiLint) {
             arrayOf(ARG_ERROR_MESSAGE_API_LINT, it)
         }
         val errorMessageCheckCompatibilityReleasedArgs = buildOptionalArgs(errorMessageCheckCompatibilityReleased) {
             arrayOf(ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_RELEASED, it)
         }
+        val errorMessageCheckCompatibilityCurrentArgs = buildOptionalArgs(errorMessageCheckCompatibilityCurrent) {
+            arrayOf(ARG_ERROR_MESSAGE_CHECK_COMPATIBILITY_CURRENT, it)
+        }
 
         val repeatErrorsMaxArgs = if (repeatErrorsMax > 0) {
             arrayOf(ARG_REPEAT_ERRORS_MAX, repeatErrorsMax.toString())
@@ -976,6 +1148,7 @@
             *classpathArgs,
             *kotlinPathArgs,
             *removedArgs,
+            *removedDexArgs,
             *apiArgs,
             *apiXmlArgs,
             *dexApiArgs,
@@ -983,17 +1156,22 @@
             *stubsArgs,
             *stubsSourceListArgs,
             *docStubsSourceListArgs,
+            "$ARG_COMPAT_OUTPUT=${if (compatibilityMode) "yes" else "no"}",
             "$ARG_OUTPUT_KOTLIN_NULLS=${if (outputKotlinStyleNulls) "yes" else "no"}",
             "$ARG_INPUT_KOTLIN_NULLS=${if (inputKotlinStyleNulls) "yes" else "no"}",
+            "$ARG_OMIT_COMMON_PACKAGES=${if (omitCommonPackages) "yes" else "no"}",
             "$ARG_INCLUDE_SIG_VERSION=${if (includeSignatureVersion) "yes" else "no"}",
+            *coverageStats,
             *quiet,
             *mergeAnnotationsArgs,
             *signatureAnnotationsArgs,
             *javaStubAnnotationsArgs,
             *inclusionAnnotationsArgs,
             *migrateNullsArguments,
+            *checkCompatibilityArguments,
             *checkCompatibilityApiReleasedArguments,
             *checkCompatibilityBaseApiArguments,
+            *checkCompatibilityRemovedCurrentArguments,
             *checkCompatibilityRemovedReleasedArguments,
             *proguardKeepArguments,
             *manifestFileArgs,
@@ -1012,16 +1190,18 @@
             *sdkFilesArgs,
             *importedPackageArgs.toTypedArray(),
             *skipEmitPackagesArgs.toTypedArray(),
+            *artifactArgs,
             *extractAnnotationsArgs,
             *validateNullabilityArgs,
             *validateNullabilityFromListArgs,
-            format.outputFlag(),
+            *signatureFormatArgs,
             *sourceList,
             *extraArguments,
             *errorMessageApiLintArgs,
             *errorMessageCheckCompatibilityReleasedArgs,
+            *errorMessageCheckCompatibilityCurrentArgs,
             *repeatErrorsMaxArgs,
-            expectedFail = actualExpectedFail
+            expectedFail = expectedFail
         )
 
         if (expectedIssues != null || allReportedIssues.toString() != "") {
@@ -1044,7 +1224,7 @@
         if (api != null && apiFile != null) {
             assertTrue("${apiFile.path} does not exist even though --api was used", apiFile.exists())
             val actualText = readFile(apiFile, stripBlankLines, trim)
-            assertEquals(prepareExpectedApi(api, format), actualText)
+            assertEquals(stripComments(api, stripLineComments = false).trimIndent(), actualText)
             // Make sure we can read back the files we write
             ApiFile.parseApi(apiFile, options.outputKotlinStyleNulls)
         }
@@ -1055,7 +1235,7 @@
                 apiXmlFile.exists()
             )
             val actualText = readFile(apiXmlFile, stripBlankLines, trim)
-            assertEquals(stripComments(apiXml, DOT_XML, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(stripComments(apiXml, stripLineComments = false).trimIndent(), actualText)
             // Make sure we can read back the files we write
             parseDocument(apiXmlFile.readText(UTF_8), false)
         }
@@ -1075,12 +1255,11 @@
             // If "update baseline" is set, use it.
             // Otherwise, the original baseline.
             val sourceFile = mergeBaselineContent ?: updateBaselineContent ?: baselineContent ?: ""
-            assertEquals(stripComments(sourceFile, DOT_XML, stripLineComments = false).trimIndent(), actualText)
+            assertEquals(stripComments(sourceFile, stripLineComments = false).trimIndent(), actualText)
         }
         checkBaseline(ARG_BASELINE, baseline, updateBaseline, mergeBaseline, baselineFile)
         checkBaseline(ARG_BASELINE_API_LINT, baselineApiLint, updateBaselineApiLint, null, baselineApiLintFile)
-        checkBaseline(
-            ARG_BASELINE_CHECK_COMPATIBILITY_RELEASED, baselineCheckCompatibilityReleased,
+        checkBaseline(ARG_BASELINE_CHECK_COMPATIBILITY_RELEASED, baselineCheckCompatibilityReleased,
             updateBaselineCheckCompatibilityReleased, null, baselineCheckCompatibilityReleasedFile
         )
 
@@ -1088,6 +1267,11 @@
             for (i in convertToJDiff.indices) {
                 val expected = convertToJDiff[i].outputFile
                 val converted = convertFiles[i].outputFile
+                if (convertToJDiff[i].baseApi != null &&
+                    compatibilityMode &&
+                    actualOutput.contains("No API change detected, not generating diff")) {
+                    continue
+                }
                 assertTrue(
                     "${converted.path} does not exist even though $ARG_CONVERT_TO_JDIFF was used",
                     converted.exists()
@@ -1096,10 +1280,7 @@
                 if (actualText.contains("<api")) {
                     parseDocument(actualText, false)
                 }
-                assertEquals(
-                    stripComments(expected, DOT_XML, stripLineComments = false).trimIndent(),
-                    actualText
-                )
+                assertEquals(stripComments(expected, stripLineComments = false).trimIndent(), actualText)
                 // Make sure we can read back the files we write
             }
         }
@@ -1110,10 +1291,7 @@
                 dexApiFile.exists()
             )
             val actualText = readFile(dexApiFile, stripBlankLines, trim)
-            assertEquals(
-                stripComments(dexApi, DOT_TXT, stripLineComments = false).trimIndent(),
-                actualText
-            )
+            assertEquals(stripComments(dexApi, stripLineComments = false).trimIndent(), actualText)
         }
 
         if (removedApi != null && removedApiFile != null) {
@@ -1122,21 +1300,27 @@
                 removedApiFile.exists()
             )
             val actualText = readFile(removedApiFile, stripBlankLines, trim)
-            assertEquals(prepareExpectedApi(removedApi, format), actualText)
+            assertEquals(stripComments(removedApi, stripLineComments = false).trimIndent(), actualText)
             // Make sure we can read back the files we write
             ApiFile.parseApi(removedApiFile, options.outputKotlinStyleNulls)
         }
 
+        if (removedDexApi != null && removedDexApiFile != null) {
+            assertTrue(
+                "${removedDexApiFile.path} does not exist even though --removed-dex-api was used",
+                removedDexApiFile.exists()
+            )
+            val actualText = readFile(removedDexApiFile, stripBlankLines, trim)
+            assertEquals(stripComments(removedDexApi, stripLineComments = false).trimIndent(), actualText)
+        }
+
         if (proguard != null && proguardFile != null) {
             val expectedProguard = readFile(proguardFile)
             assertTrue(
                 "${proguardFile.path} does not exist even though --proguard was used",
                 proguardFile.exists()
             )
-            assertEquals(
-                stripComments(proguard, DOT_TXT, stripLineComments = false).trimIndent(),
-                expectedProguard.trim()
-            )
+            assertEquals(stripComments(proguard, stripLineComments = false).trimIndent(), expectedProguard.trim())
         }
 
         if (sdk_broadcast_actions != null) {
@@ -1213,10 +1397,7 @@
                 // To make golden files look better put one entry per line instead of a single
                 // space separated line
                 .replace(' ', '\n')
-            assertEquals(
-                stripComments(stubsSourceList, DOT_TXT, stripLineComments = false).trimIndent(),
-                actualText
-            )
+            assertEquals(stripComments(stubsSourceList, stripLineComments = false).trimIndent(), actualText)
         }
 
         if (docStubsSourceList != null && docStubsSourceListFile != null) {
@@ -1228,10 +1409,7 @@
                 // To make golden files look better put one entry per line instead of a single
                 // space separated line
                 .replace(' ', '\n')
-            assertEquals(
-                stripComments(docStubsSourceList, DOT_TXT, stripLineComments = false).trimIndent(),
-                actualText
-            )
+            assertEquals(stripComments(docStubsSourceList, stripLineComments = false).trimIndent(), actualText)
         }
 
         if (checkCompilation && stubsDir != null) {
@@ -1247,10 +1425,9 @@
                 gatherSources(listOf(extraAnnotationsDir)).asSequence().map { it.path }.toList().toTypedArray()
 
             if (!runCommand(
-                    "${getJdkPath()}/bin/javac",
-                    arrayOf(
-                            "-d", project.path, *generated, *extraAnnotations
-                        )
+                    "${getJdkPath()}/bin/javac", arrayOf(
+                        "-d", project.path, *generated, *extraAnnotations
+                    )
                 )
             ) {
                 fail("Couldn't compile stub file -- compilation problems")
@@ -1327,41 +1504,57 @@
         return true
     }
 
-    /** Strip comments, trim indent, and add a signature format version header if one is missing */
-    private fun prepareExpectedApi(expectedApi: String, format: FileFormat): String {
-        val header = format.header()
-
-        return stripComments(expectedApi, DOT_TXT, stripLineComments = false)
-            .trimIndent()
-            .let {
-                if (header != null && !it.startsWith("// Signature format:")) header + it else it
-            }
-            .trim()
-    }
-
     companion object {
-        private const val API_LEVEL = 31
+        const val API_LEVEL = 27
 
-        private fun getAndroidJarFromEnv(apiLevel: Int): File {
-            val sdkRoot = System.getenv("ANDROID_SDK_ROOT")
-                ?: System.getenv("ANDROID_HOME")
-                ?: error("Expected ANDROID_SDK_ROOT to be set")
-            val jar = File(sdkRoot, "platforms/android-$apiLevel/android.jar")
-            if (!jar.exists()) {
-                error("Missing ${jar.absolutePath} file in the SDK")
-            }
-            return jar
-        }
+        private val latestAndroidPlatform: String
+            get() = "android-$API_LEVEL"
 
-        fun getAndroidJar(apiLevel: Int = API_LEVEL): File {
+        private val sdk: File
+            get() = File(
+                System.getenv("ANDROID_HOME")
+                    ?: error("You must set \$ANDROID_HOME before running tests")
+            )
+
+        fun getAndroidJar(apiLevel: Int): File? {
             val localFile = File("../../prebuilts/sdk/$apiLevel/public/android.jar")
             if (localFile.exists()) {
                 return localFile
             } else {
                 val androidJar = File("../../prebuilts/sdk/$apiLevel/android.jar")
-                if (androidJar.exists()) return androidJar
-                return getAndroidJarFromEnv(apiLevel)
+                if (androidJar.exists()) {
+                    return androidJar
+                }
             }
+            return null
+        }
+
+        fun getPlatformFile(path: String): File {
+            return getAndroidJar(API_LEVEL) ?: run {
+                val file = FileUtils.join(sdk, SdkConstants.FD_PLATFORMS, latestAndroidPlatform, path)
+                if (!file.exists()) {
+                    throw IllegalArgumentException(
+                        "File \"$path\" not found in platform $latestAndroidPlatform"
+                    )
+                }
+                file
+            }
+        }
+
+        fun java(to: String, @Language("JAVA") source: String): TestFile {
+            return TestFiles.java(to, source.trimIndent())
+        }
+
+        fun java(@Language("JAVA") source: String): TestFile {
+            return TestFiles.java(source.trimIndent())
+        }
+
+        fun kotlin(@Language("kotlin") source: String): TestFile {
+            return TestFiles.kotlin(source.trimIndent())
+        }
+
+        fun kotlin(to: String, @Language("kotlin") source: String): TestFile {
+            return TestFiles.kotlin(to, source.trimIndent())
         }
 
         private fun readFile(file: File, stripBlankLines: Boolean = false, trim: Boolean = false): String {
@@ -1378,37 +1571,6 @@
     }
 }
 
-/**
- * A slight modification of com.android.tools.lint.checks.infrastructure.findKotlinStdLibPath
- * that prints program name on error. Returns the paths as metalava args expected by Options.
- */
-fun findKotlinStdlibPathArgs(sources: Array<String>): Array<String> {
-    val classPath: String = System.getProperty("java.class.path")
-    val paths = mutableListOf<String>()
-    for (path in classPath.split(':')) {
-        val file = File(path)
-        val name = file.name
-        if (name.startsWith("kotlin-stdlib") ||
-            name.startsWith("kotlin-reflect") ||
-            name.startsWith("kotlin-script-runtime")
-        ) {
-            paths.add(file.path)
-        }
-    }
-    if (paths.isEmpty()) {
-        error("Did not find kotlin-stdlib-jre8 in $PROGRAM_NAME classpath: $classPath")
-    }
-    val kotlinPathArgs =
-        if (paths.isNotEmpty() &&
-            sources.asSequence().any { it.endsWith(DOT_KT) }
-        ) {
-            arrayOf(ARG_CLASS_PATH, paths.joinToString(separator = File.pathSeparator) { it })
-        } else {
-            emptyArray()
-        }
-    return kotlinPathArgs
-}
-
 val intRangeAnnotationSource: TestFile = java(
     """
         package android.annotation;
@@ -1840,35 +2002,22 @@
     """
 ).indented()
 
-val restrictToSource: TestFile = kotlin(
+val restrictToSource: TestFile = java(
     """
-    package androidx.annotation
-
-    import androidx.annotation.RestrictTo.Scope
-    import java.lang.annotation.ElementType.*
-
-    @MustBeDocumented
-    @kotlin.annotation.Retention(AnnotationRetention.BINARY)
-    @Target(
-        AnnotationTarget.ANNOTATION_CLASS,
-        AnnotationTarget.CLASS,
-        AnnotationTarget.FUNCTION,
-        AnnotationTarget.PROPERTY_GETTER,
-        AnnotationTarget.PROPERTY_SETTER,
-        AnnotationTarget.CONSTRUCTOR,
-        AnnotationTarget.FIELD,
-        AnnotationTarget.FILE
-    )
-    // Needed due to Kotlin's lack of PACKAGE annotation target
-    // https://youtrack.jetbrains.com/issue/KT-45921
-    @Suppress("DEPRECATED_JAVA_ANNOTATION")
-    @java.lang.annotation.Target(ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE)
-    public annotation class RestrictTo(vararg val value: Scope) {
-        public enum class Scope {
+    package androidx.annotation;
+    import java.lang.annotation.*;
+    import static java.lang.annotation.ElementType.*;
+    import static java.lang.annotation.RetentionPolicy.*;
+    @SuppressWarnings("WeakerAccess")
+    @Retention(CLASS)
+    @Target({ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE})
+    public @interface RestrictTo {
+        Scope[] value();
+        enum Scope {
             LIBRARY,
             LIBRARY_GROUP,
-            LIBRARY_GROUP_PREFIX,
-            @Deprecated("Use LIBRARY_GROUP_PREFIX instead.")
+            /** @deprecated */
+            @Deprecated
             GROUP_ID,
             TESTS,
             SUBCLASSES,
@@ -1939,18 +2088,3 @@
     public annotation class PublishedApi
     """
 ).indented()
-
-val deprecatedForSdkSource: TestFile = java(
-    """
-    package android.annotation;
-    import static java.lang.annotation.RetentionPolicy.SOURCE;
-    import java.lang.annotation.Retention;
-    /** @hide */
-    @Retention(SOURCE)
-    @SuppressWarnings("WeakerAccess")
-    public @interface DeprecatedForSdk {
-        String value();
-        Class<?>[] allowIn() default {};
-    }
-    """
-).indented()
diff --git a/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt b/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt
index 0152c82..375c283 100644
--- a/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt
+++ b/src/test/java/com/android/tools/metalava/ExtractAnnotationsTest.kt
@@ -77,7 +77,7 @@
             includeSourceRetentionAnnotations = false,
             format = FileFormat.V2,
             sourceFiles = sourceFiles1,
-            expectedIssues = "src/test/pkg/IntDefTest.java:13: error: This typedef annotation class should have @Retention(RetentionPolicy.SOURCE) [AnnotationExtraction]",
+            expectedIssues = "src/test/pkg/IntDefTest.java:11: error: This typedef annotation class should have @Retention(RetentionPolicy.SOURCE) [AnnotationExtraction]",
             extractAnnotations = mapOf(
                 "test.pkg" to """
                 <?xml version="1.0" encoding="UTF-8"?>
@@ -334,8 +334,10 @@
     fun `Include merged annotations in exported source annotations`() {
         check(
             includeSourceRetentionAnnotations = true,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             includeSystemApiAnnotations = false,
+            omitCommonPackages = false,
             expectedIssues = "error: Unexpected reference to Nonexistent.Field [InternalError]",
             sourceFiles = arrayOf(
                 java(
@@ -398,8 +400,10 @@
     fun `Only including class retention annotations in stubs`() {
         check(
             includeSourceRetentionAnnotations = false,
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
             includeSystemApiAnnotations = false,
+            omitCommonPackages = false,
             sourceFiles = arrayOf(
                 java(
                     """
diff --git a/src/test/java/com/android/tools/metalava/FileFormatTest.kt b/src/test/java/com/android/tools/metalava/FileFormatTest.kt
index 6cc3ca3..98de4d2 100644
--- a/src/test/java/com/android/tools/metalava/FileFormatTest.kt
+++ b/src/test/java/com/android/tools/metalava/FileFormatTest.kt
@@ -22,23 +22,15 @@
 class FileFormatTest {
     @Test
     fun `Check format parsing`() {
-        assertSame(
-            FileFormat.V1,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.V1, FileFormat.parseHeader("""
                 package test.pkg {
                   public class MyTest {
                     ctor public MyTest();
                   }
                 }
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.V2,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.V2, FileFormat.parseHeader("""
             // Signature format: 2.0
             package libcore.util {
               @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface NonNull {
@@ -46,79 +38,50 @@
                 method public abstract int to() default java.lang.Integer.MAX_VALUE;
               }
             }
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.V3,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.V3, FileFormat.parseHeader("""
             // Signature format: 3.0
             package androidx.collection {
               public final class LruCacheKt {
                 ctor public LruCacheKt();
               }
             }
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.V2,
-            FileFormat.parseHeader(
-                "// Signature format: 2.0\r\n" +
-                    "package libcore.util {\\r\n" +
-                    "  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface NonNull {\r\n" +
-                    "    method public abstract int from() default java.lang.Integer.MIN_VALUE;\r\n" +
-                    "    method public abstract int to() default java.lang.Integer.MAX_VALUE;\r\n" +
-                    "  }\r\n" +
-                    "}\r\n"
-            )
-        )
+        assertSame(FileFormat.V2, FileFormat.parseHeader(
+            "// Signature format: 2.0\r\n" +
+                "package libcore.util {\\r\n" +
+                "  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface NonNull {\r\n" +
+                "    method public abstract int from() default java.lang.Integer.MIN_VALUE;\r\n" +
+                "    method public abstract int to() default java.lang.Integer.MAX_VALUE;\r\n" +
+                "  }\r\n" +
+                "}\r\n"))
 
-        assertSame(
-            FileFormat.BASELINE,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.BASELINE, FileFormat.parseHeader("""
                 // Baseline format: 1.0
                 BothPackageInfoAndHtml: test/visible/package-info.java:
                     It is illegal to provide both a package-info.java file and a package.html file for the same package
                 IgnoringSymlink: test/pkg/sub1/sub2/sub3:
                     Ignoring symlink during package.html discovery directory traversal
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.JDIFF,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.JDIFF, FileFormat.parseHeader("""
             <api>
             <package name="test.pkg"
             >
             </api>
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.JDIFF,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.JDIFF, FileFormat.parseHeader("""
             <?xml version="1.0" encoding="utf-8"?>
             <api>
             <package name="test.pkg"
             >
             </api>
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.SINCE_XML,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.SINCE_XML, FileFormat.parseHeader("""
             <?xml version="1.0" encoding="utf-8"?>
             <api version="2">
                 <class name="android/hardware/Camera" since="1" deprecated="21">
@@ -128,27 +91,15 @@
                     <field name="ACTION_NEW_VIDEO" since="14" deprecated="25"/>
                 </class>
             </api>
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.UNKNOWN,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.UNKNOWN, FileFormat.parseHeader("""
             blah blah
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
 
-        assertSame(
-            FileFormat.UNKNOWN,
-            FileFormat.parseHeader(
-                """
+        assertSame(FileFormat.UNKNOWN, FileFormat.parseHeader("""
             <?xml version="1.0" encoding="utf-8"?>
             <manifest />
-                """.trimIndent()
-            )
-        )
+        """.trimIndent()))
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
index 3121f8a..fc16af5 100644
--- a/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/HideAnnotationTest.kt
@@ -24,7 +24,7 @@
     fun `Using hide annotation with Kotlin source`() {
         check(
             expectedIssues = """
-                src/test/pkg/ExtendingMyHiddenClass.kt:3: warning: Public class test.pkg.ExtendingMyHiddenClass stripped of unavailable superclass test.pkg.MyHiddenClass [HiddenSuperclass]
+                src/test/pkg/).kt:2: warning: Public class test.pkg.ExtendingMyHiddenClass stripped of unavailable superclass test.pkg.MyHiddenClass [HiddenSuperclass]
             """,
             sourceFiles = arrayOf(
                 kotlin(
@@ -67,115 +67,16 @@
             hideMetaAnnotations = arrayOf(
                 "test.pkg.MetaHide"
             ),
+            compatibilityMode = false,
             api = """
                 package test.pkg {
                   public class ExtendingMyHiddenClass<Float> {
                     ctor public ExtendingMyHiddenClass();
                   }
-                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS) public @interface MetaHide {
+                  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget) public @interface MetaHide {
                   }
                 }
                 """
         )
     }
-
-    @Test
-    fun `Using hide annotation interface order`() {
-        check(
-            expectedIssues = """
-                src/test/pkg/InterfaceWithHiddenInterfaceFirst.java:2: warning: Public class test.pkg.InterfaceWithHiddenInterfaceFirst stripped of unavailable superclass test.pkg.HiddenInterface [HiddenSuperclass]
-                src/test/pkg/InterfaceWithVisibleInterfaceFirst.java:2: warning: Public class test.pkg.InterfaceWithVisibleInterfaceFirst stripped of unavailable superclass test.pkg.HiddenInterface [HiddenSuperclass]
-            """,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
-                    @Hide
-                    public @interface Hide {}
-                """
-                ),
-                java(
-                    """
-                    package test.pkg;
-                    @Hide
-                    public interface HiddenInterface {
-                      void hiddenInterfaceMethod();
-                    }
-                """
-                ),
-                java(
-                    """
-                    package test.pkg;
-                    public interface VisibleInterface {
-                      void visibleInterfaceMethod();
-                    }
-                """
-                ),
-                java(
-                    """
-                    package test.pkg;
-                    public interface InterfaceWithVisibleInterfaceFirst
-                        extends VisibleInterface, HiddenInterface {}
-                    """
-                ),
-                java(
-                    """
-                    package test.pkg;
-                    public interface InterfaceWithHiddenInterfaceFirst
-                        extends HiddenInterface, VisibleInterface {}
-                    """
-                )
-            ),
-            hideAnnotations = arrayOf(
-                "test.pkg.Hide"
-            ),
-            includeStrippedSuperclassWarnings = true,
-            api = """
-                package test.pkg {
-                  public interface InterfaceWithHiddenInterfaceFirst extends test.pkg.VisibleInterface {
-                  }
-                  public interface InterfaceWithVisibleInterfaceFirst extends test.pkg.VisibleInterface {
-                  }
-                  public interface VisibleInterface {
-                    method public void visibleInterfaceMethod();
-                  }
-                }
-                """
-        )
-    }
-
-    @Test
-    fun `Using hide annotation on file scope`() {
-        check(
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        @Target(AnnotationTarget.FILE)
-                        annotation class HideFile
-                    """
-                ),
-                kotlin(
-                    """
-                        @file:HideFile
-                        package test.pkg
-
-                        fun hiddenTopLevelFunction() = 1
-                        var hiddenTopLevelProperty = 2
-                        class VisibleTopLevelClass
-                    """
-                )
-            ),
-            hideAnnotations = arrayOf("test.pkg.HideFile"),
-            api = """
-                package test.pkg {
-                  @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FILE) public @interface HideFile {
-                  }
-                  public final class VisibleTopLevelClass {
-                    ctor public VisibleTopLevelClass();
-                  }
-                }
-                """
-        )
-    }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/JDiffXmlTest.kt b/src/test/java/com/android/tools/metalava/JDiffXmlTest.kt
index 1a3fa5c..66e62b9 100644
--- a/src/test/java/com/android/tools/metalava/JDiffXmlTest.kt
+++ b/src/test/java/com/android/tools/metalava/JDiffXmlTest.kt
@@ -23,6 +23,7 @@
     @Test
     fun `Loading a signature file and writing the API back out`() {
         check(
+            compatibilityMode = true,
             signatureSource =
             """
             package test.pkg {
@@ -113,6 +114,7 @@
     @Test
     fun `Abstract interfaces`() {
         check(
+            compatibilityMode = true,
             format = FileFormat.V2,
             signatureSource =
             """
@@ -189,6 +191,7 @@
             }
             """
         check(
+            compatibilityMode = true,
             signatureSource = source,
             apiXml =
             """
@@ -214,6 +217,30 @@
              deprecated="not deprecated"
              visibility="public"
             >
+            <method name="valueOf"
+             return="test.pkg.Foo"
+             abstract="false"
+             native="false"
+             synchronized="false"
+             static="true"
+             final="false"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <parameter name="null" type="java.lang.String">
+            </parameter>
+            </method>
+            <method name="values"
+             return="test.pkg.Foo[]"
+             abstract="false"
+             native="false"
+             synchronized="false"
+             static="true"
+             final="true"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            </method>
             <constructor name="Foo"
              type="test.pkg.Foo"
              static="false"
@@ -361,6 +388,7 @@
             }
             """
         check(
+            compatibilityMode = false,
             signatureSource = source,
             apiXml =
             """
@@ -451,8 +479,116 @@
     }
 
     @Test
+    fun `Test enums compat mode`() {
+        val source = """
+            package test.pkg {
+              public final class Foo extends java.lang.Enum {
+                ctor public Foo(int);
+                ctor public Foo(int, int);
+                method public static test.pkg.Foo valueOf(java.lang.String);
+                method public static final test.pkg.Foo[] values();
+                enum_constant public static final test.pkg.Foo A;
+                enum_constant public static final test.pkg.Foo B;
+              }
+            }
+            """
+        check(
+            compatibilityMode = true,
+            signatureSource = source,
+            apiXml =
+            """
+            <api xmlns:metalava="http://www.android.com/metalava/">
+            <package name="test.pkg"
+            >
+            <class name="Foo"
+             extends="java.lang.Enum"
+             abstract="false"
+             static="false"
+             final="true"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <method name="valueOf"
+             return="test.pkg.Foo"
+             abstract="false"
+             native="false"
+             synchronized="false"
+             static="true"
+             final="false"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <parameter name="null" type="java.lang.String">
+            </parameter>
+            </method>
+            <method name="values"
+             return="test.pkg.Foo[]"
+             abstract="false"
+             native="false"
+             synchronized="false"
+             static="true"
+             final="true"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            </method>
+            <constructor name="Foo"
+             type="test.pkg.Foo"
+             static="false"
+             final="false"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <parameter name="null" type="int">
+            </parameter>
+            </constructor>
+            <constructor name="Foo"
+             type="test.pkg.Foo"
+             static="false"
+             final="false"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <parameter name="null" type="int">
+            </parameter>
+            <parameter name="null" type="int">
+            </parameter>
+            </constructor>
+            <method name="valueOf"
+             return="test.pkg.Foo"
+             abstract="false"
+             native="false"
+             synchronized="false"
+             static="true"
+             final="false"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <parameter name="null" type="java.lang.String">
+            </parameter>
+            </method>
+            <method name="values"
+             return="test.pkg.Foo[]"
+             abstract="false"
+             native="false"
+             synchronized="false"
+             static="true"
+             final="true"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            </method>
+            </class>
+            </package>
+            </api>
+            """
+        )
+    }
+
+    @Test
     fun `Throws Lists`() {
         check(
+            compatibilityMode = true,
             signatureSource = """
                     package android.accounts {
                       public abstract interface AccountManagerFuture<V> {
@@ -521,6 +657,7 @@
     @Test
     fun `Generics in interfaces`() {
         check(
+            compatibilityMode = false,
             signatureSource = """
                     package android.accounts {
                       public class ArgbEvaluator implements android.animation.DefaultEvaluator<D> implements android.animation.TypeEvaluator<V> {
@@ -556,6 +693,7 @@
     @Test
     fun `Type Parameter Mapping`() {
         check(
+            compatibilityMode = false,
             signatureSource = """
                 package test.pkg {
                   public interface AbstractList<D,E,F> extends test.pkg.List<A,B,C> {
@@ -606,6 +744,7 @@
     @Test
     fun `Half float short from signature file`() {
         check(
+            compatibilityMode = false,
             signatureSource = """
                 package test.pkg {
                   public class Test {
@@ -656,6 +795,7 @@
     @Test
     fun `Half float short from source`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -706,8 +846,42 @@
     }
 
     @Test
-    fun `Interface extends`() {
+    fun `Interface extends, compat mode`() {
         check(
+            compatibilityMode = true,
+            format = FileFormat.V1,
+            signatureSource = """
+            // Signature format: 2.0
+            package android.companion {
+              public interface DeviceFilter<D extends android.os.Parcelable> extends android.os.Parcelable {
+              }
+            }
+            """,
+            apiXml =
+            """
+            <api xmlns:metalava="http://www.android.com/metalava/">
+            <package name="android.companion"
+            >
+            <interface name="DeviceFilter"
+             abstract="true"
+             static="false"
+             final="false"
+             deprecated="not deprecated"
+             visibility="public"
+            >
+            <implements name="android.os.Parcelable">
+            </implements>
+            </interface>
+            </package>
+            </api>
+            """
+        )
+    }
+
+    @Test
+    fun `Interface extends, non-compat mode`() {
+        check(
+            compatibilityMode = false,
             format = FileFormat.V2,
             signatureSource = """
             // Signature format: 2.0
@@ -740,6 +914,7 @@
     fun `Test default methods from signature files`() {
         // Ensure that we treat not just static but default methods in interfaces as non-abstract
         check(
+            compatibilityMode = true,
             format = FileFormat.V1,
             signatureSource = """
                 package test.pkg {
@@ -786,6 +961,7 @@
         // *diffs* relative to the base API, are tricky: They may for example list just an
         // inner class. See 122926140 for a scenario where this happens.
         check(
+            compatibilityMode = true,
             format = FileFormat.V1,
             signatureSource = """
             // Signature format: 2.0
@@ -868,6 +1044,7 @@
         // JDiff expects spaces in type argument lists
         // Regression test for 123140708
         check(
+            compatibilityMode = false,
             format = FileFormat.V2,
             signatureSource = """
             // Signature format: 2.0
@@ -946,4 +1123,4 @@
             """
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt b/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt
index 40337b1..286517a 100644
--- a/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt
+++ b/src/test/java/com/android/tools/metalava/Java9LanguageFeaturesTest.kt
@@ -18,6 +18,7 @@
 
 package com.android.tools.metalava
 
+import org.junit.Ignore
 import org.junit.Test
 
 class Java9LanguageFeaturesTest : DriverTest() {
@@ -25,7 +26,6 @@
     fun `Private Interface Method`() {
         // Basic class; also checks that default constructor is made explicit
         check(
-            format = FileFormat.V1,
             checkCompilation = false, // Not compiling with JDK 9 yet
             sourceFiles = arrayOf(
                 java(
@@ -43,8 +43,8 @@
             ),
             api = """
                 package test.pkg {
-                  public interface Person {
-                    method public String name();
+                  public abstract interface Person {
+                    method public abstract java.lang.String name();
                   }
                 }
                 """,
@@ -56,7 +56,6 @@
     fun `Kotlin language level`() {
         // See https://kotlinlang.org/docs/reference/whatsnew13.html
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 kotlin(
                     """
@@ -75,11 +74,11 @@
                 )
             ),
             api =
-            """
+                """
                 package test.pkg {
-                  public interface Foo {
+                  public abstract interface Foo {
                     method public default static void sayHello();
-                    field @NonNull public static final test.pkg.Foo.Companion Companion;
+                    field public static final test.pkg.Foo.Companion Companion;
                     field public static final int answer = 42; // 0x2a
                   }
                   public static final class Foo.Companion {
@@ -97,7 +96,6 @@
     fun `Basic class signature extraction`() {
         // Basic class; also checks that default constructor is made explicit
         check(
-            format = FileFormat.V1,
             checkCompilation = false, // Not compiling with JDK 9 yet
             sourceFiles = arrayOf(
                 java(
@@ -175,12 +173,12 @@
                     ctor public Java9LanguageFeatures();
                     method public static byte[] copy(byte[]) throws java.io.IOException;
                     method public <T> java.util.concurrent.atomic.AtomicReference<T> createReference(T);
-                    method @java.lang.SafeVarargs public static <T> String toListString(T...);
+                    method public static <T> java.lang.String toListString(T...);
                   }
-                  public static interface Java9LanguageFeatures.Person {
+                  public static abstract interface Java9LanguageFeatures.Person {
                     method public default boolean isPalindrome();
                     method public default boolean isPalindromeIgnoreCase();
-                    method public String name();
+                    method public abstract java.lang.String name();
                   }
                 }
                 """,
@@ -188,12 +186,12 @@
         )
     }
 
+    @Ignore("TODO: unable to load JDK11 libraries from java.home")
     @Test
     fun `Using JDK APIs`() {
         // Non-Android example
         val jdk = System.getProperty("java.home") ?: error("Expected java.home to be set")
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -206,7 +204,7 @@
                 )
             ),
             api =
-            """
+                """
                 package test.pkg {
                   public class SwingTest extends javax.swing.JButton {
                     ctor public SwingTest();
diff --git a/src/test/java/com/android/tools/metalava/KeepFileTest.kt b/src/test/java/com/android/tools/metalava/KeepFileTest.kt
index 32872b4..178b653 100644
--- a/src/test/java/com/android/tools/metalava/KeepFileTest.kt
+++ b/src/test/java/com/android/tools/metalava/KeepFileTest.kt
@@ -31,16 +31,14 @@
                             extends MyBaseInterface {
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package a.b.c;
                     @SuppressWarnings("ALL")
                     public interface MyStream<T, S extends MyStream<T, S>> extends java.lang.AutoCloseable {
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     @SuppressWarnings("ALL")
@@ -351,4 +349,4 @@
             extraArguments = arrayOf(ARG_HIDE, "KotlinKeyword")
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt b/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt
index 6851467..bdd97c1 100644
--- a/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt
+++ b/src/test/java/com/android/tools/metalava/KotlinInteropChecksTest.kt
@@ -26,7 +26,7 @@
             expectedIssues = """
                 src/test/pkg/Test.java:7: error: Avoid method names that are Kotlin hard keywords ("fun"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
                 src/test/pkg/Test.java:8: error: Avoid parameter names that are Kotlin hard keywords ("typealias"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
-                src/test/pkg/Test.java:10: error: Avoid field names that are Kotlin hard keywords ("object"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
+                src/test/pkg/Test.java:9: error: Avoid field names that are Kotlin hard keywords ("object"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords [KotlinKeyword]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -57,7 +57,7 @@
             apiLint = "",
             expectedIssues = """
                 src/test/pkg/Test.java:20: warning: SAM-compatible parameters (such as parameter 1, "run", in test.pkg.Test.error1) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
-                src/test/pkg/Test.java:23: warning: SAM-compatible parameters (such as parameter 2, "callback", in test.pkg.Test.error2) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
+                src/test/pkg/Test.java:21: warning: SAM-compatible parameters (such as parameter 2, "callback", in test.pkg.Test.error2) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
                 src/test/pkg/test.kt:7: warning: lambda parameters (such as parameter 1, "bar", in test.pkg.TestKt.error) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions [SamShouldBeLast] [See https://s.android.com/api-guidelines#placement-of-sam-parameters]
                 """,
             sourceFiles = arrayOf(
@@ -186,35 +186,15 @@
     }
 
     @Test
-    fun `Methods annotated @JvmSynthetic with default parameters don't require @JvmOverloads`() {
-        check(
-            expectedIssues = "",
-            apiLint = "",
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        @JvmSynthetic
-                        fun foo(bar: Bar, baz: Baz = null) {
-                        }
-                    """
-                )
-            )
-        )
-    }
-
-    @Test
     fun `Methods which throw exceptions should document them`() {
         check(
             apiLint = "",
             extraArguments = arrayOf(ARG_HIDE, "BannedThrow", ARG_HIDE, "GenericException"),
             expectedIssues = """
                 src/test/pkg/Foo.kt:6: error: Method Foo.error_throws_multiple_times appears to be throwing java.io.FileNotFoundException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
-                src/test/pkg/Foo.kt:17: error: Method Foo.error_throwsCheckedExceptionWithWrongExceptionClassInThrows appears to be throwing java.io.FileNotFoundException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
+                src/test/pkg/Foo.kt:16: error: Method Foo.error_throwsCheckedExceptionWithWrongExceptionClassInThrows appears to be throwing java.io.FileNotFoundException; this should be recorded with a @Throws annotation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
                 src/test/pkg/Foo.kt:37: error: Method Foo.error_throwsRuntimeExceptionDocsMissing appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
-                src/test/pkg/Foo.kt:44: error: Method Foo.error_missingSpecificAnnotation appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
-                src/test/pkg/Foo.kt:76: error: Method Foo.getErrorVar appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
-                src/test/pkg/Foo.kt:77: error: Method Foo.setErrorVar appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
+                src/test/pkg/Foo.kt:43: error: Method Foo.error_missingSpecificAnnotation appears to be throwing java.lang.UnsupportedOperationException; this should be listed in the documentation; see https://android.github.io/kotlin-guides/interop.html#document-exceptions [DocumentExceptions] [See https://s.android.com/api-guidelines#docs-throws]
                 """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
@@ -294,22 +274,6 @@
                             } catch (e: Exception) {}
                         }
 
-                        var errorVar: Int
-                            get() { throw UnsupportedOperationException() }
-                            set(value) { throw UnsupportedOperationException() }
-
-                        @get:Throws(FileNotFoundException::class)
-                        var okValAnnotation: Int
-                            get() { throw FileNotFoundException("Something") }
-
-                        /** Throws [UnsupportedOperationException] */
-                        val okValDocumented: Int
-                            get() { throw UnsupportedOperationException() }
-
-                        /** Throws [UnsupportedOperationException] */
-                        var okVarDocumented: Int = 0
-                            set(value) { throw UnsupportedOperationException() }
-
                         // TODO: What about something where you call in Java a method
                         // known to throw something (e.g. Integer.parseInt) and you don't catch it; should you
                         // pass it on? Hard to say; if the logic is complicated it may
diff --git a/src/test/java/com/android/tools/metalava/NullabilityAnnotationsValidatorTest.kt b/src/test/java/com/android/tools/metalava/NullabilityAnnotationsValidatorTest.kt
index 208c2c5..13322ab 100644
--- a/src/test/java/com/android/tools/metalava/NullabilityAnnotationsValidatorTest.kt
+++ b/src/test/java/com/android/tools/metalava/NullabilityAnnotationsValidatorTest.kt
@@ -46,7 +46,9 @@
                 libcoreNullableSource,
                 libcoreNullFromTypeParamSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -87,7 +89,9 @@
                 libcoreNonNullSource,
                 libcoreNullFromTypeParamSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -128,7 +132,9 @@
                 ),
                 libcoreNullableSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -170,7 +176,9 @@
                 libcoreNullableSource,
                 libcoreNullFromTypeParamSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -213,7 +221,9 @@
                 libcoreNullableSource,
                 libcoreNullFromTypeParamSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             mergeJavaStubAnnotations = """
                 package test.pkg;
 
@@ -258,7 +268,9 @@
                 ),
                 libcoreNullableSource
             ),
+            compatibilityMode = false,
             outputKotlinStyleNulls = false,
+            omitCommonPackages = false,
             extraArguments = arrayOf(ARG_VALIDATE_NULLABILITY_FROM_MERGED_STUBS),
             validateNullabilityFromList =
             """
diff --git a/src/test/java/com/android/tools/metalava/NullnessMigrationTest.kt b/src/test/java/com/android/tools/metalava/NullnessMigrationTest.kt
index 95920c3..874056f 100644
--- a/src/test/java/com/android/tools/metalava/NullnessMigrationTest.kt
+++ b/src/test/java/com/android/tools/metalava/NullnessMigrationTest.kt
@@ -61,8 +61,8 @@
     @Test
     fun `Method which is now marked null should be marked as recently migrated null`() {
         check(
-            format = FileFormat.V2,
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -112,8 +112,8 @@
     @Test
     fun `Parameter which is now marked null should be marked as recently migrated null`() {
         check(
-            format = FileFormat.V2,
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -161,8 +161,8 @@
     @Test
     fun `Comprehensive check of migration`() {
         check(
-            format = FileFormat.V2,
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -232,8 +232,8 @@
     @Test
     fun `Comprehensive check of migration, Kotlin-style output`() {
         check(
-            format = FileFormat.V3,
             outputKotlinStyleNulls = true,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -284,8 +284,8 @@
     @Test
     fun `Convert libcore nullness annotations to support`() {
         check(
-            format = FileFormat.V2,
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -391,8 +391,8 @@
     @Test
     fun `Check androidx package annotation`() {
         check(
-            format = FileFormat.V2,
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -442,6 +442,7 @@
     fun `Migrate nullness for type-use annotations`() {
         check(
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -515,6 +516,7 @@
     fun `Do not migrate type-use annotations when not changed`() {
         check(
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -582,6 +584,7 @@
     fun `Regression test for issue 111054266, type use annotations`() {
         check(
             outputKotlinStyleNulls = false,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -652,7 +655,6 @@
     @Test
     fun `Merge nullness annotations in stubs that are not in the API signature file`() {
         check(
-            format = FileFormat.V2,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -684,6 +686,8 @@
                 androidxNonNullSource,
                 androidxNullableSource
             ),
+            compatibilityMode = false,
+            omitCommonPackages = false,
             migrateNullsApi = """
                 package test.pkg {
                   public interface Appendable {
@@ -720,7 +724,7 @@
             api = """
                 package test.pkg {
                   public interface ForSystemUse {
-                    method @NonNull public Object foo(@Nullable String);
+                    method @androidx.annotation.NonNull public java.lang.Object foo(@androidx.annotation.Nullable java.lang.String);
                   }
                 }
                 """
diff --git a/src/test/java/com/android/tools/metalava/OptionsTest.kt b/src/test/java/com/android/tools/metalava/OptionsTest.kt
index 73eecb3..6c22a59 100644
--- a/src/test/java/com/android/tools/metalava/OptionsTest.kt
+++ b/src/test/java/com/android/tools/metalava/OptionsTest.kt
@@ -30,7 +30,7 @@
     private val DESCRIPTION = """
 $PROGRAM_NAME extracts metadata from source code to generate artifacts such as the signature files, the SDK stub files,
 external annotations etc.
-    """.trimIndent()
+""".trimIndent()
 
     private val FLAGS = """
 Usage: metalava <flags>
@@ -49,6 +49,9 @@
                                              Attempt to colorize the output (defaults to true if ${"$"}TERM is xterm)
 --no-color
                                              Do not attempt to colorize the output
+--no-docs
+                                             Cancel any other documentation flags supplied to metalava. This is here to
+                                             make it easier customize build system tasks.
 --only-update-api
                                              Cancel any other "action" flags other than generating signature files. This
                                              is here to make it easier customize build system tasks, particularly for
@@ -103,6 +106,12 @@
                                              A .jar file to read APIs from directly
 --manifest <file>
                                              A manifest file, used to for check permissions to cross check APIs
+--replace-documentation <p> <r> <t>
+                                             Amongst nonempty documentation of items from Java packages <p> and their
+                                             subpackages, replaces any matches of regular expression <r> with
+                                             replacement text <t>. <p> is given as a nonempty list of Java package names
+                                             separated by ':' (e.g. "java:android.util"); <t> may contain backreferences
+                                             ($1, $2 etc.) to matching groups from <r>.
 --hide-package <package>
                                              Remove the given packages from the API even if they have not been marked
                                              with @hide
@@ -127,7 +136,7 @@
 --java-source <level>
                                              Sets the source level for Java source files; default is 1.8.
 --kotlin-source <level>
-                                             Sets the source level for Kotlin source files; default is 1.6.
+                                             Sets the source level for Kotlin source files; default is 1.4.
 --sdk-home <dir>
                                              If set, locate the `android.jar` file from the given Android SDK
 --compile-sdk-version <api>
@@ -185,6 +194,14 @@
 --output-default-values[=yes|no]
                                              Controls whether default values should be included in signature files. The
                                              default is yes.
+--compatible-output=[yes|no]
+                                             Controls whether to keep signature files compatible with the historical
+                                             format (with its various quirks) or to generate the new format (which will
+                                             also include annotations that are part of the API, etc.)
+--omit-common-packages[=yes|no]
+                                             Skip common package prefixes like java.lang.* and kotlin.* in signature
+                                             files, along with packages for well known annotations like @Nullable and
+                                             @NonNull.
 --include-signature-version[=yes|no]
                                              Whether the signature files should include a comment listing the format
                                              version of the signature file.
@@ -233,6 +250,10 @@
                                              stubs; otherwise it's the non-documentation stubs.
 --write-doc-stubs-source-list <file>
                                              Write the list of generated doc stub files into the given source list file
+--register-artifact <api-file> <id>
+                                             Registers the given id for the packages found in the given signature file.
+                                             metalava will inject an @artifactId <id> tag into every top level stub
+                                             class in that API.
 
 
 Diffs and Checks:
@@ -314,6 +335,10 @@
                                              If set, metalava shows it when errors are detected in
                                              --check-compatibility:api:released and
                                              --check-compatibility:removed:released.
+--error-message:compatibility:current <message>
+                                             If set, metalava shows it when errors are detected in
+                                             --check-compatibility:api:current and
+                                             --check-compatibility:removed:current.
 
 
 JDiff:
@@ -325,6 +350,34 @@
 --convert-new-to-jdiff <old> <new> <xml>
                                              Reads in the given old and new api files, computes the difference, and
                                              writes out only the new parts of the API in the JDiff XML format.
+--convert-to-v1 <sig> <sig>
+                                             Reads in the given signature file and writes it out as a signature file in
+                                             the original v1/doclava format.
+--convert-to-v2 <sig> <sig>
+                                             Reads in the given signature file and writes it out as a signature file in
+                                             the new signature format, v2.
+--convert-new-to-v2 <old> <new> <sig>
+                                             Reads in the given old and new api files, computes the difference, and
+                                             writes out only the new parts of the API in the v2 format.
+
+
+Statistics:
+--annotation-coverage-stats
+                                             Whether metalava should emit coverage statistics for annotations, listing
+                                             the percentage of the API that has been annotated with nullness
+                                             information.
+--annotation-coverage-of <paths>
+                                             One or more jars (separated by `:`) containing existing apps that we want
+                                             to measure annotation coverage statistics for. The set of API usages in
+                                             those apps are counted up and the most frequently used APIs that are
+                                             missing annotation metadata are listed in descending order.
+--skip-java-in-coverage-report
+                                             In the coverage annotation report, skip java.** and kotlin.** to narrow the
+                                             focus down to the Android framework APIs.
+--write-class-coverage-to <path>
+                                             Specifies a file to write the annotation coverage report for classes to.
+--write-member-coverage-to <path>
+                                             Specifies a file to write the annotation coverage report for members to.
 
 
 Extracting Annotations:
@@ -364,8 +417,6 @@
 --android-jar-pattern <pattern>
                                              Patterns to use to locate Android JAR files. The default is
                                              ${"$"}ANDROID_HOME/platforms/android-%/android.jar.
---first-version
-                                             Sets the first API level to generate an API database from; usually 1
 --current-version
                                              Sets the current API level of the current source code
 --current-codename
@@ -407,7 +458,7 @@
                                              One or more arguments (concatenated by space) to append to the end of the
                                              command line, after the generate documentation flags.
 
-    """.trimIndent()
+""".trimIndent()
 
     @Test
     fun `Test invalid arguments`() {
@@ -428,8 +479,7 @@
 
 $FLAGS
 
-            """.trimIndent(),
-            stderr.toString()
+""".trimIndent(), stderr.toString()
         )
     }
 
@@ -454,8 +504,7 @@
 
 $FLAGS
 
-            """.trimIndent(),
-            stdout.toString()
+""".trimIndent(), stdout.toString()
         )
     }
 
@@ -527,10 +576,8 @@
 
         try {
             check(
-                extraArguments = arrayOf(
-                    "--strict-input-files-exempt",
-                    file1.path + File.pathSeparatorChar + dir.path
-                )
+                extraArguments = arrayOf("--strict-input-files-exempt",
+                    file1.path + File.pathSeparatorChar + dir.path)
             )
 
             assertTrue(FileReadSandbox.isAccessAllowed(file1))
diff --git a/src/test/java/com/android/tools/metalava/ReporterTest.kt b/src/test/java/com/android/tools/metalava/ReporterTest.kt
index 9c2d111..ffde69f 100644
--- a/src/test/java/com/android/tools/metalava/ReporterTest.kt
+++ b/src/test/java/com/android/tools/metalava/ReporterTest.kt
@@ -55,8 +55,7 @@
             """,
             expectedFail = DefaultLintErrorMessage,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import android.annotation.SuppressLint;
 
@@ -68,10 +67,8 @@
 
                         public void Unsuppressed() { }
                     }
-                """
-                ),
-                kotlin(
-                    """
+                """),
+                kotlin("""
                     package test.pkg
                     import android.annotation.SuppressLint;
 
@@ -83,8 +80,7 @@
 
                         fun Unsuppressed() { }
                     }
-                """
-                ),
+                """),
                 suppressLintSource
             )
         )
@@ -96,8 +92,7 @@
             apiLint = "",
             expectedIssues = "",
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
                     import android.annotation.SuppressLint;
 
@@ -105,8 +100,7 @@
                         @SuppressLint("KotlinOperator")
                         public int get(int i) { return i + 1; }
                     }
-                """
-                ),
+                """),
                 suppressLintSource
             )
         )
@@ -126,15 +120,13 @@
             """.trimIndent() + DefaultLintErrorMessage,
             repeatErrorsMax = 5,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
 
                     public class Foo {
                         public void foo1(String a) {} 
                     }
-                """
-                ),
+                """),
                 suppressLintSource
             )
         )
@@ -162,8 +154,7 @@
             """.trimIndent() + DefaultLintErrorMessage,
             repeatErrorsMax = 5,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
 
                     public class Foo {
@@ -173,8 +164,7 @@
                         public void foo4(String a) {} 
                         public void foo5(String a) {} 
                     }
-                """
-                ),
+                """),
                 suppressLintSource
             )
         )
@@ -204,8 +194,7 @@
             """.trimIndent() + DefaultLintErrorMessage,
             repeatErrorsMax = 5,
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
 
                     public class Foo {
@@ -216,8 +205,7 @@
                         public void foo5(String a) {} 
                         public void foo6(String a) {} 
                     }
-                """
-                ),
+                """),
                 suppressLintSource
             )
         )
diff --git a/src/test/java/com/android/tools/metalava/RewriteAnnotationsTest.kt b/src/test/java/com/android/tools/metalava/RewriteAnnotationsTest.kt
index 0f5e146..a95fa2e3 100644
--- a/src/test/java/com/android/tools/metalava/RewriteAnnotationsTest.kt
+++ b/src/test/java/com/android/tools/metalava/RewriteAnnotationsTest.kt
@@ -21,7 +21,6 @@
 import com.android.tools.lint.checks.infrastructure.TestFiles.xml
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
-import org.junit.Assert.assertThrows
 import org.junit.Assert.assertTrue
 import org.junit.Test
 import java.io.File
@@ -32,7 +31,7 @@
 class RewriteAnnotationsTest : DriverTest() {
     @Test
     fun `Test copying private annotations from one of the stubs`() {
-        val source = File("stub-annotations")
+        val source = File("stub-annotations".replace('/', File.separatorChar))
         assertTrue(source.path, source.isDirectory)
         val target = temporaryFolder.newFolder()
         runDriver(
@@ -41,16 +40,10 @@
 
             ARG_COPY_ANNOTATIONS,
             source.path,
-            target.path,
-
-            ARG_CLASS_PATH,
-            getAndroidJar().path
+            target.path
         )
-        // Source retention explicitly listed: Shouldn't exist
-        val nullable = File(target, "android/annotation/SdkConstant.java")
-        assertFalse("${nullable.path} exists", nullable.isFile)
 
-        // Source retention androidx: Shouldn't exist
+        // Source retention: Shouldn't exist
         val nonNull = File(target, "androidx/annotation/NonNull.java")
         assertFalse("${nonNull.path} exists", nonNull.isFile)
 
@@ -90,57 +83,14 @@
             @Retention(CLASS)
             @Target({METHOD, PARAMETER, FIELD})
             @interface RecentlyNullable {}
-            """.trimIndent().trim(),
-            recentlyNull.readText(UTF_8).trim().replace("\r\n", "\n")
+        """.trimIndent().trim(), recentlyNull.readText(UTF_8).trim().replace("\r\n", "\n")
         )
     }
 
     @Test
-    fun `Test stub-annotations containing unknown annotation`() {
-        val source = temporaryFolder.newFolder()
-        File("stub-annotations").copyRecursively(source)
-        assertTrue(source.path, source.isDirectory)
-        val target = temporaryFolder.newFolder()
-
-        val fooSource =
-            """
-            package android.annotation;
-
-            import static java.lang.annotation.ElementType.FIELD;
-            import static java.lang.annotation.ElementType.METHOD;
-            import static java.lang.annotation.ElementType.PARAMETER;
-            import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-            import java.lang.annotation.Retention;
-            import java.lang.annotation.Target;
-
-            /** Stub only annotation. Do not use directly. */
-            @Retention(SOURCE)
-            @Target({METHOD, PARAMETER, FIELD})
-            public @interface Foo {}
-            """
-
-        File(source, "src/main/java/android/annotation/Unknown.java").writeText(fooSource)
-        assertThrows(IllegalStateException::class.java) {
-            runDriver(
-                ARG_NO_COLOR,
-                ARG_NO_BANNER,
-
-                ARG_COPY_ANNOTATIONS,
-                source.path,
-                target.path,
-
-                ARG_CLASS_PATH,
-                getAndroidJar().path
-            )
-        }
-    }
-
-    @Test
     fun `Test rewriting the bytecode for one of the public annotations`() {
         val bytecode = base64gzip(
-            "androidx/annotation/CallSuper.class",
-            "" +
+            "androidx/annotation/CallSuper.class", "" +
                 "H4sIAAAAAAAAAIWPsU4CQRRF70NhEQWxJMZoLCjdxs6KIMYCA2E3NlbD8kKG" +
                 "DDNkmSXwaxZ+gB9FfGMBFps4yczc5J53kve9//wC8IirCK0IlxHahEbiijzj" +
                 "F22Y0OorY5JixfnDQm0UoTMprNdLftdrPTXcs9Z55bWza8LdMDCxUXYeq0MR" +
@@ -157,10 +107,7 @@
             ARG_NO_BANNER,
 
             ARG_REWRITE_ANNOTATIONS,
-            compiledStubs.path,
-
-            ARG_CLASS_PATH,
-            getAndroidJar().path
+            compiledStubs.path
         )
 
         // Load the class to make sure it's legit
@@ -175,8 +122,7 @@
     @Test
     fun `Test rewriting the bytecode for one of the public annotations in a jar file`() {
         val bytecode = base64gzip(
-            "androidx/annotation/CallSuper.class",
-            "" +
+            "androidx/annotation/CallSuper.class", "" +
                 "H4sIAAAAAAAAAIWPsU4CQRRF70NhEQWxJMZoLCjdxs6KIMYCA2E3NlbD8kKG" +
                 "DDNkmSXwaxZ+gB9FfGMBFps4yczc5J53kve9//wC8IirCK0IlxHahEbiijzj" +
                 "F22Y0OorY5JixfnDQm0UoTMprNdLftdrPTXcs9Z55bWza8LdMDCxUXYeq0MR" +
@@ -198,10 +144,7 @@
             ARG_NO_BANNER,
 
             ARG_REWRITE_ANNOTATIONS,
-            jarFile.path,
-
-            ARG_CLASS_PATH,
-            getAndroidJar().path
+            jarFile.path
         )
 
         // Load the class to make sure it's legit
@@ -212,4 +155,4 @@
         assertEquals(0, modifiers and Modifier.PUBLIC)
         assertTrue(annotationClass.isAnnotation)
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt b/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt
index 2af497d..10e3a49 100644
--- a/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt
+++ b/src/test/java/com/android/tools/metalava/SdkFileWriterTest.kt
@@ -25,7 +25,7 @@
     fun `Test generating broadcast actions`() {
         check(
             expectedIssues = """
-                src/android/telephony/SubscriptionManager.java:11: lint: Field 'ACTION_DEFAULT_SUBSCRIPTION_CHANGED' is missing @BroadcastBehavior [BroadcastBehavior]
+                src/android/telephony/SubscriptionManager.java:7: lint: Field 'ACTION_DEFAULT_SUBSCRIPTION_CHANGED' is missing @BroadcastBehavior [BroadcastBehavior]
                 """,
             sourceFiles = arrayOf(
                 java(
@@ -105,4 +105,4 @@
             """
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt b/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt
index 185421c..91fb515 100644
--- a/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/ShowAnnotationTest.kt
@@ -10,7 +10,7 @@
     fun `Basic showAnnotation test`() {
         check(
             includeSystemApiAnnotations = true,
-            expectedIssues = "src/test/pkg/Foo.java:18: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
+            expectedIssues = "src/test/pkg/Foo.java:17: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
             sourceFiles = arrayOf(
                 java(
                     """
@@ -48,6 +48,7 @@
 
             extraArguments = arrayOf(
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             api = """
@@ -66,7 +67,7 @@
         check(
             includeSystemApiAnnotations = true,
             showUnannotated = true,
-            expectedIssues = "src/test/pkg/Foo.java:18: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
+            expectedIssues = "src/test/pkg/Foo.java:17: error: @SystemApi APIs must also be marked @hide: method test.pkg.Foo.method4() [UnhiddenSystemApi]",
             sourceFiles = arrayOf(
                 java(
                     """
@@ -104,6 +105,7 @@
 
             extraArguments = arrayOf(
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             api = """
@@ -163,6 +165,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.TestApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             api = """
@@ -242,11 +245,12 @@
             ),
             // Empty API: showUnannotated=false
             api = """
-            """.trimIndent(),
+                """.trimIndent(),
             includeSystemApiAnnotations = true,
             extraArguments = arrayOf(
                 ARG_SHOW_ANNOTATION, "android.annotation.TestApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             )
         )
     }
@@ -293,6 +297,7 @@
             extraArguments = arrayOf(
                 ARG_SHOW_SINGLE_ANNOTATION, "android.annotation.SystemApi",
                 ARG_HIDE_PACKAGE, "android.annotation",
+                ARG_HIDE_PACKAGE, "android.support.annotation"
             ),
 
             api = """
@@ -349,9 +354,9 @@
             ),
             showAnnotations = arrayOf("android.annotation.SystemApi"),
             expectedIssues = """
-                src/test/pkg/Class1.java:8: error: Attempting to unhide method test.pkg.Class1.method1(), but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
-                src/test/pkg/Class1.java:12: error: Attempting to unhide class test.pkg.Class1.InnerClass1, but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
-                src/test/pkg/Class2.java:11: error: Attempting to unhide method test.pkg.Class2.InnerClass2.method2(), but surrounding class test.pkg.Class2.InnerClass2 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
+                src/test/pkg/Class1.java:6: error: Attempting to unhide method test.pkg.Class1.method1(), but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
+                src/test/pkg/Class1.java:10: error: Attempting to unhide class test.pkg.Class1.InnerClass1, but surrounding class test.pkg.Class1 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
+                src/test/pkg/Class2.java:9: error: Attempting to unhide method test.pkg.Class2.InnerClass2.method2(), but surrounding class test.pkg.Class2.InnerClass2 is hidden and should also be annotated with @android.annotation.SystemApi [ShowingMemberInHiddenClass]
                 """
         )
     }
@@ -359,7 +364,6 @@
     @Test
     fun `showAnnotation with parameters`() {
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -401,7 +405,7 @@
                   public class Foo {
                     ctor public Foo();
                     method public void method1();
-                    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void method2();
+                    method public void method2();
                     method public void method4();
                   }
                 }
@@ -614,8 +618,7 @@
                     }
                  */
                 base64gzip(
-                    "test.jar",
-                    "" +
+                    "test.jar", "" +
                         "H4sICDVE/F0AA3Rlc3QuamFyAAvwZmYRYeDg4GB4kDrFnwEJcDKwMPi6hjjq" +
                         "evq56f87xcDAzBDgzc4BkmKCKgnAqVkEiOGafR39PN1cg0P0fN0++5457eOt" +
                         "q3eR11tX69yZ85uDDK4YP3hapOflq+Ppe7F0FQtnxAvJI9JREq+WPX++/PmS" +
@@ -689,7 +692,6 @@
         // and if a client refers to Class2.FIELD, that resolves to Class*1*.FIELD.
         // - Class3 is (very naturally) hidden even though the super class is visible.
         check(
-            format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -745,7 +747,7 @@
                   public class Class1 {
                     ctor public Class1();
                     method public void member();
-                    field public static final String FIELD = "Class1.FIELD";
+                    field public static final java.lang.String FIELD = "Class1.FIELD";
                   }
                   public class Class2 extends test.pkg.Class1 {
                     ctor public Class2();
diff --git a/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt b/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt
index 246d80f..00e57da 100644
--- a/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt
+++ b/src/test/java/com/android/tools/metalava/ShowForStubPurposesAnnotationTest.kt
@@ -441,8 +441,7 @@
             hideAnnotations = arrayOf(HIDE_ANNOTATION),
             showAnnotations = arrayOf(SYSTEM_API),
             sourceFiles = arrayOf(
-                java(
-                    """
+                java("""
                     package test.pkg;
 
                     @test.annotation.Hide
@@ -453,8 +452,7 @@
                     }
                     """
                 ),
-                java(
-                    """
+                java("""
                     package test.pkg;
 
                     @test.annotation.Hide
@@ -660,9 +658,7 @@
 
             // The methods are missing nullability anotations, the lint shouldn't report for
             // the SystemApi one.
-            sourceFiles = arrayOf(
-                java(
-                    """
+            sourceFiles = arrayOf(java("""
                 package test.pkg;
 
                 @test.annotation.Hide
@@ -676,9 +672,7 @@
                     public Object method2() {
                     }
                 }
-            """
-                )
-            ),
+            """)),
             api = """
                 // Signature format: 2.0
                 package test.pkg {
@@ -690,7 +684,7 @@
             apiLint = "",
             expectedFail = DefaultLintErrorMessage,
             expectedIssues = """
-                src/test/pkg/ModuleClassExtendingPublic.java:11: error: Missing nullability on method `method2` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
+                src/test/pkg/ModuleClassExtendingPublic.java:9: error: Missing nullability on method `method2` return [MissingNullability] [See https://s.android.com/api-guidelines#annotations]
                 """
         )
     }
diff --git a/src/test/java/com/android/tools/metalava/SymlinkTest.kt b/src/test/java/com/android/tools/metalava/SymlinkTest.kt
index e155e62..16187ff 100644
--- a/src/test/java/com/android/tools/metalava/SymlinkTest.kt
+++ b/src/test/java/com/android/tools/metalava/SymlinkTest.kt
@@ -62,8 +62,7 @@
                             @Nullable public Double method2(@NonNull Double factor1, @NonNull Double factor2) { }
                             @Nullable public Double method3(@NonNull Double factor1, @NonNull Double factor2) { }
                         }
-                        """
-                    )
+                        """)
                     File(dir, "src/test/pkg/sub1/package.html").writeText(
                         """
                         <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
@@ -76,8 +75,7 @@
                         Another line.<br>
                         </BODY>
                         </html>
-                        """
-                    )
+                        """)
                 },
                 // Empty source path: don't pick up random directory stuff
                 extraArguments = arrayOf(
diff --git a/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt b/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt
index 16f70a9..425b061 100644
--- a/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt
+++ b/src/test/java/com/android/tools/metalava/SystemServiceCheckTest.kt
@@ -23,6 +23,7 @@
     fun `SystemService OK, loaded from signature file`() {
         check(
             expectedIssues = "", // OK
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -59,6 +60,7 @@
     fun `SystemService OK, loaded from source`() {
         check(
             expectedIssues = "", // OK
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -95,6 +97,7 @@
     fun `Check SystemService -- no permission annotation`() {
         check(
             expectedIssues = "src/test/pkg/MyTest1.java:4: lint: Method 'myMethod2' must be protected with a system permission. [RequiresPermission]",
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -119,6 +122,7 @@
     fun `Check SystemService -- can miss a permission with anyOf`() {
         check(
             expectedIssues = "",
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -152,9 +156,10 @@
     fun `Check SystemService such that at least one permission must be defined with anyOf`() {
         check(
             expectedIssues = """
-                src/test/pkg/MyTest2.java:6: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:6: lint: Method 'myMethod1' must be protected with a system permission. [RequiresPermission]
+                src/test/pkg/MyTest2.java:5: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:5: lint: Method 'myMethod1' must be protected with a system permission. [RequiresPermission]
                 """,
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -181,7 +186,8 @@
     @Test
     fun `Check SystemService -- missing one permission with allOf`() {
         check(
-            expectedIssues = "src/test/pkg/MyTest2.java:6: lint: Permission 'foo.bar.PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]",
+            expectedIssues = "src/test/pkg/MyTest2.java:5: lint: Permission 'foo.bar.PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]",
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -214,9 +220,10 @@
     @Test
     fun `Check SystemService -- must be system permission, not normal`() {
         check(
-            expectedIssues = "src/test/pkg/MyTest2.java:7: lint: Method 'test' must be protected with a system " +
+            expectedIssues = "src/test/pkg/MyTest2.java:6: lint: Method 'test' must be protected with a system " +
                 "permission; it currently allows non-system callers holding [foo.bar.PERMISSION1, " +
                 "foo.bar.PERMISSION2] [RequiresPermission]",
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -255,10 +262,11 @@
     fun `Check SystemService -- missing manifest permissions`() {
         check(
             expectedIssues = """
-                src/test/pkg/MyTest2.java:6: lint: Permission 'Manifest.permission.MY_PERMISSION' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:6: lint: Permission 'Manifest.permission.MY_PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:6: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
+                src/test/pkg/MyTest2.java:5: lint: Permission 'Manifest.permission.MY_PERMISSION' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:5: lint: Permission 'Manifest.permission.MY_PERMISSION2' is not defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:5: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
                 """,
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -286,9 +294,10 @@
         check(
             expectedIssues = """
                 TESTROOT/manifest.xml: error: Failed to parse TESTROOT/manifest.xml: The markup in the document preceding the root element must be well-formed. [ParseError]
-                src/test/pkg/MyTest2.java:7: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
-                src/test/pkg/MyTest2.java:7: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: None of the permissions foo.bar.PERMISSION1, foo.bar.PERMISSION2 are defined by manifest TESTROOT/manifest.xml. [RequiresPermission]
+                src/test/pkg/MyTest2.java:6: lint: Method 'test' must be protected with a system permission. [RequiresPermission]
                 """,
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -316,6 +325,7 @@
     fun `Warning suppressed via annotation`() {
         check(
             expectedIssues = "", // OK (suppressed)
+            compatibilityMode = false,
             includeSystemApiAnnotations = true,
             sourceFiles = arrayOf(
                 java(
@@ -338,4 +348,4 @@
                 """
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/TestUtils.kt b/src/test/java/com/android/tools/metalava/TestUtils.kt
deleted file mode 100644
index 0424686..0000000
--- a/src/test/java/com/android/tools/metalava/TestUtils.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava
-
-import com.android.tools.lint.checks.infrastructure.TestFile
-import com.android.tools.lint.checks.infrastructure.TestFiles
-import org.intellij.lang.annotations.Language
-import java.io.File
-import kotlin.io.path.createTempDirectory
-
-fun java(to: String, @Language("JAVA") source: String): TestFile {
-    return TestFiles.java(to, source.trimIndent())
-}
-
-fun java(@Language("JAVA") source: String): TestFile {
-    return TestFiles.java(source.trimIndent())
-}
-
-fun kotlin(@Language("kotlin") source: String): TestFile {
-    return TestFiles.kotlin(source.trimIndent())
-}
-
-fun kotlin(to: String, @Language("kotlin") source: String): TestFile {
-    return TestFiles.kotlin(to, source.trimIndent())
-}
-
-/** Creates a temporary directory and cleans up afterwards */
-inline fun tempDirectory(action: (File) -> Unit) {
-    val tempDirectory = createTempDirectory().toFile()
-    try {
-        action(tempDirectory)
-    } finally {
-        tempDirectory.deleteRecursively()
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/UnhideApisTest.kt b/src/test/java/com/android/tools/metalava/UnhideApisTest.kt
index ad8ca8d..2d4410f 100644
--- a/src/test/java/com/android/tools/metalava/UnhideApisTest.kt
+++ b/src/test/java/com/android/tools/metalava/UnhideApisTest.kt
@@ -24,7 +24,6 @@
     @Test
     fun `Report hidden API access rather than opening up access`() {
         check(
-            format = FileFormat.V1,
             extraArguments = arrayOf(
                 ARG_HIDE,
                 "HiddenSuperclass",
@@ -93,7 +92,7 @@
                     method public <S extends test.pkg.Hidden1, T extends test.pkg.Hidden2> S get(T);
                     method public test.pkg.Hidden1 getHidden1();
                     method public test.pkg.Hidden2 getHidden2();
-                    method public void method(test.pkg.Hidden1, test.pkg.Hidden2);
+                    method public void method(test.pkg.Hidden1, test.pkg.Hidden2) throws test.pkg.Hidden3;
                     field public test.pkg.Hidden1 hidden1;
                     field public test.pkg.Hidden2 hidden2;
                   }
@@ -106,7 +105,6 @@
     fun `Do not warn about package private access when generating package private stubs`() {
         // Like above test, but with --package and therefore fewer warnings
         check(
-            format = FileFormat.V1,
             extraArguments = arrayOf(
                 ARG_PACKAGE,
                 ARG_HIDE,
@@ -172,7 +170,7 @@
                     method public <S extends test.pkg.Hidden1, T extends test.pkg.Hidden2> S get(T);
                     method public test.pkg.Hidden1 getHidden1();
                     method public test.pkg.Hidden2 getHidden2();
-                    method public void method(test.pkg.Hidden1, test.pkg.Hidden2);
+                    method public void method(test.pkg.Hidden1, test.pkg.Hidden2) throws test.pkg.Hidden3;
                     field public test.pkg.Hidden1 hidden1;
                     field public test.pkg.Hidden2 hidden2;
                   }
@@ -184,7 +182,6 @@
     @Test
     fun `Including private interfaces from types`() {
         check(
-            format = FileFormat.V1,
             extraArguments = arrayOf(ARG_ERROR, "ReferencesHidden"),
             sourceFiles = arrayOf(
                 java("""package test.pkg1; interface Interface1 { }"""),
@@ -235,17 +232,17 @@
                     """,
             api = """
                     package test.pkg1 {
-                      public abstract class Usage implements java.util.List<test.pkg1.Class1> {
+                      public abstract class Usage implements java.util.List {
                         ctor public Usage();
                         method public void arrayType(test.pkg1.Class9[]);
                         method public void ellipsisType(test.pkg1.Class8...);
                         method public <T extends test.pkg1.Class6> void mySort(java.util.List<test.pkg1.Class7>, T);
                         field public test.pkg1.Class3 myClass1;
                         field public java.util.List<? extends test.pkg1.Class4> myClass2;
-                        field public java.util.Map<java.lang.String,? extends test.pkg1.Class5> myClass3;
+                        field public java.util.Map<java.lang.String, ? extends test.pkg1.Class5> myClass3;
                       }
                     }
                 """
         )
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt b/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
index 813a832..9c4da1e 100644
--- a/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
+++ b/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
@@ -16,16 +16,17 @@
 
 package com.android.tools.metalava.apilevels
 
+import com.android.tools.lint.LintCliClient
+import com.android.tools.lint.checks.ApiLookup
 import com.android.tools.metalava.ARG_ANDROID_JAR_PATTERN
 import com.android.tools.metalava.ARG_CURRENT_CODENAME
 import com.android.tools.metalava.ARG_CURRENT_VERSION
-import com.android.tools.metalava.ARG_FIRST_VERSION
 import com.android.tools.metalava.ARG_GENERATE_API_LEVELS
 import com.android.tools.metalava.DriverTest
-import com.android.tools.metalava.getApiLookup
-import com.android.tools.metalava.java
+import com.android.utils.XmlUtils
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotNull
 import org.junit.Assert.assertTrue
 import org.junit.Test
 import java.io.File
@@ -66,7 +67,7 @@
                 ARG_CURRENT_CODENAME,
                 "Z",
                 ARG_CURRENT_VERSION,
-                "89" // not real api level of Z
+                "35" // not real api level of Z
             ),
             sourceFiles = arrayOf(
                 java(
@@ -84,7 +85,7 @@
         val xml = output.readText(UTF_8)
         assertTrue(xml.contains("<class name=\"android/Manifest\$permission\" since=\"1\">"))
         assertTrue(xml.contains("<field name=\"BIND_CARRIER_MESSAGING_SERVICE\" since=\"22\" deprecated=\"23\"/>"))
-        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"90\""))
+        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"36\""))
         assertFalse(xml.contains("<implements name=\"java/lang/annotation/Annotation\" removed=\""))
         assertFalse(xml.contains("<extends name=\"java/lang/Enum\" removed=\""))
         assertFalse(xml.contains("<method name=\"append(C)Ljava/lang/AbstractStringBuilder;\""))
@@ -92,171 +93,29 @@
         // Also make sure package private super classes are pruned
         assertFalse(xml.contains("<extends name=\"android/icu/util/CECalendar\""))
 
-        val apiLookup = getApiLookup(output, temporaryFolder.newFolder())
+        val document = XmlUtils.parseDocumentSilently(xml, false)
+        assertNotNull(document)
 
-        // Make sure we're really using the correct database, not the SDK one. (This placeholder
-        // class is provided as a source file above.)
-        assertEquals(90, apiLookup.getClassVersion("android.pkg.MyTest"))
+        // Make sure we can process it via ApiLookup as well
+        @Suppress("DEPRECATION") // still using older lint-api when building with soong
+        val client = object : LintCliClient() {
+            override fun findResource(relativePath: String): File? {
+                if (relativePath == ApiLookup.XML_FILE_PATH) {
+                    return output
+                }
+                return super.findResource(relativePath)
+            }
 
+            override fun getCacheDir(name: String?, create: Boolean): File? {
+                return temporaryFolder.newFolder()
+            }
+        }
+
+        val apiLookup = ApiLookup.get(client)
         apiLookup.getClassVersion("android.v")
         assertEquals(5, apiLookup.getFieldVersion("android.Manifest\$permission", "AUTHENTICATE_ACCOUNTS"))
 
         val methodVersion = apiLookup.getMethodVersion("android/icu/util/CopticCalendar", "computeTime", "()")
         assertEquals(24, methodVersion)
     }
-
-    @Test
-    fun `Extract System API`() {
-        // These are the wrong jar paths but this test doesn't actually care what the
-        // content of the jar files, just checking the logic of starting the database
-        // at some higher number than 1
-        var platformJars = File("prebuilts/sdk")
-        if (!platformJars.isDirectory) {
-            platformJars = File("../../prebuilts/sdk")
-            if (!platformJars.isDirectory) {
-                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
-                return
-            }
-        }
-
-        val output = File.createTempFile("api-info", "xml")
-        output.deleteOnExit()
-        val outputPath = output.path
-
-        check(
-            extraArguments = arrayOf(
-                ARG_GENERATE_API_LEVELS,
-                outputPath,
-                ARG_ANDROID_JAR_PATTERN,
-                "${platformJars.path}/%/public/android.jar",
-                ARG_FIRST_VERSION,
-                "21"
-            )
-        )
-
-        assertTrue(output.isFile)
-        val xml = output.readText(UTF_8)
-        assertTrue(xml.contains("<api version=\"2\" min=\"21\">"))
-        assertTrue(xml.contains("<class name=\"android/Manifest\" since=\"21\">"))
-        assertTrue(xml.contains("<field name=\"showWhenLocked\" since=\"27\"/>"))
-
-        val apiLookup = getApiLookup(output)
-        apiLookup.getClassVersion("android.v")
-        // This field was added in API level 5, but when we're starting the count higher
-        // (as in the system API), the first introduced API level is the one we use
-        assertEquals(21, apiLookup.getFieldVersion("android.Manifest\$permission", "AUTHENTICATE_ACCOUNTS"))
-
-        val methodVersion = apiLookup.getMethodVersion("android/icu/util/CopticCalendar", "computeTime", "()")
-        assertEquals(24, methodVersion)
-    }
-
-    @Test
-    fun `Correct API Level for release`() {
-        var oldSdkJars = File("prebuilts/tools/common/api-versions")
-        if (!oldSdkJars.isDirectory) {
-            oldSdkJars = File("../../prebuilts/tools/common/api-versions")
-            if (!oldSdkJars.isDirectory) {
-                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found - is \$PWD set to an Android source tree?")
-                return
-            }
-        }
-
-        var platformJars = File("prebuilts/sdk")
-        if (!platformJars.isDirectory) {
-            platformJars = File("../../prebuilts/sdk")
-            if (!platformJars.isDirectory) {
-                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
-                return
-            }
-        }
-        val output = File.createTempFile("api-info", "xml")
-        output.deleteOnExit()
-        val outputPath = output.path
-
-        check(
-            extraArguments = arrayOf(
-                ARG_GENERATE_API_LEVELS,
-                outputPath,
-                ARG_ANDROID_JAR_PATTERN,
-                "${oldSdkJars.path}/android-%/android.jar",
-                ARG_ANDROID_JAR_PATTERN,
-                "${platformJars.path}/%/public/android.jar",
-                ARG_CURRENT_CODENAME,
-                "REL",
-                ARG_CURRENT_VERSION,
-                "89" // not real api level
-            ),
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package android.pkg;
-                        public class MyTest {
-                        }
-                        """
-                )
-            )
-        )
-
-        assertTrue(output.isFile)
-        // Anything with a REL codename is in the current API level
-        val xml = output.readText(UTF_8)
-        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"89\""))
-        val apiLookup = getApiLookup(output, temporaryFolder.newFolder())
-        assertEquals(89, apiLookup.getClassVersion("android.pkg.MyTest"))
-    }
-
-    @Test
-    fun `Correct API Level for non-release`() {
-        var oldSdkJars = File("prebuilts/tools/common/api-versions")
-        if (!oldSdkJars.isDirectory) {
-            oldSdkJars = File("../../prebuilts/tools/common/api-versions")
-            if (!oldSdkJars.isDirectory) {
-                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found - is \$PWD set to an Android source tree?")
-                return
-            }
-        }
-
-        var platformJars = File("prebuilts/sdk")
-        if (!platformJars.isDirectory) {
-            platformJars = File("../../prebuilts/sdk")
-            if (!platformJars.isDirectory) {
-                println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
-                return
-            }
-        }
-        val output = File.createTempFile("api-info", "xml")
-        output.deleteOnExit()
-        val outputPath = output.path
-
-        check(
-            extraArguments = arrayOf(
-                ARG_GENERATE_API_LEVELS,
-                outputPath,
-                ARG_ANDROID_JAR_PATTERN,
-                "${oldSdkJars.path}/android-%/android.jar",
-                ARG_ANDROID_JAR_PATTERN,
-                "${platformJars.path}/%/public/android.jar",
-                ARG_CURRENT_CODENAME,
-                "ZZZ", // not just Z, but very ZZZ
-                ARG_CURRENT_VERSION,
-                "89" // not real api level
-            ),
-            sourceFiles = arrayOf(
-                java(
-                    """
-                        package android.pkg;
-                        public class MyTest {
-                        }
-                        """
-                )
-            )
-        )
-
-        assertTrue(output.isFile)
-        // Metalava should understand that a codename means "current api + 1"
-        val xml = output.readText(UTF_8)
-        assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"90\""))
-        val apiLookup = getApiLookup(output, temporaryFolder.newFolder())
-        assertEquals(90, apiLookup.getClassVersion("android.pkg.MyTest"))
-    }
 }
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassFieldsTest.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassFieldsTest.kt
deleted file mode 100644
index eba3ab5..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassFieldsTest.kt
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import org.junit.Test
-
-class BinaryCompatibilityClassFieldsTest : DriverTest() {
-
-    @Test
-    fun `Change type of API field (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has changed type from java.lang.String to int [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public String bar;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change value of API field, compile-time constant (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has changed value from 8 to 7 [ChangedValue]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public static final int bar = 7;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public static final int bar = 8;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Decrease access from protected to default or private, or public to protected, default, or private (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar changed visibility from protected to private [ChangedScope]
-                TESTROOT/load-api.txt:4: error: Field test.pkg.Foo.baz changed visibility from public to protected [ChangedScope]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field private static final int bar = 8;
-                    field protected static final int baz = 8;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field protected static final int bar = 8;
-                    field public static final int baz = 8;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Increase access, eg from protected to public (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field protected static final int bar = 8;
-                    field public static final int baz = 8;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field private static final int bar = 8;
-                    field protected static final int baz = 8;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change final to non-final, non-static (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public final int bar;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change final to non-final, static with compile-time constant value (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has removed 'final' qualifier [RemovedFinal]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public static int bar = 0;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public static final int bar = 0;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-final to final (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has added 'final' qualifier [AddedFinal]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public final int bar;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change static to non-static (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has changed 'static' qualifier [ChangedStatic]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar = 0;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public static int bar = 0;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-static to static (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has changed 'static' qualifier [ChangedStatic]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public static int bar = 0;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar = 0;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change transient to non-transient (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar = 0;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public transient int bar = 0;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change non-transient to transient (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {
-                    field public transient int bar = 0;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {
-                    field public int bar = 0;
-                  }
-                }
-            """
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassMethodsAndConstructors.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassMethodsAndConstructors.kt
deleted file mode 100644
index 758d5f0..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassMethodsAndConstructors.kt
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import org.junit.Test
-
-class BinaryCompatibilityClassMethodsAndConstructors : DriverTest() {
-    @Test
-    fun `Change method name`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar(Int) [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void baz(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    // Note: This is reversed from the eclipse wiki because of kotlin named parameters
-    fun `Change formal parameter name (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Attempted to change parameter name from bread to toast in method test.pkg.Foo.bar [ParameterNameChange]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int toast);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int bread);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Add or delete formal parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar(Int) [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar();
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change type of a formal parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar(Int) [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Float);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change result type (including void) (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed return type from void to Int [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public Int bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Add checked exceptions thrown (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar added thrown exception java.lang.Throwable [ChangedThrows]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int) throws java.lang.Throwable;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Delete checked exceptions thrown (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar no longer throws exception java.lang.Throwable [ChangedThrows]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int) throws java.lang.Throwable;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Re-order list of exceptions thrown (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int) throws java.lang.Exception, java.lang.Throwable;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int) throws java.lang.Throwable, java.lang.Exception;
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    /*
-    Decrease access; that is, from protected access to default or private access,
-    or from public access to protected, default, or private access
-     */
-    fun `Decrease access(Incompatible)`() {
-        check(
-            expectedIssues = """
-               TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar changed visibility from public to protected [ChangedScope]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method protected void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Increase access, that is, from protected access to public access (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method protected void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change abstract to non-abstract (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  abstract class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  abstract class Foo {
-                    method abstract public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-abstract to abstract (Incompatible)`() {
-        check(
-            expectedIssues = """
-               TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'abstract' qualifier [ChangedAbstract]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  abstract class Foo {
-                    method abstract public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  abstract class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change final to non-final (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method final public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change non-final to final (method not re-implementable) (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  sealed class Foo {
-                    method final public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  sealed class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-final to final (method re-implementable) (Incompatible)`() {
-        check(
-            expectedIssues = """
-               TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has added 'final' qualifier [AddedFinal]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method final public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change static to non-static (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'static' qualifier [ChangedStatic]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method static public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-static to static (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'static' qualifier [ChangedStatic]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method static public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change native to non-native (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method native public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-native to native (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method native public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change synchronized to non-synchronized (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method synchronized public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Change non-synchronized to synchronized (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method synchronized public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-
-    /*
-    TODO: Fix b/217229076 and uncomment this block of tests
-
-    @Test
-    fun `Add type parameter (existing type parameters) (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T, K> void bar();
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar();
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Add type parameter (no existing type parameters) (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Delete type parameter (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Re-order type parameters (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T, K> void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <K, T> void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Rename type parameter (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <K> void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    @Test
-    fun `Add, delete, or change type bounds of parameter (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T extends Foo> void bar(Int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(Int);
-                  }
-                }
-            """
-        )
-    }
-    */
-
-    @Test
-    fun `Change last parameter from array type T(array) to variable arity T(elipse) (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    class Foo {
-                        method public <T> void bar(T...);
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    class Foo {
-                        method public <T> void bar(T[]);
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change last parameter from variable arity T(elipse) to array type T(array) (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Changing from varargs to array is an incompatible change: parameter arg1 in test.pkg.Foo.bar(T[] arg1) [VarargRemoval]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    class Foo {
-                        method public <T> void bar(T[]);
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    class Foo {
-                        method public <T> void bar(T...);
-                    }
-                }
-            """
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassesTest.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassesTest.kt
deleted file mode 100644
index 1765f17..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityClassesTest.kt
+++ /dev/null
@@ -1,742 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import org.junit.Ignore
-import org.junit.Test
-
-/**
- * Tests for binary compatibility of modifications to classes derived from
- * https://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_Classes
- */
-class BinaryCompatibilityClassesTest : DriverTest() {
-    @Test
-    fun `Add API method, if method need not be reimplemented by client (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public abstract class Foo {
-                        ctor public Foo();
-                        method public final void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public abstract class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API method, if method must be reimplemented by client (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:4: error: Added method test.pkg.Foo.bar() [AddedAbstractMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public abstract class Foo {
-                        ctor public Foo();
-                        method public abstract void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public abstract class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API method (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        method public void bar();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Move API method up type hierarchy, if method in supertype need not be reimplemented by client (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Upper {
-                        method public void foo();
-                    }
-                    public class Lower extends test.pkg.Upper {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Upper {
-                    }
-                    public class Lower extends test.pkg.Upper {
-                        method public void foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Move API method up type hierarchy, if method in supertype must be reimplemented by client (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Added method test.pkg.Upper.foo() [AddedAbstractMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public abstract class Upper {
-                        method public abstract void foo();
-                    }
-                    public abstract class Lower extends test.pkg.Upper {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public abstract class Upper {
-                    }
-                    public abstract class Lower extends test.pkg.Upper {
-                        method public abstract void foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Move API method down type hierarchy (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Upper.foo() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Upper {
-                    }
-                    public class Lower extends test.pkg.Upper {
-                        method public void foo();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Upper {
-                        method public void foo();
-                    }
-                    public class Lower extends test.pkg.Upper {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API constructor, if there are other constructors (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo(int);
-                        ctor public Foo(int, int);
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo(int);
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API constructor, if this is the only constructor (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed constructor test.pkg.Foo() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo(int);
-                    }
-                }
-            """,
-            // A default constructor would be tracked as a zero-arg constructor in the signature
-            // file, as below. (Indistinguishable from a hand-coded zero-arg constructor)
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API constructor (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed constructor test.pkg.Foo() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API field (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public final class Foo {
-                        field public int bar;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public final class Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API field (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed field test.pkg.Foo.bar [RemovedField]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        field public int bar;
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Expand superinterface set (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public class Foo implements test.pkg.One, test.pkg.Two {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public class Foo implements test.pkg.One {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Contract superinterface set (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:6: error: Class test.pkg.Foo no longer implements test.pkg.Two [RemovedInterface]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public class Foo implements test.pkg.One {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public class Foo implements test.pkg.One, test.pkg.Two {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Expand superclass set (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Upper {
-                    }
-                    public class Middle extends test.pkg.Upper {
-                    }
-                    public class Lower extends test.pkg.Middle {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Upper {
-                    }
-                    public class Lower extends test.pkg.Upper {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Contract superclass set (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:6: error: Class test.pkg.Foo superclass changed from test.pkg.Baz to test.pkg.Bar [ChangedSuperclass]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Bar {
-                    }
-                    public class Baz extends test.pkg.Bar {
-                    }
-                    public class Foo extends test.pkg.Bar {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Bar {
-                    }
-                    public class Baz extends test.pkg.Bar {
-                    }
-                    public class Foo extends test.pkg.Baz {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API type member (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Outer {
-                    }
-                    public class Outer.Inner {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Outer {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API type member (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:4: error: Removed class test.pkg.Outer.Inner [RemovedClass]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Outer {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Outer {
-                    }
-                    public class Outer.Inner {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change abstract to non-abstract (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public abstract class Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change non-abstract to abstract (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed 'abstract' qualifier [ChangedAbstract]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public abstract class Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change final to non-final (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public final class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change non-final to final (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo added 'final' qualifier [AddedFinal]
-                TESTROOT/load-api.txt:3: error: Constructor test.pkg.Foo has added 'final' qualifier [AddedFinal]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public final class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                        ctor public Foo();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add type parameter, if class has no type parameters (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Foo<A> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add type parameter, if class has type parameters (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed number of type parameters from 1 to 2 [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo<A, B> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo<A> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete type parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Bar changed number of type parameters from 1 to 0 [ChangedType]
-                TESTROOT/load-api.txt:4: error: Class test.pkg.Foo changed number of type parameters from 2 to 1 [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Bar {
-                    }
-                    public class Foo<A> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Bar<A> {
-                    }
-                    public class Foo<A, B> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/217746739")
-    @Test
-    fun `Reorder type parameters (Incompatible)`() {
-        check(
-            expectedIssues = """
-                (expected issue for class Foo)
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Foo<B, A> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo<A, B> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Rename type parameter (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public class Foo<B> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Foo<A> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/217747331")
-    @Test
-    fun `Add, delete, or change type bounds of type parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                (expected issue for class Add)
-                (expected issue for class Change)
-                (expected issue for class Delete)
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public class Add<T extends java.util.List> {
-                    }
-                    public class Change<T extends java.util.List> {
-                    }
-                    public class Delete<T> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public class Add<T> {
-                    }
-                    public class Change<T extends java.util.Map> {
-                    }
-                    public class Delete<T extends java.util.List> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Rename enum constant (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed enum constant test.pkg.Foo.OLD [RemovedField]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo NEW;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo OLD;
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add enum constant (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo ONE;
-                        enum_constant public static final test.pkg.Foo TWO;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo ONE;
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete enum constant (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:4: error: Removed enum constant test.pkg.Foo.TWO [RemovedField]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo ONE;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo ONE;
-                        enum_constant public static final test.pkg.Foo TWO;
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Re-order enum constants (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo TWO;
-                        enum_constant public static final test.pkg.Foo ONE;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public enum Foo {
-                        enum_constant public static final test.pkg.Foo ONE;
-                        enum_constant public static final test.pkg.Foo TWO;
-                    }
-                }
-            """
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfaceFieldsTest.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfaceFieldsTest.kt
deleted file mode 100644
index 036ce8c..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfaceFieldsTest.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import org.junit.Test
-
-class BinaryCompatibilityInterfaceFieldsTest : DriverTest() {
-
-    @Test
-    fun `Change type of API field (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has changed type from int to java.lang.String [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public interface Foo {
-                    field public final String bar;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                public interface Foo {
-                  field public final int bar;
-                }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change value of API field (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Field test.pkg.Foo.bar has changed value from 8 to 7 [ChangedValue]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public interface Foo {
-                    field public static final int bar = 7;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                public interface Foo {
-                  field public static final int bar = 8;
-                }
-                }
-            """
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfaceMethodsTest.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfaceMethodsTest.kt
deleted file mode 100644
index 04e74f4..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfaceMethodsTest.kt
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import org.junit.Test
-
-class BinaryCompatibilityInterfaceMethodsTest : DriverTest() {
-
-    @Test
-    // Note: This is reversed from the eclipse wiki because of kotlin named parameters
-    fun `Change formal parameter name (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Attempted to change parameter name from bread to toast in method test.pkg.Foo.bar [ParameterNameChange]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int toast);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int bread);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change method name (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar(int) [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void baz(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add or delete formal parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar(int) [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar();
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change type of a formal parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar(int) [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(Float);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change result type (including void) (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed return type from void to int [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public int bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add checked exceptions thrown (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar added thrown exception java.lang.Throwable [ChangedThrows]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int) throws java.lang.Throwable;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete checked exceptions thrown (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar no longer throws exception java.lang.Throwable [ChangedThrows]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int) throws java.lang.Throwable;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Re-order list of exceptions thrown (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int) throws java.lang.Exception, java.lang.Throwable;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int) throws java.lang.Throwable, java.lang.Exception;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change static to non-static (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'static' qualifier [ChangedStatic]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method static public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change non-static to static (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'static' qualifier [ChangedStatic]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method static public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change default to abstract (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed 'default' qualifier [ChangedDefault]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method abstract public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method default public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change abstract to default (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method default public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method abstract public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    /*
-    TODO: Fix b/217229076 and uncomment this block of tests
-
-    @Test
-    fun `Add type parameter, no existing type parameters (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add type parameter, existing type parameters (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  interface Foo {
-                    method public <T, K> void bar();
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  interface Foo {
-                    method public <T> void bar();
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete type parameter (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Re-order type parameters (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T, K> void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <K, T> void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Rename type parameter (Compatible)`() {
-         check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <K> void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add, delete, or change type bounds of type parameter (Incompatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  class Foo {
-                    method public <T extends Foo> void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  class Foo {
-                    method public <T> void bar(int);
-                  }
-                }
-            """
-        )
-    }
-     */
-
-    @Test
-    fun `Change last parameter from array type T(array) to variable arity T(elipse) (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    interface Foo {
-                        method public <T> void bar(T...);
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    interface Foo {
-                        method public <T> void bar(T[]);
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Change last parameter from variable arity T(elipse) to array type T(array) (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Changing from varargs to array is an incompatible change: parameter arg1 in test.pkg.Foo.bar(T[] arg1) [VarargRemoval]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    interface Foo {
-                        method public <T> void bar(T[]);
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    interface Foo {
-                        method public <T> void bar(T...);
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add default clause to annotation type element (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public @interface Foo {
-                    method public void bar(int) default 0;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public @interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    /**
-     * Note: While this is technically binary compatible, it's bad API design to allow.
-     * Thus, we continue to flag this as an error.
-     */
-    fun `Change default clause on annotation type element (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed value from 0 to 1 [ChangedValue]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public @interface Foo {
-                    method public void bar(int) default 1;
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public @interface Foo {
-                    method public void bar(int) default 0;
-                  }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete default clause from annotation type element (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Method test.pkg.Foo.bar has changed value from 0 to nothing [ChangedValue]
-            """,
-            signatureSource = """
-                package test.pkg {
-                  public @interface Foo {
-                    method public void bar(int);
-                  }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public @interface Foo {
-                    method public void bar(int) default 0;
-                  }
-                }
-            """
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfacesTest.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfacesTest.kt
deleted file mode 100644
index 1e416a6..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityInterfacesTest.kt
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import org.junit.Ignore
-import org.junit.Test
-
-/**
- * Tests for binary compatibility of modifications to interfaces derived from
- * https://wiki.eclipse.org/Evolving_Java-based_APIs_2#Evolving_API_Interfaces
- */
-class BinaryCompatibilityInterfacesTest : DriverTest() {
-    @Ignore("b/220960090")
-    @Test
-    fun `Add abstract method, if method need not be implemented by client (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public sealed interface Foo {
-                        method public abstract void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public sealed interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add abstract method, if method must be implemented by client (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Added method test.pkg.Foo.bar() [AddedAbstractMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                        method public abstract void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/220960090")
-    @Test
-    fun `Add default method, if interface not implementable by clients (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public sealed interface Foo {
-                        method public default void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public sealed interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/222739015")
-    @Test
-    fun `Add default method, if interface implementable by clients (Incompatible)`() {
-        check(
-            expectedIssues = """
-                (expected issue for interface Foo)
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                        method public default void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add static method (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                        method public static void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API method (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar() [RemovedMethod]
-                TESTROOT/released-api.txt:5: error: Removed method test.pkg.Foo.bax() [RemovedMethod]
-                TESTROOT/released-api.txt:4: error: Removed method test.pkg.Foo.baz() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                        method public abstract void bar();
-                        method public default void baz();
-                        method public static void bax();
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/220960090")
-    @Test
-    fun `Move API method up type hierarchy, if method in supertype need not be implemented by client (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public sealed interface Upper {
-                        method public abstract void bar();
-                    }
-                    public sealed interface Lower extends test.pkg.Upper {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public sealed interface Upper {
-                    }
-                    public sealed interface Lower extends test.pkg.Upper {
-                        method public abstract void bar();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Move API method up the type hierarchy, if method in supertype must be implemented by client (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Added method test.pkg.Upper.bar() [AddedAbstractMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Upper {
-                        method public abstract void bar();
-                    }
-                    public interface Lower extends test.pkg.Upper {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Upper {
-                    }
-                    public interface Lower extends test.pkg.Upper {
-                        method public abstract void bar();
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Move method down type hierarchy (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Upper.bar() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Upper {
-                    }
-                    public interface Lower extends test.pkg.Upper {
-                        method public abstract void bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Upper {
-                        method public abstract void bar();
-                    }
-                    public interface Lower extends test.pkg.Upper {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API field (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                        field public static final int BAR;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API field (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed field test.pkg.Foo.BAR [RemovedField]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                        field public static final int BAR;
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Expand superinterfaces set (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public interface Foo extends test.pkg.One test.pkg.Two {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public interface Foo extends test.pkg.One {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Contract superinterface set (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:6: error: Class test.pkg.Foo no longer implements test.pkg.Two [RemovedInterface]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public interface Foo extends test.pkg.One {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface One {
-                    }
-                    public interface Two {
-                    }
-                    public interface Foo extends test.pkg.One test.pkg.Two {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add API type member (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public interface Outer {
-                    }
-                    public interface Outer.Inner {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Outer {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete API type member (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:4: error: Removed class test.pkg.Outer.Inner [RemovedInterface]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Outer {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Outer {
-                    }
-                    public interface Outer.Inner {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add type parameter, if interface has no type parameters (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo<T> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add type parameter, if interface has type parameters (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed number of type parameters from 1 to 2 [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo<A, B> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo<A> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete type parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed number of type parameters from 1 to 0 [ChangedType]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo<T> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/217746739")
-    @Test
-    fun `Re-order type parameters (Incompatible)`() {
-        check(
-            expectedIssues = """
-                (expected issue for interface Foo)
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo<B, A> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo<A, B> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/217746739")
-    @Test
-    fun `Rename type parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                (expected issue for interface Foo)
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo<B> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo<A> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Ignore("b/217747331")
-    @Test
-    fun `Add, delete, or change type bounds of type parameter (Incompatible)`() {
-        check(
-            expectedIssues = """
-                (expected issue for interface Add)
-                (expected issue for interface Change)
-                (expected issue for interface Delete)
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Add<T extends java.util.List> {
-                    }
-                    public interface Change<T extends java.util.List> {
-                    }
-                    public interface Delete<T> {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Add<T> {
-                    }
-                    public interface Change<T extends java.util.Map> {
-                    }
-                    public interface Delete<T extends java.util.List> {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add element to annotation type, if element has a default value (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                    public @interface Foo {
-                        method public abstract int bar() default 0;
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public @interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Add element to annotation type, if element has no default value (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:3: error: Added method test.pkg.Foo.bar() [AddedAbstractMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                        method public abstract int bar();
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """
-        )
-    }
-
-    @Test
-    fun `Delete element from annotation type (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed method test.pkg.Foo.bar() [RemovedMethod]
-                TESTROOT/released-api.txt:4: error: Removed method test.pkg.Foo.baz() [RemovedMethod]
-            """,
-            signatureSource = """
-                package test.pkg {
-                    public interface Foo {
-                    }
-                }
-            """,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                    public interface Foo {
-                        method public abstract int bar();
-                        method public abstract int baz() default 0;
-                    }
-                }
-            """
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityPackagesTest.kt b/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityPackagesTest.kt
deleted file mode 100644
index e688397..0000000
--- a/src/test/java/com/android/tools/metalava/binarycompatibility/BinaryCompatibilityPackagesTest.kt
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.binarycompatibility
-
-import com.android.tools.metalava.DriverTest
-import com.android.tools.metalava.FileFormat
-import com.android.tools.metalava.kotlin
-import org.junit.Test
-
-class BinaryCompatibilityPackagesTest : DriverTest() {
-    @Test
-    fun `Add API Package (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {}
-                }
-                package test.pkg.added {
-                  public class Foo {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                }
-            """.trimIndent()
-        )
-    }
-    @Test
-    fun `Delete API Package (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:4: error: Removed package test.pkg.removed [RemovedPackage]
-            """.trimIndent(),
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                }
-                package test.pkg.removed {
-                  public class Foo {}
-                }
-            """.trimIndent()
-        )
-    }
-    @Test
-    fun `Add API Type to API Package (Compatible)`() {
-        check(
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {}
-                  public class Bar {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                }
-            """.trimIndent()
-        )
-    }
-    @Test
-    fun `Delete API Type from API Package (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/released-api.txt:3: error: Removed class test.pkg.Bar [RemovedClass]
-            """.trimIndent(),
-            signatureSource = """
-                package test.pkg {
-                  public class Foo {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                  public class Bar {}
-                }
-            """.trimIndent()
-        )
-    }
-    @Test
-    fun `Add non-public (non-API) type to API package (Compatible)`() {
-        check(
-            sourceFiles = arrayOf(
-                kotlin(
-                    """
-                        package test.pkg
-                        private class Bar
-                        class Foo
-                    """.trimIndent()
-                )
-            ),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                }
-            """.trimIndent()
-        )
-    }
-    @Test
-    fun `Change public type in API package to make non-public (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:2: error: Class test.pkg.Foo changed visibility from public to private [ChangedScope]
-            """.trimIndent(),
-            signatureSource = """
-                package test.pkg {
-                  private class Foo {}
-                  public class Bar {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class Foo {}
-                  public class Bar {}
-                }
-            """.trimIndent()
-        )
-    }
-    @Test
-    fun `Change kind of API type (class, interface, enum, or annotation type) (Incompatible)`() {
-        check(
-            expectedIssues = """
-                TESTROOT/load-api.txt:11: error: Class test.pkg.AnnotationToClass changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:13: error: Class test.pkg.AnnotationToEnum changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:12: error: Class test.pkg.AnnotationToInterface changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:4: error: Class test.pkg.ClassToAnnotation changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:2: error: Class test.pkg.ClassToEnum changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:3: error: Class test.pkg.ClassToInterface changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:7: error: Class test.pkg.EnumToAnnotation changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:5: error: Class test.pkg.EnumToClass changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:6: error: Class test.pkg.EnumToInterface changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:10: error: Class test.pkg.InterfaceToAnnotation changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:8: error: Class test.pkg.InterfaceToClass changed class/interface declaration [ChangedClass]
-                TESTROOT/load-api.txt:9: error: Class test.pkg.InterfaceToEnum changed class/interface declaration [ChangedClass]
-            """.trimIndent(),
-            signatureSource = """
-                package test.pkg {
-                  public enum ClassToEnum {}
-                  public interface ClassToInterface {}
-                  public @interface ClassToAnnotation {}
-                  public class EnumToClass {}
-                  public interface EnumToInterface {}
-                  public @interface EnumToAnnotation {}
-                  public class InterfaceToClass {}
-                  public enum InterfaceToEnum {}
-                  public @interface InterfaceToAnnotation {}
-                  public class  AnnotationToClass {}
-                  public interface AnnotationToInterface {}
-                  public enum AnnotationToEnum {}
-                }
-            """.trimIndent(),
-            format = FileFormat.V4,
-            checkCompatibilityApiReleased = """
-                package test.pkg {
-                  public class ClassToEnum {}
-                  public class ClassToInterface {}
-                  public class ClassToAnnotation {}
-                  public enum EnumToClass {}
-                  public enum EnumToInterface {}
-                  public enum EnumToAnnotation {}
-                  public interface InterfaceToClass {}
-                  public interface InterfaceToEnum {}
-                  public interface InterfaceToAnnotation {}
-                  public @interface  AnnotationToClass {}
-                  public @interface AnnotationToInterface {}
-                  public @interface AnnotationToEnum {}
-                }
-            """.trimIndent()
-        )
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/AnnotationTargetTest.kt b/src/test/java/com/android/tools/metalava/model/AnnotationTargetTest.kt
index ffdbded..bab3f48 100644
--- a/src/test/java/com/android/tools/metalava/model/AnnotationTargetTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/AnnotationTargetTest.kt
@@ -29,15 +29,13 @@
             .also { assertTrue(it.isNotEmpty()) }
             .forEach { (name, value) ->
                 val targets = value as Collection<*>
-                assertTrue(
-                    "$name: should contain $INTERNAL but doesn't: $targets",
-                    targets.contains(INTERNAL)
-                )
+                assertTrue("$name: should contain $INTERNAL but doesn't: $targets",
+                        targets.contains(INTERNAL))
             }
     }
 
     private val Class<*>.constants get() = methods
-        .filter { Modifier.isStatic(it.modifiers) }
-        .filter { it.name.startsWith("get") }
-        .map { it.name to it.invoke(null) }
+            .filter { Modifier.isStatic(it.modifiers) }
+            .filter { it.name.startsWith("get") }
+            .map { it.name to it.invoke(null) }
 }
diff --git a/src/test/java/com/android/tools/metalava/model/PsiTypeItemAssignabilityTest.kt b/src/test/java/com/android/tools/metalava/model/PsiTypeItemAssignabilityTest.kt
deleted file mode 100644
index 08bad44..0000000
--- a/src/test/java/com/android/tools/metalava/model/PsiTypeItemAssignabilityTest.kt
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model
-
-import com.android.tools.metalava.java
-import com.android.tools.metalava.kotlin
-import com.android.tools.metalava.model.psi.PsiTypeItem
-import com.android.tools.metalava.model.psi.testCodebase
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TemporaryFolder
-
-class PsiTypeItemAssignabilityTest {
-    @get:Rule
-    val tmpFolder = TemporaryFolder()
-
-    @Test
-    fun `Assignability in PSI`() {
-        val sourceFiles = arrayOf(
-            // pass in the same class structure in kotlin and java.
-            java(
-                """
-                package test.foo;
-                import java.util.*;
-                public class JavaSubject {
-                    public Object obj;
-                    public String string;
-                    public int primitiveInt;
-                    public Number number;
-                    public Integer boxedInt;
-                    public List<Integer> listOfInt;
-                    public List<Number> listOfNumber;
-                    public Map<Integer, String> mapOfIntToString;
-                    public Map<Number, String> mapOfNumberToString;
-                }
-                """
-            ),
-            kotlin(
-                """
-                package test.foo;
-                class KotlinSubject {
-                    @JvmField
-                    var obj: Any? = null
-                    @JvmField
-                    var string: String? = null
-                    @JvmField
-                    var primitiveInt = 0
-                    @JvmField
-                    var number: Number? = null
-                    @JvmField
-                    var boxedInt: Int? = null
-                    @JvmField
-                    var listOfInt: MutableList<Int>? = null
-                    @JvmField
-                    var listOfNumber: MutableList<Number>? = null
-                    @JvmField
-                    var mapOfIntToString: MutableMap<Int, String>? = null
-                    @JvmField
-                    var mapOfNumberToString: MutableMap<Number, String>? = null
-                }
-                """
-            )
-        )
-
-        testCodebase(
-            sources = sourceFiles
-        ) { codebase ->
-            val javaSubject = codebase.findClass("test.foo.JavaSubject")
-                ?: error("Cannot find java subject")
-            val kotlinSubject = codebase.findClass("test.foo.KotlinSubject")
-                ?: error("Cannot find subject")
-            val testSubjects = listOf(javaSubject, kotlinSubject)
-            // helper method to check assignability between fields
-            fun String.isAssignableFromWithoutUnboxing(
-                otherField: String
-            ): Boolean {
-                val results = testSubjects.map { subject ->
-                    val field1Type = checkNotNull(
-                        subject.findField(this)?.type() as? PsiTypeItem
-                    ) {
-                        "cannot find $this in $subject"
-                    }
-                    val field2Type = checkNotNull(
-                        subject.findField(otherField)?.type() as? PsiTypeItem
-                    ) {
-                        "cannot find $otherField in $subject"
-                    }
-                    field1Type.isAssignableFromWithoutUnboxing(field2Type)
-                }
-                check(results.toSet().size == 1) {
-                    "isAssignable check for $this to $otherField returned inconsistent results " +
-                        "between kotlin and java: $results"
-                }
-                return results.first()
-            }
-
-            assertThat(
-                "string".isAssignableFromWithoutUnboxing("string")
-            ).isTrue()
-            assertThat(
-                "obj".isAssignableFromWithoutUnboxing("string")
-            ).isTrue()
-            assertThat(
-                "string".isAssignableFromWithoutUnboxing("obj")
-            ).isFalse()
-            assertThat(
-                "primitiveInt".isAssignableFromWithoutUnboxing("number")
-            ).isFalse()
-            assertThat(
-                "number".isAssignableFromWithoutUnboxing("primitiveInt")
-            ).isTrue()
-            assertThat(
-                "boxedInt".isAssignableFromWithoutUnboxing("primitiveInt")
-            ).isTrue()
-            assertThat(
-                "primitiveInt".isAssignableFromWithoutUnboxing("boxedInt")
-            ).isFalse()
-            assertThat(
-                "number".isAssignableFromWithoutUnboxing("boxedInt")
-            ).isTrue()
-            assertThat(
-                "boxedInt".isAssignableFromWithoutUnboxing("number")
-            ).isFalse()
-            assertThat(
-                "listOfInt".isAssignableFromWithoutUnboxing("listOfInt")
-            ).isTrue()
-            assertThat(
-                "listOfInt".isAssignableFromWithoutUnboxing("listOfNumber")
-            ).isFalse()
-            assertThat(
-                "listOfNumber".isAssignableFromWithoutUnboxing("listOfInt")
-            ).isFalse()
-            assertThat(
-                "mapOfNumberToString".isAssignableFromWithoutUnboxing("mapOfNumberToString")
-            ).isTrue()
-            assertThat(
-                "mapOfNumberToString".isAssignableFromWithoutUnboxing("mapOfIntToString")
-            ).isFalse()
-            assertThat(
-                "mapOfIntToString".isAssignableFromWithoutUnboxing("mapOfNumberToString")
-            ).isFalse()
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt b/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt
index c9b3bff..9250aa6 100644
--- a/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/TextBackedAnnotationItemTest.kt
@@ -42,8 +42,8 @@
             "@androidx.annotation.Nullable"
         )
         assertEquals("@androidx.annotation.Nullable", annotation.toSource())
-        assertEquals("androidx.annotation.Nullable", annotation.qualifiedName)
-        assertTrue(annotation.attributes.isEmpty())
+        assertEquals("androidx.annotation.Nullable", annotation.qualifiedName())
+        assertTrue(annotation.attributes().isEmpty())
     }
 
     @Test
@@ -53,8 +53,8 @@
             "@androidx.annotation.IntRange(from = 20, to = 40)"
         )
         assertEquals("@androidx.annotation.IntRange(from = 20, to = 40)", annotation.toSource())
-        assertEquals("androidx.annotation.IntRange", annotation.qualifiedName)
-        assertEquals(2, annotation.attributes.size)
+        assertEquals("androidx.annotation.IntRange", annotation.qualifiedName())
+        assertEquals(2, annotation.attributes().size)
         assertEquals("from", annotation.findAttribute("from")?.name)
         assertEquals("20", annotation.findAttribute("from")?.value.toString())
         assertEquals("to", annotation.findAttribute("to")?.name)
@@ -71,8 +71,8 @@
             "@androidx.annotation.IntDef({STYLE_NORMAL, STYLE_NO_TITLE, STYLE_NO_FRAME, STYLE_NO_INPUT})",
             annotation.toSource()
         )
-        assertEquals("androidx.annotation.IntDef", annotation.qualifiedName)
-        assertEquals(1, annotation.attributes.size)
+        assertEquals("androidx.annotation.IntDef", annotation.qualifiedName())
+        assertEquals(1, annotation.attributes().size)
         val attribute = annotation.findAttribute("value")
         assertNotNull(attribute)
         assertEquals("value", attribute?.name)
@@ -88,4 +88,4 @@
             assertEquals("STYLE_NO_TITLE", list[1].toSource())
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/model/TypeItemTest.kt b/src/test/java/com/android/tools/metalava/model/TypeItemTest.kt
index 4d66e16..1772272 100644
--- a/src/test/java/com/android/tools/metalava/model/TypeItemTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/TypeItemTest.kt
@@ -17,17 +17,19 @@
 package com.android.tools.metalava.model
 
 import com.android.tools.metalava.JAVA_LANG_STRING
+import com.android.tools.metalava.compatibility
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 
 class TypeItemTest {
     @Test
     fun test() {
-        assertThat(TypeItem.shortenTypes("@androidx.annotation.Nullable")).isEqualTo("@Nullable")
+        compatibility.omitCommonPackages = true
+        assertThat(TypeItem.shortenTypes("@android.support.annotation.Nullable")).isEqualTo("@Nullable")
         assertThat(TypeItem.shortenTypes(JAVA_LANG_STRING)).isEqualTo("String")
         assertThat(TypeItem.shortenTypes("java.lang.reflect.Method")).isEqualTo("java.lang.reflect.Method")
         assertThat(TypeItem.shortenTypes("java.util.List<java.lang.String>")).isEqualTo("java.util.List<java.lang.String>")
-        assertThat(TypeItem.shortenTypes("java.util.List<@androidx.annotation.NonNull java.lang.String>")).isEqualTo(
+        assertThat(TypeItem.shortenTypes("java.util.List<@android.support.annotation.NonNull java.lang.String>")).isEqualTo(
             "java.util.List<@NonNull java.lang.String>"
         )
     }
@@ -68,4 +70,4 @@
         )
         check("kotlin.jvm.functions<<>")
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/model/psi/JavadocTest.kt b/src/test/java/com/android/tools/metalava/model/psi/JavadocTest.kt
index 342b8ab..3a0909b 100644
--- a/src/test/java/com/android/tools/metalava/model/psi/JavadocTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/psi/JavadocTest.kt
@@ -18,7 +18,6 @@
 
 import com.android.tools.lint.checks.infrastructure.TestFile
 import com.android.tools.metalava.DriverTest
-import com.android.tools.metalava.java
 import org.intellij.lang.annotations.Language
 import org.junit.Assert.assertEquals
 import org.junit.Test
@@ -26,6 +25,7 @@
 class JavadocTest : DriverTest() {
     private fun checkStubs(
         @Language("JAVA") source: String,
+        compatibilityMode: Boolean = true,
         warnings: String? = "",
         api: String? = null,
         extraArguments: Array<String> = emptyArray(),
@@ -39,6 +39,7 @@
             sourceFiles = sourceFiles,
             showAnnotations = showAnnotations,
             stubFiles = arrayOf(java(source)),
+            compatibilityMode = compatibilityMode,
             expectedIssues = warnings,
             checkCompilation = true,
             api = api,
@@ -163,7 +164,6 @@
                     @SuppressWarnings({"unchecked", "deprecation", "all"})
                     @Deprecated
                     public class SomeClass {
-                    @Deprecated
                     public SomeClass() { throw new RuntimeException("Stub!"); }
                     /**
                      * My method.
@@ -172,9 +172,8 @@
                      * @throws java.io.IOException when blah blah blah
                      * @throws {@link java.lang.RuntimeException RuntimeException} when blah blah blah
                      */
-                    @Deprecated
                     public void baz(int focus) throws java.io.IOException { throw new RuntimeException("Stub!"); }
-                    @Deprecated public boolean importance;
+                    public boolean importance;
                     }
                     """
         )
@@ -264,7 +263,6 @@
                 @SuppressWarnings({"unchecked", "deprecation", "all"})
                 @Deprecated
                 public class SomeClass {
-                @Deprecated
                 public SomeClass() { throw new RuntimeException("Stub!"); }
                 /**
                  * My method.
@@ -273,9 +271,8 @@
                  * @throws java.io.IOException when blah blah blah
                  * @throws {@link java.lang.RuntimeException} when blah blah blah
                  */
-                @Deprecated
                 public void baz(int focus) throws java.io.IOException { throw new RuntimeException("Stub!"); }
-                @Deprecated public boolean importance;
+                public boolean importance;
                 }
                 """
         )
@@ -431,7 +428,7 @@
         )
     }
 
-    @Test
+        @Test
     fun `Rewrite relative documentation links in doc-stubs but preserve custom link text`() {
         checkStubs(
             docStubs = true,
@@ -677,6 +674,7 @@
     fun `Check references to inherited field constants`() {
         checkStubs(
             docStubs = true,
+            compatibilityMode = false,
             warnings = "",
             sourceFiles = arrayOf(
                 java(
@@ -774,6 +772,7 @@
     fun `Handle @attr references`() {
         checkStubs(
             docStubs = true,
+            compatibilityMode = false,
             warnings = "",
             sourceFiles = arrayOf(
                 java(
@@ -818,6 +817,7 @@
     fun `Rewrite parameter list`() {
         checkStubs(
             docStubs = true,
+            compatibilityMode = false,
             warnings = "",
             sourceFiles = arrayOf(
                 java(
@@ -881,6 +881,7 @@
     fun `Rewrite parameter list 2`() {
         checkStubs(
             docStubs = true,
+            compatibilityMode = false,
             warnings = "",
             sourceFiles = arrayOf(
                 java(
@@ -930,6 +931,7 @@
         @Suppress("ConstantConditionIf")
         checkStubs(
             docStubs = true,
+            compatibilityMode = false,
             warnings =
             if (REPORT_UNRESOLVED_SYMBOLS) {
                 """
@@ -1063,6 +1065,7 @@
     @Test
     fun `Ensure references to classes in JavaDoc of hidden members do not affect imports`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiBasedCodebaseTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiBasedCodebaseTest.kt
index 2a965f2..4f7a5d3 100644
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiBasedCodebaseTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiBasedCodebaseTest.kt
@@ -18,15 +18,12 @@
 
 import com.android.tools.lint.checks.infrastructure.TestFiles.base64gzip
 import com.android.tools.metalava.DriverTest
-import com.android.tools.metalava.FileFormat
-import com.android.tools.metalava.java
 import org.junit.Test
 
 class PsiBasedCodebaseTest : DriverTest() {
     @Test
     fun `Regression test for issue 112931426`() {
         check(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -56,8 +53,7 @@
                     }
                  */
                 base64gzip(
-                    "test.jar",
-                    "" +
+                    "test.jar", "" +
                         "H4sIAAAAAAAAAAvwZmYRYeDg4GCYUiXhy4AEOBlYGHxdQxx1Pf3c9P+dYmBg" +
                         "ZgjwZucASTFBlQTg1CwCxHDNvo5+nm6uwSF6vm6ffc+c9vHW1bvI662rde7M" +
                         "+c1BBleMHzwt0vPy1fH0vVi6ioUz4oXkEekoCa2MH+Kqas+XaFk8Fxd9Iq46" +
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiFieldItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiFieldItemTest.kt
deleted file mode 100644
index caa83ee..0000000
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiFieldItemTest.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model.psi
-
-import com.android.tools.metalava.kotlin
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertSame
-
-class PsiFieldItemTest {
-    @Test
-    fun `backing fields have properties`() {
-        testCodebase(kotlin("class Foo(val bar: Int)")) { codebase ->
-            val field = codebase.assertClass("Foo").fields().single()
-
-            assertNotNull(field.property)
-            assertSame(field, field.property?.backingField)
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiMethodItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiMethodItemTest.kt
deleted file mode 100644
index 390643f..0000000
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiMethodItemTest.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model.psi
-
-import com.android.tools.metalava.kotlin
-import org.junit.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertSame
-
-class PsiMethodItemTest {
-    @Test
-    fun `property accessors have properties`() {
-        testCodebase(kotlin("class Foo { var bar: Int = 0 }")) { codebase ->
-            val classItem = codebase.assertClass("Foo")
-            val getter = classItem.methods().single { it.name() == "getBar" }
-            val setter = classItem.methods().single { it.name() == "setBar" }
-
-            assertNotNull(getter.property)
-            assertNotNull(setter.property)
-
-            assertSame(getter.property, setter.property)
-            assertSame(getter, getter.property?.getter)
-            assertSame(setter, setter.property?.setter)
-        }
-    }
-
-    @Test
-    fun `destructuring functions do not have a property relationship`() {
-        testCodebase(kotlin("data class Foo(val bar: Int)")) { codebase ->
-            val classItem = codebase.assertClass("Foo")
-            val component1 = classItem.methods().single { it.name() == "component1" }
-
-            assertNull(component1.property)
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiModifierItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiModifierItemTest.kt
deleted file mode 100644
index 8e8f4f9..0000000
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiModifierItemTest.kt
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model.psi
-
-import com.android.tools.metalava.kotlin
-import com.android.tools.metalava.model.VisibilityLevel
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-
-class PsiModifierItemTest {
-    @Test
-    fun `Kotlin implicit internal visibility inheritance`() {
-        testCodebase(
-            kotlin(
-                """
-                    open class Base {
-                        internal open fun method(): Int = 1
-                        internal open val property: Int = 2
-                    }
-
-                    class Inherited : Base() {
-                        override fun method(): Int = 3
-                        override val property = 4
-                    }
-                """
-            )
-        ) { codebase ->
-            val inherited = codebase.assertClass("Inherited")
-            val method = inherited.methods().first { it.name().startsWith("method") }
-            val property = inherited.properties().single()
-
-            assertEquals(VisibilityLevel.INTERNAL, method.modifiers.getVisibilityLevel())
-            assertEquals(VisibilityLevel.INTERNAL, property.modifiers.getVisibilityLevel())
-        }
-    }
-
-    @Test
-    fun `Kotlin class visibility modifiers`() {
-        testCodebase(
-            kotlin(
-                """
-                    internal class Internal
-                    public class Public
-                    class DefaultPublic
-                    abstract class Outer {
-                        private class Private
-                        protected class Protected
-                    }
-                """
-            )
-        ) { codebase ->
-            assertTrue(codebase.assertClass("Internal").isInternal)
-            assertTrue(codebase.assertClass("Public").isPublic)
-            assertTrue(codebase.assertClass("DefaultPublic").isPublic)
-            assertTrue(codebase.assertClass("Outer.Private").isPrivate)
-            assertTrue(codebase.assertClass("Outer.Protected").isProtected)
-        }
-    }
-
-    @Test
-    fun `Kotlin class abstract and final modifiers`() {
-        testCodebase(
-            kotlin(
-                """
-                    abstract class Abstract
-                    sealed class Sealed
-                    open class Open
-                    final class Final
-                    class FinalDefault
-                    interface Interface
-                    annotation class Annotation
-                """
-            )
-        ) { codebase ->
-            codebase.assertClass("Abstract").modifiers.let {
-                assertTrue(it.isAbstract())
-                assertFalse(it.isSealed())
-                assertFalse(it.isFinal())
-            }
-
-            codebase.assertClass("Sealed").modifiers.let {
-                assertTrue(it.isAbstract())
-                assertTrue(it.isSealed())
-                assertFalse(it.isFinal())
-            }
-
-            codebase.assertClass("Open").modifiers.let {
-                assertFalse(it.isAbstract())
-                assertFalse(it.isFinal())
-            }
-
-            codebase.assertClass("Final").modifiers.let {
-                assertFalse(it.isAbstract())
-                assertTrue(it.isFinal())
-            }
-
-            codebase.assertClass("FinalDefault").modifiers.let {
-                assertFalse(it.isAbstract())
-                assertTrue(it.isFinal())
-            }
-
-            codebase.assertClass("Interface").modifiers.let {
-                assertTrue(it.isAbstract())
-                assertFalse(it.isFinal())
-            }
-
-            codebase.assertClass("Annotation").modifiers.let {
-                assertTrue(it.isAbstract())
-                assertFalse(it.isFinal())
-            }
-        }
-    }
-
-    @Test
-    fun `Kotlin class type modifiers`() {
-        testCodebase(
-            kotlin(
-                """
-                    inline class Inline(val value: Int)
-                    value class Value(val value: Int)
-                    data class Data(val data: Int) {
-                        companion object {
-                            const val DATA = 0
-                        }
-                    }
-                    fun interface FunInterface {
-                        fun foo()
-                    }
-                """
-            )
-        ) { codebase ->
-            assertTrue(codebase.assertClass("Inline").modifiers.isInline())
-            assertTrue(codebase.assertClass("Value").modifiers.isValue())
-            assertTrue(codebase.assertClass("Data").modifiers.isData())
-            assertTrue(codebase.assertClass("Data.Companion").modifiers.isCompanion())
-            assertTrue(codebase.assertClass("FunInterface").modifiers.isFunctional())
-        }
-    }
-
-    @Test
-    fun `Kotlin class static modifiers`() {
-        testCodebase(
-            kotlin(
-                """
-                    class TopLevel {
-                        inner class Inner
-                        class Nested
-                        interface Interface
-                        annotation class Annotation
-                        object Object
-                    }
-                    object Object
-                """
-            )
-        ) { codebase ->
-
-            assertFalse(codebase.assertClass("TopLevel").modifiers.isStatic())
-            assertFalse(codebase.assertClass("TopLevel.Inner").modifiers.isStatic())
-            assertFalse(codebase.assertClass("Object").modifiers.isStatic())
-
-            assertTrue(codebase.assertClass("TopLevel.Nested").modifiers.isStatic())
-            assertTrue(codebase.assertClass("TopLevel.Interface").modifiers.isStatic())
-            assertTrue(codebase.assertClass("TopLevel.Annotation").modifiers.isStatic())
-            assertTrue(codebase.assertClass("TopLevel.Object").modifiers.isStatic())
-        }
-    }
-
-    fun `Kotlin vararg parameters`() {
-        testCodebase(
-            kotlin(
-                "Foo.kt",
-                """
-                    fun varArg(vararg parameter: Int) { TODO() }
-                    fun nonVarArg(parameter: Int) { TODO() }
-                """
-            )
-        ) { codebase ->
-            val facade = codebase.assertClass("FooKt")
-            val varArg = facade.methods().single { it.name() == "varArg" }.parameters().single()
-            val nonVarArg =
-                facade.methods().single { it.name() == "nonVarArg" }.parameters().single()
-
-            assertTrue(varArg.modifiers.isVarArg())
-            assertFalse(nonVarArg.modifiers.isVarArg())
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiParameterItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiParameterItemTest.kt
deleted file mode 100644
index 91faefb..0000000
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiParameterItemTest.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model.psi
-
-import com.android.tools.metalava.kotlin
-import kotlin.test.Test
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertSame
-
-class PsiParameterItemTest {
-    @Test
-    fun `primary constructor parameters have properties`() {
-        testCodebase(kotlin("class Foo(val property: Int, parameter: Int)")) { codebase ->
-            val constructorItem = codebase.assertClass("Foo").constructors().single()
-            val propertyParameter = constructorItem.parameters().single { it.name() == "property" }
-            val regularParameter = constructorItem.parameters().single { it.name() == "parameter" }
-
-            assertNull(regularParameter.property)
-            assertNotNull(propertyParameter.property)
-            assertSame(propertyParameter, propertyParameter.property?.constructorParameter)
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiPropertyItemTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiPropertyItemTest.kt
deleted file mode 100644
index 9ac922a..0000000
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiPropertyItemTest.kt
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model.psi
-
-import com.android.tools.metalava.kotlin
-import kotlin.test.Test
-import kotlin.test.assertContains
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertSame
-import kotlin.test.assertTrue
-
-class PsiPropertyItemTest {
-    @Test
-    fun `primary constructor properties have constructor parameters`() {
-        testCodebase(kotlin("class Foo(val myVal: Int)")) { codebase ->
-            val myVal = codebase.assertClass("Foo").properties().single()
-
-            assertNotNull(myVal.constructorParameter)
-            assertSame(myVal, myVal.constructorParameter?.property)
-        }
-    }
-
-    @Test
-    fun `properties have getters`() {
-        testCodebase(
-            kotlin(
-                """
-                    class Foo {
-                        val myVal: Int = 0
-                        var myVar: Int = 0
-                    }
-                """
-            )
-        ) { codebase ->
-            val properties = codebase.assertClass("Foo").properties()
-            val myVal = properties.single { it.name() == "myVal" }
-            val myVar = properties.single { it.name() == "myVar" }
-
-            assertNotNull(myVal.getter)
-            assertNotNull(myVar.getter)
-
-            assertEquals("getMyVal", myVal.getter?.name())
-            assertEquals("getMyVar", myVar.getter?.name())
-
-            assertSame(myVal, myVal.getter?.property)
-            assertSame(myVar, myVar.getter?.property)
-        }
-    }
-
-    @Test
-    fun `var properties have setters`() {
-        testCodebase(kotlin("class Foo { var myVar: Int = 0 }")) { codebase ->
-            val myVar = codebase.assertClass("Foo").properties().single()
-
-            assertNotNull(myVar.setter)
-            assertEquals("setMyVar", myVar.setter?.name())
-            assertSame(myVar, myVar.setter?.property)
-        }
-    }
-
-    @Test
-    fun `setter visibility`() {
-        testCodebase(
-            kotlin(
-                """
-                    class Foo {
-                        var internalSet: Int = 0
-                            internal set
-
-                        var privateSet: Int = 0
-                            private set
-
-                        var privateCustomSet: Int = 0
-                            private set(value) { field = value + 1 }
-                """
-            )
-        ) { codebase ->
-            val properties = codebase.assertClass("Foo").properties()
-            val internalSet = properties.single { it.name() == "internalSet" }
-            val privateSet = properties.single { it.name() == "privateSet" }
-            val privateCustomSet = properties.single { it.name() == "privateCustomSet" }
-
-            assertTrue(internalSet.isPublic)
-            assertTrue(internalSet.getter!!.isPublic)
-            assertTrue(internalSet.setter!!.isInternal)
-
-            assertTrue(privateSet.isPublic)
-            assertTrue(privateSet.getter!!.isPublic)
-            assertNull(privateSet.setter) // Private setter is replaced with direct field access
-
-            assertTrue(privateCustomSet.isPublic)
-            assertTrue(privateCustomSet.getter!!.isPublic)
-            assertTrue(privateCustomSet.setter!!.isPrivate)
-        }
-    }
-
-    @Test
-    fun `properties have backing fields`() {
-        testCodebase(
-            kotlin(
-                """
-                    class Foo(val withField: Int) {
-                        val withoutField: Int
-                            get() = 0
-                    }
-                """
-            )
-        ) { codebase ->
-            val properties = codebase.assertClass("Foo").properties()
-            val withField = properties.single { it.name() == "withField" }
-            val withoutField = properties.single { it.name() == "withoutField" }
-
-            assertNull(withoutField.backingField)
-
-            assertNotNull(withField.backingField)
-            assertEquals("withField", withField.backingField?.name())
-            assertSame(withField, withField.backingField?.property)
-        }
-    }
-
-    @Test
-    fun `properties have documentation`() {
-        testCodebase(
-            kotlin(
-                """
-                    class Foo(/** parameter doc */ val parameter: Int) {
-                        /** body doc */
-                        var body: Int = 0
-
-                        /** accessors property doc */
-                        var accessors: Int
-                            /** getter doc */
-                            get() = field + 1
-                            /** setter doc */
-                            set(value) = { field = value - 1 }
-                    }
-                """
-            )
-        ) { codebase ->
-            val properties = codebase.assertClass("Foo").properties()
-            val parameter = properties.single { it.name() == "parameter" }
-            val body = properties.single { it.name() == "body" }
-            val accessors = properties.single { it.name() == "accessors" }
-
-            assertContains(parameter.documentation, "parameter doc")
-            assertContains(body.documentation, "body doc")
-            assertContains(accessors.documentation, "accessors property doc")
-            assertContains(accessors.getter?.documentation.orEmpty(), "getter doc")
-            assertContains(accessors.setter?.documentation.orEmpty(), "setter doc")
-        }
-    }
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiTestUtils.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiTestUtils.kt
deleted file mode 100644
index de17fc0..0000000
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiTestUtils.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tools.metalava.model.psi
-
-import com.android.SdkConstants
-import com.android.tools.lint.UastEnvironment
-import com.android.tools.lint.checks.infrastructure.TestFile
-import com.android.tools.metalava.ARG_CLASS_PATH
-import com.android.tools.metalava.DriverTest
-import com.android.tools.metalava.ENV_VAR_METALAVA_TESTS_RUNNING
-import com.android.tools.metalava.Options
-import com.android.tools.metalava.findKotlinStdlibPathArgs
-import com.android.tools.metalava.options
-import com.android.tools.metalava.parseSources
-import com.android.tools.metalava.tempDirectory
-import com.intellij.openapi.util.Disposer
-import java.io.File
-import kotlin.test.assertNotNull
-
-inline fun testCodebase(
-    vararg sources: TestFile,
-    action: (PsiBasedCodebase) -> Unit
-) {
-    tempDirectory { tempDirectory ->
-        val codebase = createTestCodebase(tempDirectory, *sources)
-        try {
-            action(codebase)
-        } finally {
-            destroyTestCodebase(codebase)
-        }
-    }
-}
-
-fun createTestCodebase(
-    directory: File,
-    vararg sources: TestFile
-): PsiBasedCodebase {
-    System.setProperty(ENV_VAR_METALAVA_TESTS_RUNNING, SdkConstants.VALUE_TRUE)
-    Disposer.setDebugMode(true)
-
-    val sourcePaths = sources.map { it.targetPath }.toTypedArray()
-    val args = findKotlinStdlibPathArgs(sourcePaths) + arrayOf(
-        ARG_CLASS_PATH,
-        DriverTest.getAndroidJar().path
-    )
-    options = Options(args)
-
-    return parseSources(
-        sources = sources.map { it.createFile(directory) },
-        description = "Test Codebase",
-    )
-}
-
-fun destroyTestCodebase(codebase: PsiBasedCodebase) {
-    codebase.dispose()
-
-    UastEnvironment.disposeApplicationEnvironment()
-    Disposer.assertIsEmpty(true)
-}
-
-fun PsiBasedCodebase.assertClass(qualifiedName: String): PsiClassItem {
-    val classItem = this.findClass(qualifiedName)
-    assertNotNull(classItem) { "Expected $qualifiedName to be defined" }
-    return classItem
-}
diff --git a/src/test/java/com/android/tools/metalava/model/psi/PsiTypePrinterTest.kt b/src/test/java/com/android/tools/metalava/model/psi/PsiTypePrinterTest.kt
index e2da2e8..3cee501 100644
--- a/src/test/java/com/android/tools/metalava/model/psi/PsiTypePrinterTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/psi/PsiTypePrinterTest.kt
@@ -17,18 +17,15 @@
 package com.android.tools.metalava.model.psi
 
 import com.android.tools.lint.checks.infrastructure.TestFile
-import com.android.tools.metalava.ARG_CLASS_PATH
+import com.android.tools.metalava.Compatibility
 import com.android.tools.metalava.DriverTest
-import com.android.tools.metalava.Options
-import com.android.tools.metalava.java
-import com.android.tools.metalava.kotlin
+import com.android.tools.metalava.compatibility
 import com.android.tools.metalava.libcoreNonNullSource
 import com.android.tools.metalava.libcoreNullableSource
 import com.android.tools.metalava.model.AnnotationItem
 import com.android.tools.metalava.model.Item
 import com.android.tools.metalava.nonNullSource
 import com.android.tools.metalava.nullableSource
-import com.android.tools.metalava.options
 import com.android.tools.metalava.parseSources
 import com.intellij.psi.JavaRecursiveElementVisitor
 import com.intellij.psi.PsiAnnotation
@@ -562,8 +559,7 @@
             Type: PsiClassReferenceType
             Canonical: java.util.Collection<? extends T>
             Annotated: java.util.Collection<? extends @Nullable T>
-            Merged: [@Nullable]
-            Printed: java.util.Collection<? extends T?>?
+            Printed: java.util.Collection<? extends T?>!
 
             Type: PsiWildcardType
             Canonical: ? extends T
@@ -812,10 +808,10 @@
                 classPath.add(file)
             }
         }
-        classPath.add(getAndroidJar())
+        classPath.add(getPlatformFile("android.jar"))
 
-        options = Options(arrayOf(ARG_CLASS_PATH, getAndroidJar().path))
         // TestDriver#check normally sets this for all the other tests
+        compatibility = Compatibility(false)
         val codebase = parseSources(
             sourceFiles, "test project",
             sourcePath = sourcePath, classpath = classPath
@@ -927,12 +923,9 @@
             }
             val elementAnnotations = entry.elementAnnotations
             if (elementAnnotations != null && elementAnnotations.isNotEmpty()) {
-                printWriter.printf(
-                    "Merged: %s\n",
-                    elementAnnotations.toString()
-                        .replace("androidx.annotation.", "")
-                        .replace("libcore.util.", "")
-                )
+                printWriter.printf("Merged: %s\n", elementAnnotations.toString()
+                    .replace("androidx.annotation.", "")
+                    .replace("libcore.util.", ""))
             }
             printWriter.printf("Printed: %s\n\n", string)
         }
diff --git a/src/test/java/com/android/tools/metalava/model/text/TextModifiersTest.kt b/src/test/java/com/android/tools/metalava/model/text/TextModifiersTest.kt
index 8bdf4f7..0be75e9 100644
--- a/src/test/java/com/android/tools/metalava/model/text/TextModifiersTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/text/TextModifiersTest.kt
@@ -26,26 +26,22 @@
     @Test
     fun `test equivalentTo()`() {
         val codebase = ApiFile.parseApi(
-            "test",
-            """
+            "test", """
             package androidx.navigation {
               public final class NavDestination {
                 ctor public NavDestination();
               }
             }
-            """.trimIndent(),
-            false
+        """.trimIndent(), false
         )
 
         assertTrue {
             TextModifiers(codebase, flags = DefaultModifierList.PUBLIC).equivalentTo(
-                TextModifiers(codebase, flags = DefaultModifierList.PUBLIC)
-            )
+                TextModifiers(codebase, flags = DefaultModifierList.PUBLIC))
         }
         assertFalse {
             TextModifiers(codebase, flags = DefaultModifierList.PRIVATE).equivalentTo(
-                TextModifiers(codebase, flags = DefaultModifierList.PUBLIC)
-            )
+                TextModifiers(codebase, flags = DefaultModifierList.PUBLIC))
         }
     }
 }
diff --git a/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt b/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt
index 6326f2f..10ce148 100644
--- a/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/text/TextTypeItemTest.kt
@@ -23,12 +23,12 @@
     @Test
     fun `test typeString()`() {
         val full =
-            "@androidx.annotation.Nullable java.util.List<@androidx.annotation.Nullable java.lang.String>"
+            "@android.support.annotation.Nullable java.util.List<@android.support.annotation.Nullable java.lang.String>"
         assertThat(TextTypeItem.toTypeString(full, false, false, false)).isEqualTo(
             "java.util.List<java.lang.String>"
         )
         assertThat(TextTypeItem.toTypeString(full, false, true, false)).isEqualTo(
-            "java.util.List<@androidx.annotation.Nullable java.lang.String>"
+            "java.util.List<@android.support.annotation.Nullable java.lang.String>"
         )
         assertThat(TextTypeItem.toTypeString(full, false, false, true)).isEqualTo(
             "java.util.List"
@@ -40,7 +40,7 @@
                 true,
                 false
             )
-        ).isEqualTo("@androidx.annotation.Nullable java.util.List<@androidx.annotation.Nullable java.lang.String>")
+        ).isEqualTo("@android.support.annotation.Nullable java.util.List<@android.support.annotation.Nullable java.lang.String>")
         assertThat(
             TextTypeItem.toTypeString(
                 full,
@@ -48,7 +48,7 @@
                 true,
                 true
             )
-        ).isEqualTo("@androidx.annotation.Nullable java.util.List")
+        ).isEqualTo("@android.support.annotation.Nullable java.util.List")
         assertThat(TextTypeItem.toTypeString("int", false, false, false)).isEqualTo("int")
 
         assertThat(
@@ -66,8 +66,7 @@
         // When a type variable is on a member and the type variable is defined on the surrounding
         // class, look up the bound on the class type parameter:
         val codebase = ApiFile.parseApi(
-            "test",
-            """
+            "test", """
             package androidx.navigation {
               public final class NavDestination {
                 ctor public NavDestination();
@@ -77,8 +76,7 @@
                 method public D build();
               }
             }
-            """.trimIndent(),
-            false
+        """.trimIndent(), false
         )
         val cls = codebase.findClass("androidx.navigation.NavDestinationBuilder")
         val method = cls?.findMethod("build", "") as TextMethodItem
@@ -108,15 +106,13 @@
         // When a type variable is on a member and the type variable is defined on the surrounding
         // class, look up the bound on the class type parameter:
         val codebase = ApiFile.parseApi(
-            "test",
-            """
+            "test", """
             package test.pkg {
               public final class TestClass<D> {
                 method public D build();
               }
             }
-            """.trimIndent(),
-            false
+        """.trimIndent(), false
         )
         val cls = codebase.findClass("test.pkg.TestClass")
         val method = cls?.findMethod("build", "") as TextMethodItem
@@ -141,16 +137,14 @@
         // When a type variable is on a member and the type variable is defined on the surrounding
         // class, look up the bound on the class type parameter:
         val codebase = ApiFile.parseApi(
-            "test",
-            """
+            "test", """
             package test.pkg {
               public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable {
                 method public java.util.EnumMap<K, V> clone();
                 method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
               }
             }
-            """.trimIndent(),
-            false
+        """.trimIndent(), false
         )
         val cls = codebase.findClass("test.pkg.EnumMap")
         val method = cls?.findMethod("clone", "") as TextMethodItem
diff --git a/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterItemTest.kt b/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterItemTest.kt
index ae2ebeb..44d4195 100644
--- a/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterItemTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterItemTest.kt
@@ -17,6 +17,7 @@
 package com.android.tools.metalava.model.text
 
 import com.android.tools.metalava.model.text.TextTypeParameterItem.Companion.bounds
+
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 
@@ -28,15 +29,14 @@
         assertThat(bounds("X").toString()).isEqualTo("[]")
         assertThat(bounds("DEF extends T").toString()).isEqualTo("[T]")
         assertThat(bounds("T extends java.lang.Comparable<? super T>").toString())
-            .isEqualTo("[java.lang.Comparable<? super T>]")
+            .isEqualTo("[java.lang.Comparable]")
         assertThat(bounds("T extends java.util.List<Number> & java.util.RandomAccess").toString())
-            .isEqualTo("[java.util.List<Number>, java.util.RandomAccess]")
+            .isEqualTo("[java.util.List, java.util.RandomAccess]")
 
         // When a type variable is on a member and the type variable is defined on the surrounding
         // class, look up the bound on the class type parameter:
         val codebase = ApiFile.parseApi(
-            "test",
-            """
+            "test", """
             package androidx.navigation {
               public final class NavDestination {
                 ctor public NavDestination();
@@ -46,12 +46,11 @@
                 method public D build();
               }
             }
-            """.trimIndent(),
-            false
+        """.trimIndent(), false
         )
         val cls = codebase.findClass("androidx.navigation.NavDestinationBuilder")
         val method = cls?.findMethod("build", "") as TextMethodItem
         assertThat(method).isNotNull()
         assertThat(bounds("D", method).toString()).isEqualTo("[androidx.navigation.NavDestination]")
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterListTest.kt b/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterListTest.kt
index b3ff2df..511b051 100644
--- a/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterListTest.kt
+++ b/src/test/java/com/android/tools/metalava/model/text/TextTypeParameterListTest.kt
@@ -30,4 +30,4 @@
         Truth.assertThat(TextTypeParameterList.typeParameterStrings("<T extends java.lang.Comparable<? super T>>").toString())
             .isEqualTo("[T extends java.lang.Comparable<? super T>]")
     }
-}
+}
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/metalava/stub/StubsTest.kt b/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
index 59a2881..84249a0 100644
--- a/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
+++ b/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
@@ -22,30 +22,25 @@
 import com.android.tools.lint.checks.infrastructure.TestFile
 import com.android.tools.metalava.ARG_CHECK_API
 import com.android.tools.metalava.ARG_EXCLUDE_ALL_ANNOTATIONS
-import com.android.tools.metalava.ARG_EXCLUDE_ANNOTATION
 import com.android.tools.metalava.ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS
 import com.android.tools.metalava.ARG_HIDE_PACKAGE
 import com.android.tools.metalava.ARG_KOTLIN_STUBS
 import com.android.tools.metalava.ARG_PASS_THROUGH_ANNOTATION
+import com.android.tools.metalava.ARG_EXCLUDE_ANNOTATION
 import com.android.tools.metalava.ARG_UPDATE_API
 import com.android.tools.metalava.DriverTest
 import com.android.tools.metalava.FileFormat
 import com.android.tools.metalava.androidxNullableSource
-import com.android.tools.metalava.deprecatedForSdkSource
 import com.android.tools.metalava.extractRoots
 import com.android.tools.metalava.gatherSources
 import com.android.tools.metalava.intDefAnnotationSource
 import com.android.tools.metalava.intRangeAnnotationSource
-import com.android.tools.metalava.java
-import com.android.tools.metalava.kotlin
 import com.android.tools.metalava.libcoreNonNullSource
 import com.android.tools.metalava.model.SUPPORT_TYPE_USE_ANNOTATIONS
 import com.android.tools.metalava.requiresApiSource
 import com.android.tools.metalava.requiresPermissionSource
 import com.android.tools.metalava.restrictToSource
 import com.android.tools.metalava.supportParameterName
-import com.android.tools.metalava.systemApiSource
-import com.android.tools.metalava.testApiSource
 import org.intellij.lang.annotations.Language
 import org.junit.Test
 import java.io.File
@@ -59,6 +54,7 @@
 
     private fun checkStubs(
         @Language("JAVA") source: String,
+        compatibilityMode: Boolean = true,
         warnings: String? = "",
         api: String? = null,
         extraArguments: Array<String> = emptyArray(),
@@ -66,13 +62,14 @@
         showAnnotations: Array<String> = emptyArray(),
         includeSourceRetentionAnnotations: Boolean = true,
         skipEmitPackages: List<String> = listOf("java.lang", "java.util", "java.io"),
-        format: FileFormat = FileFormat.latest,
+        format: FileFormat? = null,
         sourceFiles: Array<TestFile>
     ) {
         check(
             sourceFiles = sourceFiles,
             showAnnotations = showAnnotations,
             stubFiles = arrayOf(java(source)),
+            compatibilityMode = compatibilityMode,
             expectedIssues = warnings,
             checkCompilation = true,
             api = api,
@@ -370,8 +367,7 @@
                         public void child() { }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     public class Super {
@@ -496,23 +492,19 @@
                 @SuppressWarnings({"unchecked", "deprecation", "all"})
                 @Deprecated
                 protected static final class Inner1 {
-                @Deprecated
                 protected Inner1() { throw new RuntimeException("Stub!"); }
                 }
                 /** @deprecated */
                 @SuppressWarnings({"unchecked", "deprecation", "all"})
                 @Deprecated
                 protected abstract static class Inner2 {
-                @Deprecated
                 protected Inner2() { throw new RuntimeException("Stub!"); }
                 }
                 /** @deprecated */
                 @SuppressWarnings({"unchecked", "deprecation", "all"})
                 @Deprecated
                 protected static interface Inner3 {
-                @Deprecated
                 public default void method3() { throw new RuntimeException("Stub!"); }
-                @Deprecated
                 public static void method4() { throw new RuntimeException("Stub!"); }
                 }
                 }
@@ -590,7 +582,9 @@
             ),
             api = """
                 package test.pkg {
-                  public enum Alignment {
+                  public final class Alignment extends java.lang.Enum {
+                    method public static test.pkg.Alignment valueOf(java.lang.String) throws java.lang.IllegalArgumentException;
+                    method public static final test.pkg.Alignment[] values();
                     enum_constant public static final test.pkg.Alignment ALIGN_CENTER;
                     enum_constant public static final test.pkg.Alignment ALIGN_NORMAL;
                     enum_constant public static final test.pkg.Alignment ALIGN_OPPOSITE;
@@ -610,8 +604,12 @@
     }
 
     @Test
-    fun `Check correct throws list for generics`() {
+    fun `Check erasure in throws list`() {
+        // Makes sure that when we have a generic signature in the throws list we take
+        // the erasure instead (in compat mode); "Throwable" instead of "X" in the below
+        // test. Real world example: Optional.orElseThrow.
         checkStubs(
+            compatibilityMode = true,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -633,7 +631,7 @@
                 @SuppressWarnings({"unchecked", "deprecation", "all"})
                 public final class Test<T> {
                 public Test() { throw new RuntimeException("Stub!"); }
-                public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X> exceptionSupplier) throws X { throw new RuntimeException("Stub!"); }
+                public <X extends java.lang.Throwable> T orElseThrow(java.util.function.Supplier<? extends X> exceptionSupplier) throws java.lang.Throwable { throw new RuntimeException("Stub!"); }
                 }
                 """
         )
@@ -735,8 +733,7 @@
                         }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
 
@@ -773,8 +770,7 @@
                         public void method4() { }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     /** @hide */
@@ -791,8 +787,7 @@
                         public void method3d(java.util.List<HiddenParent> p) { }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     /** @hide */
@@ -801,8 +796,7 @@
                         public void method2() { }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     public class PublicParent {
@@ -836,6 +830,7 @@
             // Note that doclava1 includes fields here that it doesn't include in the
             // signature file.
             // checkDoclava1 = true,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -844,8 +839,7 @@
                         public void method1() { }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     class HiddenParent {
@@ -877,6 +871,7 @@
 
         // BUG: Note that we need to implement the parent
         checkStubs(
+            compatibilityMode = true,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -886,16 +881,14 @@
                         @Override public void other() { }
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     public interface OtherInterface {
                         void other();
                     }
                     """
-                ),
-                java(
+                ), java(
                     """
                     package test.pkg;
                     interface HiddenInterface extends OtherInterface {
@@ -1245,8 +1238,9 @@
 
     @Test
     fun `Check generating type parameters in interface list`() {
+        // In signature files we don't include generics in the interface list.
+        // In stubs, we do.
         checkStubs(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1267,7 +1261,7 @@
             ),
             api = """
                 package test.pkg {
-                  public class GenericsInInterfaces<T> implements java.lang.Comparable<test.pkg.GenericsInInterfaces> {
+                  public class GenericsInInterfaces<T> implements java.lang.Comparable {
                     ctor public GenericsInInterfaces();
                     method public int compareTo(test.pkg.GenericsInInterfaces);
                   }
@@ -1376,7 +1370,7 @@
                     @android.annotation.Nullable
                     public java.lang.String getProperty2() { throw new RuntimeException("Stub!"); }
                     /** property doc */
-                    public void setProperty2(@android.annotation.Nullable java.lang.String value) { throw new RuntimeException("Stub!"); }
+                    public void setProperty2(@android.annotation.Nullable java.lang.String property2) { throw new RuntimeException("Stub!"); }
                     @android.annotation.NonNull
                     public java.lang.String getProperty1() { throw new RuntimeException("Stub!"); }
                     public int someField2;
@@ -1420,7 +1414,7 @@
         // When APIs reference annotations that are hidden, make sure the're excluded from the stubs and
         // signature files
         checkStubs(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1761,6 +1755,7 @@
     @Test
     fun `Check generating required stubs from hidden super classes and interfaces`() {
         checkStubs(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -1864,7 +1859,6 @@
     @Test
     fun `Rewrite unknown nullability annotations as sdk stubs`() {
         check(
-            format = FileFormat.V2,
             checkCompilation = true,
             sourceFiles = arrayOf(
                 java(
@@ -1878,7 +1872,7 @@
             api = """
                     package my.pkg {
                       public class String {
-                        ctor public String(@NonNull char[]);
+                        ctor public String(char[]);
                       }
                     }
                     """,
@@ -1899,7 +1893,6 @@
     @Test
     fun `Rewrite unknown nullability annotations as doc stubs`() {
         check(
-            format = FileFormat.V2,
             checkCompilation = true,
             sourceFiles = arrayOf(
                 java(
@@ -1913,7 +1906,7 @@
             api = """
                     package my.pkg {
                       public class String {
-                        ctor public String(@NonNull char[]);
+                        ctor public String(char[]);
                       }
                     }
                     """,
@@ -1983,7 +1976,6 @@
     @Test
     fun `Pass through libcore annotations`() {
         check(
-            format = FileFormat.V2,
             checkCompilation = true,
             extraArguments = arrayOf(
                 ARG_PASS_THROUGH_ANNOTATION, "libcore.util.NonNull"
@@ -2002,12 +1994,12 @@
             expectedIssues = "",
             api = """
                     package libcore.util {
-                      @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE_USE}) public @interface NonNull {
+                      public abstract class NonNull implements java.lang.annotation.Annotation {
                       }
                     }
                     package my.pkg {
                       public class String {
-                        ctor public String(@libcore.util.NonNull char[]);
+                        ctor public String(char[]);
                       }
                     }
                     """,
@@ -2083,9 +2075,7 @@
             expectedIssues = "",
             api = """
                     package androidx.annotation {
-                      @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface RequiresApi {
-                        method public abstract int api() default 1;
-                        method public abstract int value() default 1;
+                      public abstract class RequiresApi implements java.lang.annotation.Annotation {
                       }
                     }
                     package my.pkg {
@@ -2294,6 +2284,7 @@
     @Test
     fun `Rewriting type parameters in interfaces from hidden super classes and in throws lists`() {
         checkStubs(
+            extraArguments = arrayOf("--skip-inherited-methods=false"),
             format = FileFormat.V1,
             sourceFiles = arrayOf(
                 java(
@@ -2340,13 +2331,13 @@
                   public class Generics {
                     ctor public Generics();
                   }
-                  public class Generics.MyClass<X, Y extends java.lang.Number> extends test.pkg.Generics.PublicParent<X,Y> implements test.pkg.Generics.PublicInterface<X,Y> {
+                  public class Generics.MyClass<X, Y extends java.lang.Number> extends test.pkg.Generics.PublicParent implements test.pkg.Generics.PublicInterface {
                     ctor public Generics.MyClass();
-                    method public java.util.Map<X,java.util.Map<Y,java.lang.String>> createMap(java.util.List<X>) throws java.io.IOException;
+                    method public java.util.Map<X, java.util.Map<Y, java.lang.String>> createMap(java.util.List<X>) throws test.pkg.Generics.MyThrowable;
                     method public java.util.List<X> foo();
                   }
-                  public static interface Generics.PublicInterface<A, B> {
-                    method public java.util.Map<A,java.util.Map<B,java.lang.String>> createMap(java.util.List<A>) throws java.io.IOException;
+                  public static abstract interface Generics.PublicInterface<A, B> {
+                    method public abstract java.util.Map<A, java.util.Map<B, java.lang.String>> createMap(java.util.List<A>) throws java.io.IOException;
                   }
                   public abstract class Generics.PublicParent<A, B extends java.lang.Number> {
                     ctor public Generics.PublicParent();
@@ -2499,7 +2490,7 @@
     fun `Rewriting implements class references`() {
         // Checks some more subtle bugs around generics type variable renaming
         checkStubs(
-            format = FileFormat.V2,
+            extraArguments = arrayOf("--skip-inherited-methods=false"),
             sourceFiles = arrayOf(
                 java(
                     """
@@ -2537,10 +2528,10 @@
                       public class ConcurrentHashMap<K, V> {
                         ctor public ConcurrentHashMap();
                       }
-                      public abstract static class ConcurrentHashMap.KeySetView<K, V> implements java.util.Collection<K> java.io.Serializable java.util.Set<K> {
+                      public static abstract class ConcurrentHashMap.KeySetView<K, V> implements java.util.Collection java.io.Serializable java.util.Set {
                         ctor public ConcurrentHashMap.KeySetView();
                         method public int size();
-                        method public final Object[] toArray();
+                        method public final java.lang.Object[] toArray();
                         method public final <T> T[] toArray(T[]);
                       }
                     }
@@ -2661,12 +2652,13 @@
     @Test
     fun `Picking Super Constructors`() {
         checkStubs(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
                     package test.pkg;
 
+                    import java.io.IOException;
+
                     @SuppressWarnings({"RedundantThrows", "JavaDoc", "WeakerAccess"})
                     public class PickConstructors {
                         public abstract static class FileInputStream extends InputStream {
@@ -2742,15 +2734,15 @@
                       public class PickConstructors {
                         ctor public PickConstructors();
                       }
-                      public abstract static class PickConstructors.AutoCloseInputStream extends test.pkg.PickConstructors.FileInputStream {
+                      public static abstract class PickConstructors.AutoCloseInputStream extends test.pkg.PickConstructors.FileInputStream {
                         ctor public PickConstructors.AutoCloseInputStream(test.pkg.PickConstructors.ParcelFileDescriptor);
                       }
-                      public abstract static class PickConstructors.AutoCloseInputStream2 extends test.pkg.PickConstructors.FileInputStream {
+                      public static abstract class PickConstructors.AutoCloseInputStream2 extends test.pkg.PickConstructors.FileInputStream {
                         ctor public PickConstructors.AutoCloseInputStream2(test.pkg.PickConstructors.ParcelFileDescriptor);
                       }
-                      public static interface PickConstructors.AutoCloseable {
+                      public static abstract interface PickConstructors.AutoCloseable {
                       }
-                      public static interface PickConstructors.Closeable extends test.pkg.PickConstructors.AutoCloseable {
+                      public static abstract interface PickConstructors.Closeable implements test.pkg.PickConstructors.AutoCloseable {
                       }
                       public static class PickConstructors.File {
                         ctor public PickConstructors.File();
@@ -2758,8 +2750,8 @@
                       public static final class PickConstructors.FileDescriptor {
                         ctor public PickConstructors.FileDescriptor();
                       }
-                      public abstract static class PickConstructors.FileInputStream extends test.pkg.PickConstructors.InputStream {
-                        ctor public PickConstructors.FileInputStream(String) throws test.pkg.PickConstructors.FileNotFoundException;
+                      public static abstract class PickConstructors.FileInputStream extends test.pkg.PickConstructors.InputStream {
+                        ctor public PickConstructors.FileInputStream(java.lang.String) throws test.pkg.PickConstructors.FileNotFoundException;
                         ctor public PickConstructors.FileInputStream(test.pkg.PickConstructors.File) throws test.pkg.PickConstructors.FileNotFoundException;
                         ctor public PickConstructors.FileInputStream(test.pkg.PickConstructors.FileDescriptor);
                       }
@@ -2769,7 +2761,7 @@
                       public static class PickConstructors.IOException extends java.lang.Exception {
                         ctor public PickConstructors.IOException();
                       }
-                      public abstract static class PickConstructors.InputStream implements test.pkg.PickConstructors.Closeable {
+                      public static abstract class PickConstructors.InputStream implements test.pkg.PickConstructors.Closeable {
                         ctor public PickConstructors.InputStream();
                       }
                       public abstract class PickConstructors.ParcelFileDescriptor implements test.pkg.PickConstructors.Closeable {
@@ -3068,7 +3060,7 @@
                         ctor public Layouts.View();
                         method protected void onLayout(boolean, int, int, int, int);
                       }
-                      public abstract static class Layouts.ViewGroup extends test.pkg.Layouts.View {
+                      public static abstract class Layouts.ViewGroup extends test.pkg.Layouts.View {
                         ctor public Layouts.ViewGroup();
                         method protected abstract void onLayout(boolean, int, int, int, int);
                       }
@@ -3211,6 +3203,7 @@
     @Test
     fun `Annotation default values`() {
         checkStubs(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3354,6 +3347,7 @@
     @Test
     fun `Annotation metadata in stubs`() {
         checkStubs(
+            compatibilityMode = false,
             includeSourceRetentionAnnotations = false,
             skipEmitPackages = emptyList(),
             sourceFiles = arrayOf(
@@ -3385,6 +3379,7 @@
     @Test
     fun `Functional Interfaces`() {
         checkStubs(
+            compatibilityMode = false,
             skipEmitPackages = emptyList(),
             sourceFiles = arrayOf(
                 java(
@@ -3413,7 +3408,6 @@
     @Test
     fun `Check writing package info file`() {
         checkStubs(
-            format = FileFormat.V2,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3434,7 +3428,7 @@
             ),
             warnings = "",
             api = """
-                package @Nullable test.pkg {
+                package test.pkg {
                   public class Test {
                     ctor public Test();
                   }
@@ -3449,8 +3443,7 @@
                 // By default metalava rewrites androidx.annotation.Nullable to
                 // android.annotation.Nullable, but the latter does not have target PACKAGE thus
                 // fails to compile. This forces stubs keep the androidx annotation.
-                ARG_PASS_THROUGH_ANNOTATION, "androidx.annotation.Nullable"
-            )
+                ARG_PASS_THROUGH_ANNOTATION, "androidx.annotation.Nullable")
         )
     }
 
@@ -3497,6 +3490,7 @@
     @Test
     fun `Test package-info annotations`() {
         check(
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3542,6 +3536,7 @@
     fun `Ensure we emit both deprecated javadoc and annotation with exclude-all-annotations`() {
         check(
             extraArguments = arrayOf(ARG_EXCLUDE_ALL_ANNOTATIONS),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3581,6 +3576,7 @@
     fun `Ensure we emit runtime and deprecated annotations in stubs with exclude-annotations`() {
         check(
             extraArguments = arrayOf(ARG_EXCLUDE_ALL_ANNOTATIONS),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3647,6 +3643,7 @@
     fun `Ensure we include class and runtime and not source annotations in stubs with include-annotations`() {
         check(
             extraArguments = arrayOf("--include-annotations"),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3719,6 +3716,7 @@
     fun `Generate stubs with --exclude-documentation-from-stubs`() {
         checkStubs(
             extraArguments = arrayOf(ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3765,6 +3763,7 @@
     fun `Generate documentation stubs with --exclude-documentation-from-stubs`() {
         checkStubs(
             extraArguments = arrayOf(ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3891,11 +3890,11 @@
     @Test(expected = FileNotFoundException::class)
     fun `Test update-api should not generate stubs`() {
         check(
-            format = FileFormat.V2,
             extraArguments = arrayOf(
                 ARG_UPDATE_API,
                 ARG_EXCLUDE_ALL_ANNOTATIONS
             ),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3936,6 +3935,7 @@
                 ARG_CHECK_API,
                 ARG_EXCLUDE_ALL_ANNOTATIONS
             ),
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -3967,7 +3967,7 @@
     fun `Include package private classes referenced from public API`() {
         // Real world example: android.net.http.Connection in apache-http referenced from RequestHandle
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             expectedIssues = """
                 src/test/pkg/PublicApi.java:4: error: Class test.pkg.HiddenType is not public but was referenced (as return type) from public method test.pkg.PublicApi.getHiddenType() [ReferencesHidden]
                 src/test/pkg/PublicApi.java:5: error: Class test.pkg.HiddenType4 is hidden but was referenced (as return type) from public method test.pkg.PublicApi.getHiddenType4() [ReferencesHidden]
@@ -4079,7 +4079,7 @@
         // Real world example: hidden android.car.vms.VmsOperationRecorder.Writer in android.car-system-stubs
         // referenced from outer class constructor
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             expectedIssues = """
                 src/test/pkg/PublicApi.java:4: error: Class test.pkg.PublicApi.HiddenInner is hidden but was referenced (as parameter type) from public parameter inner in test.pkg.PublicApi(test.pkg.PublicApi.HiddenInner inner) [ReferencesHidden]
                 src/test/pkg/PublicApi.java:4: warning: Parameter inner references hidden type test.pkg.PublicApi.HiddenInner. [HiddenTypeParameter]
@@ -4123,7 +4123,7 @@
     @Test
     fun `Use type argument in constructor cast`() {
         check(
-            format = FileFormat.V2,
+            compatibilityMode = false,
             sourceFiles = arrayOf(
                 java(
                     """
@@ -4204,6 +4204,7 @@
         //    type substitution of Orange for T is lost.
         // """
         check(
+            compatibilityMode = false,
             expectedIssues = "src/test/pkg/Alpha.java:2: warning: Public class test.pkg.Alpha stripped of unavailable superclass test.pkg.Beta [HiddenSuperclass]",
             sourceFiles = arrayOf(
                 java(
@@ -4277,6 +4278,7 @@
     fun `Regression test for 124333557`() {
         // Regression test for 124333557: Handle empty java files
         check(
+            compatibilityMode = false,
             expectedIssues = """
             TESTROOT/src/test/Something2.java: error: metalava was unable to determine the package name. This usually means that a source file was where the directory does not seem to match the package declaration; we expected the path TESTROOT/src/test/Something2.java to end with /test/wrong/Something2.java [IoError]
             TESTROOT/src/test/Something2.java: error: metalava was unable to determine the package name. This usually means that a source file was where the directory does not seem to match the package declaration; we expected the path TESTROOT/src/test/Something2.java to end with /test/wrong/Something2.java [IoError]
@@ -4370,8 +4372,7 @@
                     }
                     """
                 ),
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
                     open class ExtendableClass<T>
                 """
@@ -4413,16 +4414,14 @@
                 ARG_KOTLIN_STUBS
             ),
             sourceFiles = arrayOf(
-                kotlin(
-                    """
+                kotlin("""
                     package test.pkg
                     class MainClass: MyParentClass(), MyInterface1, MyInterface2
                     
                     open class MyParentClass
                     interface MyInterface1
                     interface MyInterface2
-                """
-                )
+                """)
             ),
             stubFiles = arrayOf(
                 kotlin(
@@ -4519,241 +4518,6 @@
         )
     }
 
-    @Test
-    fun `Translate DeprecatedForSdk to Deprecated`() {
-        // See b/144111352
-        check(
-            expectedIssues = """
-                src/test/pkg/PublicApi.java:30: error: Method test.pkg.PublicApi.method4(): Documentation contains `@deprecated` which implies this API is fully deprecated, not just @DeprecatedForSdk [DeprecationMismatch]
-            """,
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
-                    import android.annotation.DeprecatedForSdk;
-                    import android.annotation.DeprecatedForSdk.*;
-
-                    public class PublicApi {
-                        private PublicApi() { }
-                        // Normal deprecation:
-                        /** @deprecated My deprecation reason 1 */
-                        @Deprecated
-                        public static void method1() { }
-
-                        // Deprecated in the SDK. No comment; make sure annotation comment
-                        // shows up in the doc stubs.
-                        @DeprecatedForSdk("My deprecation reason 2")
-                        public static void method2() { }
-
-                        // Deprecated in the SDK, and has comment: Make sure comments merged
-                        // in the doc stubs.
-                        /**
-                         * My docs here.
-                         * @return the value
-                         */
-                        @DeprecatedForSdk("My deprecation reason 3")
-                        public static void method3() { } // warn about missing annotation
-
-                        // Already implicitly deprecated everywhere (because of @deprecated
-                        // comment; complain if combined with @DeprecatedForSdk
-                        /** @deprecated Something */
-                        @DeprecatedForSdk("Something")
-                        public static void method4() { }
-
-                        // Test @DeprecatedForSdk with specific exemptions; none of these are
-                        // the current public SDK so make sure it's deprecated there.
-                        // A different test will check whath appens when generating the
-                        // system API or test API.
-                        @DeprecatedForSdk(value = "Explanation", allowIn = { SYSTEM_API, TEST_API })
-                        public static void method5() { }
-                    }
-                    """
-                ).indented(),
-                deprecatedForSdkSource
-            ),
-            api = """
-                package test.pkg {
-                  public class PublicApi {
-                    method @Deprecated public static void method1();
-                    method @Deprecated public static void method2();
-                    method @Deprecated public static void method3();
-                    method @Deprecated public static void method4();
-                    method @Deprecated public static void method5();
-                  }
-                }
-                """,
-            stubFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
-                    @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    public class PublicApi {
-                    private PublicApi() { throw new RuntimeException("Stub!"); }
-                    /** @deprecated My deprecation reason 1 */
-                    @Deprecated
-                    public static void method1() { throw new RuntimeException("Stub!"); }
-                    /**
-                     * @deprecated My deprecation reason 2
-                     */
-                    @Deprecated
-                    public static void method2() { throw new RuntimeException("Stub!"); }
-                    /**
-                     * My docs here.
-                     * @deprecated My deprecation reason 3
-                     * @return the value
-                     */
-                    @Deprecated
-                    public static void method3() { throw new RuntimeException("Stub!"); }
-                    /** @deprecated Something */
-                    @Deprecated
-                    public static void method4() { throw new RuntimeException("Stub!"); }
-                    /**
-                     * @deprecated Explanation
-                     */
-                    @Deprecated
-                    public static void method5() { throw new RuntimeException("Stub!"); }
-                    }
-                    """
-                )
-            ),
-            docStubs = true
-        )
-    }
-
-    @Test
-    fun `Translate DeprecatedForSdk with API Filtering`() {
-        // See b/144111352.
-        // Remaining: don't include @deprecated in the docs for allowed platforms!
-        check(
-            showAnnotations = arrayOf("android.annotation.SystemApi"),
-            sourceFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
-
-                    import android.annotation.SystemApi;
-                    import android.annotation.TestApi;
-                    import android.annotation.DeprecatedForSdk;
-
-                    public class PublicApi2 {
-                        private PublicApi2() {
-                        }
-
-                        // This method should be deprecated in the SDK but *not* here in
-                        // the system API (this test runs with --show-annotations SystemApi)
-                        @DeprecatedForSdk(value = "My deprecation reason 1", allowIn = {SystemApi.class, TestApi.class})
-                        public static void method1() {
-                        }
-
-                        // Same as method 1 (here we're just using a different annotation
-                        // initializer form to test we're handling both types): *not* deprecated.
-
-                        /**
-                         * My docs.
-                         */
-                        @DeprecatedForSdk(value = "My deprecation reason 2", allowIn = SystemApi.class)
-                        public static void method2() {
-                        }
-
-                        // Finally, this method *is* deprecated in the system API and should
-                        // show up as such.
-
-                        /**
-                         * My docs.
-                         */
-                        @DeprecatedForSdk(value = "My deprecation reason 3", allowIn = TestApi.class)
-                        public static void method3() {
-                        }
-                    }
-                    """
-                ).indented(),
-                // Include some Kotlin files too to make sure we correctly handle
-                // annotation lookup for Kotlin (which uses UAST instead of plain Java PSI
-                // behind the scenes), even if android.util.ArrayMap is really implemented in Java
-                kotlin(
-                    """
-                    package android.util
-                    import android.annotation.DeprecatedForSdk
-                    import android.annotation.SystemApi;
-                    import android.annotation.TestApi;
-
-                    @DeprecatedForSdk(value = "Use androidx.collection.ArrayMap")
-                    class ArrayMap
-
-                    @DeprecatedForSdk(value = "Use androidx.collection.ArrayMap", allowIn = [SystemApi::class])
-                    class SystemArrayMap
-
-                    @DeprecatedForSdk("Use android.Manifest.permission.ACCESS_FINE_LOCATION instead")
-                    const val FINE_LOCATION =  "android.permission.ACCESS_FINE_LOCATION"
-                    """
-                ).indented(),
-                deprecatedForSdkSource,
-                systemApiSource,
-                testApiSource
-            ),
-            stubFiles = arrayOf(
-                java(
-                    """
-                    package test.pkg;
-                    @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    public class PublicApi2 {
-                    private PublicApi2() { throw new RuntimeException("Stub!"); }
-                    public static void method1() { throw new RuntimeException("Stub!"); }
-                    /**
-                     * My docs.
-                     */
-                    public static void method2() { throw new RuntimeException("Stub!"); }
-                    /**
-                     * My docs.
-                     * @deprecated My deprecation reason 3
-                     */
-                    @Deprecated
-                    public static void method3() { throw new RuntimeException("Stub!"); }
-                    }
-                    """
-                ),
-                java(
-                    """
-                    package android.util;
-                    /**
-                     * @deprecated Use androidx.collection.ArrayMap
-                     */
-                    @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    @Deprecated
-                    public final class ArrayMap {
-                    @Deprecated
-                    public ArrayMap() { throw new RuntimeException("Stub!"); }
-                    }
-                    """
-                ),
-                // SystemArrayMap is like ArrayMap, but has allowedIn=SystemApi::class, so
-                // it should not be deprecated here in the system api stubs
-                java(
-                    """
-                    package android.util;
-                    @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    public final class SystemArrayMap {
-                    public SystemArrayMap() { throw new RuntimeException("Stub!"); }
-                    }
-                    """
-                ),
-                java(
-                    """
-                    package android.util;
-                    @SuppressWarnings({"unchecked", "deprecation", "all"})
-                    public final class ArrayMapKt {
-                    /**
-                     * @deprecated Use android.Manifest.permission.ACCESS_FINE_LOCATION instead
-                     */
-                    @Deprecated @androidx.annotation.NonNull public static final java.lang.String FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
-                    }
-                    """
-                )
-            ),
-            docStubs = true
-        )
-    }
-
     // TODO: Test what happens when a class extends a hidden extends a public in separate packages,
     // and the hidden has a @hide constructor so the stub in the leaf class doesn't compile -- I should
     // check for this and fail build.
diff --git a/stub-annotations/src/main/java/androidx/annotation/Discouraged.java b/stub-annotations/src/main/java/androidx/annotation/Discouraged.java
deleted file mode 100644
index dd5f190..0000000
--- a/stub-annotations/src/main/java/androidx/annotation/Discouraged.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.annotation;
-
-import static java.lang.annotation.ElementType.CONSTRUCTOR;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/** Stub only annotation. Do not use directly. */
-@Retention(SOURCE)
-@Target({CONSTRUCTOR, FIELD, METHOD, PARAMETER, TYPE})
-public @interface Discouraged {
-    /**
-     * Defines the message to display when an element marked with this annotation is used. An
-     * alternative should be provided in the message.
-     */
-    String message();
-}