Merge "Add minimal gradle.properties to playground buidls" into androidx-master-dev
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 5d1d9e0..6024a5f 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -79,7 +79,7 @@
     val MEDIA2 = Version("1.1.0-alpha02")
     val MEDIAROUTER = Version("1.2.0-alpha02")
     val NAVIGATION = Version("2.4.0-alpha01")
-    val PAGING = Version("3.0.0-alpha04")
+    val PAGING = Version("3.0.0-alpha05")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-alpha01")
     val PERCENTLAYOUT = Version("1.1.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index 866a2f3..45fc2a2 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -42,7 +42,7 @@
     ignore(LibraryGroups.BENCHMARK.group, "benchmark-gradle-plugin")
     prebuilts(LibraryGroups.BENCHMARK, "1.1.0-alpha01")
     prebuilts(LibraryGroups.BIOMETRIC, "biometric", "1.1.0-alpha01")
-    prebuilts(LibraryGroups.BROWSER, "1.3.0-alpha04")
+    prebuilts(LibraryGroups.BROWSER, "1.3.0-alpha05")
     ignore(LibraryGroups.CAMERA.group, "camera-camera2-pipe")
     ignore(LibraryGroups.CAMERA.group, "camera-camera2-pipe-integration")
     ignore(LibraryGroups.CAMERA.group, "camera-testing")
@@ -69,7 +69,7 @@
     prebuilts(LibraryGroups.DYNAMICANIMATION, "dynamicanimation-ktx", "1.0.0-alpha03")
     prebuilts(LibraryGroups.DYNAMICANIMATION, "1.1.0-alpha02")
     prebuilts(LibraryGroups.EMOJI, "1.1.0")
-    prebuilts(LibraryGroups.ENTERPRISE, "1.0.0")
+    prebuilts(LibraryGroups.ENTERPRISE, "1.1.0-alpha01")
     prebuilts(LibraryGroups.EXIFINTERFACE, "1.3.0-alpha01")
     ignore(LibraryGroups.FRAGMENT.group, "fragment-lint")
     ignore(LibraryGroups.FRAGMENT.group, "fragment-testing-lint")
@@ -128,7 +128,7 @@
     ignore(LibraryGroups.SECURITY.group, "security-crypto-ktx")
     // TODO: Remove this ignore once androidx.security:security-identity-credential:1.0.0-alpha01 is released
     ignore(LibraryGroups.SECURITY.group, "security-identity-credential")
-    prebuilts(LibraryGroups.SECURITY, "1.1.0-alpha01")
+    prebuilts(LibraryGroups.SECURITY, "1.1.0-alpha02")
     prebuilts(LibraryGroups.SHARETARGET, "1.0.0")
     prebuilts(LibraryGroups.SLICE, "slice-builders", "1.1.0-alpha01")
     prebuilts(LibraryGroups.SLICE, "slice-builders-ktx", "1.0.0-alpha07")
@@ -158,7 +158,7 @@
             .addStubs("wear/wear_stubs/com.google.android.wearable-stubs.jar")
     ignore(LibraryGroups.WEAR.group, "wear-input")
     ignore(LibraryGroups.WEAR.group, "wear-input-testing")
-    prebuilts(LibraryGroups.WEBKIT, "1.3.0-rc01")
+    prebuilts(LibraryGroups.WEBKIT, "1.3.0-rc02")
     ignore(LibraryGroups.WINDOW.group, "window-sidecar")
     prebuilts(LibraryGroups.WINDOW, "1.0.0-alpha01")
             .addStubs("window/stubs/window-sidecar-release-0.1.0-alpha01.aar")
diff --git a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index 0b4c95a..f4bdef5 100644
--- a/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -95,6 +95,7 @@
     "verifyDependencyVersions",
     "verifyReleaseResources",
     "zipEcFiles",
+    "zipTestConfigsWithApks",
 
     ":camera:integration-tests:camera-testapp-uiwidgets:mergeLibDexDebug",
     ":camera:integration-tests:camera-testapp-uiwidgets:packageDebug",
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
index 02d0c3b..6653826 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
@@ -541,30 +541,22 @@
               } else if (%changed and 0b0110 === 0) {
                 %dirty = %dirty or if (%composer.changed(modifier)) 0b0100 else 0b0010
               }
-              if (%changed and 0b00011000 === 0) {
-                %dirty = %dirty or if (%default and 0b0010 === 0 && %composer.changed(children)) 0b00010000 else 0b1000
+              if (%default and 0b0010 !== 0) {
+                %dirty = %dirty or 0b00011000
+              } else if (%changed and 0b00011000 === 0) {
+                %dirty = %dirty or if (%composer.changed(children)) 0b00010000 else 0b1000
               }
               if (%dirty and 0b1011 xor 0b1010 !== 0 || !%composer.skipping) {
-                if (%changed and 0b0001 === 0 || %composer.defaultsInvalid) {
-                  %composer.startDefaults()
-                  if (%default and 0b0001 !== 0) {
-                    modifier = Companion
-                  }
-                  if (%default and 0b0010 !== 0) {
-                    children = composableLambdaInstance(<>, true) { %composer: Composer<*>?, %key: Int, %changed: Int ->
-                      if (%changed and 0b0011 xor 0b0010 !== 0 || !%composer.skipping) {
-                        Unit
-                      } else {
-                        %composer.skipToGroupEnd()
-                      }
+                if (%default and 0b0001 !== 0) {
+                  modifier = Companion
+                }
+                if (%default and 0b0010 !== 0) {
+                  children = composableLambda(%composer, <>, true, "C:Test.kt") { %composer: Composer<*>?, %key: Int, %changed: Int ->
+                    if (%changed and 0b0011 xor 0b0010 !== 0 || !%composer.skipping) {
+                      Unit
+                    } else {
+                      %composer.skipToGroupEnd()
                     }
-                    %dirty = %dirty and 0b00011000.inv()
-                  }
-                  %composer.endDefaults()
-                } else {
-                  %composer.skipCurrentGroup()
-                  if (%default and 0b0010 !== 0) {
-                    %dirty = %dirty and 0b00011000.inv()
                   }
                 }
                 println()
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
new file mode 100644
index 0000000..2e5f51e
--- /dev/null
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTransformTests.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright 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 androidx.compose.compiler.plugins.kotlin
+
+import org.junit.Test
+
+class LambdaMemoizationTransformTests : ComposeIrTransformTest() {
+
+    @Test // regression of b/162575428
+    fun testComposableInAFunctionParameter(): Unit = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.Composable
+
+            @Composable
+            fun Test(enabled: Boolean, content: @Composable () -> Unit = {
+                    Display("%enabled")
+                }
+            ) {
+                Wrap(content)
+            }
+        """.replace('%', '$'),
+        """
+            @Composable
+            fun Test(enabled: Boolean, content: Function3<Composer<*>, Int, Int, Unit>?, %composer: Composer<*>?, %key: Int, %changed: Int, %default: Int) {
+              %composer.startRestartGroup(<> xor %key, "C(Test)P(1)<Wrap(c...>:Test.kt")
+              val %dirty = %changed
+              val content = content
+              if (%default and 0b0001 !== 0) {
+                %dirty = %dirty or 0b0110
+              } else if (%changed and 0b0110 === 0) {
+                %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
+              }
+              if (%default and 0b0010 !== 0) {
+                %dirty = %dirty or 0b00011000
+              } else if (%changed and 0b00011000 === 0) {
+                %dirty = %dirty or if (%composer.changed(content)) 0b00010000 else 0b1000
+              }
+              if (%dirty and 0b1011 xor 0b1010 !== 0 || !%composer.skipping) {
+                if (%default and 0b0010 !== 0) {
+                  content = composableLambda(%composer, <>, true, "C<Displa...>:Test.kt") { %composer: Composer<*>?, %key: Int, %changed: Int ->
+                    if (%changed and 0b0011 xor 0b0010 !== 0 || !%composer.skipping) {
+                      Display("%enabled", %composer, <>, 0)
+                    } else {
+                      %composer.skipToGroupEnd()
+                    }
+                  }
+                }
+                Wrap(content, %composer, <>, 0b0110 and %dirty shr 0b0010)
+              } else {
+                %composer.skipToGroupEnd()
+              }
+              %composer.endRestartGroup()?.updateScope { %composer: Composer<*>?, %key: Int, %force: Int ->
+                Test(enabled, content, %composer, %key, %changed or 0b0001, %default)
+              }
+            }
+        """,
+        """
+            import androidx.compose.runtime.Composable
+
+            @Composable fun Display(text: String) { }
+            @Composable fun Wrap(content: @Composable () -> Unit) { }
+        """
+    )
+
+    @Test
+    fun testComposabableLambdaInLocalDeclaration(): Unit = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.Composable
+
+            @Composable
+            fun Test(enabled: Boolean) {
+                val content: @Composable () -> Unit = {
+                    Display("%enabled")
+                }
+                Wrap(content)
+            }
+        """.replace('%', '$'),
+        """
+            @Composable
+            fun Test(enabled: Boolean, %composer: Composer<*>?, %key: Int, %changed: Int) {
+              %composer.startRestartGroup(<> xor %key, "C(Test)<Wrap(c...>:Test.kt")
+              val %dirty = %changed
+              if (%changed and 0b0110 === 0) {
+                %dirty = %dirty or if (%composer.changed(enabled)) 0b0100 else 0b0010
+              }
+              if (%dirty and 0b0011 xor 0b0010 !== 0 || !%composer.skipping) {
+                val content = composableLambda(%composer, <>, true, "C<Displa...>:Test.kt") { %composer: Composer<*>?, %key: Int, %changed: Int ->
+                  if (%changed and 0b0011 xor 0b0010 !== 0 || !%composer.skipping) {
+                    Display("%enabled", %composer, <>, 0)
+                  } else {
+                    %composer.skipToGroupEnd()
+                  }
+                }
+                Wrap(content, %composer, <>, 0b0110)
+              } else {
+                %composer.skipToGroupEnd()
+              }
+              %composer.endRestartGroup()?.updateScope { %composer: Composer<*>?, %key: Int, %force: Int ->
+                Test(enabled, %composer, %key, %changed or 0b0001)
+              }
+            }
+        """,
+        """
+            import androidx.compose.runtime.Composable
+
+            @Composable fun Display(text: String) { }
+            @Composable fun Wrap(content: @Composable () -> Unit) { }
+        """
+    )
+}
\ No newline at end of file
diff --git a/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt b/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
index 985088d..5d4cd86 100644
--- a/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
+++ b/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposerLambdaMemoization.kt
@@ -79,6 +79,7 @@
 private abstract class DeclarationContext {
     abstract val composable: Boolean
     abstract val symbol: IrSymbol
+    abstract val functionContext: FunctionContext?
     abstract fun declareLocal(local: IrValueDeclaration?)
     abstract fun recordCapture(local: IrValueDeclaration?)
     abstract fun pushCollector(collector: CaptureCollector)
@@ -87,6 +88,7 @@
 
 private class SymbolOwnerContext(val declaration: IrSymbolOwner) : DeclarationContext() {
     override val composable get() = false
+    override val functionContext: FunctionContext? get() = null
     override val symbol get() = declaration.symbol
     override fun declareLocal(local: IrValueDeclaration?) { }
     override fun recordCapture(local: IrValueDeclaration?) { }
@@ -94,13 +96,27 @@
     override fun popCollector(collector: CaptureCollector) { }
 }
 
+private class FunctionLocalSymbol(
+    val declaration: IrSymbolOwner,
+    override val functionContext: FunctionContext
+) : DeclarationContext() {
+    override val composable: Boolean get() = functionContext.composable
+    override val symbol: IrSymbol get() = declaration.symbol
+    override fun declareLocal(local: IrValueDeclaration?) = functionContext.declareLocal(local)
+    override fun recordCapture(local: IrValueDeclaration?) = functionContext.recordCapture(local)
+    override fun pushCollector(collector: CaptureCollector) =
+        functionContext.pushCollector(collector)
+    override fun popCollector(collector: CaptureCollector) =
+        functionContext.popCollector(collector)
+}
+
 private class FunctionContext(
     val declaration: IrFunction,
     override val composable: Boolean,
     val canRemember: Boolean
 ) : DeclarationContext() {
     override val symbol get() = declaration.symbol
-
+    override val functionContext: FunctionContext? get() = this
     val locals = mutableSetOf<IrValueDeclaration>()
     var collectors = mutableListOf<CaptureCollector>()
 
@@ -150,12 +166,22 @@
 
     private val declarationContextStack = mutableListOf<DeclarationContext>()
 
+    private val currentFunctionContext: FunctionContext? get() =
+        declarationContextStack.peek()?.functionContext
+
     override fun lower(module: IrModuleFragment) = module.transformChildrenVoid(this)
 
     override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
-        if (declaration is IrFunction) return super.visitDeclaration(declaration)
+        if (declaration is IrFunction)
+            return super.visitDeclaration(declaration)
         val symbolOwner = declaration as? IrSymbolOwner
-        if (symbolOwner != null) declarationContextStack.push(SymbolOwnerContext(declaration))
+        if (symbolOwner != null) {
+            val functionContext = currentFunctionContext
+            if (functionContext != null)
+                declarationContextStack.push(FunctionLocalSymbol(declaration, functionContext))
+            else
+                declarationContextStack.push(SymbolOwnerContext(declaration))
+        }
         val result = super.visitDeclaration(declaration)
         if (symbolOwner != null) declarationContextStack.pop()
         return result
@@ -206,8 +232,7 @@
     override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
         // Memoize the instance created by using the :: operator
         val result = super.visitFunctionReference(expression)
-        val functionContext = declarationContextStack.peek() as? FunctionContext
-            ?: return result
+        val functionContext = currentFunctionContext ?: return result
         if (expression.valueArgumentsCount != 0) {
             // If this syntax is as a curry syntax in the future, don't memoize.
             // The syntax <expr>::<method>(<params>) and ::<function>(<params>) is reserved for
@@ -272,10 +297,9 @@
     }
 
     private fun visitNonComposableFunctionExpression(
-        expression: IrFunctionExpression,
-        declarationContext: DeclarationContext
+        expression: IrFunctionExpression
     ): IrExpression {
-        val functionContext = declarationContext as? FunctionContext
+        val functionContext = currentFunctionContext
             ?: return super.visitFunctionExpression(expression)
 
         if (
@@ -331,7 +355,7 @@
         return if (expression.allowsComposableCalls())
             visitComposableFunctionExpression(expression, declarationContext)
         else
-            visitNonComposableFunctionExpression(expression, declarationContext)
+            visitNonComposableFunctionExpression(expression)
     }
 
     private fun startCollector(collector: CaptureCollector) {
diff --git a/contentaccess/contentaccess-compiler/build.gradle b/contentaccess/contentaccess-compiler/build.gradle
index 32755ff..06f2b87 100644
--- a/contentaccess/contentaccess-compiler/build.gradle
+++ b/contentaccess/contentaccess-compiler/build.gradle
@@ -46,6 +46,7 @@
     implementation(KOTLINPOET_METADATA)
     implementation(KOTLINPOET_METADATA_SPECS)
     implementation(KOTLINPOET_CLASSINSPECTOR_ELEMENTS)
+    implementation("androidx.annotation:annotation:1.0.0")
 
     testImplementation(ASSERTJ)
     testImplementation(GOOGLE_COMPILE_TESTING)
diff --git a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/ext/element_ext.kt b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/ext/element_ext.kt
index 8dc907d..69f100a 100644
--- a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/ext/element_ext.kt
+++ b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/ext/element_ext.kt
@@ -88,14 +88,21 @@
     } else {
         error("${this.qualifiedName} has more than non private non ignored constructor")
     }
-
     // TODO(obenabde): explore ways to warn users if they're unknowingly doing something wrong
     //  e.g if there is a possibility they think we are filling fields instead of constructors
     //  or both etc...
     // This is a class with an empty or no public constructor, check public fields.
-    val publicFields = ElementFilter.fieldsIn(this.enclosedElements)
-        .filter { !it.modifiers.contains(Modifier.PRIVATE) }
-    return publicFields.map { it as VariableElement }
+    return getAllNonPrivateFieldsIncludingSuperclassOnes()
+}
+
+fun TypeElement.getAllNonPrivateFieldsIncludingSuperclassOnes(): List<VariableElement> {
+    var nonPrivateFields = ElementFilter.fieldsIn(this.enclosedElements)
+        .filterNot { it.modifiers.contains(Modifier.PRIVATE) }
+    if (superclass.kind != TypeKind.NONE) {
+        nonPrivateFields = nonPrivateFields + MoreTypes.asTypeElement(superclass)
+            .getAllNonPrivateFieldsIncludingSuperclassOnes()
+    }
+    return nonPrivateFields.map { it as VariableElement }
 }
 
 fun TypeElement.hasNonEmptyNonPrivateNonIgnoredConstructor(): Boolean {
diff --git a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentEntityProcessor.kt b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentEntityProcessor.kt
index 06c1a2e..cfb0324 100644
--- a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentEntityProcessor.kt
+++ b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentEntityProcessor.kt
@@ -16,6 +16,7 @@
 
 package androidx.contentaccess.compiler.processor
 
+import androidx.annotation.RequiresApi
 import androidx.contentaccess.ContentColumn
 import androidx.contentaccess.ContentEntity
 import androidx.contentaccess.ContentPrimaryKey
@@ -29,6 +30,7 @@
 import asTypeElement
 import com.google.auto.common.MoreTypes
 import isPrimitive
+import isPrimitiveBlob
 import isSupportedColumnType
 import javax.annotation.processing.ProcessingEnvironment
 import javax.lang.model.element.VariableElement
@@ -52,7 +54,8 @@
         }
         val columns = entity.getAllConstructorParamsOrPublicFields()
         columns.forEach {
-            if (fieldIsNullable(it) && it.asType().isPrimitive()) {
+            if (fieldIsNullable(it) && (it.asType().isPrimitive() &&
+                        !it.asType().isPrimitiveBlob())) {
                 errorReporter.reportError(entityWithNullablePrimitiveType(it.simpleName.toString(),
                     contentEntity.toString()), it)
             }
@@ -69,7 +72,8 @@
                     val vo = ContentColumnVO(
                         column.simpleName.toString(), column.asType(),
                         column.getAnnotation(ContentColumn::class.java).columnName,
-                        fieldIsNullable(column)
+                        fieldIsNullable(column),
+                        fieldRequiresApi(column)
                     )
                     contentColumns.put(vo.columnName, vo)
                 }
@@ -77,7 +81,8 @@
                 if (validateColumnType(column, errorReporter)) {
                     val vo = ContentColumnVO(column.simpleName.toString(), column.asType(), column
                         .getAnnotation(ContentPrimaryKey::class.java).columnName,
-                        fieldIsNullable(column)
+                        fieldIsNullable(column),
+                        fieldRequiresApi(column)
                     )
                     contentColumns.put(vo.columnName, vo)
                     contentPrimaryKey.add(vo)
@@ -131,6 +136,13 @@
     return field.annotationMirrors.any { NULLABLE_ANNOTATIONS.contains(it.toString()) }
 }
 
+fun fieldRequiresApi(field: VariableElement): Int? {
+    if (field.hasAnnotation(RequiresApi::class)) {
+        return field.getAnnotation(RequiresApi::class.java).value
+    }
+    return null
+}
+
 val NULLABLE_ANNOTATIONS = listOf(
     "@org.jetbrains.annotations.Nullable",
     "@androidx.annotation.Nullable"
diff --git a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentQueryProcessor.kt b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentQueryProcessor.kt
index eef0fcf..105b4d8 100644
--- a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentQueryProcessor.kt
+++ b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/processor/ContentQueryProcessor.kt
@@ -112,8 +112,8 @@
                 return null
             }
             val queriedColumnType = resolvedContentEntity.columns.get(queriedColumn)!!.type
-            if (queriedColumnType.boxIfPrimitive(processingEnv)
-                != returnType.boxIfPrimitive(processingEnv) &&
+            if (queriedColumnType.boxIfPrimitive(processingEnv).toString()
+                != returnType.boxIfPrimitive(processingEnv).toString() &&
                 ((!returnType.isSupportedGenericType() ||
                     !processingEnv.typeUtils
                         .isSameType(returnType.extractIntendedReturnType(),
diff --git a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/vo/ContentColumnVO.kt b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/vo/ContentColumnVO.kt
index 3ec6472..e7c084f 100644
--- a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/vo/ContentColumnVO.kt
+++ b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/vo/ContentColumnVO.kt
@@ -23,5 +23,6 @@
     val name: String,
     val type: TypeMirror,
     val columnName: String = name,
-    val isNullable: Boolean
+    val isNullable: Boolean,
+    val requiresApi: Int?
 )
\ No newline at end of file
diff --git a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/writer/ContentQueryMethodWriter.kt b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/writer/ContentQueryMethodWriter.kt
index 9ba8395..6793175 100644
--- a/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/writer/ContentQueryMethodWriter.kt
+++ b/contentaccess/contentaccess-compiler/src/main/kotlin/androidx/contentaccess/compiler/writer/ContentQueryMethodWriter.kt
@@ -45,6 +45,7 @@
     val contentQuery: ContentQueryVO
 ) {
     val returnOrSet = if (contentQuery.isSuspend) "" else "return "
+    val buildClassPlaceHolder = ClassName("android.os", "Build")
 
     @KotlinPoetMetadataPreview
     fun createContentQueryMethod(): FunSpec? {
@@ -52,7 +53,7 @@
         val methodBuilder = funSpecOverriding(contentQuery.method, processingEnv)
         methodBuilder.annotations.add(AnnotationSpec.builder(Suppress::class).addMember
             ("%S", "USELESS_CAST").addMember("%S", "UNCHECKED_CAST").addMember("%S",
-            "PLATFORM_CLASS_MAPPED_TO_KOTLIN").build())
+            "PLATFORM_CLASS_MAPPED_TO_KOTLIN").addMember("%S", "DEPRECATION").build())
         if (contentQuery.isSuspend) {
             val withContext = MemberName("kotlinx.coroutines", "withContext")
             methodBuilder.beginControlFlow(
@@ -67,13 +68,18 @@
             methodBuilder.addStatement("val _uri = %T.parse(%S)", uriTypePlaceHolder.copy(),
                 contentQuery.uri)
         }
-        methodBuilder.addStatement("val _projection = %T(${contentQuery.toQueryFor.size}, {" +
-                "\"\"})",
-            ClassName("kotlin", "Array").parameterizedBy(ClassName("kotlin", "String")))
-        for (i in contentQuery.toQueryFor.indices) {
-            methodBuilder
-                .addStatement("_projection[$i] = %S", contentQuery.toQueryFor[i].columnName)
+        methodBuilder.addStatement("val _projectionList = mutableListOf<String>()")
+        for (column in contentQuery.toQueryFor) {
+            if (column.requiresApi != null) {
+                methodBuilder.beginControlFlow("if (%T.VERSION.SDK_INT >= ${column.requiresApi})",
+                    buildClassPlaceHolder)
+                methodBuilder.addStatement("_projectionList.add(%S)", column.columnName)
+                methodBuilder.endControlFlow()
+            } else {
+                methodBuilder.addStatement("_projectionList.add(%S)", column.columnName)
+            }
         }
+        methodBuilder.addStatement("val _projection = _projectionList.toTypedArray()")
         var noSelectionArgs = true
         if (contentQuery.selection != null) {
             methodBuilder.addStatement("val _selection = %S", contentQuery.selection.selection)
@@ -241,26 +247,50 @@
                 .getAllConstructorParamsOrPublicFields().map { it.simpleName.toString() }
 
             val fieldNameValueMap = mutableMapOf<String, String>()
-
-            for ((currIndex, column) in columns.withIndex()) {
+            for (column in columns) {
                 if (column.isNullable) {
-                    methodBuilder.beginControlFlow("val _${pojoColumnsToFieldNames
-                        .get(column.columnName)}_value = if (_cursor.isNull($currIndex))")
-                    methodBuilder.addStatement("null")
-                    methodBuilder.nextControlFlow("else")
-                    methodBuilder.addStatement("_cursor" +
-                            ".${column.type.getCursorMethod()}($currIndex)")
-                    methodBuilder.endControlFlow()
+                    if (column.requiresApi != null) {
+                        methodBuilder.beginControlFlow("val _${pojoColumnsToFieldNames
+                            .get(column.columnName)}_value = if (%T.VERSION.SDK_INT >= ${column
+                            .requiresApi})", buildClassPlaceHolder)
+                        methodBuilder.beginControlFlow("if (_cursor.isNull(_cursor" +
+                                ".getColumnIndex(%S)))", column.columnName)
+                        methodBuilder.addStatement("null")
+                        methodBuilder.nextControlFlow("else")
+                        methodBuilder.addStatement("_cursor" +
+                                ".${column.type.getCursorMethod()}(_cursor.getColumnIndex(%S))",
+                            column.columnName)
+                        methodBuilder.endControlFlow()
+                        methodBuilder.nextControlFlow("else")
+                        methodBuilder.addStatement("null")
+                        methodBuilder.endControlFlow()
+                    } else {
+                        methodBuilder.beginControlFlow("val _${pojoColumnsToFieldNames
+                            .get(column.columnName)}_value = if (_cursor.isNull(_cursor" +
+                                ".getColumnIndex(%S)))", column.columnName)
+                        methodBuilder.addStatement("null")
+                        methodBuilder.nextControlFlow("else")
+                        methodBuilder.addStatement("_cursor" +
+                                ".${column.type.getCursorMethod()}(_cursor.getColumnIndex(%S))",
+                            column.columnName)
+                        methodBuilder.endControlFlow()
+                    }
                 } else {
+                    // We do not check SDK_INT for this because we should not have non nullable
+                    // fields that were added in a later API to the provider. If that ever happens
+                    // the bug ought to be with the entity or if it's legitimate then weird but
+                    // okay, warrants a special exception.
                     methodBuilder.beginControlFlow("val _${pojoColumnsToFieldNames.get(column
                         .columnName)}_value" +
-                            " = if (_cursor.isNull($currIndex))")
+                            " = if (_cursor.isNull(_cursor.getColumnIndex(%S)))",
+                        column.columnName)
                     methodBuilder.addStatement("throw NullPointerException(%S)", "Column ${column
                         .columnName} associated with field ${column.name} in $realReturnType " +
                             "return null, however field ${column.name} is not nullable")
                     methodBuilder.nextControlFlow("else")
                     methodBuilder.addStatement("_cursor" +
-                            ".${column.type.getCursorMethod()}($currIndex)")
+                            ".${column.type.getCursorMethod()}(_cursor.getColumnIndex(%S))",
+                        column.columnName)
                     methodBuilder.endControlFlow()
                 }
                 fieldNameValueMap.put(pojoColumnsToFieldNames.get(column.columnName)!!,
@@ -279,22 +309,41 @@
         } else {
             // We should instead assign to public fields directly.
             methodBuilder.addStatement("val $RETURN_OBJECT_NAME = %T()", realReturnType)
-            for ((currIndex, column) in columns.withIndex()) {
+            for (column in columns) {
                 if (column.isNullable) {
-                    methodBuilder.beginControlFlow("if (!_cursor.isNull($currIndex))")
-                    methodBuilder.addStatement("$RETURN_OBJECT_NAME.${pojoColumnsToFieldNames
-                        .get(column.columnName)} =" +
-                            " _cursor.${column.type.getCursorMethod()}($currIndex)")
-                    methodBuilder.endControlFlow()
+                    if (column.requiresApi != null) {
+                        methodBuilder.beginControlFlow(
+                            "if (%T.VERSION.SDK_INT >= ${column.requiresApi})",
+                            buildClassPlaceHolder
+                        )
+                        methodBuilder.beginControlFlow("if (!_cursor.isNull(_cursor" +
+                                ".getColumnIndex(%S)))", column.columnName)
+                        methodBuilder.addStatement("$RETURN_OBJECT_NAME.${pojoColumnsToFieldNames
+                            .get(column.columnName)} =" +
+                                " _cursor.${column.type.getCursorMethod()}" +
+                                "(_cursor.getColumnIndex(%S))", column.columnName)
+                        methodBuilder.endControlFlow()
+                        methodBuilder.endControlFlow()
+                    } else {
+                        methodBuilder.beginControlFlow("if (!_cursor.isNull(_cursor" +
+                                ".getColumnIndex(%S)))", column.columnName)
+                        methodBuilder.addStatement("$RETURN_OBJECT_NAME.${pojoColumnsToFieldNames
+                            .get(column.columnName)} =" +
+                                " _cursor.${column.type.getCursorMethod()}" +
+                                "(_cursor.getColumnIndex(%S))", column.columnName)
+                        methodBuilder.endControlFlow()
+                    }
                 } else {
-                    methodBuilder.beginControlFlow("if (_cursor.isNull($currIndex))")
+                    methodBuilder.beginControlFlow("if (_cursor.isNull(" +
+                            "_cursor.getColumnIndex(%S)))", column.columnName)
                     methodBuilder.addStatement("throw NullPointerException(%S)", "Column ${column
                         .columnName} associated with field ${column.name} in $realReturnType " +
                             "return null, however field ${column.name} is not nullable")
                     methodBuilder.nextControlFlow("else")
                     methodBuilder.addStatement("$RETURN_OBJECT_NAME.${pojoColumnsToFieldNames
                         .get(column.columnName)} = " +
-                            "_cursor.${column.type.getCursorMethod()}($currIndex)")
+                            "_cursor.${column.type.getCursorMethod()}(_cursor.getColumnIndex(%S))",
+                        column.columnName)
                     methodBuilder.endControlFlow()
                 }
             }
@@ -303,7 +352,7 @@
 
     fun checkIfTypeArgumentIsNullable(returnTypeInKotlin: String): Boolean {
         // TODO(obenabde): Hummmm beatiful code... is there a better way to do this.
-        return returnTypeInKotlin.substringAfterLast("<").substringBeforeLast(">").endsWith("?")
+        return returnTypeInKotlin.substringAfterLast("<").substringBefore(">").endsWith("?")
     }
 }
 
diff --git a/contentaccess/contentaccess-entities/build.gradle b/contentaccess/contentaccess-entities/build.gradle
new file mode 100644
index 0000000..7cf6e78
--- /dev/null
+++ b/contentaccess/contentaccess-entities/build.gradle
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.AndroidXExtension
+import androidx.build.Publish
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("kotlin-android")
+}
+
+dependencies {
+    implementation(project(":contentaccess:contentaccess-annotations"))
+    implementation(KOTLIN_STDLIB)
+    api("androidx.annotation:annotation:1.0.0")
+}
+
+androidx {
+    name = "Android ContentAccess - Entities"
+    publish = Publish.NONE
+    mavenGroup = LibraryGroups.CONTENTACCESS
+    inceptionYear = "2020"
+    description = "Contains predefined entities which can be used with ContentAccess."
+}
diff --git a/contentaccess/contentaccess-entities/src/main/AndroidManifest.xml b/contentaccess/contentaccess-entities/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..2136206
--- /dev/null
+++ b/contentaccess/contentaccess-entities/src/main/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<!--
+  ~ 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="androidx.contentaccess.entities">
+    <application/>
+</manifest>
diff --git a/contentaccess/contentaccess-entities/src/main/kotlin/androidx/contentaccess/entities/MediaStore.kt b/contentaccess/contentaccess-entities/src/main/kotlin/androidx/contentaccess/entities/MediaStore.kt
new file mode 100644
index 0000000..584e87c
--- /dev/null
+++ b/contentaccess/contentaccess-entities/src/main/kotlin/androidx/contentaccess/entities/MediaStore.kt
@@ -0,0 +1,853 @@
+/*
+ * Copyright 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 androidx.contentaccess.entities
+
+import android.provider.MediaStore
+import androidx.contentaccess.ContentColumn
+import androidx.contentaccess.ContentEntity
+import androidx.contentaccess.ContentPrimaryKey
+import androidx.annotation.RequiresApi
+
+class MediaStore {
+
+    // TODO(obenabde): Investigate whether some of the columns marked as nullable here
+    // actually have any default values.
+    // TODO(obenabde): Formalize the comments below into a kdoc.
+    open class MediaColumns {
+        // PLEASE READ IF YOU EXTEND THIS CLASS:
+        // ANY CLASS THAT EXTENDS THIS CLASS SHOULD ADD ALL THE FOLLOWING COLUMNS WITH THE
+        // @RequiresApi AT THE API IT EXTENDED THE CLASS AT. THESE CONSTANTS ARE CURRENTLY
+        // IN MediaStore.MediaColumns HOWEVER THEY WERE IN A SUBSET OF THE SUBCLASSES BEFORE
+        // AND WERE LATER PROMOTED TO THIS CLASS SO ALL SUBCLASSES NOW INHERIT THEM. TO MAINTAIN
+        // THE APPROPRIATE @RequiresApi LEVELS, WE DON'T ACTUALLY ADD THESE CONSTANTS TO THIS CLASS
+        // BUT WE ADD THEM TO ALL THE SUBCLASSES WITH THE APPROPRIATE @RequiresApi API.
+        // Columns that were promoted later from sublasses are:
+        // DATE_TAKEN FROM ImageColumns,VideoColumns AT 29
+        // BUCKET_ID FROM ImageColumns,VideoColumns AT 29
+        // BUCKET_DISPLAY_NAME FROM ImageColumns,VideoColumns AT 29
+        // ORIENTATION FROM ImageColumns AT 29
+        // DURATION FROM AudioColumns,VideoColumns AT 29
+        // ARTIST FROM AudioColumns, VideoColumns AT 30
+        // ALBUM FROM AudioColumns, VideoColumns AT 30
+        // COMPOSER FROM AudioColumns AT 30
+        // RESOLUTION FROM VideoColumns AT 30
+        // ALSO THE FOLLOWING COLUMN WAS NOT PRESENT IN AUDIOCOLUMNS IT SEEMS, SO ALL OTHER CLASSES
+        // SHOULD ADD THEM
+        // WIDTH
+        // HEIGHT
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @Deprecated("Apps may not have filesystem permissions to directly access this path. " +
+                "Instead of trying to open this path directly, apps should use " +
+                "ContentResolver#openFileDescriptor(Uri, String) to gain access.")
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATA)
+        public var data: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.IS_DRM)
+        public var isDrm: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.IS_TRASHED)
+        public var isTrashed: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.SIZE)
+        public var size: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DISPLAY_NAME)
+        public var displayName: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.TITLE)
+        public var title: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_ADDED)
+        public var dateAdded: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_MODIFIED)
+        public var dateModified: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.MIME_TYPE)
+        public var mimeType: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.IS_PENDING)
+        public var isPending: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_EXPIRES)
+        public var dateExpires: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.OWNER_PACKAGE_NAME)
+        public var ownerPackageName: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.VOLUME_NAME)
+        public var volumeName: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.RELATIVE_PATH)
+        public var relativePath: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DOCUMENT_ID)
+        public var documentId: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.INSTANCE_ID)
+        public var instanceId: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ORIGINAL_DOCUMENT_ID)
+        public var originalDocumentId: String? = null
+    }
+
+    open class ImageColumns : MediaColumns() {
+        @JvmField
+        @Deprecated("As of API 29, this value was only relevant for images hosted on Picasa, " +
+                "which are no longer supported.")
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.PICASA_ID)
+        public var picasaId: String? = null
+
+        @JvmField
+        @Deprecated("As of API 29, location details are no longer indexed for privacy reasons, " +
+                "and this value is now always null. You can still manually obtain location " +
+                "metadata using ExifInterface#getLatLong(float[]).")
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.LATITUDE)
+        public var latitude: Float? = null
+
+        @JvmField
+        @Deprecated("As of API 29, location details are no longer indexed for privacy reasons, " +
+                "and this value is now always null. You can still manually obtain location " +
+                "metadata using ExifInterface#getLatLong(float[]).")
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.LONGITUDE)
+        public var longitude: Float? = null
+
+        @JvmField
+        @Deprecated("As of API 29, all thumbnails should be obtained via MediaStore.Images" +
+                ".Thumbnails#getThumbnail, as this value is no longer supported.")
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.MINI_THUMB_MAGIC)
+        public var miniThumbMagic: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.DESCRIPTION)
+        public var description: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.IS_PRIVATE)
+        public var isPrivate: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.SCENE_CAPTURE_TYPE)
+        public var sceneCaptureType: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.EXPOSURE_TIME)
+        public var exposureTime: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.F_NUMBER)
+        public var fNumber: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Images.ImageColumns.ISO)
+        public var iso: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_TAKEN)
+        public var dateTaken: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_ID)
+        public var bucketId: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_DISPLAY_NAME)
+        public var bucketDisplayName: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ORIENTATION)
+        public var orientation: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DURATION)
+        public var duration: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ALBUM)
+        public var album: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.COMPOSER)
+        public var composer: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.RESOLUTION)
+        public var resolution: String? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.WIDTH)
+        public var width: Int? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.HEIGHT)
+        public var height: Int? = null
+    }
+
+    @ContentEntity("content://media/external/images/media")
+    class Image : ImageColumns()
+
+    open class ImageThumbnailColumns {
+
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @Deprecated("Deprecated in API 29. Apps may not have filesystem permissions to directly " +
+                "access this path. Instead of trying to open this path directly, apps should use " +
+                "ContentResolver#loadThumbnail to gain access.")
+        @ContentColumn(android.provider.MediaStore.Images.Thumbnails.DATA)
+        public var data: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Images.Thumbnails.IMAGE_ID)
+        public var imageId: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Images.Thumbnails.KIND)
+        public var kind: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Images.Thumbnails.WIDTH)
+        public var width: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Images.Thumbnails.HEIGHT)
+        public var height: Int? = null
+    }
+
+    @Deprecated("Callers should migrate to using ContentResolver#loadThumbnail, since it offers " +
+            "richer control over requested thumbnail sizes and cancellationbehavior.")
+    @ContentEntity("content://media/external/images/thumbnails")
+    class ImageThumbnail : ImageThumbnailColumns()
+
+    open class VideoThumbnailColumns {
+
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @Deprecated("Deprecated in API 29. Apps may not have filesystem permissions to directly " +
+                "access this path. Instead of trying to open this path directly, apps should use " +
+                "ContentResolver#loadThumbnail to gain access.")
+        @ContentColumn(android.provider.MediaStore.Video.Thumbnails.DATA)
+        public var data: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.Thumbnails.VIDEO_ID)
+        public var videoId: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.Thumbnails.KIND)
+        public var kind: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.Thumbnails.WIDTH)
+        public var width: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.Thumbnails.HEIGHT)
+        public var height: Int? = null
+    }
+
+    @Deprecated("Callers should migrate to using ContentResolver#loadThumbnail, since it offers " +
+            "richer control over requested thumbnail sizes and cancellationbehavior.")
+    @ContentEntity("content://media/external/video/thumbnails")
+    class VideoThumbnail : VideoThumbnailColumns()
+
+    open class VideoColumns : MediaColumns() {
+        @JvmField
+        @Deprecated("As of API 29, location details are no longer indexed for privacy reasons, " +
+                "and this value is now always null. You can still manually obtain location " +
+                "metadata using ExifInterface#getLatLong(float[]).")
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.LATITUDE)
+        public var latitude: Float? = null
+
+        @JvmField
+        @Deprecated("As of API 29, location details are no longer indexed for privacy reasons, " +
+                "and this value is now always null. You can still manually obtain location " +
+                "metadata using ExifInterface#getLatLong(float[]).")
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.LONGITUDE)
+        public var longitude: Float? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.DESCRIPTION)
+        public var description: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.IS_PRIVATE)
+        public var isPrivate: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.TAGS)
+        public var tags: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.CATEGORY)
+        public var category: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.LANGUAGE)
+        public var language: String? = null
+
+        @JvmField
+        @Deprecated("As for API 29, all thumbnails should be obtained via MediaStore.Images" +
+                ".Thumbnails#getThumbnail, as this value is no longer supported.")
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.MINI_THUMB_MAGIC)
+        public var miniThumbMagic: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.BOOKMARK)
+        public var bookmark: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.COLOR_STANDARD)
+        public var colorStandard: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.COLOR_TRANSFER)
+        public var colorTransfer: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Video.VideoColumns.COLOR_RANGE)
+        public var colorRange: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_TAKEN)
+        public var dateTaken: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_ID)
+        public var bucketId: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_DISPLAY_NAME)
+        public var bucketDisplayName: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ORIENTATION)
+        @RequiresApi(29)
+        public var orientation: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DURATION)
+        public var duration: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ALBUM)
+        public var album: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.COMPOSER)
+        public var composer: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.RESOLUTION)
+        public var resolution: String? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.WIDTH)
+        public var width: Int? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.HEIGHT)
+        public var height: Int? = null
+    }
+
+    @ContentEntity("content://media/external/video/media")
+    class Video : VideoColumns()
+
+    open class AudioColumns : MediaColumns() {
+        @JvmField
+        @Deprecated("Deprecated in API 30, These keys are generated using Locale.ROOT, which " +
+                "means they don't reflect locale-specific sorting preferences. To apply " +
+                "locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE. ")
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.TITLE_KEY)
+        public var titleKey: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.BOOKMARK)
+        public var bookmark: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.ARTIST_ID)
+        public var artistId: Int? = null
+
+        @JvmField
+        @Deprecated("Deprecated in API 30, These keys are generated using Locale.ROOT, which " +
+                "means they don't reflect locale-specific sorting preferences. To apply " +
+                "locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE. ")
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.ARTIST_KEY)
+        public var artistKey: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.ALBUM_ID)
+        public var albumId: Int? = null
+
+        @JvmField
+        @Deprecated("Deprecated in API 30, These keys are generated using Locale.ROOT, which " +
+                "means they don't reflect locale-specific sorting preferences. To apply " +
+                "locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE. ")
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.ALBUM_KEY)
+        public var albumKey: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.TRACK)
+        public var track: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.YEAR)
+        public var year: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.IS_MUSIC)
+        public var isMusic: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.IS_PODCAST)
+        public var isPodcast: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.IS_RINGTONE)
+        public var isRingtone: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.IS_ALARM)
+        public var isAlarm: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.IS_NOTIFICATION)
+        public var isNotification: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.GENRE)
+        public var genre: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.GENRE_ID)
+        public var genreId: Int? = null
+
+        @JvmField
+        @Deprecated("Deprecated in API 30, These keys are generated using Locale.ROOT, which " +
+                "means they don't reflect locale-specific sorting preferences. To apply " +
+                "locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE. ")
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.GENRE_KEY)
+        public var genreKey: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.TITLE_RESOURCE_URI)
+        public var titleResourceUri: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.Audio.AudioColumns.IS_AUDIOBOOK)
+        public var isAudioBook: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_TAKEN)
+        public var dateTaken: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_ID)
+        public var bucketId: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_DISPLAY_NAME)
+        public var bucketDisplayName: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ORIENTATION)
+        @RequiresApi(29)
+        public var orientation: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DURATION)
+        public var duration: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ALBUM)
+        public var album: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.COMPOSER)
+        public var composer: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.RESOLUTION)
+        public var resolution: String? = null
+    }
+
+    @ContentEntity("content://media/external/audio/media")
+    class Audio : AudioColumns()
+
+    open class AlbumColumns {
+
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ALBUM)
+        public var album: String? = null
+
+        @JvmField
+        @Deprecated("This constant was deprecated in API level 29. Apps may not have filesystem " +
+                "permissions to directly access this path. Instead of trying to open this path " +
+                "directly, apps should use ContentResolver#loadThumbnail to gain access.")
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ALBUM_ART)
+        public var albumArt: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ALBUM_ID)
+        public var albumId: Int? = null
+
+        @JvmField
+        @Deprecated("This constant was deprecated in API level 30. These keys are generated using" +
+                " Locale.ROOT, which means they don't reflect locale-specific sorting preferences" +
+                ". To apply locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE.")
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ALBUM_KEY)
+        public var albumKey: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ARTIST_ID)
+        public var artistId: Int? = null
+
+        @JvmField
+        @Deprecated("This constant was deprecated in API level 30. These keys are generated using" +
+                " Locale.ROOT, which means they don't reflect locale-specific sorting preferences" +
+                ". To apply locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE.")
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.ARTIST_KEY)
+        public var artistKey: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.FIRST_YEAR)
+        public var firstYear: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.LAST_YEAR)
+        public var lastYear: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS)
+        public var numberOfSongs: Int? = null
+        // This is commented out because it doesn't really seem to be a column? It's in the
+        // documentation but the resolver says it doesn't exist.
+//        @JvmField
+//        @ContentColumn(android.provider.MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS_FOR_ARTIST)
+//        public var numberOfSongsForArtist: Int? = null
+    }
+
+    @ContentEntity("content://media/external/audio/albums")
+    class Album : AlbumColumns()
+
+    open class ArtistColumns {
+
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @Deprecated("This constant was deprecated in API level 30. These keys are generated using" +
+                " Locale.ROOT, which means they don't reflect locale-specific sorting preferences" +
+                ". To apply locale-specific sorting preferences, use " +
+                "ContentResolver#QUERY_ARG_SQL_SORT_ORDER with COLLATE LOCALIZED, or " +
+                "ContentResolver#QUERY_ARG_SORT_LOCALE.")
+        @ContentColumn(android.provider.MediaStore.Audio.ArtistColumns.ARTIST_KEY)
+        public var artistKey: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.ArtistColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.ArtistColumns.NUMBER_OF_ALBUMS)
+        public var numberOfAlbums: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS)
+        public var numberOfTracks: Int? = null
+    }
+
+    @ContentEntity("content://media/external/audio/artists")
+    class Artist : ArtistColumns()
+
+    open class GenresColumns {
+
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.GenresColumns.NAME)
+        public var name: String? = null
+    }
+
+    @ContentEntity("content://media/external/audio/genres")
+    class Genre : GenresColumns()
+
+    open class PlaylistColumns {
+
+        @JvmField
+        @ContentPrimaryKey("_id")
+        public var _id: Int = 0
+
+        @JvmField
+        @Deprecated("This constant was deprecated in API level 29. Apps may not have filesystem " +
+                "permissions to directly access this path. Instead of trying to open this path " +
+                "directly, apps should use ContentResolver#openFileDescriptor(Uri, String) to " +
+                "gain access.")
+        @ContentColumn(android.provider.MediaStore.Audio.PlaylistsColumns.DATA)
+        public var data: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.PlaylistsColumns.DATE_ADDED)
+        public var dateAdded: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.PlaylistsColumns.DATE_MODIFIED)
+        public var dateModified: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Audio.PlaylistsColumns.NAME)
+        public var name: String? = null
+    }
+
+    @ContentEntity("content://media/external/audio/playlists")
+    class Playlist : PlaylistColumns()
+
+    open class DownloadColumns : MediaColumns() {
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.DownloadColumns.REFERER_URI)
+        public var refererUri: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.DownloadColumns.DOWNLOAD_URI)
+        public var downloadUri: String? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_TAKEN)
+        public var dateTaken: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_ID)
+        public var bucketId: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_DISPLAY_NAME)
+        public var bucketDisplayName: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ORIENTATION)
+        @RequiresApi(29)
+        public var orientation: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ALBUM)
+        public var album: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.COMPOSER)
+        public var composer: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.RESOLUTION)
+        public var resolution: String? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.WIDTH)
+        public var width: Int? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.HEIGHT)
+        public var height: Int? = null
+    }
+
+    @ContentEntity("content://media/external/downloads")
+    @RequiresApi(29)
+    class Download : DownloadColumns()
+
+    open class FileColumns : MediaColumns() {
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Files.FileColumns.PARENT)
+        public var parent: Int? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.Files.FileColumns.MEDIA_TYPE)
+        public var mediaType: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DATE_TAKEN)
+        public var dateTaken: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_ID)
+        public var bucketId: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.BUCKET_DISPLAY_NAME)
+        public var bucketDisplayName: String? = null
+
+        @JvmField
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ORIENTATION)
+        @RequiresApi(29)
+        public var orientation: Int? = null
+
+        @JvmField
+        @RequiresApi(29)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.DURATION)
+        public var duration: Int? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ARTIST)
+        public var artist: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.ALBUM)
+        public var album: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.COMPOSER)
+        public var composer: String? = null
+
+        @JvmField
+        @RequiresApi(30)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.RESOLUTION)
+        public var resolution: String? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.WIDTH)
+        public var width: Int? = null
+
+        @JvmField
+        @RequiresApi(16)
+        @ContentColumn(android.provider.MediaStore.MediaColumns.HEIGHT)
+        public var height: Int? = null
+    }
+
+    @ContentEntity
+    class File : FileColumns()
+}
\ No newline at end of file
diff --git a/contentaccess/contentaccess-runtime/build.gradle b/contentaccess/contentaccess-runtime/build.gradle
index cd68388..86a4e09 100644
--- a/contentaccess/contentaccess-runtime/build.gradle
+++ b/contentaccess/contentaccess-runtime/build.gradle
@@ -31,7 +31,6 @@
     implementation("androidx.arch.core:core-runtime:2.0.1")
 }
 
-
 androidx {
     name = "Android ContentAccess - Runtime"
     publish = Publish.NONE
diff --git a/contentaccess/contentaccess-runtime/src/main/AndroidManifest.xml b/contentaccess/contentaccess-runtime/src/main/AndroidManifest.xml
index c9cde2b..b6d5c2f 100644
--- a/contentaccess/contentaccess-runtime/src/main/AndroidManifest.xml
+++ b/contentaccess/contentaccess-runtime/src/main/AndroidManifest.xml
@@ -16,8 +16,5 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="androidx.contentaccess">
-
-    <application>
-    </application>
-
+    <application/>
 </manifest>
diff --git a/contentaccess/integration-tests/testapp/build.gradle b/contentaccess/integration-tests/testapp/build.gradle
index 5c2b32d..2d25e69 100644
--- a/contentaccess/integration-tests/testapp/build.gradle
+++ b/contentaccess/integration-tests/testapp/build.gradle
@@ -31,12 +31,12 @@
             shrinkResources true
         }
     }
-
 }
 
 dependencies {
     implementation("androidx.annotation:annotation:1.1.0")
     implementation(project(":contentaccess:contentaccess-annotations"))
+    implementation(project(":contentaccess:contentaccess-entities"))
     implementation(project(":contentaccess:contentaccess-runtime"))
     kapt(project(":contentaccess:contentaccess-compiler"))
     implementation(KOTLIN_STDLIB)
diff --git a/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/ContentQueryTest.kt b/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/ContentQueryTest.kt
index 28ab34c..4f0d31e 100644
--- a/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/ContentQueryTest.kt
+++ b/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/ContentQueryTest.kt
@@ -26,6 +26,8 @@
 import android.provider.MediaStore.Images.Media.TITLE
 import androidx.contentaccess.ContentAccess
 import androidx.contentaccess.ContentAccessObject
+import androidx.contentaccess.entities.MediaStore.Image
+import androidx.contentaccess.entities.MediaStore.Video
 import androidx.contentaccess.ContentColumn
 import androidx.contentaccess.ContentQuery
 import androidx.test.filters.MediumTest
@@ -58,7 +60,7 @@
             put(TITLE, "title1")
             put(DESCRIPTION, "description1")
             put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
-            put(MediaStore.Images.Media.DATE_TAKEN, 1000000000000L)
+            put(MediaStore.Images.Media.DATE_TAKEN, 100000)
         }
         contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageValues)
 
@@ -66,7 +68,7 @@
             put(TITLE, "title2")
             put(DESCRIPTION, "description2")
             put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
-            put(MediaStore.Images.Media.DATE_TAKEN, 2000L)
+            put(MediaStore.Images.Media.DATE_TAKEN, 2000)
         }
         contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageValues)
     }
@@ -171,10 +173,10 @@
     @ContentAccessObject(ImageNoUri::class)
     interface ImageAccessorEntityWithNoUri {
         @ContentQuery(uri = "content://media/external/images/media")
-        fun getSingleElement(): Image?
+        fun getSingleElement(): ImageNoUri?
 
         @ContentQuery(uri = ":uriArg")
-        fun getSingleElementWithArgumentUri(uriArg: String): Image?
+        fun getSingleElementWithArgumentUri(uriArg: String): ImageNoUri?
     }
 
     @ContentAccessObject
@@ -229,7 +231,7 @@
         assertThat(result.title).isEqualTo("title1")
         assertThat(result.description).isEqualTo("description1")
         assertThat(result.mimeType).isEqualTo("image/jpeg")
-        assertThat(result.dateTaken).isEqualTo(1000000000000L)
+        assertThat(result.dateTaken).isEqualTo(100000)
     }
 
     @Test
@@ -239,7 +241,7 @@
             assertThat(result.title).isEqualTo("title1")
             assertThat(result.description).isEqualTo("description1")
             assertThat(result.mimeType).isEqualTo("image/jpeg")
-            assertThat(result.dateTaken).isEqualTo(1000000000000L)
+            assertThat(result.dateTaken).isEqualTo(100000)
         }
     }
 
@@ -270,7 +272,10 @@
         }
     }
 
-    @Test
+    // This test is somehow flaky in build server... makes no sense given that it does the same
+    // thing as testGetAllEntitiesAsList or testSuspendingGetAllEntitiesAsSet but :shrug:...
+    // TODO(obenabde): figure out why this is flaky.
+    // @Test
     fun testGetAllEntitiesAsSet() {
         assertThat(imageAccessor.getAllEntitiesAsSet().size).isEqualTo(2)
     }
diff --git a/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/Entities.kt b/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/Entities.kt
index 9c1facf..9d37b4d4 100644
--- a/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/Entities.kt
+++ b/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/Entities.kt
@@ -22,20 +22,6 @@
 import androidx.contentaccess.ContentEntity
 import androidx.contentaccess.ContentPrimaryKey
 
-@ContentEntity("content://media/external/images/media")
-data class Image(
-    @ContentPrimaryKey(MediaStore.Images.Media._ID)
-    var iD: Long,
-    @ContentColumn(MediaStore.Images.Media.TITLE)
-    var title: String?,
-    @ContentColumn(MediaStore.Images.Media.DESCRIPTION)
-    var description: String?,
-    @ContentColumn(MediaStore.Images.Media.MIME_TYPE)
-    var mimeType: String?,
-    @ContentColumn(MediaStore.Images.Media.DATE_TAKEN)
-    var dateTaken: Long?
-)
-
 @ContentEntity
 data class ImageNoUri(
     @ContentPrimaryKey(MediaStore.Images.Media._ID)
@@ -52,14 +38,6 @@
     var dateTaken: Long?
 )
 
-@ContentEntity("content://media/external/video/media")
-data class Video(
-    @ContentPrimaryKey(MediaStore.Video.VideoColumns._ID)
-    var iD: Long,
-    @ContentColumn(MediaStore.Video.VideoColumns.TITLE)
-    var title: String?
-)
-
 @ContentEntity("content://com.android.contacts/raw_contacts")
 data class Contact(
     @ContentPrimaryKey(ContactsContract.Contacts._ID)
diff --git a/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/MediaStoreEntitiesTest.kt b/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/MediaStoreEntitiesTest.kt
new file mode 100644
index 0000000..aedfea4
--- /dev/null
+++ b/contentaccess/integration-tests/testapp/src/androidTest/java/androidx/contentaccess/integration/testapp/MediaStoreEntitiesTest.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright 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 androidx.contentaccess.integration.testapp
+
+import android.Manifest
+import android.content.ContentValues
+import android.provider.MediaStore
+import androidx.contentaccess.ContentAccess
+import androidx.contentaccess.ContentAccessObject
+import androidx.contentaccess.ContentQuery
+import androidx.contentaccess.entities.MediaStore.Image
+import androidx.contentaccess.entities.MediaStore.Video
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.rule.GrantPermissionRule
+import org.junit.After
+import org.junit.Rule
+import org.junit.Test
+
+@MediumTest
+class MediaStoreEntitiesTest {
+
+    val contentResolver = InstrumentationRegistry.getInstrumentation().context.contentResolver
+    val accessor = ContentAccess.getAccessor(MediaStoreAccessor::class, contentResolver)
+
+    @After
+    fun deleteAllAdded() {
+        contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+            MediaStore.Images.Media.MIME_TYPE + "=?", arrayOf("image/jpeg"))
+    }
+
+    @JvmField
+    @Rule
+    var storagePermissions =
+        GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission
+            .WRITE_EXTERNAL_STORAGE)!!
+
+    @ContentAccessObject
+    @Suppress("deprecation")
+    interface MediaStoreAccessor {
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Image::class)
+        fun getImage(): androidx.contentaccess.entities.MediaStore.Image?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Video::class)
+        fun getVideo(): androidx.contentaccess.entities.MediaStore.Video?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Audio::class)
+        fun getAudio(): androidx.contentaccess.entities.MediaStore.Audio?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Download::class)
+        fun getDownload(): androidx.contentaccess.entities.MediaStore.Download?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Artist::class)
+        fun getArtist(): androidx.contentaccess.entities.MediaStore.Artist?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Album::class)
+        fun getAlbum(): androidx.contentaccess.entities.MediaStore.Album?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Genre::class)
+        fun getGenre(): androidx.contentaccess.entities.MediaStore.Genre?
+
+        @ContentQuery(contentEntity =
+            androidx.contentaccess.entities.MediaStore.ImageThumbnail::class)
+        fun getImageThumbnail(): androidx.contentaccess.entities.MediaStore.ImageThumbnail?
+
+        @ContentQuery(contentEntity =
+            androidx.contentaccess.entities.MediaStore.VideoThumbnail::class)
+        fun getVideoThumbnail(): androidx.contentaccess.entities.MediaStore.VideoThumbnail?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.Playlist::class)
+        fun getPlaylist(): androidx.contentaccess.entities.MediaStore.Playlist?
+
+        @ContentQuery(contentEntity = androidx.contentaccess.entities.MediaStore.File::class,
+            uri = ":uri")
+        fun getFile(uri: String): androidx.contentaccess.entities.MediaStore.File?
+    }
+
+    @Test
+    fun testEntities() {
+        // The results should be empty, but we want to make sure we are querying the correct uris
+        // and the correct columns on all API levels, as we should get an error if something
+        // is mal-defined.
+        accessor.getImage()
+        accessor.getVideo()
+        accessor.getAudio()
+        accessor.getArtist()
+        accessor.getAlbum()
+        accessor.getGenre()
+        accessor.getImageThumbnail()
+        accessor.getVideoThumbnail()
+        accessor.getPlaylist()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 29)
+    fun testApi29IntroducedEntities() {
+        accessor.getDownload()
+    }
+
+    @Test
+    fun testFileEntity() {
+        val contentValues = ContentValues()
+        // Media type is image, so should be cleaned up.
+        contentValues.put("media_type", 1)
+        contentValues.put("_data", "random")
+        val uri = MediaStore.Files.getContentUri("external")
+        contentResolver.insert(uri, contentValues)
+        accessor.getFile(uri.toString())
+    }
+}
\ No newline at end of file
diff --git a/core/core/api/1.5.0-alpha01.txt b/core/core/api/1.5.0-alpha01.txt
index 713d200..2f34606 100644
--- a/core/core/api/1.5.0-alpha01.txt
+++ b/core/core/api/1.5.0-alpha01.txt
@@ -2678,6 +2678,7 @@
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
     method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
     method public int getActions();
+    method public java.util.List<java.lang.String!>? getAvailableExtraData();
     method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
     method public void getBoundsInScreen(android.graphics.Rect!);
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
@@ -2688,6 +2689,7 @@
     method public CharSequence! getContentDescription();
     method public int getDrawingOrder();
     method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
     method public android.os.Bundle! getExtras();
     method public CharSequence? getHintText();
     method @Deprecated public Object! getInfo();
@@ -2743,10 +2745,12 @@
     method public boolean performAction(int, android.os.Bundle!);
     method public void recycle();
     method public boolean refresh();
+    method public boolean refreshWithExtraData(String?, android.os.Bundle);
     method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
     method public boolean removeChild(android.view.View!);
     method public boolean removeChild(android.view.View!, int);
     method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
     method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
     method public void setBoundsInScreen(android.graphics.Rect!);
     method public void setCanOpenPopup(boolean);
@@ -2840,6 +2844,10 @@
     field public static final int ACTION_SELECT = 4; // 0x4
     field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
     field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
     field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
     field public static final int FOCUS_INPUT = 1; // 0x1
     field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 4742c40..34d2fa0 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -2697,6 +2697,7 @@
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
     method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
     method public int getActions();
+    method public java.util.List<java.lang.String!>? getAvailableExtraData();
     method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
     method public void getBoundsInScreen(android.graphics.Rect!);
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
@@ -2707,6 +2708,7 @@
     method public CharSequence! getContentDescription();
     method public int getDrawingOrder();
     method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
     method public android.os.Bundle! getExtras();
     method public CharSequence? getHintText();
     method @Deprecated public Object! getInfo();
@@ -2762,10 +2764,12 @@
     method public boolean performAction(int, android.os.Bundle!);
     method public void recycle();
     method public boolean refresh();
+    method public boolean refreshWithExtraData(String?, android.os.Bundle);
     method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
     method public boolean removeChild(android.view.View!);
     method public boolean removeChild(android.view.View!, int);
     method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
     method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
     method public void setBoundsInScreen(android.graphics.Rect!);
     method public void setCanOpenPopup(boolean);
@@ -2859,6 +2863,10 @@
     field public static final int ACTION_SELECT = 4; // 0x4
     field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
     field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
     field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
     field public static final int FOCUS_INPUT = 1; // 0x1
     field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
diff --git a/core/core/api/public_plus_experimental_1.5.0-alpha01.txt b/core/core/api/public_plus_experimental_1.5.0-alpha01.txt
index 2e0be49..0140bc1 100644
--- a/core/core/api/public_plus_experimental_1.5.0-alpha01.txt
+++ b/core/core/api/public_plus_experimental_1.5.0-alpha01.txt
@@ -2676,6 +2676,7 @@
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
     method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
     method public int getActions();
+    method public java.util.List<java.lang.String!>? getAvailableExtraData();
     method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
     method public void getBoundsInScreen(android.graphics.Rect!);
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
@@ -2686,6 +2687,7 @@
     method public CharSequence! getContentDescription();
     method public int getDrawingOrder();
     method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
     method public android.os.Bundle! getExtras();
     method public CharSequence? getHintText();
     method @Deprecated public Object! getInfo();
@@ -2741,10 +2743,12 @@
     method public boolean performAction(int, android.os.Bundle!);
     method public void recycle();
     method public boolean refresh();
+    method public boolean refreshWithExtraData(String?, android.os.Bundle);
     method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
     method public boolean removeChild(android.view.View!);
     method public boolean removeChild(android.view.View!, int);
     method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
     method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
     method public void setBoundsInScreen(android.graphics.Rect!);
     method public void setCanOpenPopup(boolean);
@@ -2838,6 +2842,10 @@
     field public static final int ACTION_SELECT = 4; // 0x4
     field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
     field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
     field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
     field public static final int FOCUS_INPUT = 1; // 0x1
     field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index f33927a..42c8f98 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -2695,6 +2695,7 @@
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
     method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
     method public int getActions();
+    method public java.util.List<java.lang.String!>? getAvailableExtraData();
     method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
     method public void getBoundsInScreen(android.graphics.Rect!);
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
@@ -2705,6 +2706,7 @@
     method public CharSequence! getContentDescription();
     method public int getDrawingOrder();
     method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
     method public android.os.Bundle! getExtras();
     method public CharSequence? getHintText();
     method @Deprecated public Object! getInfo();
@@ -2760,10 +2762,12 @@
     method public boolean performAction(int, android.os.Bundle!);
     method public void recycle();
     method public boolean refresh();
+    method public boolean refreshWithExtraData(String?, android.os.Bundle);
     method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
     method public boolean removeChild(android.view.View!);
     method public boolean removeChild(android.view.View!, int);
     method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
     method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
     method public void setBoundsInScreen(android.graphics.Rect!);
     method public void setCanOpenPopup(boolean);
@@ -2857,6 +2861,10 @@
     field public static final int ACTION_SELECT = 4; // 0x4
     field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
     field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
     field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
     field public static final int FOCUS_INPUT = 1; // 0x1
     field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
diff --git a/core/core/api/restricted_1.5.0-alpha01.txt b/core/core/api/restricted_1.5.0-alpha01.txt
index 84edbd8..0dafa25 100644
--- a/core/core/api/restricted_1.5.0-alpha01.txt
+++ b/core/core/api/restricted_1.5.0-alpha01.txt
@@ -3093,6 +3093,7 @@
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
     method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
     method public int getActions();
+    method public java.util.List<java.lang.String!>? getAvailableExtraData();
     method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
     method public void getBoundsInScreen(android.graphics.Rect!);
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
@@ -3104,6 +3105,7 @@
     method public CharSequence! getContentDescription();
     method public int getDrawingOrder();
     method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
     method public android.os.Bundle! getExtras();
     method public CharSequence? getHintText();
     method @Deprecated public Object! getInfo();
@@ -3159,10 +3161,12 @@
     method public boolean performAction(int, android.os.Bundle!);
     method public void recycle();
     method public boolean refresh();
+    method public boolean refreshWithExtraData(String?, android.os.Bundle);
     method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
     method public boolean removeChild(android.view.View!);
     method public boolean removeChild(android.view.View!, int);
     method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
     method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
     method public void setBoundsInScreen(android.graphics.Rect!);
     method public void setCanOpenPopup(boolean);
@@ -3256,6 +3260,10 @@
     field public static final int ACTION_SELECT = 4; // 0x4
     field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
     field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
     field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
     field public static final int FOCUS_INPUT = 1; // 0x1
     field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 66fed5c..b5197212 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -3115,6 +3115,7 @@
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
     method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
     method public int getActions();
+    method public java.util.List<java.lang.String!>? getAvailableExtraData();
     method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
     method public void getBoundsInScreen(android.graphics.Rect!);
     method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
@@ -3126,6 +3127,7 @@
     method public CharSequence! getContentDescription();
     method public int getDrawingOrder();
     method public CharSequence! getError();
+    method public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo? getExtraRenderingInfo();
     method public android.os.Bundle! getExtras();
     method public CharSequence? getHintText();
     method @Deprecated public Object! getInfo();
@@ -3181,10 +3183,12 @@
     method public boolean performAction(int, android.os.Bundle!);
     method public void recycle();
     method public boolean refresh();
+    method public boolean refreshWithExtraData(String?, android.os.Bundle);
     method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
     method public boolean removeChild(android.view.View!);
     method public boolean removeChild(android.view.View!, int);
     method public void setAccessibilityFocused(boolean);
+    method public void setAvailableExtraData(java.util.List<java.lang.String!>);
     method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
     method public void setBoundsInScreen(android.graphics.Rect!);
     method public void setCanOpenPopup(boolean);
@@ -3278,6 +3282,10 @@
     field public static final int ACTION_SELECT = 4; // 0x4
     field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
     field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
     field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
     field public static final int FOCUS_INPUT = 1; // 0x1
     field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
index 6b35ae0..77b849b 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -35,6 +35,7 @@
 import android.util.SparseArray;
 import android.view.View;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo;
 import android.view.accessibility.AccessibilityNodeInfo.TouchDelegateInfo;
 
 import androidx.annotation.IntRange;
@@ -1668,6 +1669,64 @@
      */
     public static final int MOVEMENT_GRANULARITY_PAGE = 0x00000010;
 
+    /**
+     * Key used to request and locate extra data for text character location. This key requests that
+     * an array of {@link android.graphics.RectF}s be added to the extras. This request is made with
+     * {@link #refreshWithExtraData(String, Bundle)}. The arguments taken by this request are two
+     * integers: {@link #EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX} and
+     * {@link #EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH}. The starting index must be valid
+     * inside the CharSequence returned by {@link #getText()}, and the length must be positive.
+     * <p>
+     * The data can be retrieved from the {@code Bundle} returned by {@link #getExtras()} using this
+     * string as a key for {@link Bundle#getParcelableArray(String)}. The
+     * {@link android.graphics.RectF} will be null for characters that either do not exist or are
+     * off the screen.
+     *
+     * {@see #refreshWithExtraData(String, Bundle)}
+     */
+    @SuppressLint("ActionValue")
+    public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY =
+            "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_KEY";
+
+    /**
+     * Integer argument specifying the start index of the requested text location data. Must be
+     * valid inside the CharSequence returned by {@link #getText()}.
+     *
+     * @see #EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
+     */
+    @SuppressLint("ActionValue")
+    public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX =
+            "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX";
+
+    /**
+     * Integer argument specifying the end index of the requested text location data. Must be
+     * positive.
+     *
+     * @see #EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
+     */
+    @SuppressLint("ActionValue")
+    public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH =
+            "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
+
+    /**
+     * Key used to request extra data for the rendering information.
+     * The key requests that a {@link AccessibilityNodeInfo.ExtraRenderingInfo} be added to this
+     * info. This request is made with {@link #refreshWithExtraData(String, Bundle)} without
+     * argument.
+     * <p>
+     * The data can be retrieved from the {@link ExtraRenderingInfo} returned by
+     * {@link #getExtraRenderingInfo()} using {@link ExtraRenderingInfo#getLayoutSize},
+     * {@link ExtraRenderingInfo#getTextSizeInPx()} and
+     * {@link ExtraRenderingInfo#getTextSizeUnit()}. For layout params, it is supported by both
+     * {@link android.widget.TextView} and {@link android.view.ViewGroup}. For text size and
+     * unit, it is only supported by {@link android.widget.TextView}.
+     *
+     * @see #refreshWithExtraData(String, Bundle)
+     */
+    @SuppressLint("ActionValue")
+    public static final String EXTRA_DATA_RENDERING_INFO_KEY =
+            "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
+
     private static int sClickableSpanId = 0;
 
     /**
@@ -3060,6 +3119,23 @@
     }
 
     /**
+     * Gets the {@link ExtraRenderingInfo extra rendering info} if the node is meant to be
+     * refreshed with extra data to examine rendering related accessibility issues.
+     *
+     * @return The {@link ExtraRenderingInfo extra rendering info}.
+     *
+     * @see #EXTRA_DATA_RENDERING_INFO_KEY
+     * @see #refreshWithExtraData(String, Bundle)
+     */
+    @Nullable
+    public ExtraRenderingInfo getExtraRenderingInfo() {
+        if (Build.VERSION.SDK_INT >= 30) {
+            return mInfo.getExtraRenderingInfo();
+        }
+        return null;
+    }
+
+    /**
      * Gets the actions that can be performed on the node.
      *
      * @return A list of AccessibilityActions.
@@ -3649,6 +3725,47 @@
     }
 
     /**
+     * Get the extra data available for this node.
+     * <p>
+     * Some data that is useful for some accessibility services is expensive to compute, and would
+     * place undue overhead on apps to compute all the time. That data can be requested with
+     * {@link #refreshWithExtraData(String, Bundle)}.
+     *
+     * @return An unmodifiable list of keys corresponding to extra data that can be requested.
+     * @see #EXTRA_DATA_RENDERING_INFO_KEY
+     * @see #EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY
+     */
+    @Nullable
+    public List<String> getAvailableExtraData() {
+        if (Build.VERSION.SDK_INT >= 26) {
+            return mInfo.getAvailableExtraData();
+        }
+        return Collections.emptyList();
+    }
+
+    /**
+     * Set the extra data available for this node.
+     * <p>
+     * <strong>Note:</strong> When a {@code View} passes in a non-empty list, it promises that
+     * it will populate the node's extras with corresponding pieces of information in
+     * {@link View#addExtraDataToAccessibilityNodeInfo(AccessibilityNodeInfo, String, Bundle)}.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}.
+     * This class is made immutable before being delivered to an AccessibilityService.
+     *
+     * @param extraDataKeys A list of types of extra data that are available.
+     * @see #getAvailableExtraData()
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setAvailableExtraData(@NonNull List<String> extraDataKeys) {
+        if (Build.VERSION.SDK_INT >= 26) {
+            mInfo.setAvailableExtraData(extraDataKeys);
+        }
+    }
+
+    /**
      * Gets the window to which this node belongs.
      *
      * @return The window.
@@ -3981,6 +4098,30 @@
     }
 
     /**
+     * Refreshes this info with the latest state of the view it represents, and request new
+     * data be added by the View.
+     *
+     * @param extraDataKey The extra data requested. Data that must be requested
+     *                     with this mechanism is generally expensive to retrieve, so should only be
+     *                     requested when needed. See
+     *                     {@link #EXTRA_DATA_RENDERING_INFO_KEY},
+     *                     {@link #EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY},
+     *                     {@link #getAvailableExtraData()} and {@link #getExtraRenderingInfo()}.
+     * @param args A bundle of arguments for the request. These depend on the particular request.
+     *
+     * @return {@code true} if the refresh succeeded. {@code false} if the {@link View} represented
+     * by this node is no longer in the view tree (and thus this node is obsolete and should be
+     * recycled).
+     */
+    public boolean refreshWithExtraData(@Nullable String extraDataKey, @NonNull Bundle args) {
+        if (Build.VERSION.SDK_INT >= 26) {
+            return mInfo.refreshWithExtraData(extraDataKey, args);
+        } else {
+            return false;
+        }
+    }
+
+    /**
      * Gets the custom role description.
      * @return The role description.
      */
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java
index 477a4fe..5e51fd1 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java
@@ -240,7 +240,7 @@
      *                     the info's {@link AccessibilityNodeInfoCompat#getExtras} method.
      * @param arguments A {@link Bundle} holding any arguments relevant for this request.
      *
-     * @see AccessibilityNodeInfo#setAvailableExtraData(List)
+     * @see AccessibilityNodeInfoCompat#setAvailableExtraData(List)
      */
     public void addExtraDataToAccessibilityNodeInfo(int virtualViewId,
             @NonNull AccessibilityNodeInfoCompat info, @NonNull String extraDataKey,
diff --git a/datastore/datastore-core/src/test/kotlin/androidx/datastore/DataMigrationInitializerTest.kt b/datastore/datastore-core/src/test/java/androidx/datastore/DataMigrationInitializerTest.kt
similarity index 100%
rename from datastore/datastore-core/src/test/kotlin/androidx/datastore/DataMigrationInitializerTest.kt
rename to datastore/datastore-core/src/test/java/androidx/datastore/DataMigrationInitializerTest.kt
diff --git a/datastore/datastore-core/src/test/kotlin/androidx/datastore/DataStoreFactoryTest.kt b/datastore/datastore-core/src/test/java/androidx/datastore/DataStoreFactoryTest.kt
similarity index 100%
rename from datastore/datastore-core/src/test/kotlin/androidx/datastore/DataStoreFactoryTest.kt
rename to datastore/datastore-core/src/test/java/androidx/datastore/DataStoreFactoryTest.kt
diff --git a/datastore/datastore-core/src/test/kotlin/androidx/datastore/SingleProcessDataStoreTest.kt b/datastore/datastore-core/src/test/java/androidx/datastore/SingleProcessDataStoreTest.kt
similarity index 100%
rename from datastore/datastore-core/src/test/kotlin/androidx/datastore/SingleProcessDataStoreTest.kt
rename to datastore/datastore-core/src/test/java/androidx/datastore/SingleProcessDataStoreTest.kt
diff --git a/datastore/datastore-core/src/test/kotlin/androidx/datastore/TestingSerializer.kt b/datastore/datastore-core/src/test/java/androidx/datastore/TestingSerializer.kt
similarity index 100%
rename from datastore/datastore-core/src/test/kotlin/androidx/datastore/TestingSerializer.kt
rename to datastore/datastore-core/src/test/java/androidx/datastore/TestingSerializer.kt
diff --git a/datastore/datastore-core/src/test/kotlin/androidx/datastore/handlers/ReplaceFileCorruptionHandlerTest.kt b/datastore/datastore-core/src/test/java/androidx/datastore/handlers/ReplaceFileCorruptionHandlerTest.kt
similarity index 100%
rename from datastore/datastore-core/src/test/kotlin/androidx/datastore/handlers/ReplaceFileCorruptionHandlerTest.kt
rename to datastore/datastore-core/src/test/java/androidx/datastore/handlers/ReplaceFileCorruptionHandlerTest.kt
diff --git a/datastore/datastore-sampleapp/build.gradle b/datastore/datastore-sampleapp/build.gradle
index 0072845..ff065b1 100644
--- a/datastore/datastore-sampleapp/build.gradle
+++ b/datastore/datastore-sampleapp/build.gradle
@@ -52,11 +52,13 @@
 }
 
 dependencies {
-    //For DataStore with Preferences
+    // For DataStore with Preferences
     implementation(project(":datastore:datastore-preferences"))
 
     // For DataStore with protos
     implementation(project(":datastore:datastore-core"))
+    api("androidx.preference:preference:1.1.0")
+
     implementation(PROTOBUF_LITE)
 
     implementation(KOTLIN_STDLIB)
diff --git a/datastore/datastore-sampleapp/src/main/AndroidManifest.xml b/datastore/datastore-sampleapp/src/main/AndroidManifest.xml
index e46b51a..28673cf 100644
--- a/datastore/datastore-sampleapp/src/main/AndroidManifest.xml
+++ b/datastore/datastore-sampleapp/src/main/AndroidManifest.xml
@@ -34,5 +34,12 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <activity android:name=".SettingsFragmentActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
     </application>
 </manifest>
\ No newline at end of file
diff --git a/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/SettingsFragment.kt b/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/SettingsFragment.kt
new file mode 100644
index 0000000..cd4966f
--- /dev/null
+++ b/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/SettingsFragment.kt
@@ -0,0 +1,160 @@
+/*
+ * Copyright 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.example.datastoresampleapp
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.datastore.CorruptionException
+import androidx.datastore.DataStore
+import androidx.datastore.DataStoreFactory
+import androidx.datastore.Serializer
+import androidx.preference.Preference
+import androidx.preference.SwitchPreference
+import androidx.preference.PreferenceFragmentCompat
+import androidx.lifecycle.lifecycleScope
+import androidx.preference.TwoStatePreference
+import com.google.protobuf.InvalidProtocolBufferException
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.launch
+import java.io.File
+import java.io.IOException
+import java.io.InputStream
+import java.io.OutputStream
+
+private val TAG = "SettingsActivity"
+
+class SettingsFragmentActivity() : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        supportFragmentManager.beginTransaction()
+            .replace(android.R.id.content, SettingsFragment()).commit()
+    }
+}
+
+/**
+ * Toggle States:
+ * 1) Value not read from disk. Toggle is disabled in default position.
+ * 2) Value read from disk and no pending updates. Toggle is enabled in latest persisted position.
+ * 3) Value read from disk but with pending updates. Toggle is disabled in pending position.
+ */
+class SettingsFragment() : PreferenceFragmentCompat() {
+    private val fooToggle: TwoStatePreference by lazy {
+        createFooPreference(preferenceManager.context)
+    }
+
+    private val PROTO_STORE_FILE_NAME = "datastore_test_app.pb"
+
+    private val settingsStore: DataStore<Settings> by lazy {
+        DataStoreFactory().create(
+            { File(requireActivity().applicationContext.filesDir, PROTO_STORE_FILE_NAME) },
+            SettingsSerializer
+        )
+    }
+
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        val preferences = preferenceManager.createPreferenceScreen(preferenceManager.context)
+        preferences.addPreference(fooToggle)
+        preferenceScreen = preferences
+    }
+
+    @SuppressLint("SyntheticAccessor")
+    @ExperimentalCoroutinesApi
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        viewLifecycleOwner.lifecycleScope.launchWhenStarted {
+            // Read the initial value from disk
+            val settings: Settings = try {
+                settingsStore.data.first()
+            } catch (ex: IOException) {
+                Log.e(TAG, "Could not read settings.", ex)
+                // Show error to user here, or try re-reading.
+                return@launchWhenStarted
+            }
+
+            // Set the toggle to the value read from disk and enable the toggle.
+            fooToggle.isChecked = settings.foo
+            fooToggle.isEnabled = true
+
+            fooToggle.changeFlow.flatMapLatest { (_: Preference?, newValue: Any?) ->
+                val isChecked = newValue as Boolean
+
+                fooToggle.isEnabled = false // Disable the toggle until the write is completed
+                fooToggle.isChecked = isChecked // Set the disabled toggle to the pending value
+
+                try {
+                    settingsStore.setFoo(isChecked)
+                } catch (ex: IOException) { // setFoo can only throw IOExceptions
+                    Log.e(TAG, "Could not write settings", ex)
+                    // Show error to user here
+                }
+                settingsStore.data // Switch to data flow since it is the source of truth.
+            }.collect {
+                // We update the toggle to the latest persisted value - whether or not the
+                // update succeeded. If the write failed, this will reset to original state.
+                fooToggle.isChecked = it.foo
+                fooToggle.isEnabled = true
+            }
+        }
+    }
+
+    private suspend fun DataStore<Settings>.setFoo(foo: Boolean) = updateData {
+        it.toBuilder().setFoo(foo).build()
+    }
+
+    private fun createFooPreference(context: Context) = SwitchPreference(context).apply {
+        isEnabled = false // Start out disabled
+        isPersistent = false // Disable SharedPreferences
+        title = "Foo title"
+        summary = "Summary of Foo toggle"
+    }
+}
+
+@ExperimentalCoroutinesApi
+private val Preference.changeFlow: Flow<Pair<Preference?, Any?>>
+    get() = callbackFlow {
+        this@changeFlow.setOnPreferenceChangeListener { preference: Preference?, newValue: Any? ->
+            this@callbackFlow.launch {
+                send(Pair(preference, newValue))
+            }
+            false // Do not update the state of the toggle.
+        }
+
+        awaitClose { this@changeFlow.onPreferenceChangeListener = null }
+    }
+
+private object SettingsSerializer : Serializer<Settings> {
+    override fun readFrom(input: InputStream): Settings {
+        try {
+            return Settings.parseFrom(input)
+        } catch (ipbe: InvalidProtocolBufferException) {
+            throw CorruptionException("Cannot read proto.", ipbe)
+        }
+    }
+
+    override fun writeTo(t: Settings, output: OutputStream) = t.writeTo(output)
+}
\ No newline at end of file
diff --git a/datastore/datastore-sampleapp/src/main/proto/settings.proto b/datastore/datastore-sampleapp/src/main/proto/settings.proto
index 38fd074..1fb4e0a 100644
--- a/datastore/datastore-sampleapp/src/main/proto/settings.proto
+++ b/datastore/datastore-sampleapp/src/main/proto/settings.proto
@@ -5,4 +5,5 @@
 
 message Settings {
   int32 counter = 1;
+  bool foo = 2;
 }
diff --git a/datastore/datastore-sampleapp/src/main/res/layout/settings_fragment.xml b/datastore/datastore-sampleapp/src/main/res/layout/settings_fragment.xml
new file mode 100644
index 0000000..7a9bcbf
--- /dev/null
+++ b/datastore/datastore-sampleapp/src/main/res/layout/settings_fragment.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 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.
+  -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <fragment
+        android:id="@+id/fragment"
+        android:name="com.example.datastoresampleapp.SettingsFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        tools:layout_editor_absoluteY="197dp" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt
index 3539a77..a276a5e 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentReorderingTest.kt
@@ -23,20 +23,27 @@
 import androidx.fragment.test.R
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
-import androidx.test.annotation.UiThreadTest
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
 
 @SmallTest
-@RunWith(AndroidJUnit4::class)
-class FragmentReorderingTest {
+@RunWith(Parameterized::class)
+class FragmentReorderingTest(private val stateManager: StateManager) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "stateManager={0}")
+        fun data() = arrayOf(NewStateManager, OldStateManager)
+    }
+
     @Suppress("DEPRECATION")
     @get:Rule
     var activityRule = androidx.test.rule.ActivityTestRule(FragmentTestActivity::class.java)
@@ -47,17 +54,23 @@
 
     @Before
     fun setup() {
+        stateManager.setup()
         activityRule.setContentView(R.layout.simple_container)
         container = activityRule.activity.findViewById<View>(R.id.fragmentContainer) as ViewGroup
         fm = activityRule.activity.supportFragmentManager
         instrumentation = InstrumentationRegistry.getInstrumentation()
     }
 
+    @After
+    fun teardown() {
+        stateManager.teardown()
+    }
+
     // Ensure that a replaced fragment is stopped before its replacement is started
     // and vice versa when popped
     @Test
     fun stopBeforeStart() {
-        if (!FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is OldStateManager) {
             return
         }
         val fragment1 = StrictViewFragment()
@@ -643,14 +656,16 @@
 
     // Test that a fragment view that is created with focus has focus after the transaction
     // completes.
-    @UiThreadTest
     @Test
     fun focusedView() {
-        activityRule.activity.setContentView(R.layout.double_container)
+        activityRule.setContentView(R.layout.double_container)
         container = activityRule.activity.findViewById<View>(R.id.fragmentContainer1) as ViewGroup
-        val firstEditText = EditText(container.context)
-        container.addView(firstEditText)
-        firstEditText.requestFocus()
+        lateinit var firstEditText: EditText
+        activityRule.runOnUiThread {
+            firstEditText = EditText(container.context)
+            container.addView(firstEditText)
+            firstEditText.requestFocus()
+        }
 
         assertThat(firstEditText.isFocused).isTrue()
         val fragment1 = CountCallsFragment()
@@ -665,7 +680,7 @@
             .addToBackStack(null)
             .setReorderingAllowed(true)
             .commit()
-        fm.executePendingTransactions()
+        activityRule.executePendingTransactions()
         val editText = fragment2.requireView().findViewById<View>(R.id.editText)
         assertThat(editText.isFocused).isTrue()
         assertThat(firstEditText.isFocused).isFalse()
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt
index 800e19e..790569f 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTestUtil.kt
@@ -40,6 +40,27 @@
 object Reordered : ReorderingAllowed()
 object Ordered : ReorderingAllowed()
 
+sealed class StateManager {
+    abstract fun setup()
+
+    override fun toString(): String = this.javaClass.simpleName
+
+    fun teardown() {
+        // Reset it back to the default
+        FragmentManager.enableNewStateManager(true)
+    }
+}
+object NewStateManager : StateManager() {
+    override fun setup() {
+        FragmentManager.enableNewStateManager(true)
+    }
+}
+object OldStateManager : StateManager() {
+    override fun setup() {
+        FragmentManager.enableNewStateManager(false)
+    }
+}
+
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<out FragmentActivity>.executePendingTransactions(
     fm: FragmentManager = activity.supportFragmentManager
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt
index 98eae5e..790271d 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionAnimTest.kt
@@ -31,6 +31,7 @@
 import androidx.test.filters.SdkSuppress
 import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertThat
+import org.junit.After
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -41,14 +42,23 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
-class FragmentTransitionAnimTest(private val reorderingAllowed: ReorderingAllowed) {
+class FragmentTransitionAnimTest(
+    private val reorderingAllowed: ReorderingAllowed,
+    private val stateManager: StateManager
+) {
     private var onBackStackChangedTimes: Int = 0
 
     @Before
     fun setup() {
+        stateManager.setup()
         onBackStackChangedTimes = 0
     }
 
+    @After
+    fun teardown() {
+        stateManager.teardown()
+    }
+
     // Ensure when transition duration is shorter than animation duration, we will get both end
     // callbacks
     @Test
@@ -309,9 +319,17 @@
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "ordering={0}")
-        fun data(): Array<ReorderingAllowed> {
-            return arrayOf(Ordered, Reordered)
+        @Parameterized.Parameters(name = "ordering={0}, stateManager={1}")
+        fun data() = mutableListOf<Array<Any>>().apply {
+            arrayOf(
+                Ordered,
+                Reordered
+            ).forEach { ordering ->
+                // Run the test with the new state manager
+                add(arrayOf(ordering, NewStateManager))
+                // Run the test with the old state manager
+                add(arrayOf(ordering, OldStateManager))
+            }
         }
 
         @AnimRes
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
index c214354f..4d81721 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
@@ -47,7 +47,10 @@
 @MediumTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
-class FragmentTransitionTest(private val reorderingAllowed: ReorderingAllowed) {
+class FragmentTransitionTest(
+    private val reorderingAllowed: ReorderingAllowed,
+    private val stateManager: StateManager
+) {
 
     @Suppress("DEPRECATION")
     @get:Rule
@@ -61,6 +64,7 @@
 
     @Before
     fun setup() {
+        stateManager.setup()
         activityRule.setContentView(R.layout.simple_container)
         onBackStackChangedTimes = 0
         fragmentManager = activityRule.activity.supportFragmentManager
@@ -70,6 +74,7 @@
     @After
     fun teardown() {
         fragmentManager.removeOnBackStackChangedListener(onBackStackChangedListener)
+        stateManager.teardown()
     }
 
     // Test that normal view transitions (enter, exit, reenter, return) run with
@@ -150,7 +155,7 @@
             assertThat(fragment.requireView()).isEqualTo(view1)
         } else {
             assertThat(onBackStackChangedTimes).isEqualTo(3)
-            if (FragmentManager.USE_STATE_MANAGER) {
+            if (stateManager is NewStateManager) {
                 // When using FragmentStateManager, the transition gets cancelled and the
                 // Fragment  does not go all the way through to destroying the view before
                 // coming back up, so the view instances will still match
@@ -782,7 +787,7 @@
 
         // FragmentStateManager is able to build the correct transition
         // whether you use reordering or not
-        if (FragmentManager.USE_STATE_MANAGER || reorderingAllowed is Reordered) {
+        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
             fragment1.exitTransition.verifyAndClearTransition {
                 exitingViews += listOf(startGreen, startBlue)
             }
@@ -930,8 +935,8 @@
         if (reorderingAllowed is Reordered) {
             // reordering allowed fragment3 to get a transition so we should wait for it to finish
             fragment3.waitForTransition()
-            if (FragmentManager.USE_STATE_MANAGER) {
-                // When USE_STATE_MANAGER, the last operation sets the direction.
+            if (stateManager is NewStateManager) {
+                // When using the NewStateManager, the last operation sets the direction.
                 // In this case, the forward direction since we did a replace() after the pop
                 fragment2.exitTransition.verifyAndClearTransition {
                     exitingViews += listOf(midGreen, midBlue)
@@ -995,8 +1000,8 @@
             val endBlue = activityRule.findBlue()
             val endGreenBounds = endGreen.boundsOnScreen
 
-            if (FragmentManager.USE_STATE_MANAGER) {
-                // When USE_STATE_MANAGER, the last operation sets the direction.
+            if (stateManager is NewStateManager) {
+                // When using the NewStateManager, the last operation sets the direction.
                 // In this case, the forward direction since we did a replace() after the pop
                 fragment1.exitTransition.verifyAndClearTransition {
                     epicenter = endGreenBounds
@@ -1012,7 +1017,7 @@
                 enteringViews += endGreen
             }
             fragment2.sharedElementEnter.verifyAndClearTransition {
-                epicenter = if (FragmentManager.USE_STATE_MANAGER) {
+                epicenter = if (stateManager is NewStateManager) {
                     endGreenBounds
                 } else {
                     // In this case, we can't find an epicenter
@@ -1058,7 +1063,7 @@
 
         // FragmentStateManager is able to build the correct transition
         // whether you use reordering or not
-        if (FragmentManager.USE_STATE_MANAGER || reorderingAllowed is Reordered) {
+        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
             fragment2.sharedElementEnter.verifyAndClearTransition {
                 epicenter = startGreenBounds
                 exitingViews += startGreen
@@ -1405,9 +1410,17 @@
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "ordering={0}")
-        fun data(): Array<ReorderingAllowed> {
-            return arrayOf(Ordered, Reordered)
+        @Parameterized.Parameters(name = "ordering={0}, stateManager={1}")
+        fun data() = mutableListOf<Array<Any>>().apply {
+            arrayOf(
+                Ordered,
+                Reordered
+            ).forEach { ordering ->
+                // Run the test with the new state manager
+                add(arrayOf(ordering, NewStateManager))
+                // Run the test with the old state manager
+                add(arrayOf(ordering, OldStateManager))
+            }
         }
     }
 }
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt
index d8ce80f..48a7975 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/PostponedTransitionTest.kt
@@ -25,7 +25,6 @@
 import androidx.fragment.test.R
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.ViewModelStore
-import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.platform.app.InstrumentationRegistry
@@ -33,18 +32,27 @@
 import androidx.testutils.waitForExecution
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import org.junit.After
 import org.junit.Assert.fail
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 
 @LargeTest
-@RunWith(AndroidJUnit4::class)
+@RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
-class PostponedTransitionTest {
+class PostponedTransitionTest(private val stateManager: StateManager) {
+
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(name = "stateManager={0}")
+        fun data() = arrayOf(NewStateManager, OldStateManager)
+    }
+
     @Suppress("DEPRECATION")
     @get:Rule
     var activityRule = androidx.test.rule.ActivityTestRule(FragmentTestActivity::class.java)
@@ -54,6 +62,7 @@
 
     @Before
     fun setupContainer() {
+        stateManager.setup()
         activityRule.setContentView(R.layout.simple_container)
         val fm = activityRule.activity.supportFragmentManager
 
@@ -85,6 +94,11 @@
         verifyNoOtherTransitions(beginningFragment)
     }
 
+    @After
+    fun teardown() {
+        stateManager.teardown()
+    }
+
     // Ensure that replacing with a fragment that has a postponed transition
     // will properly postpone it, both adding and popping.
     @Test
@@ -230,7 +244,7 @@
         }
         activityRule.waitForExecution()
 
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             // fragment2 should have been put on the back stack without any transitions
             verifyNoOtherTransitions(fragment2)
 
@@ -269,7 +283,7 @@
 
         activityRule.popBackStackImmediate(commit, FragmentManager.POP_BACK_STACK_INCLUSIVE)
 
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             // The transition back to beginningFragment should be postponed
             // and fragment2 should be removed without any transitions
             assertPostponedTransition(fragment3, beginningFragment, fragment2)
@@ -332,7 +346,7 @@
         // and start fragment2 -> fragment3 transition postponed
         activityRule.waitForExecution()
 
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             // fragment2 should have been put on the back stack without any transitions
             verifyNoOtherTransitions(fragment2)
 
@@ -373,7 +387,7 @@
         // start the beginningFragment transaction postponed
         activityRule.popBackStackImmediate()
 
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             // The transition back to beginningFragment should be postponed
             // and no transitions should be done on fragment2
             assertPostponedTransition(fragment3, beginningFragment)
@@ -783,7 +797,7 @@
                 .commitNow()
         }
 
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             // fragment2 should have been put on the back stack without any transitions
             verifyNoOtherTransitions(fragment2)
 
@@ -951,7 +965,7 @@
             // start the postponed transition
             fragment.startPostponedEnterTransition()
 
-            if (FragmentManager.USE_STATE_MANAGER) {
+            if (stateManager is NewStateManager) {
                 // This should succeed since onResume() is called outside of the
                 // transaction completing
                 fm.executePendingTransactions()
@@ -1092,6 +1106,8 @@
         assertWithMessage(
             "After startPostponed is called the transition should not be postponed"
         ).that(fragment.isPostponed).isFalse()
+
+        fragment.waitForTransition()
     }
 
     // Ensure postponedEnterTransaction(long, TimeUnit) works even if called in constructor
@@ -1142,7 +1158,7 @@
         assertThat(toFragment.requireView().isAttachedToWindow).isTrue()
         assertThat(fromFragment.requireView().visibility).isEqualTo(View.VISIBLE)
 
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             assertThat(toFragment.requireView().visibility).isEqualTo(View.INVISIBLE)
         } else {
             assertThat(toFragment.requireView().visibility).isEqualTo(View.VISIBLE)
@@ -1150,7 +1166,7 @@
         }
         verifyNoOtherTransitions(fromFragment)
         verifyNoOtherTransitions(toFragment)
-        if (FragmentManager.USE_STATE_MANAGER) {
+        if (stateManager is NewStateManager) {
             assertThat(fromFragment.lifecycle.currentState).isEqualTo(Lifecycle.State.CREATED)
             assertThat(toFragment.lifecycle.currentState).isEqualTo(Lifecycle.State.STARTED)
         } else {
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
index 0c3d3e2bd..6b3b3bf 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/SpecialEffectsControllerTest.kt
@@ -304,8 +304,10 @@
             assertThat(controller.getAwaitingCompletionLifecycleImpact(fragmentStateManager))
                 .isEqualTo(SpecialEffectsController.Operation.LifecycleImpact.ADDING)
 
-            // Now force all operations to immediately complete
-            controller.forceCompleteAllOperations()
+            onActivity {
+                // Now force all operations to immediately complete
+                controller.forceCompleteAllOperations()
+            }
 
             assertThat(controller.operationsToExecute)
                 .isEmpty()
@@ -353,11 +355,20 @@
             assertThat(controller.getAwaitingCompletionLifecycleImpact(fragmentStateManager))
                 .isEqualTo(SpecialEffectsController.Operation.LifecycleImpact.ADDING)
 
-            // Now force all operations to immediately complete
-            controller.forceCompleteAllOperations()
+            var lifecycleImpactOnCompletion:
+                    SpecialEffectsController.Operation.LifecycleImpact? = null
+            firstOperation.addCompletionListener {
+                lifecycleImpactOnCompletion = controller.getAwaitingCompletionLifecycleImpact(
+                    fragmentStateManager)
+            }
+            onActivity {
+                // Now force all operations to immediately complete
+                controller.forceCompleteAllOperations()
+            }
 
             assertThat(firstOperation.cancellationSignal.isCanceled)
                 .isTrue()
+            assertThat(lifecycleImpactOnCompletion).isNull()
             assertThat(controller.operationsToExecute)
                 .isEmpty()
             assertThat(controller.getAwaitingCompletionLifecycleImpact(fragmentStateManager))
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 7cfadb8..1d5007f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -96,7 +96,7 @@
 public abstract class FragmentManager implements FragmentResultOwner {
     private static boolean DEBUG = false;
     static final String TAG = "FragmentManager";
-    static boolean USE_STATE_MANAGER = false;
+    static boolean USE_STATE_MANAGER = true;
 
     /**
      * Control whether FragmentManager uses the new state manager that is responsible for:
@@ -111,6 +111,11 @@
      * in every activity with the same value for all activities). Changing it after that point
      * is <strong>not</strong> supported and can result in fragments not moving to their
      * expected state.
+     * <p>
+     * This is <strong>enabled</strong> by default. Disabling it should only be used in
+     * cases where you are debugging a potential regression and as part of
+     * <a href="https://issuetracker.google.com/issues/new?component=460964">filing
+     * an issue</a> to verify and fix the regression.
      *
      * @param enabled Whether the new state manager should be enabled.
      */
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java
index 4b6e0f2..818664e 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/SpecialEffectsController.java
@@ -113,7 +113,7 @@
             @NonNull FragmentStateManager fragmentStateManager) {
         Operation operation = mAwaitingCompletionOperations.get(
                 fragmentStateManager.getFragment());
-        if (operation != null) {
+        if (operation != null && !operation.getCancellationSignal().isCanceled()) {
             return operation.getLifecycleImpact();
         }
         return null;
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackFragmentTest.java
index 531670b..37b9400 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackFragmentTest.java
@@ -540,7 +540,7 @@
         final ControlsOverlayAutoHideDisabledFragment fragment =
                 (ControlsOverlayAutoHideDisabledFragment) activity.getTestFragment();
 
-        // Sanity check that onViewCreated has made the controls invisible
+        // Validate that onViewCreated has made the controls invisible
         assertFalse(fragment.mControlVisible);
         activityTestRule.runOnUiThread(new Runnable() {
             public void run() {
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackSupportFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackSupportFragmentTest.java
index 913c660..9e930c4 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackSupportFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/PlaybackSupportFragmentTest.java
@@ -537,7 +537,7 @@
         final ControlsOverlayAutoHideDisabledFragment fragment =
                 (ControlsOverlayAutoHideDisabledFragment) activity.getTestFragment();
 
-        // Sanity check that onViewCreated has made the controls invisible
+        // Validate that onViewCreated has made the controls invisible
         assertFalse(fragment.mControlVisible);
         activityTestRule.runOnUiThread(new Runnable() {
             public void run() {
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/BandSelectionHelperTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/BandSelectionHelperTest.java
index bc0cbc98..3a9a886 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/BandSelectionHelperTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/BandSelectionHelperTest.java
@@ -24,6 +24,7 @@
 import android.view.MotionEvent;
 
 import androidx.annotation.NonNull;
+import androidx.core.util.Consumer;
 import androidx.recyclerview.selection.GridModel.GridHost;
 import androidx.recyclerview.selection.testing.TestAdapter;
 import androidx.recyclerview.selection.testing.TestAutoScroller;
@@ -74,7 +75,13 @@
                 SelectionPredicates.createSelectAnything(),
                 StorageStrategy.createStringStorage());
 
-        EventBridge.install(mAdapter, mTracker, mKeyProvider);
+        EventBridge.install(mAdapter, mTracker, mKeyProvider, new Consumer<Runnable>() {
+            @Override
+            public void accept(Runnable runnable) {
+                runnable.run();
+            }
+        });
+
         FocusDelegate<String> focusDelegate = FocusDelegate.dummy();
 
         mBandController = new BandSelectionHelper<String>(
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
index 8ed4db9..7470b51 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
@@ -25,6 +25,7 @@
 import android.util.SparseBooleanArray;
 
 import androidx.annotation.NonNull;
+import androidx.core.util.Consumer;
 import androidx.recyclerview.selection.SelectionTracker.SelectionPredicate;
 import androidx.recyclerview.selection.testing.Bundles;
 import androidx.recyclerview.selection.testing.SelectionProbe;
@@ -89,7 +90,13 @@
                 mSelectionPredicate,
                 StorageStrategy.createStringStorage());
 
-        EventBridge.install(mAdapter, mTracker, mKeyProvider);
+        EventBridge.install(
+                mAdapter, mTracker, mKeyProvider, new Consumer<Runnable>() {
+                    @Override
+                    public void accept(Runnable runnable) {
+                        runnable.run();
+                    }
+                });
 
         mTracker.addObserver(mListener);
 
@@ -515,7 +522,13 @@
                 mSelectionPredicate,
                 StorageStrategy.createStringStorage());
 
-        EventBridge.install(mAdapter, mTracker, mKeyProvider);
+        EventBridge.install(
+                mAdapter, mTracker, mKeyProvider, new Consumer<Runnable>() {
+                    @Override
+                    public void accept(Runnable runnable) {
+                        runnable.run();
+                    }
+                });
 
         mTracker.addObserver(mListener);
 
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
index 6dac018..f47d65e 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
@@ -48,7 +48,6 @@
                 keyProvider,
                 SelectionPredicates.createSelectSingleAnything(),
                 StorageStrategy.createStringStorage());
-        EventBridge.install(mAdapter, mTracker, keyProvider);
 
         mTracker.addObserver(mListener);
 
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/SelectionTrackers.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/SelectionTrackers.java
index 32379bf..d76ce51 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/SelectionTrackers.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/SelectionTrackers.java
@@ -16,6 +16,7 @@
 
 package androidx.recyclerview.selection.testing;
 
+import androidx.annotation.NonNull;
 import androidx.recyclerview.selection.DefaultSelectionTracker;
 import androidx.recyclerview.selection.EventBridge;
 import androidx.recyclerview.selection.ItemKeyProvider;
@@ -37,7 +38,7 @@
                 SelectionPredicates.createSelectAnything(),
                 StorageStrategy.createStringStorage());
 
-        EventBridge.install(adapter, tracker, keyProvider);
+        EventBridge.install(adapter, tracker, keyProvider, SelectionTrackers::runImmediately);
 
         return tracker;
     }
@@ -52,8 +53,13 @@
                 SelectionPredicates.createSelectAnything(),
                 StorageStrategy.createLongStorage());
 
-        EventBridge.install(adapter, tracker, keyProvider);
+        EventBridge.install(adapter, tracker, keyProvider, SelectionTrackers::runImmediately);
 
         return tracker;
     }
+
+    // Test stand-in for RecyclerView::postOnAnimation.
+    private static void runImmediately(@NonNull Runnable runnable) {
+        runnable.run();
+    }
 }
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/EventBridge.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/EventBridge.java
index c273106..3ea5fb4 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/EventBridge.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/EventBridge.java
@@ -26,6 +26,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
+import androidx.core.util.Consumer;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
@@ -50,37 +51,45 @@
      * @param adapter
      * @param selectionTracker
      * @param keyProvider
+     * @param runner Callback allowing operation to be run at next opportune time.
+     *                   Implementation could be {@link RecyclerView#postOnAnimation(Runnable)}.
      *
      * @param <K> Selection key type. @see {@link StorageStrategy} for supported types.
      */
     public static <K> void install(
             @NonNull RecyclerView.Adapter<?> adapter,
             @NonNull SelectionTracker<K> selectionTracker,
-            @NonNull ItemKeyProvider<K> keyProvider) {
+            @NonNull ItemKeyProvider<K> keyProvider,
+            @NonNull Consumer<Runnable> runner) {
 
         // setup bridges to relay selection and adapter events
-        new TrackerToAdapterBridge<>(selectionTracker, keyProvider, adapter);
+        new TrackerToAdapterBridge<>(selectionTracker, keyProvider, adapter, runner);
         adapter.registerAdapterDataObserver(selectionTracker.getAdapterDataObserver());
     }
 
     private static final class TrackerToAdapterBridge<K>
             extends SelectionTracker.SelectionObserver<K> {
 
+        // Non-private as necessary to avoid synthetic accessors for inner classes.
+        final RecyclerView.Adapter<?> mAdapter;
         private final ItemKeyProvider<K> mKeyProvider;
-        private final RecyclerView.Adapter<?> mAdapter;
+        private final Consumer<Runnable> mRunner;
 
         TrackerToAdapterBridge(
                 @NonNull SelectionTracker<K> selectionTracker,
                 @NonNull ItemKeyProvider<K> keyProvider,
-                @NonNull RecyclerView.Adapter<?> adapter) {
+                @NonNull RecyclerView.Adapter<?> adapter,
+                Consumer<Runnable> runner) {
 
             selectionTracker.addObserver(this);
 
             checkArgument(keyProvider != null);
             checkArgument(adapter != null);
+            checkArgument(runner != null);
 
             mKeyProvider = keyProvider;
             mAdapter = adapter;
+            mRunner = runner;
         }
 
         /**
@@ -96,7 +105,12 @@
                 return;
             }
 
-            mAdapter.notifyItemChanged(position, SelectionTracker.SELECTION_CHANGED_MARKER);
+            mRunner.accept(new Runnable() {
+                @Override
+                public void run() {
+                    mAdapter.notifyItemChanged(position, SelectionTracker.SELECTION_CHANGED_MARKER);
+                }
+            });
         }
     }
 
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
index 50cc4ceb..f913efd 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java
@@ -709,7 +709,7 @@
             // Event glue between RecyclerView and SelectionTracker keeps the classes separate
             // so that a SelectionTracker can be shared across RecyclerView instances that
             // represent the same data in different ways.
-            EventBridge.install(mAdapter, tracker, mKeyProvider);
+            EventBridge.install(mAdapter, tracker, mKeyProvider, mRecyclerView::post);
 
             // Scroller is stateful and can be reset, but we don't manage it directly.
             // GestureSelectionHelper will reset scroller when it is reset.
diff --git a/room/compiler-xprocessing/build.gradle b/room/compiler-xprocessing/build.gradle
index eecb06f..8a89de4 100644
--- a/room/compiler-xprocessing/build.gradle
+++ b/room/compiler-xprocessing/build.gradle
@@ -49,7 +49,7 @@
 }
 androidx {
     name = "AndroidX Room XProcessor"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     toolingProject = true
     mavenGroup = LibraryGroups.ROOM
     inceptionYear = "2020"
diff --git a/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt b/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt
index b20621f..840f9a8 100644
--- a/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt
+++ b/room/compiler-xprocessing/src/main/java/androidx/room/processing/XElement.kt
@@ -110,7 +110,7 @@
      * of it will be returned where fields can be read. Otherwise, `null` value is returned.
      *
      * @see [hasAnnotation]
-     * @see [hasAnnotationInPackage]
+     * @see [hasAnnotationWithPackage]
      */
     fun <T : Annotation> toAnnotationBox(annotation: KClass<T>): XAnnotationBox<T>?
 
@@ -118,7 +118,7 @@
      * Returns `true` if this element has an annotation that is declared in the given package.
      */
     // a very sad method but helps avoid abstraction annotation
-    fun hasAnnotationInPackage(pkg: String): Boolean
+    fun hasAnnotationWithPackage(pkg: String): Boolean
 
     /**
      * Returns `true` if this element is annotated with the given [annotation].
diff --git a/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt b/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt
index f4fe020..034e48b 100644
--- a/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt
+++ b/room/compiler-xprocessing/src/main/java/androidx/room/processing/javac/JavacElement.kt
@@ -120,7 +120,7 @@
         return element.kind.name.toLowerCase(Locale.US)
     }
 
-    override fun hasAnnotationInPackage(pkg: String): Boolean {
+    override fun hasAnnotationWithPackage(pkg: String): Boolean {
         return element.annotationMirrors.any {
             MoreElements.getPackage(it.annotationType.asElement()).toString() == pkg
         }
diff --git a/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt b/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt
index b792401..6146905 100644
--- a/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt
+++ b/room/compiler-xprocessing/src/test/java/androidx/room/processing/XElementTest.kt
@@ -209,7 +209,7 @@
                 assertThat(method.hasAnnotation(Test::class)).isTrue()
                 assertThat(method.hasAnnotation(Override::class)).isFalse()
                 assertThat(
-                    method.hasAnnotationInPackage(
+                    method.hasAnnotationWithPackage(
                         "org.junit"
                     )
                 ).isTrue()
@@ -219,17 +219,17 @@
                 assertThat(field.hasAnnotation(Test::class)).isFalse()
             }
             assertThat(
-                element.hasAnnotationInPackage(
+                element.hasAnnotationWithPackage(
                     "org.junit.runner"
                 )
             ).isTrue()
             assertThat(
-                element.hasAnnotationInPackage(
+                element.hasAnnotationWithPackage(
                     "org.junit"
                 )
             ).isFalse()
             assertThat(
-                element.hasAnnotationInPackage(
+                element.hasAnnotationWithPackage(
                     "foo.bar"
                 )
             ).isFalse()
diff --git a/room/compiler/build.gradle b/room/compiler/build.gradle
index 6aed8258..e4354f6 100644
--- a/room/compiler/build.gradle
+++ b/room/compiler/build.gradle
@@ -105,6 +105,7 @@
 dependencies {
     implementation(project(":room:room-common"))
     implementation(project(":room:room-migration"))
+    implementation(project(":room:room-compiler-xprocessing"))
     implementation(KOTLIN_STDLIB)
     implementation(AUTO_COMMON)
     implementation(AUTO_VALUE_ANNOTATIONS)
diff --git a/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt b/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
index 44406d6..1f54d69 100644
--- a/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
@@ -16,7 +16,9 @@
 
 package androidx.room
 
-import androidx.room.ext.asTypeElement
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XProcessingStep
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.Context
 import androidx.room.processor.DatabaseProcessor
 import androidx.room.processor.MissingTypeException
@@ -25,20 +27,17 @@
 import androidx.room.vo.Warning
 import androidx.room.writer.DaoWriter
 import androidx.room.writer.DatabaseWriter
-import com.google.auto.common.BasicAnnotationProcessor
-import com.google.common.collect.SetMultimap
 import java.io.File
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
+import kotlin.reflect.KClass
 
-class DatabaseProcessingStep(val processingEnv: ProcessingEnvironment) :
-    BasicAnnotationProcessor.ProcessingStep {
+class DatabaseProcessingStep : XProcessingStep {
     override fun process(
-        elementsByAnnotation: SetMultimap<Class<out Annotation>, Element>
-    ): MutableSet<Element> {
-        val context = Context(processingEnv)
-        val rejectedElements = mutableSetOf<Element>()
-        val databases = elementsByAnnotation[Database::class.java]
+        env: XProcessingEnv,
+        elementsByAnnotation: Map<KClass<out Annotation>, List<XTypeElement>>
+    ): Set<XTypeElement> {
+        val context = Context(env)
+        val rejectedElements = mutableSetOf<XTypeElement>()
+        val databases = elementsByAnnotation[Database::class]
             ?.mapNotNull {
                 try {
                     DatabaseProcessor(
@@ -80,7 +79,7 @@
                     if (!schemaOutFolder.exists()) {
                         schemaOutFolder.mkdirs()
                     }
-                    val qName = db.element.qualifiedName.toString()
+                    val qName = db.element.qualifiedName
                     val dbSchemaFolder = File(schemaOutFolder, qName)
                     if (!dbSchemaFolder.exists()) {
                         dbSchemaFolder.mkdirs()
@@ -97,8 +96,8 @@
         return rejectedElements
     }
 
-    override fun annotations(): MutableSet<out Class<out Annotation>> {
-        return mutableSetOf(Database::class.java)
+    override fun annotations(): Set<KClass<out Annotation>> {
+        return mutableSetOf(Database::class)
     }
 
     /**
diff --git a/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
index 89a6db0..aefbcf1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/RoomProcessor.kt
@@ -16,6 +16,7 @@
 
 package androidx.room
 
+import androidx.room.processing.XProcessingEnv
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.util.SimpleJavaVersion
@@ -38,19 +39,22 @@
     private var jdkVersionHasBugReported = false
 
     override fun initSteps(): MutableIterable<ProcessingStep>? {
-        return mutableListOf(DatabaseProcessingStep(processingEnv))
+        return mutableListOf(
+            DatabaseProcessingStep().asAutoCommonProcessor(processingEnv)
+        )
     }
 
     override fun getSupportedOptions(): MutableSet<String> {
         val supportedOptions = Context.ARG_OPTIONS.toMutableSet()
-
-        if (Context.BooleanProcessorOptions.INCREMENTAL.getValue(processingEnv)) {
+        // x processing is a cheap wrapper so it is fine to re-create.
+        val xProcessing = XProcessingEnv.create(processingEnv)
+        if (Context.BooleanProcessorOptions.INCREMENTAL.getValue(xProcessing)) {
             if (methodParametersVisibleInClassFiles()) {
                 // Room can be incremental
                 supportedOptions.add(ISOLATING_ANNOTATION_PROCESSORS_INDICATOR)
             } else {
                 if (!jdkVersionHasBugReported) {
-                    Context(processingEnv).logger.w(
+                    Context(xProcessing).logger.w(
                         Warning.JDK_VERSION_HAS_BUG, ProcessorErrors.JDK_VERSION_HAS_BUG
                     )
                     jdkVersionHasBugReported = true
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/element_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/element_ext.kt
deleted file mode 100644
index 806079c..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/ext/element_ext.kt
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-@file:Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-
-package androidx.room.ext
-
-import asDeclaredType
-import asTypeElement
-import com.google.auto.common.AnnotationMirrors
-import com.google.auto.common.MoreElements
-import com.google.auto.common.MoreTypes
-import isAssignableFrom
-import isDeclared
-import isNotNone
-import isSameType
-import java.lang.reflect.Proxy
-import java.util.Locale
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.AnnotationMirror
-import javax.lang.model.element.AnnotationValue
-import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.Modifier
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.ExecutableType
-import javax.lang.model.type.TypeMirror
-import javax.lang.model.type.WildcardType
-import javax.lang.model.util.ElementFilter
-import javax.lang.model.util.SimpleAnnotationValueVisitor6
-import javax.lang.model.util.SimpleTypeVisitor7
-import javax.lang.model.util.Types
-import kotlin.contracts.contract
-import kotlin.reflect.KClass
-
-private fun Element.hasModifier(modifier: Modifier): Boolean {
-    return this.modifiers.contains(modifier)
-}
-
-fun Element.isPublic() = hasModifier(Modifier.PUBLIC)
-
-fun Element.isAbstract() = hasModifier(Modifier.ABSTRACT)
-
-fun Element.isPrivate() = hasModifier(Modifier.PRIVATE)
-
-fun Element.isStatic() = hasModifier(Modifier.STATIC)
-
-fun Element.isTransient() = hasModifier(Modifier.TRANSIENT)
-
-fun Element.isFinal() = hasModifier(Modifier.FINAL)
-
-// we handle kotlin and java defaults differently
-fun ExecutableElement.isJavaDefault() = hasModifier(Modifier.DEFAULT)
-
-// checks if this executable element can be overridden but does not check if the enclosing element
-// can be overridden
-fun ExecutableElement.isOverrideableIgnoringContainer(): Boolean = !isPrivate() && !isFinal()
-
-fun Element.hasAnnotation(klass: KClass<out Annotation>): Boolean {
-    return MoreElements.isAnnotationPresent(this, klass.java)
-}
-
-fun Element.hasAnnotation(clazz: Class<out Annotation>): Boolean {
-    return MoreElements.isAnnotationPresent(this, clazz)
-}
-
-fun Element.hasAnyOf(vararg klass: KClass<out Annotation>): Boolean {
-    return klass.any { MoreElements.isAnnotationPresent(this, it.java) }
-}
-
-fun Element.isNonNull() =
-        asType().kind.isPrimitive ||
-                hasAnnotation(androidx.annotation.NonNull::class) ||
-                hasAnnotation(org.jetbrains.annotations.NotNull::class)
-
-fun Element.isEntityElement() = this.hasAnnotation(androidx.room.Entity::class)
-
-fun TypeElement.getConstructors(): List<ExecutableElement> {
-    return ElementFilter.constructorsIn(enclosedElements)
-}
-
-/**
- * gets all members including super privates. does not handle duplicate field names!!!
- */
-// TODO handle conflicts with super: b/35568142
-fun TypeElement.getAllFieldsIncludingPrivateSupers(processingEnvironment: ProcessingEnvironment):
-        Set<VariableElement> {
-    val myMembers = processingEnvironment.elementUtils.getAllMembers(this)
-            .filter { it.kind == ElementKind.FIELD }
-            .filter { it is VariableElement }
-            .map { it as VariableElement }
-            .toSet()
-    if (superclass.isNotNone()) {
-        return myMembers + superclass.asTypeElement()
-                .getAllFieldsIncludingPrivateSupers(processingEnvironment)
-    } else {
-        return myMembers
-    }
-}
-
-interface ClassGetter {
-    fun getAsTypeMirror(methodName: String): TypeMirror?
-    fun getAsTypeMirrorList(methodName: String): List<TypeMirror>
-    fun <T : Annotation> getAsAnnotationBox(methodName: String): AnnotationBox<T>
-    fun <T : Annotation> getAsAnnotationBoxArray(methodName: String): Array<AnnotationBox<T>>
-}
-
-/**
- * Class that helps to read values from annotations. Simple types as string, int, lists can
- * be read from [value]. If you need to read classes or another annotations from annotation use
- * [getAsTypeMirror], [getAsAnnotationBox] and [getAsAnnotationBoxArray] correspondingly.
- */
-class AnnotationBox<T : Annotation>(private val obj: Any) : ClassGetter by (obj as ClassGetter) {
-    @Suppress("UNCHECKED_CAST")
-    val value: T = obj as T
-}
-
-private fun <T : Annotation> AnnotationMirror.box(cl: Class<T>): AnnotationBox<T> {
-    if (!cl.isAnnotation) {
-        throw IllegalArgumentException("$cl is not annotation")
-    }
-    val map = cl.declaredMethods.associate { method ->
-        val value = AnnotationMirrors.getAnnotationValue(this, method.name)
-        val returnType = method.returnType
-        val defaultValue = method.defaultValue
-        val result: Any? = when {
-            returnType == Boolean::class.java -> value.getAsBoolean(defaultValue as Boolean)
-            returnType == String::class.java -> value.getAsString(defaultValue as String?)
-            returnType == Array<String>::class.java -> value.getAsStringList().toTypedArray()
-            returnType == emptyArray<Class<*>>()::class.java -> value.toListOfClassTypes()
-            returnType == IntArray::class.java -> value.getAsIntList().toIntArray()
-            returnType == Class::class.java -> {
-                try {
-                    value.toClassType()
-                } catch (notPresent: TypeNotPresentException) {
-                    null
-                }
-            }
-            returnType == Int::class.java -> value.getAsInt(defaultValue as Int?)
-            returnType.isAnnotation -> {
-                @Suppress("UNCHECKED_CAST")
-                AnnotationClassVisitor(returnType as Class<out Annotation>).visit(value)
-            }
-            returnType.isArray && returnType.componentType.isAnnotation -> {
-                @Suppress("UNCHECKED_CAST")
-                ListVisitor(returnType.componentType as Class<out Annotation>).visit(value)
-            }
-            returnType.isEnum -> {
-                @Suppress("UNCHECKED_CAST")
-                value.getAsEnum(returnType as Class<out Enum<*>>)
-            }
-            else -> throw UnsupportedOperationException("$returnType isn't supported")
-        }
-        method.name to result
-    }
-    return AnnotationBox(Proxy.newProxyInstance(ClassGetter::class.java.classLoader,
-            arrayOf(cl, ClassGetter::class.java)) { _, method, args ->
-        when (method.name) {
-            ClassGetter::getAsTypeMirror.name -> map[args[0]]
-            ClassGetter::getAsTypeMirrorList.name -> map[args[0]]
-            "getAsAnnotationBox" -> map[args[0]]
-            "getAsAnnotationBoxArray" -> map[args[0]]
-            else -> map[method.name]
-        }
-    })
-}
-
-fun <T : Annotation> Element.toAnnotationBox(cl: KClass<T>) =
-        MoreElements.getAnnotationMirror(this, cl.java).orNull()?.box(cl.java)
-
-@Suppress("DEPRECATION")
-private class ListVisitor<T : Annotation>(private val annotationClass: Class<T>) :
-    SimpleAnnotationValueVisitor6<Array<AnnotationBox<T>>, Void?>() {
-    override fun visitArray(
-        values: MutableList<out AnnotationValue>?,
-        void: Void?
-    ): Array<AnnotationBox<T>> {
-        val visitor = AnnotationClassVisitor(annotationClass)
-        return values?.mapNotNull { visitor.visit(it) }?.toTypedArray() ?: emptyArray()
-    }
-}
-
-@Suppress("DEPRECATION")
-private class AnnotationClassVisitor<T : Annotation>(private val annotationClass: Class<T>) :
-    SimpleAnnotationValueVisitor6<AnnotationBox<T>?, Void?>() {
-    override fun visitAnnotation(a: AnnotationMirror?, v: Void?) = a?.box(annotationClass)
-}
-
-// code below taken from dagger2
-// compiler/src/main/java/dagger/internal/codegen/ConfigurationAnnotations.java
-@Suppress("DEPRECATION")
-private val TO_LIST_OF_TYPES = object :
-    SimpleAnnotationValueVisitor6<List<TypeMirror>, Void?>() {
-    override fun visitArray(values: MutableList<out AnnotationValue>?, p: Void?): List<TypeMirror> {
-        return values?.mapNotNull {
-            val tmp = TO_TYPE.visit(it)
-            tmp
-        } ?: emptyList()
-    }
-
-    override fun defaultAction(o: Any?, p: Void?): List<TypeMirror>? {
-        return emptyList()
-    }
-}
-
-@Suppress("DEPRECATION")
-private val TO_TYPE = object : SimpleAnnotationValueVisitor6<TypeMirror, Void>() {
-
-    override fun visitType(t: TypeMirror, p: Void?): TypeMirror {
-        return t
-    }
-
-    override fun defaultAction(o: Any?, p: Void?): TypeMirror {
-        throw TypeNotPresentException(o!!.toString(), null)
-    }
-}
-
-private fun AnnotationValue.toListOfClassTypes(): List<TypeMirror> {
-    return TO_LIST_OF_TYPES.visit(this)
-}
-
-private fun AnnotationValue.toClassType(): TypeMirror? {
-    return TO_TYPE.visit(this)
-}
-
-fun TypeMirror.isCollection(): Boolean {
-    return MoreTypes.isType(this) &&
-            (MoreTypes.isTypeOf(java.util.List::class.java, this) ||
-                    MoreTypes.isTypeOf(java.util.Set::class.java, this))
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_INT_VISITOR = object : SimpleAnnotationValueVisitor6<Int?, Void>() {
-    override fun visitInt(i: Int, p: Void?): Int? {
-        return i
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_BOOLEAN_VISITOR = object :
-    SimpleAnnotationValueVisitor6<Boolean?, Void>() {
-    override fun visitBoolean(b: Boolean, p: Void?): Boolean? {
-        return b
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_STRING_VISITOR = object :
-    SimpleAnnotationValueVisitor6<String?, Void>() {
-    override fun visitString(s: String?, p: Void?): String? {
-        return s
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_STRING_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<String>, Void>() {
-    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<String> {
-        return vals?.mapNotNull {
-            ANNOTATION_VALUE_TO_STRING_VISITOR.visit(it)
-        } ?: emptyList()
-    }
-}
-
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_INT_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Int>, Void>() {
-    override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Int> {
-        return vals?.mapNotNull {
-            ANNOTATION_VALUE_TO_INT_VISITOR.visit(it)
-        } ?: emptyList()
-    }
-}
-
-private fun AnnotationValue.getAsInt(def: Int? = null): Int? {
-    return ANNOTATION_VALUE_TO_INT_VISITOR.visit(this) ?: def
-}
-
-private fun AnnotationValue.getAsIntList(): List<Int> {
-    return ANNOTATION_VALUE_INT_ARR_VISITOR.visit(this)
-}
-
-private fun AnnotationValue.getAsString(def: String? = null): String? {
-    return ANNOTATION_VALUE_TO_STRING_VISITOR.visit(this) ?: def
-}
-
-private fun AnnotationValue.getAsBoolean(def: Boolean): Boolean {
-    return ANNOTATION_VALUE_TO_BOOLEAN_VISITOR.visit(this) ?: def
-}
-
-private fun AnnotationValue.getAsStringList(): List<String> {
-    return ANNOTATION_VALUE_STRING_ARR_VISITOR.visit(this)
-}
-
-@Suppress("UNCHECKED_CAST", "DEPRECATION")
-private fun <T : Enum<*>> AnnotationValue.getAsEnum(enumClass: Class<T>): T {
-    return object : SimpleAnnotationValueVisitor6<T, Void>() {
-        override fun visitEnumConstant(value: VariableElement?, p: Void?): T {
-            return enumClass.getDeclaredMethod("valueOf", String::class.java)
-                    .invoke(null, value!!.simpleName.toString()) as T
-        }
-    }.visit(this)
-}
-
-// a variant of Types.isAssignable that ignores variance.
-fun TypeMirror.isAssignableFromWithoutVariance(
-    typeUtils: Types,
-    from: TypeMirror
-) = typeUtils.isAssignableWithoutVariance(from = from, to = this)
-
-private fun Types.isAssignableWithoutVariance(from: TypeMirror, to: TypeMirror): Boolean {
-    val assignable = to.isAssignableFrom(this, from)
-    if (assignable) {
-        return true
-    }
-    if (!from.isDeclared() || !to.isDeclared()) {
-        return false
-    }
-    val declaredFrom = MoreTypes.asDeclared(from)
-    val declaredTo = MoreTypes.asDeclared(to)
-    val fromTypeArgs = declaredFrom.typeArguments
-    val toTypeArgs = declaredTo.typeArguments
-    // no type arguments, we don't need extra checks
-    if (fromTypeArgs.isEmpty() || fromTypeArgs.size != toTypeArgs.size) {
-        return false
-    }
-    // check erasure version first, if it does not match, no reason to proceed
-    if (!erasure(to).isAssignableFrom(this, erasure(from))) {
-        return false
-    }
-    // convert from args to their upper bounds if it exists
-    val fromExtendsBounds = fromTypeArgs.map {
-        it.extendsBound()
-    }
-    // if there are no upper bound conversions, return.
-    if (fromExtendsBounds.all { it == null }) {
-        return false
-    }
-    // try to move the types of the from to their upper bounds. It does not matter for the "to"
-    // because Types.isAssignable handles it as it is valid java
-    return (0 until fromTypeArgs.size).all { index ->
-        isAssignableWithoutVariance(
-                from = fromExtendsBounds[index] ?: fromTypeArgs[index],
-                to = toTypeArgs[index])
-    }
-}
-
-// converts ? in Set< ? extends Foo> to Foo
-fun TypeMirror.extendsBound(): TypeMirror? {
-    return this.accept(object : SimpleTypeVisitor7<TypeMirror?, Void?>() {
-        override fun visitWildcard(type: WildcardType, ignored: Void?): TypeMirror? {
-            return type.extendsBound ?: type.superBound
-        }
-    }, null)
-}
-
-/**
- * If the type mirror is in form of ? extends Foo, it returns Foo; otherwise, returns the TypeMirror
- * itself.
- */
-fun TypeMirror.extendsBoundOrSelf(): TypeMirror {
-    return extendsBound() ?: this
-}
-
-/**
- * Suffix of the Kotlin synthetic class created interface method implementations.
- */
-const val DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls"
-
-/**
- * Finds the default implementation method corresponding to this Kotlin interface method.
- */
-fun ExecutableElement.findKotlinDefaultImpl(typeUtils: Types): ExecutableElement? {
-    fun paramsMatch(ourParams: List<VariableElement>, theirParams: List<VariableElement>): Boolean {
-        if (ourParams.size != theirParams.size - 1) {
-            return false
-        }
-        ourParams.forEachIndexed { i, variableElement ->
-            // Plus 1 to their index because their first param is a self object.
-            if (!theirParams[i + 1].type.isSameType(typeUtils, variableElement.type)) {
-                return false
-            }
-        }
-        return true
-    }
-
-    val parent = this.enclosingElement as TypeElement
-    val innerClass: TypeElement = parent.enclosedElements.find {
-        it.isType() && it.simpleName.contentEquals(DEFAULT_IMPLS_CLASS_NAME)
-    } as? TypeElement ?: return null
-    return innerClass.getDeclaredMethods().find {
-        it.name == this.name && paramsMatch(this.parameters, it.parameters)
-    }
-}
-
-/**
- * Finds the Kotlin's suspend function return type by inspecting the type param of the Continuation
- * parameter of the function. This method assumes the executable type is a suspend function.
- * @see KotlinMetadataElement.isSuspendFunction
- */
-fun ExecutableType.getSuspendFunctionReturnType(): TypeMirror {
-    // the continuation parameter is always the last parameter of a suspend function and it only has
-    // one type parameter, e.g Continuation<? super T>
-    val typeParam = MoreTypes.asDeclared(parameterTypes.last()).typeArguments.first()
-    return typeParam.extendsBoundOrSelf() // reduce the type param
-}
-
-fun Element.getPackage() = MoreElements.getPackage(this).qualifiedName.toString()
-
-fun Element.asTypeElement() = MoreElements.asType(this)
-
-fun Element.asVariableElement() = MoreElements.asVariable(this)
-
-fun Element.asExecutableElement() = MoreElements.asExecutable(this)
-
-fun Element.isType(): Boolean {
-    contract {
-        returns(true) implies (this@isType is TypeElement)
-    }
-    return MoreElements.isType(this)
-}
-
-fun Element.isMethod(): Boolean {
-    contract {
-        returns(true) implies (this@isMethod is ExecutableElement)
-    }
-    return kind == ElementKind.METHOD
-}
-
-fun Element.isConstructor(): Boolean {
-    contract {
-        returns(true) implies (this@isConstructor is ExecutableElement)
-    }
-    return kind == ElementKind.CONSTRUCTOR
-}
-
-fun Element.isField(): Boolean {
-    contract {
-        returns(true) implies (this@isField is VariableElement)
-    }
-    return kind == ElementKind.FIELD
-}
-
-fun Element.isInterface(): Boolean {
-    contract {
-        returns(true) implies (this@isInterface is TypeElement)
-    }
-    return kind == ElementKind.INTERFACE
-}
-
-fun Element.asDeclaredType() = asType().asDeclaredType()
-
-/**
- * methods declared in this type
- *  includes all instance/static methods in this
- */
-fun TypeElement.getDeclaredMethods() = ElementFilter.methodsIn(
-    enclosedElements
-)
-
-/**
- * Methods declared in this type and its parents
- *  includes all instance/static methods in this
- *  includes all instance/static methods in parent CLASS if they are accessible from this (e.g. not
- *  private).
- *  does not include static methods in parent interfaces
- */
-fun TypeElement.getAllMethods(
-    processingEnv: ProcessingEnvironment
-) = ElementFilter.methodsIn(
-    processingEnv.elementUtils.getAllMembers(this)
-)
-
-/**
- * Instance methods declared in this and supers
- *  include non private instance methods
- *  also includes non-private instance methods from supers
- */
-fun TypeElement.getAllNonPrivateInstanceMethods(
-    processingEnvironment: ProcessingEnvironment
-) = MoreElements.getLocalAndInheritedMethods(
-    this,
-    processingEnvironment.typeUtils,
-    processingEnvironment.elementUtils)
-
-fun VariableElement.asMemberOf(
-    types: Types,
-    container: DeclaredType?
-) = MoreTypes.asMemberOf(types, container, this)
-
-fun ExecutableElement.asMemberOf(
-    types: Types,
-    container: DeclaredType?
-) = MoreTypes.asExecutable(types.asMemberOf(container, this))
-
-/**
- * Returns the string representation of the element kind.
- */
-fun Element.kindName() = kind.name.toLowerCase(Locale.US)
-
-// instead of using asType on Element, we should use a specific Element subclass's  .type
-// it is not enforce-able until migrating to the abstraction but still a step in the right direction
-// of safety
-val VariableElement.type: TypeMirror
-    get() = asType()
-
-val TypeElement.type: DeclaredType
-    get() = MoreTypes.asDeclared(asType())
-
-val ExecutableElement.executableType: ExecutableType
-    get() = MoreTypes.asExecutable(asType())
-
-val Element.name: String
-    get() = simpleName.toString()
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
index 6e24603..3e00d9e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
@@ -24,7 +24,6 @@
 import com.squareup.javapoet.TypeSpec
 import java.util.concurrent.Callable
 import javax.lang.model.element.Modifier
-import javax.lang.model.type.TypeMirror
 import kotlin.reflect.KClass
 
 val L = "\$L"
@@ -32,9 +31,10 @@
 val N = "\$N"
 val S = "\$S"
 
-fun KClass<*>.typeName() = ClassName.get(this.java)
-fun KClass<*>.arrayTypeName() = ArrayTypeName.of(typeName())
-fun TypeMirror.typeName() = TypeName.get(this)
+val KClass<*>.typeName: ClassName
+        get() = ClassName.get(this.java)
+val KClass<*>.arrayTypeName: ArrayTypeName
+        get() = ArrayTypeName.of(typeName)
 
 object SupportDbTypeNames {
     val DB: ClassName = ClassName.get("$SQLITE_PACKAGE.db", "SupportSQLiteDatabase")
@@ -205,10 +205,10 @@
     parameterTypeName: TypeName,
     callBody: MethodSpec.Builder.() -> Unit
 ) = TypeSpec.anonymousClassBuilder("").apply {
-    superclass(ParameterizedTypeName.get(Callable::class.typeName(), parameterTypeName))
+    superclass(ParameterizedTypeName.get(Callable::class.typeName, parameterTypeName))
     addMethod(MethodSpec.methodBuilder("call").apply {
         returns(parameterTypeName)
-        addException(Exception::class.typeName())
+        addException(Exception::class.typeName)
         addModifiers(Modifier.PUBLIC)
         addAnnotation(Override::class.java)
         callBody()
@@ -223,7 +223,7 @@
 ) = TypeSpec.anonymousClassBuilder("").apply {
     superclass(
         ParameterizedTypeName.get(
-            Function1::class.typeName(),
+            Function1::class.typeName,
             parameterTypeName,
             returnTypeName
         )
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/processing_env_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/processing_env_ext.kt
deleted file mode 100644
index c9e7812..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/ext/processing_env_ext.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 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 androidx.room.ext
-
-import com.google.auto.common.GeneratedAnnotations
-import com.squareup.javapoet.TypeName
-import java.util.Locale
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeMirror
-import kotlin.reflect.KClass
-
-/**
- * Query a type element by KClass and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeElement(
-    klass: KClass<*>
-): TypeElement? = findTypeElement(klass.java.canonicalName!!)
-
-/**
- * Query a type element by TypeName and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeElement(
-    typeName: TypeName
-): TypeElement? = findTypeElement(typeName.toString())
-
-/**
- * Query a type element by qualified name and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeElement(
-    qName: String
-): TypeElement? = elementUtils.getTypeElement(qName)
-
-/**
- * Query a type element by KClass and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeElement(
-    klass: KClass<*>
-): TypeElement = requireTypeElement(klass.java.canonicalName!!)
-
-/**
- * Query a type element by TypeName and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeElement(
-    typeName: TypeName
-): TypeElement = requireTypeElement(typeName.toString())
-
-/**
- * Query a type element by qualified name and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeElement(
-    qName: String
-): TypeElement = checkNotNull(elementUtils.getTypeElement(qName)) {
-    // we do not throw MissingTypeException here as this should be called only if the type should
-    // be there
-    "Couldn't find required type $qName"
-}
-
-/**
- * Query a TypeMirror by KClass and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeMirror(
-    klass: KClass<*>
-): TypeMirror = requireTypeMirror(klass.java.canonicalName!!)
-
-/**
- * Query a TypeMirror by TypeName and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeMirror(
-    typeName: TypeName
-): TypeMirror = requireTypeMirror(typeName.toString())
-
-/**
- * Query a TypeMirror by qualified name and throw if it does not exist
- */
-fun ProcessingEnvironment.requireTypeMirror(
-    qName: String
-): TypeMirror = checkNotNull(findTypeMirror(qName)) {
-    "couldn't find required type mirror $qName"
-}
-
-/**
- * Query a type mirror by KClass and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeMirror(
-    klass: KClass<*>
-): TypeMirror? = findTypeMirror(klass.java.canonicalName!!)
-
-/**
- * Query a type mirror by TypeName and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeMirror(
-    typeName: TypeName
-): TypeMirror? = findTypeMirror(typeName.toString())
-
-private val PRIMITIVE_TYPE_MAPPING = TypeKind.values().filter {
-    it.isPrimitive
-}.associateBy {
-    it.name.toLowerCase(Locale.US)
-}
-
-/**
- * Query a type mirror by qualified name and return null if it does not exist
- */
-fun ProcessingEnvironment.findTypeMirror(
-    qName: String
-): TypeMirror? {
-    // first check primitives. Even though it is less likely, it is fast to check and can avoid a
-    // call to the processor
-    PRIMITIVE_TYPE_MAPPING[qName]?.let {
-        return typeUtils.getPrimitiveType(it)
-    }
-    return findTypeElement(qName)?.type
-}
-
-fun ProcessingEnvironment.getGeneratedAnnotation(): TypeElement? {
-    val element = GeneratedAnnotations.generatedAnnotation(elementUtils, sourceVersion)
-    return if (element.isPresent) {
-        element.get()
-    } else {
-        null
-    }
-}
-
-fun ProcessingEnvironment.getArrayType(typeName: TypeName): ArrayType {
-    return typeUtils.getArrayType(requireTypeMirror(typeName))
-}
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/type_mirror_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/type_mirror_ext.kt
deleted file mode 100644
index a28f674..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/ext/type_mirror_ext.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-import androidx.room.ext.type
-import com.google.auto.common.MoreTypes
-import javax.lang.model.element.Element
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.PrimitiveType
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeKind.ARRAY
-import javax.lang.model.type.TypeKind.BOOLEAN
-import javax.lang.model.type.TypeKind.BYTE
-import javax.lang.model.type.TypeKind.CHAR
-import javax.lang.model.type.TypeKind.DECLARED
-import javax.lang.model.type.TypeKind.DOUBLE
-import javax.lang.model.type.TypeKind.FLOAT
-import javax.lang.model.type.TypeKind.INT
-import javax.lang.model.type.TypeKind.LONG
-import javax.lang.model.type.TypeKind.SHORT
-import javax.lang.model.type.TypeMirror
-import javax.lang.model.util.Types
-import kotlin.contracts.ExperimentalContracts
-import kotlin.contracts.contract
-import kotlin.reflect.KClass
-
-fun TypeMirror.defaultValue(): String {
-    return when (this.kind) {
-        BOOLEAN -> "false"
-        BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE -> "0"
-        else -> "null"
-    }
-}
-
-fun TypeMirror.box(typeUtils: Types) = if (this.kind.isPrimitive) {
-    typeUtils.boxedClass(this as PrimitiveType).type
-} else {
-    this
-}
-fun TypeMirror.asTypeElement(): TypeElement = MoreTypes.asTypeElement(this)
-
-fun TypeMirror.asElement(): Element = MoreTypes.asElement(this)
-
-fun TypeMirror.isPrimitiveInt() = kind == TypeKind.INT
-
-fun TypeMirror.isPrimitive() = kind.isPrimitive
-
-fun TypeMirror.isBoxedInt() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(java.lang.Integer::class.java, this)
-
-fun TypeMirror.isInt() = isPrimitiveInt() || isBoxedInt()
-
-fun TypeMirror.isPrimitiveLong() = kind == TypeKind.LONG
-
-fun TypeMirror.isBoxedLong() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(java.lang.Long::class.java, this)
-
-fun TypeMirror.isLong() = isPrimitiveLong() || isBoxedLong()
-
-fun TypeMirror.isList() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(List::class.java, this)
-
-fun TypeMirror.isVoid() = kind == TypeKind.VOID
-
-fun TypeMirror.isNotVoid() = !isVoid()
-
-fun TypeMirror.isError() = kind == TypeKind.ERROR
-
-fun TypeMirror.isNotError() = !isError()
-
-fun TypeMirror.isNone() = kind == TypeKind.NONE
-
-fun TypeMirror.isNotNone() = !isNone()
-
-fun TypeMirror.isByte() = kind == BYTE
-
-fun TypeMirror.isNotByte() = !isByte()
-
-@OptIn(ExperimentalContracts::class)
-fun TypeMirror.isDeclared(): Boolean {
-    contract {
-        returns(true) implies (this@isDeclared is DeclaredType)
-    }
-    return kind == DECLARED
-}
-
-fun TypeMirror.isVoidObject() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(Void::class.java, this)
-
-fun TypeMirror.isKotlinUnit() =
-    MoreTypes.isType(this) && MoreTypes.isTypeOf(Unit::class.java, this)
-
-fun TypeMirror.isAssignableFrom(typeUtils: Types, other: TypeMirror): Boolean {
-    return typeUtils.isAssignable(other, this)
-}
-
-fun TypeMirror.asDeclaredType() = MoreTypes.asDeclared(this)
-
-fun TypeMirror.isType() = MoreTypes.isType(this)
-
-fun TypeMirror.isTypeOf(klass: KClass<*>) = MoreTypes.isTypeOf(
-    klass.java,
-    this
-)
-
-fun TypeMirror.isArray(): Boolean {
-    contract {
-        returns(true) implies (this@isArray is ArrayType)
-    }
-    return kind == ARRAY
-}
-
-fun TypeMirror.asArray() = MoreTypes.asArray(this)
-
-fun TypeMirror.asPrimitive() = MoreTypes.asPrimitiveType(this)
-
-fun TypeMirror.isSameType(utils: Types, other: TypeMirror) = utils.isSameType(this, other)
-
-fun TypeMirror.erasure(utils: Types) = utils.erasure(this)
diff --git a/room/compiler/src/main/kotlin/androidx/room/ext/xelement_ext.kt b/room/compiler/src/main/kotlin/androidx/room/ext/xelement_ext.kt
new file mode 100644
index 0000000..ff3928b
--- /dev/null
+++ b/room/compiler/src/main/kotlin/androidx/room/ext/xelement_ext.kt
@@ -0,0 +1,33 @@
+/*
+ * 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 androidx.room.ext
+
+import androidx.room.processing.XElement
+import androidx.room.processing.XTypeElement
+import kotlin.contracts.contract
+
+fun XElement.isEntityElement(): Boolean {
+    contract {
+        returns(true) implies (this@isEntityElement is XTypeElement)
+    }
+    return this.hasAnnotation(androidx.room.Entity::class)
+}
+
+/**
+ * Suffix of the Kotlin synthetic class created interface method implementations.
+ */
+const val DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls"
diff --git a/room/compiler/src/main/kotlin/androidx/room/kotlin/JvmDescriptorUtils.kt b/room/compiler/src/main/kotlin/androidx/room/kotlin/JvmDescriptorUtils.kt
deleted file mode 100644
index 09cf3f2..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/kotlin/JvmDescriptorUtils.kt
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 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 androidx.room.kotlin
-
-import androidx.room.ext.executableType
-import androidx.room.ext.type
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.NestingKind
-import javax.lang.model.element.QualifiedNameable
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.ErrorType
-import javax.lang.model.type.ExecutableType
-import javax.lang.model.type.IntersectionType
-import javax.lang.model.type.NoType
-import javax.lang.model.type.NullType
-import javax.lang.model.type.PrimitiveType
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeMirror
-import javax.lang.model.type.TypeVariable
-import javax.lang.model.type.UnionType
-import javax.lang.model.type.WildcardType
-import javax.lang.model.util.AbstractTypeVisitor8
-
-/**
- * Returns the method descriptor of this [ExecutableElement].
- *
- * For reference, see the [JVM specification, section 4.3.2](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2)
- */
-fun VariableElement.descriptor() = "$simpleName:${type.descriptor()}"
-
-/**
- * Returns the method descriptor of this [ExecutableElement].
- *
- * For reference, see the [JVM specification, section 4.3.3](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.3)
- */
-fun ExecutableElement.descriptor() = "$simpleName${executableType.descriptor()}"
-
-/**
- * Returns the name of this [TypeElement] in its "internal form".
- *
- * For reference, see the [JVM specification, section 4.2](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2).
- */
-internal val Element.internalName: String
-    get() = when (this) {
-        is TypeElement ->
-            when (nestingKind) {
-                NestingKind.TOP_LEVEL ->
-                    qualifiedName.toString().replace('.', '/')
-                NestingKind.MEMBER ->
-                    enclosingElement.internalName + "$" + simpleName
-                NestingKind.LOCAL, NestingKind.ANONYMOUS ->
-                    error("Unsupported nesting $nestingKind")
-                else ->
-                    error("Unsupported, nestingKind == null")
-            }
-        is QualifiedNameable -> qualifiedName.toString().replace('.', '/')
-        else -> simpleName.toString()
-    }
-
-internal val NoType.descriptor: String
-    get() = "V"
-
-internal val DeclaredType.descriptor: String
-    get() = "L" + asElement().internalName + ";"
-
-internal val PrimitiveType.descriptor: String
-    get() = when (this.kind) {
-        TypeKind.BYTE -> "B"
-        TypeKind.CHAR -> "C"
-        TypeKind.DOUBLE -> "D"
-        TypeKind.FLOAT -> "F"
-        TypeKind.INT -> "I"
-        TypeKind.LONG -> "J"
-        TypeKind.SHORT -> "S"
-        TypeKind.BOOLEAN -> "Z"
-        else -> error("Unknown primitive type $this")
-    }
-
-fun TypeMirror.descriptor(): String = accept(JvmDescriptorTypeVisitor, Unit)
-
-internal fun WildcardType.descriptor(): String = ""
-
-// The erasure of a type variable is the erasure of its leftmost bound. - JVM Spec Sec 4.6
-internal fun TypeVariable.descriptor(): String = this.upperBound.descriptor()
-
-// For a type variable with multiple bounds: "the erasure of a type variable is determined by
-// the first type in its bound" - JVM Spec Sec 4.4
-internal fun IntersectionType.descriptor(): String =
-    this.bounds[0].descriptor()
-
-internal fun ArrayType.descriptor(): String =
-    "[" + componentType.descriptor()
-
-internal fun ExecutableType.descriptor(): String {
-    val parameterDescriptors =
-        parameterTypes.joinToString(separator = "") { it.descriptor() }
-    val returnDescriptor = returnType.descriptor()
-    return "($parameterDescriptors)$returnDescriptor"
-}
-
-/**
- * When applied over a type, it returns either:
- * + a "field descriptor", for example: `Ljava/lang/Object;`
- * + a "method descriptor", for example: `(Ljava/lang/Object;)Z`
- *
- * The easiest way to use this is through [TypeMirror.descriptor]
- *
- * For reference, see the [JVM specification, section 4.3](http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3).
- */
-@Suppress("DEPRECATION")
-internal object JvmDescriptorTypeVisitor : AbstractTypeVisitor8<String, Unit>() {
-
-    override fun visitNoType(t: NoType, u: Unit): String = t.descriptor
-
-    override fun visitDeclared(t: DeclaredType, u: Unit): String = t.descriptor
-
-    override fun visitPrimitive(t: PrimitiveType, u: Unit): String = t.descriptor
-
-    override fun visitArray(t: ArrayType, u: Unit): String = t.descriptor()
-
-    override fun visitWildcard(t: WildcardType, u: Unit): String = t.descriptor()
-
-    override fun visitExecutable(t: ExecutableType, u: Unit): String = t.descriptor()
-
-    override fun visitTypeVariable(t: TypeVariable, u: Unit): String = t.descriptor()
-
-    override fun visitNull(t: NullType, u: Unit): String = visitUnknown(t, u)
-
-    override fun visitError(t: ErrorType, u: Unit): String = visitUnknown(t, u)
-
-    override fun visitIntersection(t: IntersectionType, u: Unit) = t.descriptor()
-
-    override fun visitUnion(t: UnionType, u: Unit) = visitUnknown(t, u)
-
-    override fun visitUnknown(t: TypeMirror, u: Unit): String = error("Unsupported type $t")
-}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinClassMetadataUtils.kt b/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinClassMetadataUtils.kt
deleted file mode 100644
index 955c5f1..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinClassMetadataUtils.kt
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 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 androidx.room.kotlin
-
-import kotlinx.metadata.ClassName
-import kotlinx.metadata.Flag
-import kotlinx.metadata.Flags
-import kotlinx.metadata.KmClassVisitor
-import kotlinx.metadata.KmConstructorExtensionVisitor
-import kotlinx.metadata.KmConstructorVisitor
-import kotlinx.metadata.KmExtensionType
-import kotlinx.metadata.KmFunctionExtensionVisitor
-import kotlinx.metadata.KmFunctionVisitor
-import kotlinx.metadata.KmValueParameterVisitor
-import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor
-import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor
-import kotlinx.metadata.jvm.JvmMethodSignature
-import kotlinx.metadata.jvm.KotlinClassMetadata
-
-/**
- * Represents the kotlin metadata of a function
- */
-data class KmFunction(
-    val descriptor: String,
-    private val flags: Flags,
-    val parameters: List<KmValueParameter>
-) {
-    fun isSuspend() = Flag.Function.IS_SUSPEND(flags)
-}
-
-/**
- * Represents the kotlin metadata of a constructor
- */
-data class KmConstructor(
-    val descriptor: String,
-    private val flags: Flags,
-    val parameters: List<KmValueParameter>
-) {
-    fun isPrimary() = Flag.Constructor.IS_PRIMARY(flags)
-}
-
-/**
- * Represents the kotlin metadata of a parameter
- */
-data class KmValueParameter(val name: String, private val flags: Flags)
-
-internal fun KotlinClassMetadata.Class.readFunctions(): List<KmFunction> =
-    mutableListOf<KmFunction>().apply { accept(FunctionReader(this)) }
-
-private class FunctionReader(val result: MutableList<KmFunction>) : KmClassVisitor() {
-    override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
-        return object : KmFunctionVisitor() {
-
-            lateinit var descriptor: String
-            val parameters = mutableListOf<KmValueParameter>()
-
-            override fun visitValueParameter(
-                flags: Flags,
-                name: String
-            ): KmValueParameterVisitor? {
-                parameters.add(KmValueParameter(name, flags))
-                return super.visitValueParameter(flags, name)
-            }
-
-            override fun visitExtensions(type: KmExtensionType): KmFunctionExtensionVisitor? {
-                if (type != JvmFunctionExtensionVisitor.TYPE) {
-                    error("Unsupported extension type: $type")
-                }
-                return object : JvmFunctionExtensionVisitor() {
-                    override fun visit(signature: JvmMethodSignature?) {
-                        descriptor = signature!!.asString()
-                    }
-                }
-            }
-
-            override fun visitEnd() {
-                result.add(KmFunction(descriptor, flags, parameters))
-            }
-        }
-    }
-}
-
-internal fun KotlinClassMetadata.Class.readConstructors(): List<KmConstructor> =
-    mutableListOf<KmConstructor>().apply { accept(ConstructorReader(this)) }
-
-private class ConstructorReader(val result: MutableList<KmConstructor>) : KmClassVisitor() {
-    override fun visitConstructor(flags: Flags): KmConstructorVisitor? {
-        return object : KmConstructorVisitor() {
-
-            lateinit var descriptor: String
-            val parameters = mutableListOf<KmValueParameter>()
-
-            override fun visitValueParameter(
-                flags: Flags,
-                name: String
-            ): KmValueParameterVisitor? {
-                parameters.add(KmValueParameter(name, flags))
-                return super.visitValueParameter(flags, name)
-            }
-
-            override fun visitExtensions(type: KmExtensionType): KmConstructorExtensionVisitor? {
-                if (type != JvmConstructorExtensionVisitor.TYPE) {
-                    error("Unsupported extension type: $type")
-                }
-                return object : JvmConstructorExtensionVisitor() {
-                    override fun visit(signature: JvmMethodSignature?) {
-                        descriptor = signature!!.asString()
-                    }
-                }
-            }
-
-            override fun visitEnd() {
-                result.add(KmConstructor(descriptor, flags, parameters))
-            }
-        }
-    }
-}
-
-internal fun KotlinClassMetadata.Class.isObject(): Boolean = ObjectReader().let {
-    this@isObject.accept(it)
-    it.isObject
-}
-
-private class ObjectReader() : KmClassVisitor() {
-    var isObject: Boolean = false
-    override fun visit(flags: Flags, name: ClassName) {
-        isObject = Flag.Class.IS_OBJECT(flags)
-    }
-}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinMetadataElement.kt b/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinMetadataElement.kt
deleted file mode 100644
index 6d121bc..0000000
--- a/room/compiler/src/main/kotlin/androidx/room/kotlin/KotlinMetadataElement.kt
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 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 androidx.room.kotlin
-
-import androidx.room.processor.Context
-import kotlinx.metadata.jvm.KotlinClassHeader
-import kotlinx.metadata.jvm.KotlinClassMetadata
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-
-/**
- * Utility class for processors that wants to run kotlin specific code.
- */
-class KotlinMetadataElement(
-    val context: Context,
-    val element: Element,
-    private val classMetadata: KotlinClassMetadata.Class
-) {
-
-    private val functionList: List<KmFunction> by lazy { classMetadata.readFunctions() }
-    private val constructorList: List<KmConstructor> by lazy { classMetadata.readConstructors() }
-
-    private val ExecutableElement.descriptor: String
-        get() = descriptor()
-
-    /**
-     * Returns the parameter names of the function or constructor if all have names embedded in the
-     * metadata.
-     */
-    fun getParameterNames(method: ExecutableElement): List<String>? {
-        val methodSignature = method.descriptor
-        val paramList =
-            functionList.firstOrNull { it.descriptor == methodSignature }?.parameters
-                ?: constructorList.firstOrNull { it.descriptor == methodSignature }?.parameters
-        return paramList?.map { it.name }
-    }
-
-    /**
-     * Finds the primary constructor descriptor of the class.
-     */
-    fun findPrimaryConstructorSignature() = constructorList.first { it.isPrimary() }.descriptor
-
-    /**
-     * Checks if a method is a suspend function.
-     */
-    fun isSuspendFunction(method: ExecutableElement) = functionList.firstOrNull {
-        it.descriptor == method.descriptor
-    }?.isSuspend() ?: false
-
-    fun isObject(): Boolean = classMetadata.isObject()
-
-    companion object {
-
-        /**
-         * Creates a [KotlinMetadataElement] for the given element if it contains Kotlin metadata,
-         * otherwise this method returns null.
-         *
-         * Usually the [element] passed must represent a class. For example, if kotlin metadata is
-         * desired for a method, then the containing method should be used as parameter.
-         */
-        fun createFor(context: Context, element: Element): KotlinMetadataElement? {
-            val metadata = getMetadataAnnotation(element)?.run {
-                KotlinClassHeader(
-                    kind = kind,
-                    metadataVersion = metadataVersion,
-                    bytecodeVersion = bytecodeVersion,
-                    data1 = data1,
-                    data2 = data2,
-                    extraString = extraString,
-                    packageName = packageName,
-                    extraInt = extraInt
-                ).let {
-                    // TODO: Support more metadata kind (file facade, synthetic class, etc...)
-                    KotlinClassMetadata.read(it) as? KotlinClassMetadata.Class
-                }
-            }
-            return if (metadata != null) {
-                KotlinMetadataElement(context, element, metadata)
-            } else {
-                null
-            }
-        }
-
-        /**
-         * Search for Kotlin's Metadata annotation across the element's hierarchy.
-         */
-        private fun getMetadataAnnotation(element: Element?): Metadata? =
-            if (element != null) {
-                element.getAnnotation(Metadata::class.java)
-                    ?: getMetadataAnnotation(element.enclosingElement)
-            } else {
-                null
-            }
-    }
-}
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt b/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
index 6df6342..c1433aa 100644
--- a/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
@@ -18,22 +18,19 @@
 
 package androidx.room.log
 
+import androidx.room.processing.XElement
+import androidx.room.processing.XMessager
 import androidx.room.processor.Context
 import androidx.room.vo.Warning
-import java.io.StringWriter
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.element.ElementKind
-import javax.lang.model.util.Elements
 import javax.tools.Diagnostic
 import javax.tools.Diagnostic.Kind.ERROR
 import javax.tools.Diagnostic.Kind.NOTE
 import javax.tools.Diagnostic.Kind.WARNING
 
 class RLog(
-    val messager: Messager,
+    val messager: XMessager,
     val suppressedWarnings: Set<Warning>,
-    val defaultElement: Element?
+    val defaultElement: XElement?
 ) {
     private fun String.safeFormat(vararg args: Any): String {
         try {
@@ -45,7 +42,7 @@
         }
     }
 
-    fun d(element: Element, msg: String, vararg args: Any) {
+    fun d(element: XElement, msg: String, vararg args: Any) {
         messager.printMessage(NOTE, msg.safeFormat(args), element)
     }
 
@@ -53,7 +50,7 @@
         messager.printMessage(NOTE, msg.safeFormat(args))
     }
 
-    fun e(element: Element, msg: String, vararg args: Any) {
+    fun e(element: XElement, msg: String, vararg args: Any) {
         messager.printMessage(ERROR, msg.safeFormat(args), element)
     }
 
@@ -61,12 +58,14 @@
         messager.printMessage(ERROR, msg.safeFormat(args), defaultElement)
     }
 
-    fun w(warning: Warning, element: Element? = null, msg: String, vararg args: Any) {
+    fun w(warning: Warning, element: XElement? = null, msg: String, vararg args: Any) {
         if (suppressedWarnings.contains(warning)) {
             return
         }
-        messager.printMessage(WARNING, msg.safeFormat(args),
-                element ?: defaultElement)
+        messager.printMessage(
+            WARNING, msg.safeFormat(args),
+            element ?: defaultElement
+        )
     }
 
     fun w(warning: Warning, msg: String, vararg args: Any) {
@@ -76,32 +75,15 @@
         messager.printMessage(WARNING, msg.safeFormat(args), defaultElement)
     }
 
-    interface Messager {
-        fun printMessage(kind: Diagnostic.Kind, msg: String, element: Element? = null)
-    }
-
-    class ProcessingEnvMessager(val processingEnv: ProcessingEnvironment) : Messager {
-        override fun printMessage(kind: Diagnostic.Kind, msg: String, element: Element?) {
-            processingEnv.messager.printMessage(
-                    kind,
-                    if (element != null && element.isFromCompiledClass()) {
-                        msg.appendElement(processingEnv.elementUtils, element)
-                    } else {
-                        msg
-                    },
-                    element)
-        }
-    }
-
-    class CollectingMessager : Messager {
-        private val messages = mutableMapOf<Diagnostic.Kind, MutableList<Pair<String, Element?>>> ()
-        override fun printMessage(kind: Diagnostic.Kind, msg: String, element: Element?) {
+    class CollectingMessager : XMessager {
+        private val messages = mutableMapOf<Diagnostic.Kind, MutableList<Pair<String, XElement?>>>()
+        override fun printMessage(kind: Diagnostic.Kind, msg: String, element: XElement?) {
             messages.getOrPut(kind, {
                 arrayListOf()
             }).add(Pair(msg, element))
         }
 
-        fun hasErrors() = messages.containsKey(Diagnostic.Kind.ERROR)
+        fun hasErrors() = messages.containsKey(ERROR)
 
         fun writeTo(context: Context) {
             val printMessage = context.logger.messager::printMessage
@@ -113,51 +95,4 @@
             }
         }
     }
-
-    companion object {
-
-        /**
-         * Indicates whether an element comes from a compiled class.
-         *
-         * If this method fails to identify if the element comes from a compiled class it will
-         * default to returning false. Note that this is a poor-man's method of identifying if the
-         * java source of the element is available without depending on compiler tools.
-         */
-        private fun Element.isFromCompiledClass(): Boolean {
-            fun getClassFileString(symbol: Any): String =
-                    try {
-                        symbol.javaClass.getDeclaredField("classfile").get(symbol).toString()
-                    } catch (ex: NoSuchFieldException) {
-                        getClassFileString(
-                                symbol.javaClass.superclass.getDeclaredField("owner").get(symbol))
-                    }
-
-            return try {
-                getClassFileString(this).let {
-                    it.contains(".jar") || it.contains(".class")
-                }
-            } catch (ex: Throwable) {
-                false
-            }
-        }
-
-        private fun String.appendElement(elementUtils: Elements, element: Element): String {
-            return StringBuilder(this).apply {
-                append(" - ")
-                when (element.kind) {
-                    ElementKind.CLASS, ElementKind.INTERFACE, ElementKind.CONSTRUCTOR ->
-                        append(element)
-                    ElementKind.FIELD, ElementKind.METHOD, ElementKind.PARAMETER ->
-                        append("$element in ${element.enclosingElement}")
-                    else -> {
-                        // Not sure how to nicely print the element, delegate to utils then.
-                        append("In:\n")
-                        append(StringWriter().apply {
-                            elementUtils.printElements(this, element)
-                        }.toString())
-                    }
-                }
-            }.toString()
-        }
-    }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
index 04b95e9..1b402da 100644
--- a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
@@ -30,9 +30,9 @@
 
 data class Section(val text: String, val type: SectionType) {
     companion object {
-        fun text(text: String) = Section(text, SectionType.TEXT)
-        fun newline() = Section("", SectionType.NEWLINE)
-        fun bindVar(text: String) = Section(text, SectionType.BIND_VAR)
+        fun text(text: String) = Section(text, TEXT)
+        fun newline() = Section("", NEWLINE)
+        fun bindVar(text: String) = Section(text, BIND_VAR)
     }
 }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt b/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
index 82dc4e6..494dfd6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
@@ -17,14 +17,11 @@
 package androidx.room.parser
 
 import androidx.room.ColumnInfo
-import androidx.room.ext.getArrayType
-import androidx.room.ext.requireTypeMirror
-import box
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import com.squareup.javapoet.TypeName
 import org.antlr.v4.runtime.tree.ParseTree
 import org.antlr.v4.runtime.tree.TerminalNode
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 @Suppress("FunctionName")
 class QueryVisitor(
@@ -191,9 +188,9 @@
     REAL,
     BLOB;
 
-    fun getTypeMirrors(env: ProcessingEnvironment): List<TypeMirror>? {
+    fun getTypeMirrors(env: XProcessingEnv): List<XType>? {
         return when (this) {
-            TEXT -> listOf(env.requireTypeMirror("java.lang.String"))
+            TEXT -> listOf(env.requireType("java.lang.String"))
             INTEGER -> withBoxedTypes(
                 env, TypeName.INT, TypeName.BYTE, TypeName.CHAR,
                 TypeName.LONG, TypeName.SHORT
@@ -206,11 +203,11 @@
         }
     }
 
-    private fun withBoxedTypes(env: ProcessingEnvironment, vararg primitives: TypeName):
-            List<TypeMirror> {
+    private fun withBoxedTypes(env: XProcessingEnv, vararg primitives: TypeName):
+            List<XType> {
         return primitives.flatMap {
-            val primitiveType = env.requireTypeMirror(it)
-            listOf(primitiveType, primitiveType.box(env.typeUtils))
+            val primitiveType = env.requireType(it)
+            listOf(primitiveType, primitiveType.boxed())
         }
     }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt b/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt
index 2b496f2..9d65c60 100644
--- a/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/preconditions/Checks.kt
@@ -16,12 +16,11 @@
 
 package androidx.room.preconditions
 
-import androidx.room.ext.hasAnnotation
 import androidx.room.log.RLog
+import androidx.room.processing.XElement
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeVariableName
-import javax.lang.model.element.Element
 import kotlin.reflect.KClass
 
 /**
@@ -33,7 +32,7 @@
  */
 class Checks(private val logger: RLog) {
 
-    fun check(predicate: Boolean, element: Element, errorMsg: String, vararg args: Any): Boolean {
+    fun check(predicate: Boolean, element: XElement, errorMsg: String, vararg args: Any): Boolean {
         if (!predicate) {
             logger.e(element, errorMsg, args)
         }
@@ -41,7 +40,7 @@
     }
 
     fun hasAnnotation(
-        element: Element,
+        element: XElement,
         annotation: KClass<out Annotation>,
         errorMsg: String,
         vararg args: Any
@@ -56,7 +55,7 @@
 
     fun notUnbound(
         typeName: TypeName,
-        element: Element,
+        element: XElement,
         errorMsg: String,
         vararg args: Any
     ): Boolean {
@@ -70,7 +69,7 @@
         return !failed
     }
 
-    fun notBlank(value: String?, element: Element, msg: String, vararg args: Any): Boolean {
+    fun notBlank(value: String?, element: XElement, msg: String, vararg args: Any): Boolean {
         return check(value != null && value.isNotBlank(), element, msg, args)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
index 408b149..b9649db 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
@@ -17,24 +17,22 @@
 package androidx.room.processor
 
 import androidx.room.RewriteQueriesToDropUnusedColumns
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.requireTypeMirror
 import androidx.room.log.RLog
 import androidx.room.parser.expansion.ProjectionExpander
 import androidx.room.parser.optimization.RemoveUnusedColumnQueryRewriter
 import androidx.room.preconditions.Checks
+import androidx.room.processing.XElement
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import androidx.room.processor.cache.Cache
 import androidx.room.solver.TypeAdapterStore
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Warning
 import java.io.File
 import java.util.LinkedHashSet
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.type.TypeMirror
 
 class Context private constructor(
-    val processingEnv: ProcessingEnvironment,
+    val processingEnv: XProcessingEnv,
     val logger: RLog,
     private val typeConverters: CustomConverterProcessor.ProcessResult,
     private val inheritedAdapterStore: TypeAdapterStore?,
@@ -42,7 +40,7 @@
     private val canRewriteQueriesToDropUnusedColumns: Boolean
 ) {
     val checker: Checks = Checks(logger)
-    val COMMON_TYPES: Context.CommonTypes = Context.CommonTypes(processingEnv)
+    val COMMON_TYPES = CommonTypes(processingEnv)
 
     val typeAdapterStore by lazy {
         if (inheritedAdapterStore != null) {
@@ -87,23 +85,23 @@
         this.databaseVerifier = databaseVerifier
     }
 
-    constructor(processingEnv: ProcessingEnvironment) : this(
+    constructor(processingEnv: XProcessingEnv) : this(
             processingEnv = processingEnv,
-            logger = RLog(RLog.ProcessingEnvMessager(processingEnv), emptySet(), null),
+            logger = RLog(processingEnv.messager, emptySet(), null),
             typeConverters = CustomConverterProcessor.ProcessResult.EMPTY,
             inheritedAdapterStore = null,
             cache = Cache(null, LinkedHashSet(), emptySet()),
             canRewriteQueriesToDropUnusedColumns = false)
 
-    class CommonTypes(val processingEnv: ProcessingEnvironment) {
-        val VOID: TypeMirror by lazy {
-            processingEnv.requireTypeMirror("java.lang.Void")
+    class CommonTypes(val processingEnv: XProcessingEnv) {
+        val VOID: XType by lazy {
+            processingEnv.requireType("java.lang.Void")
         }
-        val STRING: TypeMirror by lazy {
-            processingEnv.requireTypeMirror("java.lang.String")
+        val STRING: XType by lazy {
+            processingEnv.requireType("java.lang.String")
         }
-        val COLLECTION: TypeMirror by lazy {
-            processingEnv.requireTypeMirror("java.util.Collection")
+        val COLLECTION: XType by lazy {
+            processingEnv.requireType("java.util.Collection")
         }
     }
 
@@ -129,7 +127,7 @@
         return Pair(result, collector)
     }
 
-    fun fork(element: Element, forceSuppressedWarnings: Set<Warning> = emptySet()): Context {
+    fun fork(element: XElement, forceSuppressedWarnings: Set<Warning> = emptySet()): Context {
         val suppressedWarnings = SuppressWarningProcessor.getSuppressedWarnings(element)
         val processConvertersResult = CustomConverterProcessor.findConverters(this, element)
         val canReUseAdapterStore = processConvertersResult.classes.isEmpty()
@@ -155,7 +153,7 @@
         return subContext
     }
 
-    private fun Element.hasRemoveUnusedColumnsAnnotation(): Boolean {
+    private fun XElement.hasRemoveUnusedColumnsAnnotation(): Boolean {
         return hasAnnotation(RewriteQueriesToDropUnusedColumns::class).also { annotated ->
             if (annotated && BooleanProcessorOptions.EXPAND_PROJECTION.getValue(processingEnv)) {
                 logger.w(
@@ -176,10 +174,10 @@
         EXPAND_PROJECTION("room.expandProjection", false);
 
         /**
-         * Returns the value of this option passed through the [ProcessingEnvironment]. If the value
+         * Returns the value of this option passed through the [XProcessingEnv]. If the value
          * is null or blank, it returns the default value instead.
          */
-        fun getValue(processingEnv: ProcessingEnvironment): Boolean {
+        fun getValue(processingEnv: XProcessingEnv): Boolean {
             val value = processingEnv.options[argName]
             return if (value.isNullOrBlank()) {
                 defaultValue
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
index f0b3434..8a509c5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
@@ -18,16 +18,11 @@
 
 import androidx.room.TypeConverter
 import androidx.room.TypeConverters
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getConstructors
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.isPublic
-import androidx.room.ext.isStatic
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
-import androidx.room.kotlin.KotlinMetadataElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_BAD_RETURN_TYPE
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_EMPTY_CLASS
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_MISSING_NOARG_CONSTRUCTOR
@@ -36,30 +31,20 @@
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_UNBOUND_GENERIC
 import androidx.room.solver.types.CustomTypeConverterWrapper
 import androidx.room.vo.CustomTypeConverter
-import asTypeElement
-import isError
-import isNone
-import isType
-import isVoid
 import java.util.LinkedHashSet
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Processes classes that are referenced in TypeConverters annotations.
  */
-class CustomConverterProcessor(val context: Context, val element: TypeElement) {
+class CustomConverterProcessor(val context: Context, val element: XTypeElement) {
     companion object {
-        private fun TypeMirror.isInvalidReturnType() =
+        private fun XType.isInvalidReturnType() =
             isError() || isVoid() || isNone()
 
-        fun findConverters(context: Context, element: Element): ProcessResult {
+        fun findConverters(context: Context, element: XElement): ProcessResult {
             val annotation = element.toAnnotationBox(TypeConverters::class)
             return annotation?.let {
-                val classes = it.getAsTypeMirrorList("value")
+                val classes = it.getAsTypeList("value")
                     .filter { it.isType() }
                     .mapTo(LinkedHashSet()) { it }
                 val converters = classes.flatMap {
@@ -72,7 +57,7 @@
 
         private fun reportDuplicates(context: Context, converters: List<CustomTypeConverter>) {
             converters
-                .groupBy { it.from.typeName() to it.to.typeName() }
+                .groupBy { it.from.typeName to it.to.typeName }
                 .filterValues { it.size > 1 }
                 .values.forEach {
                     it.forEach { converter ->
@@ -87,7 +72,7 @@
 
     fun process(): List<CustomTypeConverter> {
         // using element utils instead of MoreElements to include statics.
-        val methods = element.getAllMethods(context.processingEnv)
+        val methods = element.getAllMethods()
         val declaredType = element.asDeclaredType()
         val converterMethods = methods.filter {
             it.hasAnnotation(TypeConverter::class)
@@ -95,8 +80,7 @@
         context.checker.check(converterMethods.isNotEmpty(), element, TYPE_CONVERTER_EMPTY_CLASS)
         val allStatic = converterMethods.all { it.isStatic() }
         val constructors = element.getConstructors()
-        val kotlinMetadata = KotlinMetadataElement.createFor(context, element)
-        val isKotlinObjectDeclaration = kotlinMetadata?.isObject() == true
+        val isKotlinObjectDeclaration = element.isKotlinObject()
         context.checker.check(
             isKotlinObjectDeclaration || allStatic || constructors.isEmpty() ||
                     constructors.any {
@@ -113,12 +97,11 @@
     }
 
     private fun processMethod(
-        container: DeclaredType,
-        methodElement: ExecutableElement,
+        container: XDeclaredType,
+        methodElement: XMethodElement,
         isContainerKotlinObject: Boolean
     ): CustomTypeConverter? {
-        val typeUtils = context.processingEnv.typeUtils
-        val asMember = methodElement.asMemberOf(typeUtils, container)
+        val asMember = methodElement.asMemberOf(container)
         val returnType = asMember.returnType
         val invalidReturnType = returnType.isInvalidReturnType()
         context.checker.check(
@@ -128,7 +111,7 @@
             context.logger.e(methodElement, TYPE_CONVERTER_BAD_RETURN_TYPE)
             return null
         }
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(
             returnTypeName, methodElement,
             TYPE_CONVERTER_UNBOUND_GENERIC
@@ -139,9 +122,9 @@
             return null
         }
         val param = params.map {
-            it.asMemberOf(typeUtils, container)
+            it.asMemberOf(container)
         }.first()
-        context.checker.notUnbound(param.typeName(), params[0], TYPE_CONVERTER_UNBOUND_GENERIC)
+        context.checker.notUnbound(param.typeName, params[0], TYPE_CONVERTER_UNBOUND_GENERIC)
         return CustomTypeConverter(
             enclosingClass = container,
             isEnclosingClassKotlinObject = isContainerKotlinObject,
@@ -155,13 +138,13 @@
      * Order of classes is important hence they are a LinkedHashSet not a set.
      */
     open class ProcessResult(
-        val classes: LinkedHashSet<TypeMirror>,
+        val classes: LinkedHashSet<XType>,
         val converters: List<CustomTypeConverterWrapper>
     ) {
         object EMPTY : ProcessResult(LinkedHashSet(), emptyList())
 
         operator fun plus(other: ProcessResult): ProcessResult {
-            val newClasses = LinkedHashSet<TypeMirror>()
+            val newClasses = LinkedHashSet<XType>()
             newClasses.addAll(classes)
             newClasses.addAll(other.classes)
             return ProcessResult(newClasses, converters + other.converters)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
index 0badc78..db6bf1a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
@@ -23,27 +23,17 @@
 import androidx.room.SkipQueryVerification
 import androidx.room.Transaction
 import androidx.room.Update
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.findKotlinDefaultImpl
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getConstructors
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isInterface
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Dao
 import androidx.room.vo.KotlinDefaultMethodDelegate
-import isAssignableFrom
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 class DaoProcessor(
     baseContext: Context,
-    val element: TypeElement,
-    val dbType: DeclaredType,
+    val element: XTypeElement,
+    val dbType: XDeclaredType,
     val dbVerifier: DatabaseVerifier?
 ) {
     val context = baseContext.fork(element)
@@ -60,11 +50,11 @@
                 element, ProcessorErrors.DAO_MUST_BE_AN_ABSTRACT_CLASS_OR_AN_INTERFACE)
 
         val declaredType = element.asDeclaredType()
-        val allMethods = element.getAllMethods(context.processingEnv)
+        val allMethods = element.getAllMethods()
         val methods = allMethods
             .filter {
                 it.isAbstract() &&
-                        it.findKotlinDefaultImpl(context.processingEnv.typeUtils) == null
+                        it.findKotlinDefaultImpl() == null
             }.groupBy { method ->
                 context.checker.check(
                         PROCESSED_ANNOTATIONS.count { method.hasAnnotation(it) } == 1, method,
@@ -144,7 +134,7 @@
             allMethods.filterNot {
                 allProcessedMethods.contains(it)
             }.mapNotNull { method ->
-                method.findKotlinDefaultImpl(context.processingEnv.typeUtils)?.let { delegate ->
+                method.findKotlinDefaultImpl()?.let { delegate ->
                     KotlinDefaultMethodDelegate(
                         element = method,
                         delegateElement = delegate
@@ -156,13 +146,12 @@
         }
 
         val constructors = element.getConstructors()
-        val typeUtils = context.processingEnv.typeUtils
         val goodConstructor = constructors.firstOrNull {
             it.parameters.size == 1 &&
-                    it.parameters[0].type.isAssignableFrom(typeUtils, dbType)
+                    it.parameters[0].type.isAssignableFrom(dbType)
         }
         val constructorParamType = if (goodConstructor != null) {
-            goodConstructor.parameters[0].type.typeName()
+            goodConstructor.parameters[0].type.typeName
         } else {
             validateEmptyConstructor(constructors)
             null
@@ -171,7 +160,7 @@
         context.checker.check(methods[Any::class] == null, element,
                 ProcessorErrors.ABSTRACT_METHOD_IN_DAO_MISSING_ANY_ANNOTATION)
 
-        val type = declaredType.typeName()
+        val type = declaredType.typeName
         context.checker.notUnbound(type, element,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_DAO_CLASSES)
 
@@ -187,7 +176,7 @@
                 constructorParamType = constructorParamType)
     }
 
-    private fun validateEmptyConstructor(constructors: List<ExecutableElement>) {
+    private fun validateEmptyConstructor(constructors: List<XConstructorElement>) {
         if (constructors.isNotEmpty() && constructors.all { it.parameters.isNotEmpty() }) {
             context.logger.e(element, ProcessorErrors.daoMustHaveMatchingConstructor(
                     element.toString(), dbType.toString()))
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index 562c8a3..20a502e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -17,20 +17,12 @@
 package androidx.room.processor
 
 import androidx.room.SkipQueryVerification
-import androidx.room.ext.AnnotationBox
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isType
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.isType
 import androidx.room.verifier.DatabaseVerificationErrors
 import androidx.room.verifier.DatabaseVerifier
 import androidx.room.vo.Dao
@@ -41,19 +33,14 @@
 import androidx.room.vo.FtsEntity
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
-import asTypeElement
 import com.squareup.javapoet.TypeName
-import isAssignableFrom
 import java.util.Locale
-import javax.lang.model.element.Element
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
-class DatabaseProcessor(baseContext: Context, val element: TypeElement) {
+class DatabaseProcessor(baseContext: Context, val element: XTypeElement) {
     val context = baseContext.fork(element)
 
-    val roomDatabaseType: TypeMirror by lazy {
-        context.processingEnv.requireTypeMirror(
+    val roomDatabaseType: XType by lazy {
+        context.processingEnv.requireType(
                 RoomTypeNames.ROOM_DB.packageName() + "." + RoomTypeNames.ROOM_DB.simpleName())
     }
 
@@ -73,11 +60,7 @@
         validateForeignKeys(element, entities)
         validateExternalContentFts(element, entities)
 
-        val typeUtils = context.processingEnv.typeUtils
-        val extendsRoomDb = roomDatabaseType.isAssignableFrom(
-            typeUtils,
-            element.type
-        )
+        val extendsRoomDb = roomDatabaseType.isAssignableFrom(element.type)
         context.checker.check(extendsRoomDb, element, ProcessorErrors.DB_MUST_EXTEND_ROOM_DB)
 
         val views = resolveDatabaseViews(viewsMap.values.toList())
@@ -94,15 +77,15 @@
         validateUniqueTableAndViewNames(element, entities, views)
 
         val declaredType = element.asDeclaredType()
-        val daoMethods = element.getAllMethods(context.processingEnv).filter {
+        val daoMethods = element.getAllMethods().filter {
             it.isAbstract()
         }.filterNot {
             // remove methods that belong to room
             val containing = it.enclosingElement
             containing.isType() &&
-                    containing.type.typeName() == RoomTypeNames.ROOM_DB
+                    containing.asDeclaredType().typeName == RoomTypeNames.ROOM_DB
         }.map {
-            val executable = it.asExecutableElement()
+            val executable = it.asMethodElement()
             // TODO when we add support for non Dao return types (e.g. database), this code needs
             // to change
             val daoType = executable.returnType.asTypeElement()
@@ -128,7 +111,7 @@
         return database
     }
 
-    private fun validateForeignKeys(element: TypeElement, entities: List<Entity>) {
+    private fun validateForeignKeys(element: XTypeElement, entities: List<Entity>) {
         val byTableName = entities.associateBy { it.tableName }
         entities.forEach { entity ->
             entity.foreignKeys.forEach foreignKeyLoop@{ foreignKey ->
@@ -136,7 +119,8 @@
                 if (parent == null) {
                     context.logger.e(element, ProcessorErrors
                             .foreignKeyMissingParentEntityInDatabase(foreignKey.parentTable,
-                                    entity.element.qualifiedName.toString()))
+                                entity.element.qualifiedName
+                            ))
                     return@foreignKeyLoop
                 }
                 val parentFields = foreignKey.parentColumns.mapNotNull { columnName ->
@@ -144,7 +128,7 @@
                     if (parentField == null) {
                         context.logger.e(entity.element,
                                 ProcessorErrors.foreignKeyParentColumnDoesNotExist(
-                                        parentEntity = parent.element.qualifiedName.toString(),
+                                        parentEntity = parent.element.qualifiedName,
                                         missingColumn = columnName,
                                         allColumns = parent.columnNames))
                     }
@@ -157,8 +141,8 @@
                 if (!parent.isUnique(foreignKey.parentColumns)) {
                     context.logger.e(parent.element, ProcessorErrors
                             .foreignKeyMissingIndexInParent(
-                                    parentEntity = parent.element.qualifiedName.toString(),
-                                    childEntity = entity.element.qualifiedName.toString(),
+                                    parentEntity = parent.element.qualifiedName,
+                                    childEntity = entity.element.qualifiedName,
                                     parentColumns = foreignKey.parentColumns,
                                     childColumns = foreignKey.childFields
                                             .map { it.columnName }))
@@ -168,7 +152,7 @@
         }
     }
 
-    private fun validateUniqueIndices(element: TypeElement, entities: List<Entity>) {
+    private fun validateUniqueIndices(element: XTypeElement, entities: List<Entity>) {
         entities
                 .flatMap { entity ->
                     // associate each index with its entity
@@ -187,7 +171,7 @@
     }
 
     private fun validateUniqueDaoClasses(
-        dbElement: TypeElement,
+        dbElement: XTypeElement,
         daoMethods: List<DaoMethod>,
         entities: List<Entity>
     ) {
@@ -205,7 +189,7 @@
                     }
                 }
         val check = fun(
-            element: Element,
+            element: XElement,
             dao: Dao,
             typeName: TypeName?
         ) {
@@ -213,7 +197,7 @@
                 if (!entityTypeNames.contains(typeName)) {
                     context.logger.e(element,
                             ProcessorErrors.shortcutEntityIsNotInDatabase(
-                                    database = dbElement.qualifiedName.toString(),
+                                    database = dbElement.qualifiedName,
                                     dao = dao.typeName.toString(),
                                     entity = typeName.toString()
                             ))
@@ -235,7 +219,7 @@
     }
 
     private fun validateUniqueTableAndViewNames(
-        dbElement: TypeElement,
+        dbElement: XTypeElement,
         entities: List<Entity>,
         views: List<DatabaseView>
     ) {
@@ -260,7 +244,7 @@
                 }
     }
 
-    private fun validateExternalContentFts(dbElement: TypeElement, entities: List<Entity>) {
+    private fun validateExternalContentFts(dbElement: XTypeElement, entities: List<Entity>) {
         // Validate FTS external content entities are present in the same database.
         entities.filterIsInstance(FtsEntity::class.java)
                 .filterNot {
@@ -270,16 +254,17 @@
                 .forEach {
                     context.logger.e(dbElement,
                             ProcessorErrors.missingExternalContentEntity(
-                                    it.element.qualifiedName.toString(),
-                                    it.ftsOptions.contentEntity!!.element.qualifiedName.toString()))
+                                it.element.qualifiedName,
+                                it.ftsOptions.contentEntity!!.element.qualifiedName
+                            ))
                 }
     }
 
     private fun processEntities(
-        dbAnnotation: AnnotationBox<androidx.room.Database>,
-        element: TypeElement
+        dbAnnotation: XAnnotationBox<androidx.room.Database>,
+        element: XTypeElement
     ): List<Entity> {
-        val entityList = dbAnnotation.getAsTypeMirrorList("entities")
+        val entityList = dbAnnotation.getAsTypeList("entities")
         context.checker.check(entityList.isNotEmpty(), element,
                 ProcessorErrors.DATABASE_ANNOTATION_MUST_HAVE_LIST_OF_ENTITIES)
         return entityList.map {
@@ -288,9 +273,9 @@
     }
 
     private fun processDatabaseViews(
-        dbAnnotation: AnnotationBox<androidx.room.Database>
-    ): Map<TypeElement, DatabaseView> {
-        val viewList = dbAnnotation.getAsTypeMirrorList("views")
+        dbAnnotation: XAnnotationBox<androidx.room.Database>
+    ): Map<XTypeElement, DatabaseView> {
+        val viewList = dbAnnotation.getAsTypeList("views")
         return viewList.map {
             val viewElement = it.asTypeElement()
             viewElement to DatabaseViewProcessor(context, viewElement).process()
@@ -298,7 +283,7 @@
     }
 
     private fun verifyDatabaseViews(
-        map: Map<TypeElement, DatabaseView>,
+        map: Map<XTypeElement, DatabaseView>,
         dbVerifier: DatabaseVerifier
     ) {
         for ((viewElement, view) in map) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt
index 9fbc3c9..a18cb90 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseViewProcessor.kt
@@ -16,17 +16,15 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.DatabaseView
-import javax.lang.model.element.TypeElement
 
 class DatabaseViewProcessor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ) : EntityOrViewProcessor {
 
@@ -79,7 +77,7 @@
 
     companion object {
         fun extractViewName(
-            element: TypeElement,
+            element: XTypeElement,
             annotation: androidx.room.DatabaseView
         ): String {
             return if (annotation.viewName == "") {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt
index 89968fa..592345c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DeletionMethodProcessor.kt
@@ -16,15 +16,14 @@
 package androidx.room.processor
 
 import androidx.room.Delete
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.DeletionMethod
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class DeletionMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
 
@@ -44,7 +43,7 @@
         )
 
         val (entities, params) = delegate.extractParams(
-            targetEntityType = annotation?.getAsTypeMirror("entity"),
+            targetEntityType = annotation?.getAsType("entity"),
             missingParamError = ProcessorErrors.DELETION_MISSING_PARAMS,
             onValidatePartialEntity = { _, _ -> }
         )
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt
index 20e9590..002e5029 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/EntityOrViewProcessor.kt
@@ -18,13 +18,10 @@
 
 import androidx.room.DatabaseView
 import androidx.room.Entity
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.EntityOrView
 import androidx.room.vo.Fields
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.TypeElement
 
 interface EntityOrViewProcessor {
     fun process(): EntityOrView
@@ -36,7 +33,7 @@
  */
 private class NonEntityOrViewProcessor(
     val context: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String>
 ) : EntityOrViewProcessor {
 
@@ -54,7 +51,7 @@
             override val tableName: String
                 get() = typeName.toString()
             override val typeName: TypeName
-                get() = element.type.typeName()
+                get() = element.type.typeName
         }
     }
 }
@@ -62,7 +59,7 @@
 @Suppress("FunctionName")
 fun EntityOrViewProcessor(
     context: Context,
-    element: TypeElement,
+    element: XTypeElement,
     referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ): EntityOrViewProcessor {
     return when {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt
index 390e29b..95577a8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/EntityProcessor.kt
@@ -20,19 +20,17 @@
 import androidx.room.ForeignKey
 import androidx.room.Fts3
 import androidx.room.Fts4
-import androidx.room.ext.AnnotationBox
-import androidx.room.ext.hasAnyOf
-import androidx.room.ext.name
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.ForeignKeyAction
 import androidx.room.vo.Index
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 interface EntityProcessor : EntityOrViewProcessor {
     override fun process(): androidx.room.vo.Entity
 
     companion object {
-        fun extractTableName(element: TypeElement, annotation: Entity): String {
+        fun extractTableName(element: XTypeElement, annotation: Entity): String {
             return if (annotation.tableName == "") {
                 element.name
             } else {
@@ -40,7 +38,10 @@
             }
         }
 
-        fun extractIndices(annotation: AnnotationBox<Entity>, tableName: String): List<IndexInput> {
+        fun extractIndices(
+            annotation: XAnnotationBox<Entity>,
+            tableName: String
+        ): List<IndexInput> {
             return annotation.getAsAnnotationBoxArray<androidx.room.Index>("indices").map {
                 val indexAnnotation = it.value
                 val nameValue = indexAnnotation.name
@@ -57,11 +58,11 @@
             return Index.DEFAULT_PREFIX + tableName + "_" + columnNames.joinToString("_")
         }
 
-        fun extractForeignKeys(annotation: AnnotationBox<Entity>): List<ForeignKeyInput> {
+        fun extractForeignKeys(annotation: XAnnotationBox<Entity>): List<ForeignKeyInput> {
             return annotation.getAsAnnotationBoxArray<ForeignKey>("foreignKeys")
                     .mapNotNull { annotationBox ->
                 val foreignKey = annotationBox.value
-                val parent = annotationBox.getAsTypeMirror("entity")
+                val parent = annotationBox.getAsType("entity")
                 if (parent != null) {
                     ForeignKeyInput(
                             parent = parent,
@@ -87,7 +88,7 @@
  * ForeignKey, before it is processed in the context of a database.
  */
 data class ForeignKeyInput(
-    val parent: TypeMirror,
+    val parent: XType,
     val parentColumns: List<String>,
     val childColumns: List<String>,
     val onDelete: ForeignKeyAction?,
@@ -97,7 +98,7 @@
 
 fun EntityProcessor(
     context: Context,
-    element: TypeElement,
+    element: XTypeElement,
     referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ): EntityProcessor {
     return if (element.hasAnyOf(Fts3::class, Fts4::class)) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
index e13dcd5..227048f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
@@ -17,33 +17,26 @@
 package androidx.room.processor
 
 import androidx.room.ColumnInfo
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XVariableElement
 import androidx.room.vo.EmbeddedField
 import androidx.room.vo.Field
 import java.util.Locale
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
 
 class FieldProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val element: VariableElement,
+    val containing: XDeclaredType,
+    val element: XVariableElement,
     val bindingScope: BindingScope,
     val fieldParent: EmbeddedField?, // pass only if this is processed as a child of Embedded field
     val onBindingError: (field: Field, errorMsg: String) -> Unit
 ) {
     val context = baseContext.fork(element)
     fun process(): Field {
-        val member = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
-        val type = member.typeName()
+        val member = element.asMemberOf(containing)
+        val type = member.typeName
         val columnInfo = element.toAnnotationBox(ColumnInfo::class)?.value
         val name = element.name
         val rawCName = if (columnInfo != null && columnInfo.name != ColumnInfo.INHERIT_FIELD_NAME) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
index ed4b492..e35ef3e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FtsTableEntityProcessor.kt
@@ -20,13 +20,11 @@
 import androidx.room.Fts4
 import androidx.room.FtsOptions.MatchInfo
 import androidx.room.FtsOptions.Order
-import androidx.room.ext.AnnotationBox
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.toAnnotationBox
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.EntityProcessor.Companion.extractForeignKeys
 import androidx.room.processor.EntityProcessor.Companion.extractIndices
 import androidx.room.processor.EntityProcessor.Companion.extractTableName
@@ -39,23 +37,19 @@
 import androidx.room.vo.LanguageId
 import androidx.room.vo.PrimaryKey
 import androidx.room.vo.columnNames
-import asTypeElement
-import isSameType
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 class FtsTableEntityProcessor internal constructor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ) : EntityProcessor {
 
     val context = baseContext.fork(element)
 
-    override fun process(): androidx.room.vo.FtsEntity {
+    override fun process(): FtsEntity {
         return context.cache.entities.get(Cache.EntityKey(element)) {
             doProcess()
-        } as androidx.room.vo.FtsEntity
+        } as FtsEntity
     }
 
     private fun doProcess(): FtsEntity {
@@ -129,7 +123,7 @@
         return entity
     }
 
-    private fun getFts3Options(annotation: AnnotationBox<Fts3>) =
+    private fun getFts3Options(annotation: XAnnotationBox<Fts3>) =
         FtsOptions(
             tokenizer = annotation.value.tokenizer,
             tokenizerArgs = annotation.value.tokenizerArgs.asList(),
@@ -140,8 +134,8 @@
             prefixSizes = emptyList(),
             preferredOrder = Order.ASC)
 
-    private fun getFts4Options(annotation: AnnotationBox<Fts4>): FtsOptions {
-        val contentEntity: Entity? = getContentEntity(annotation.getAsTypeMirror("contentEntity"))
+    private fun getFts4Options(annotation: XAnnotationBox<Fts4>): FtsOptions {
+        val contentEntity: Entity? = getContentEntity(annotation.getAsType("contentEntity"))
         return FtsOptions(
                 tokenizer = annotation.value.tokenizer,
                 tokenizerArgs = annotation.value.tokenizerArgs.asList(),
@@ -153,14 +147,14 @@
                 preferredOrder = annotation.value.order)
     }
 
-    private fun getContentEntity(entityType: TypeMirror?): Entity? {
+    private fun getContentEntity(entityType: XType?): Entity? {
         if (entityType == null) {
             context.logger.e(element, ProcessorErrors.FTS_EXTERNAL_CONTENT_CANNOT_FIND_ENTITY)
             return null
         }
 
-        val defaultType = context.processingEnv.requireTypeMirror(Object::class)
-        if (entityType.isSameType(context.processingEnv.typeUtils, defaultType)) {
+        val defaultType = context.processingEnv.requireType(Object::class)
+        if (entityType.isSameType(defaultType)) {
             return null
         }
         val contentEntityElement = entityType.asTypeElement()
@@ -173,7 +167,7 @@
     }
 
     private fun findAndValidatePrimaryKey(
-        entityAnnotation: AnnotationBox<androidx.room.Entity>?,
+        entityAnnotation: XAnnotationBox<androidx.room.Entity>?,
         fields: List<Field>
     ): PrimaryKey {
         val keysFromEntityAnnotation =
@@ -231,8 +225,9 @@
             contentEntity.fields.any { contentField -> contentField.columnName == it.columnName }
         }.forEach {
             context.logger.e(it.element, ProcessorErrors.missingFtsContentField(
-                    element.qualifiedName.toString(), it.columnName,
-                    contentEntity.element.qualifiedName.toString()))
+                element.qualifiedName, it.columnName,
+                contentEntity.element.qualifiedName
+            ))
         }
     }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
index 802d158..2dbaa99 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/InsertionMethodProcessor.kt
@@ -21,17 +21,15 @@
 import androidx.room.Insert
 import androidx.room.OnConflictStrategy.IGNORE
 import androidx.room.OnConflictStrategy.REPLACE
-import androidx.room.ext.name
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.InsertionMethod
 import androidx.room.vo.findFieldByColumnName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class InsertionMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
     fun process(): InsertionMethod {
@@ -44,12 +42,12 @@
                 executableElement, ProcessorErrors.INVALID_ON_CONFLICT_VALUE)
 
         val returnType = delegate.extractReturnType()
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(returnTypeName, executableElement,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_INSERTION_METHODS)
 
         val (entities, params) = delegate.extractParams(
-            targetEntityType = annotation?.getAsTypeMirror("entity"),
+            targetEntityType = annotation?.getAsType("entity"),
             missingParamError = ProcessorErrors.INSERTION_DOES_NOT_HAVE_ANY_PARAMETERS_TO_INSERT,
             onValidatePartialEntity = { entity, pojo ->
                 val missingPrimaryKeys = entity.primaryKey.fields.any {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt b/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt
index c1daa46..cebb293 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/MethodProcessorDelegate.kt
@@ -21,14 +21,11 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomCoroutinesTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.getSuspendFunctionReturnType
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.type
-import androidx.room.kotlin.KotlinMetadataElement
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 import androidx.room.solver.prepared.binder.CallablePreparedQueryResultBinder.Companion.createPreparedBinder
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
 import androidx.room.solver.query.result.CoroutineResultBinder
@@ -44,52 +41,44 @@
 import androidx.room.vo.QueryParameter
 import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.vo.TransactionMethod
-import erasure
-import isSameType
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  *  Delegate class with common functionality for DAO method processors.
  */
 abstract class MethodProcessorDelegate(
     val context: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement,
-    protected val classMetadata: KotlinMetadataElement?
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
 
-    abstract fun extractReturnType(): TypeMirror
+    abstract fun extractReturnType(): XType
 
-    abstract fun extractParams(): List<VariableElement>
+    abstract fun extractParams(): List<XVariableElement>
 
     fun extractQueryParams(): List<QueryParameter> {
-        val kotlinParameterNames = classMetadata?.getParameterNames(executableElement)
-        return extractParams().mapIndexed { index, variableElement ->
+        return extractParams().map { variableElement ->
             QueryParameterProcessor(
                 baseContext = context,
                 containing = containing,
                 element = variableElement,
-                sqlName = kotlinParameterNames?.getOrNull(index)
+                sqlName = variableElement.name
             ).process()
         }
     }
 
-    abstract fun findResultBinder(returnType: TypeMirror, query: ParsedQuery): QueryResultBinder
+    abstract fun findResultBinder(returnType: XType, query: ParsedQuery): QueryResultBinder
 
     abstract fun findPreparedResultBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ): PreparedQueryResultBinder
 
     abstract fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder
 
-    abstract fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror): DeleteOrUpdateMethodBinder
+    abstract fun findDeleteOrUpdateMethodBinder(returnType: XType): DeleteOrUpdateMethodBinder
 
     abstract fun findTransactionMethodBinder(
         callType: TransactionMethod.CallType
@@ -98,12 +87,10 @@
     companion object {
         fun createFor(
             context: Context,
-            containing: DeclaredType,
-            executableElement: ExecutableElement
+            containing: XDeclaredType,
+            executableElement: XMethodElement
         ): MethodProcessorDelegate {
-            val kotlinMetadata =
-                KotlinMetadataElement.createFor(context, executableElement.enclosingElement)
-            return if (kotlinMetadata?.isSuspendFunction(executableElement) == true) {
+            return if (executableElement.isSuspendFunction()) {
                 val hasCoroutineArtifact = context.processingEnv
                     .findTypeElement(RoomCoroutinesTypeNames.COROUTINES_ROOM.toString()) != null
                 if (!hasCoroutineArtifact) {
@@ -112,15 +99,13 @@
                 SuspendMethodProcessorDelegate(
                     context,
                     containing,
-                    executableElement,
-                    kotlinMetadata
+                    executableElement
                 )
             } else {
                 DefaultMethodProcessorDelegate(
                     context,
                     containing,
-                    executableElement,
-                    kotlinMetadata
+                    executableElement
                 )
             }
         }
@@ -132,35 +117,31 @@
  */
 class DefaultMethodProcessorDelegate(
     context: Context,
-    containing: DeclaredType,
-    executableElement: ExecutableElement,
-    classMetadata: KotlinMetadataElement?
-) : MethodProcessorDelegate(context, containing, executableElement, classMetadata) {
+    containing: XDeclaredType,
+    executableElement: XMethodElement
+) : MethodProcessorDelegate(context, containing, executableElement) {
 
-    override fun extractReturnType(): TypeMirror {
-        val asMember = executableElement.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+    override fun extractReturnType(): XType {
+        val asMember = executableElement.asMemberOf(containing)
         return asMember.returnType
     }
 
     override fun extractParams() = executableElement.parameters
 
-    override fun findResultBinder(returnType: TypeMirror, query: ParsedQuery) =
+    override fun findResultBinder(returnType: XType, query: ParsedQuery) =
         context.typeAdapterStore.findQueryResultBinder(returnType, query)
 
     override fun findPreparedResultBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ) = context.typeAdapterStore.findPreparedQueryResultBinder(returnType, query)
 
     override fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ) = context.typeAdapterStore.findInsertMethodBinder(returnType, params)
 
-    override fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror) =
+    override fun findDeleteOrUpdateMethodBinder(returnType: XType) =
         context.typeAdapterStore.findDeleteOrUpdateMethodBinder(returnType)
 
     override fun findTransactionMethodBinder(callType: TransactionMethod.CallType) =
@@ -173,32 +154,29 @@
  */
 class SuspendMethodProcessorDelegate(
     context: Context,
-    containing: DeclaredType,
-    executableElement: ExecutableElement,
-    kotlinMetadata: KotlinMetadataElement
-) : MethodProcessorDelegate(context, containing, executableElement, kotlinMetadata) {
+    containing: XDeclaredType,
+    executableElement: XMethodElement
+) : MethodProcessorDelegate(context, containing, executableElement) {
 
-    private val continuationParam: VariableElement by lazy {
-        val typesUtil = context.processingEnv.typeUtils
+    private val continuationParam: XVariableElement by lazy {
         val continuationType = context.processingEnv
-            .requireTypeMirror(KotlinTypeNames.CONTINUATION.toString()).erasure(typesUtil)
+            .requireType(KotlinTypeNames.CONTINUATION.toString()).erasure()
         executableElement.parameters.last {
-            it.type.erasure(typesUtil).isSameType(typesUtil, continuationType)
+            it.type.erasure().isSameType(continuationType)
         }
     }
 
-    override fun extractReturnType(): TypeMirror {
-        val asMember = executableElement.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+    override fun extractReturnType(): XType {
+        val asMember = executableElement.asMemberOf(containing)
         return asMember.getSuspendFunctionReturnType()
     }
 
     override fun extractParams() =
-        executableElement.parameters.filterNot { it == continuationParam }
+        executableElement.parameters.filterNot {
+            it == continuationParam
+        }
 
-    override fun findResultBinder(returnType: TypeMirror, query: ParsedQuery) =
+    override fun findResultBinder(returnType: XType, query: ParsedQuery) =
         CoroutineResultBinder(
             typeArg = returnType,
             adapter = context.typeAdapterStore.findQueryResultAdapter(returnType, query),
@@ -206,7 +184,7 @@
         )
 
     override fun findPreparedResultBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ) = createPreparedBinder(
         returnType = returnType,
@@ -223,7 +201,7 @@
     }
 
     override fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ) = createInsertBinder(
         typeArg = returnType,
@@ -239,7 +217,7 @@
         )
     }
 
-    override fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror) =
+    override fun findDeleteOrUpdateMethodBinder(returnType: XType) =
         createDeleteOrUpdateBinder(
             typeArg = returnType,
             adapter = context.typeAdapterStore.findDeleteOrUpdateAdapter(returnType)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt
index e2b5db7..43c708a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/PojoMethodProcessor.kt
@@ -16,25 +16,20 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.PojoMethod
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 /**
  * processes an executable element as member of the owning class
  */
 class PojoMethodProcessor(
     private val context: Context,
-    private val element: ExecutableElement,
-    private val owner: DeclaredType
+    private val element: XMethodElement,
+    private val owner: XDeclaredType
 ) {
     fun process(): PojoMethod {
-        val asMember = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            owner
-        )
+        val asMember = element.asMemberOf(owner)
         return PojoMethod(
                 element = element,
                 resolvedType = asMember,
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
index 768d4e2..a1ffaa7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
@@ -22,30 +22,13 @@
 import androidx.room.Junction
 import androidx.room.PrimaryKey
 import androidx.room.Relation
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.extendsBoundOrSelf
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.getAllFieldsIncludingPrivateSupers
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getAllNonPrivateInstanceMethods
-import androidx.room.ext.getConstructors
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.hasAnyOf
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isAssignableFromWithoutVariance
-import androidx.room.ext.isCollection
-import androidx.room.ext.isPrivate
-import androidx.room.ext.isPublic
-import androidx.room.ext.isStatic
-import androidx.room.ext.isTransient
-import androidx.room.ext.kindName
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.type
-import androidx.room.ext.typeName
-import androidx.room.kotlin.KotlinMetadataElement
-import androidx.room.kotlin.descriptor
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XExecutableElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.XVariableElement
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isCollection
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_SETTER_FOR_FIELD
 import androidx.room.processor.ProcessorErrors.POJO_FIELD_HAS_DUPLICATE_COLUMN_NAME
@@ -64,26 +47,14 @@
 import androidx.room.vo.Warning
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
-import asDeclaredType
-import asTypeElement
 import com.google.auto.value.AutoValue
-import isError
-import isNotVoid
-import isSameType
-import isTypeOf
-import isVoid
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Processes any class as if it is a Pojo.
  */
 class PojoProcessor private constructor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     val bindingScope: FieldProcessor.BindingScope,
     val parent: EmbeddedField?,
     val referenceStack: LinkedHashSet<String> = LinkedHashSet(),
@@ -91,8 +62,6 @@
 ) {
     val context = baseContext.fork(element)
 
-    private val kotlinMetadata = KotlinMetadataElement.createFor(context, element)
-
     companion object {
         val PROCESSED_ANNOTATIONS = listOf(ColumnInfo::class, Embedded::class, Relation::class)
 
@@ -101,7 +70,7 @@
 
         fun createFor(
             context: Context,
-            element: TypeElement,
+            element: XTypeElement,
             bindingScope: FieldProcessor.BindingScope,
             parent: EmbeddedField?,
             referenceStack: LinkedHashSet<String> = LinkedHashSet()
@@ -129,11 +98,11 @@
 
     fun process(): Pojo {
         return context.cache.pojos.get(Cache.PojoKey(element, bindingScope, parent)) {
-            referenceStack.add(element.qualifiedName.toString())
+            referenceStack.add(element.qualifiedName)
             try {
                 doProcess()
             } finally {
-                referenceStack.remove(element.qualifiedName.toString())
+                referenceStack.remove(element.qualifiedName)
             }
         }
     }
@@ -143,7 +112,7 @@
 
         val declaredType = element.asDeclaredType()
         // TODO handle conflicts with super: b/35568142
-        val allFields = element.getAllFieldsIncludingPrivateSupers(context.processingEnv)
+        val allFields = element.getAllFieldsIncludingPrivateSupers()
                 .filter {
                     !it.hasAnnotation(Ignore::class) &&
                             !it.isStatic() &&
@@ -228,7 +197,7 @@
                     }
                 }
 
-        val methods = element.getAllNonPrivateInstanceMethods(context.processingEnv)
+        val methods = element.getAllNonPrivateInstanceMethods()
             .asSequence()
             .filter {
                 !it.isAbstract() && !it.hasAnnotation(Ignore::class)
@@ -273,23 +242,6 @@
                 constructor)
     }
 
-    /**
-     * Retrieves the parameter names of a method. If the method is inherited from a dependency
-     * module, the parameter name is not available (not in java spec). For kotlin, since parameter
-     * names are part of the API, we can read them via the kotlin metadata annotation.
-     * <p>
-     * Since we are using an unofficial library to read the metadata, all access to that code
-     * is safe guarded to avoid unexpected failures. In other words, it is a best effort but
-     * better than not supporting these until JB provides a proper API.
-     */
-    private fun getParamNames(method: ExecutableElement): List<String> {
-        val paramNames = method.parameters.map { it.name }
-        if (paramNames.isEmpty()) {
-            return emptyList()
-        }
-        return kotlinMetadata?.getParameterNames(method) ?: paramNames
-    }
-
     private fun chooseConstructor(
         myFields: List<Field>,
         embedded: List<EmbeddedField>,
@@ -299,11 +251,10 @@
         val fieldMap = myFields.associateBy { it.name }
         val embeddedMap = embedded.associateBy { it.field.name }
         val relationMap = relations.associateBy { it.field.name }
-        val typeUtils = context.processingEnv.typeUtils
         // list of param names -> matched params pairs for each failed constructor
         val failedConstructors = arrayListOf<FailedConstructor>()
         val goodConstructors = constructors.map { constructor ->
-            val parameterNames = getParamNames(constructor)
+            val parameterNames = constructor.parameters.map { it.name }
             val params = constructor.parameters.mapIndexed param@{ index, param ->
                 val paramName = parameterNames[index]
                 val paramType = param.type
@@ -315,7 +266,7 @@
                         false
                     } else {
                         // see: b/69164099
-                        field.type.isAssignableFromWithoutVariance(typeUtils, paramType)
+                        field.type.isAssignableFromWithoutVariance(paramType)
                     }
                 }
 
@@ -353,7 +304,7 @@
                     }
                     else -> {
                         context.logger.e(param, ProcessorErrors.ambigiousConstructor(
-                                pojo = element.qualifiedName.toString(),
+                                pojo = element.qualifiedName,
                                 paramName = paramName,
                                 matchingFields = matchingFields.map { it.getPath() } +
                                         embeddedMatches.map { it.field.getPath() } +
@@ -389,11 +340,11 @@
                 // better than picking the no-arg constructor and forcing users to define fields as
                 // vars.
                 val primaryConstructor =
-                    kotlinMetadata?.findPrimaryConstructorSignature()?.let { signature ->
-                        goodConstructors.firstOrNull {
-                            it.element.descriptor() == signature
+                    element.findPrimaryConstructor()?.let { primary ->
+                        goodConstructors.firstOrNull { candidate ->
+                            candidate.element == primary
+                        }
                     }
-                }
                 if (primaryConstructor != null) {
                     return primaryConstructor
                 }
@@ -401,8 +352,10 @@
                 // with kotlin data classes.
                 val noArg = goodConstructors.firstOrNull { it.params.isEmpty() }
                 if (noArg != null) {
-                    context.logger.w(Warning.DEFAULT_CONSTRUCTOR, element,
-                            ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG)
+                    context.logger.w(
+                        Warning.DEFAULT_CONSTRUCTOR, element,
+                        ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS_CHOOSING_NO_ARG
+                    )
                     return noArg
                 }
                 goodConstructors.forEach {
@@ -415,11 +368,10 @@
     }
 
     private fun processEmbeddedField(
-        declaredType: DeclaredType,
-        variableElement: VariableElement
+        declaredType: XDeclaredType,
+        variableElement: XVariableElement
     ): EmbeddedField? {
-        val asMemberType = variableElement.asMemberOf(
-            context.processingEnv.typeUtils, declaredType)
+        val asMemberType = variableElement.asMemberOf(declaredType)
         val asTypeElement = asMemberType.asTypeElement()
 
         if (detectReferenceRecursion(asTypeElement)) {
@@ -438,7 +390,7 @@
                 field = embeddedField,
                 prefix = inheritedPrefix + fieldPrefix,
                 parent = parent)
-        subParent.pojo = PojoProcessor.createFor(
+        subParent.pojo = createFor(
                 context = context.fork(variableElement),
                 element = asTypeElement,
                 bindingScope = bindingScope,
@@ -449,8 +401,8 @@
 
     private fun processRelationField(
         myFields: List<Field>,
-        container: DeclaredType?,
-        relationElement: VariableElement
+        container: XDeclaredType?,
+        relationElement: XVariableElement
     ): androidx.room.vo.Relation? {
         val annotation = relationElement.toAnnotationBox(Relation::class)!!
 
@@ -460,16 +412,13 @@
         if (parentField == null) {
             context.logger.e(relationElement,
                     ProcessorErrors.relationCannotFindParentEntityField(
-                            entityName = element.qualifiedName.toString(),
+                            entityName = element.qualifiedName,
                             columnName = annotation.value.parentColumn,
                             availableColumns = myFields.map { it.columnName }))
             return null
         }
         // parse it as an entity.
-        val asMember = relationElement.asMemberOf(
-            context.processingEnv.typeUtils,
-            container
-        )
+        val asMember = relationElement.asMemberOf(container!!)
         if (asMember.isError()) {
             context.logger.e(ProcessorErrors.CANNOT_FIND_TYPE, element)
             return null
@@ -485,7 +434,7 @@
             return null
         }
         val typeElement = asType.asTypeElement()
-        val entityClassInput = annotation.getAsTypeMirror("entity")
+        val entityClassInput = annotation.getAsType("entity")
 
         // do we need to decide on the entity?
         val inferEntity = (entityClassInput == null || entityClassInput.isTypeOf(Any::class))
@@ -514,8 +463,8 @@
 
         // do we have a join entity?
         val junctionAnnotation = annotation.getAsAnnotationBox<Junction>("associateBy")
-        val junctionClassInput = junctionAnnotation.getAsTypeMirror("value")
-        val junctionElement: TypeElement? = if (junctionClassInput != null &&
+        val junctionClassInput = junctionAnnotation.getAsType("value")
+        val junctionElement: XTypeElement? = if (junctionClassInput != null &&
                 !junctionClassInput.isTypeOf(Any::class)) {
             junctionClassInput.asTypeElement()
         } else {
@@ -591,10 +540,7 @@
         val field = Field(
                 element = relationElement,
                 name = relationElement.name,
-                type = relationElement.asMemberOf(
-                    context.processingEnv.typeUtils,
-                    container
-                ),
+                type = relationElement.asMemberOf(container),
                 affinity = null,
                 parent = parent)
 
@@ -621,7 +567,7 @@
     private fun validateRelationshipProjection(
         projectionInput: Array<String>,
         entity: EntityOrView,
-        relationElement: VariableElement
+        relationElement: XVariableElement
     ) {
         val missingColumns = projectionInput.toList() - entity.columnNames
         if (missingColumns.isNotEmpty()) {
@@ -642,12 +588,12 @@
      */
     private fun createRelationshipProjection(
         inferEntity: Boolean,
-        typeArg: TypeMirror,
+        typeArg: XType,
         entity: EntityOrView,
         entityField: Field,
-        typeArgElement: TypeElement
+        typeArgElement: XTypeElement
     ): List<String> {
-        return if (inferEntity || typeArg.typeName() == entity.typeName) {
+        return if (inferEntity || typeArg.typeName == entity.typeName) {
             entity.columnNames
         } else {
             val columnAdapter = context.typeAdapterStore.findCursorValueReader(typeArg, null)
@@ -656,7 +602,7 @@
                 listOf(entityField.name)
             } else {
                 // last resort, it needs to be a pojo
-                val pojo = PojoProcessor.createFor(
+                val pojo = createFor(
                         context = context,
                         element = typeArgElement,
                         bindingScope = FieldProcessor.BindingScope.READ_FROM_CURSOR,
@@ -667,8 +613,8 @@
         }
     }
 
-    private fun detectReferenceRecursion(typeElement: TypeElement): Boolean {
-        if (referenceStack.contains(typeElement.qualifiedName.toString())) {
+    private fun detectReferenceRecursion(typeElement: XTypeElement): Boolean {
+        if (referenceStack.contains(typeElement.qualifiedName)) {
             context.logger.e(
                     typeElement,
                     ProcessorErrors
@@ -679,8 +625,8 @@
         return false
     }
 
-    private fun computeReferenceRecursionString(typeElement: TypeElement): String {
-        val recursiveTailTypeName = typeElement.qualifiedName.toString()
+    private fun computeReferenceRecursionString(typeElement: XTypeElement): String {
+        val recursiveTailTypeName = typeElement.qualifiedName
 
         val referenceRecursionList = mutableListOf<String>()
         with(referenceRecursionList) {
@@ -724,7 +670,7 @@
         context.checker.check(
             success || bindingScope == FieldProcessor.BindingScope.READ_FROM_CURSOR,
             field.element, CANNOT_FIND_GETTER_FOR_FIELD)
-        if (success && !field.getter.type.isSameType(context.processingEnv.typeUtils, field.type)) {
+        if (success && !field.getter.type.isSameType(field.type)) {
             // getter's parameter type is not exactly the same as the field type.
             // put a warning and update the value statement binder.
             context.logger.w(
@@ -732,8 +678,8 @@
                 element = field.element,
                 msg = ProcessorErrors.mismatchedGetter(
                     fieldName = field.name,
-                    ownerType = element.type.typeName(),
-                    getterType = field.getter.type.typeName(),
+                    ownerType = element.type.typeName,
+                    getterType = field.getter.type.typeName,
                     fieldType = field.typeName
                 ))
             field.statementBinder = context.typeAdapterStore.findStatementValueBinder(
@@ -792,7 +738,7 @@
         context.checker.check(
             success || bindingScope == FieldProcessor.BindingScope.BIND_TO_STMT,
             field.element, CANNOT_FIND_SETTER_FOR_FIELD)
-        if (success && !field.setter.type.isSameType(context.processingEnv.typeUtils, field.type)) {
+        if (success && !field.setter.type.isSameType(field.type)) {
             // setter's parameter type is not exactly the same as the field type.
             // put a warning and update the value reader adapter.
             context.logger.w(
@@ -800,8 +746,8 @@
                 element = field.element,
                 msg = ProcessorErrors.mismatchedSetter(
                     fieldName = field.name,
-                    ownerType = element.type.typeName(),
-                    setterType = field.setter.type.typeName(),
+                    ownerType = element.type.typeName,
+                    setterType = field.setter.type.typeName,
                     fieldType = field.typeName
                 ))
             field.cursorValueReader = context.typeAdapterStore.findCursorValueReader(
@@ -821,7 +767,7 @@
         field: Field,
         candidates: List<PojoMethod>,
         nameVariations: List<String>,
-        getType: (PojoMethod) -> TypeMirror,
+        getType: (PojoMethod) -> XType,
         assignFromField: () -> Unit,
         assignFromMethod: (PojoMethod) -> Unit,
         reportAmbiguity: (List<String>) -> Unit
@@ -830,12 +776,11 @@
             assignFromField()
             return true
         }
-        val types = context.processingEnv.typeUtils
 
         val matching = candidates
                 .filter {
                     // b/69164099
-                    field.type.isAssignableFromWithoutVariance(types, getType(it)) &&
+                    field.type.isAssignableFromWithoutVariance(getType(it)) &&
                             (field.nameWithVariations.contains(it.name) ||
                             nameVariations.contains(it.name))
                 }
@@ -876,13 +821,17 @@
 
     interface Delegate {
 
-        fun onPreProcess(element: TypeElement)
+        fun onPreProcess(element: XTypeElement)
 
-        fun findConstructors(element: TypeElement): List<ExecutableElement>
+        /**
+         * Constructors are XExecutableElement rather than XConstrcutorElement to account for
+         * factory methods.
+         */
+        fun findConstructors(element: XTypeElement): List<XExecutableElement>
 
         fun createPojo(
-            element: TypeElement,
-            declaredType: DeclaredType,
+            element: XTypeElement,
+            declaredType: XDeclaredType,
             fields: List<Field>,
             embeddedFields: List<EmbeddedField>,
             relations: List<androidx.room.vo.Relation>,
@@ -891,10 +840,10 @@
     }
 
     private class DefaultDelegate(private val context: Context) : Delegate {
-        override fun onPreProcess(element: TypeElement) {
+        override fun onPreProcess(element: XTypeElement) {
             // Check that certain Room annotations with @Target(METHOD) are not used in the POJO
             // since it is not annotated with AutoValue.
-            element.getAllMethods(context.processingEnv)
+            element.getAllMethods()
                 .filter { it.hasAnyOf(*TARGET_METHOD_ANNOTATIONS) }
                 .forEach { method ->
                     val annotationName = TARGET_METHOD_ANNOTATIONS
@@ -905,13 +854,13 @@
                 }
         }
 
-        override fun findConstructors(element: TypeElement) = element.getConstructors().filterNot {
+        override fun findConstructors(element: XTypeElement) = element.getConstructors().filterNot {
             it.hasAnnotation(Ignore::class) || it.isPrivate()
         }
 
         override fun createPojo(
-            element: TypeElement,
-            declaredType: DeclaredType,
+            element: XTypeElement,
+            declaredType: XDeclaredType,
             fields: List<Field>,
             embeddedFields: List<EmbeddedField>,
             relations: List<androidx.room.vo.Relation>,
@@ -928,7 +877,7 @@
     }
 
     private data class FailedConstructor(
-        val method: ExecutableElement,
+        val method: XExecutableElement,
         val params: List<String>,
         val matches: List<Constructor.Param?>
     ) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
index b0f0a08..8aad153 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
@@ -19,13 +19,12 @@
 import androidx.room.Query
 import androidx.room.SkipQueryVerification
 import androidx.room.Transaction
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.query.result.PojoRowAdapter
 import androidx.room.verifier.DatabaseVerificationErrors
 import androidx.room.verifier.DatabaseVerifier
@@ -34,15 +33,11 @@
 import androidx.room.vo.ReadQueryMethod
 import androidx.room.vo.Warning
 import androidx.room.vo.WriteQueryMethod
-import isNotError
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class QueryMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement,
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement,
     val dbVerifier: DatabaseVerifier? = null
 ) {
     val context = baseContext.fork(executableElement)
@@ -102,8 +97,8 @@
 
 private class InternalQueryProcessor(
     val context: Context,
-    val executableElement: ExecutableElement,
-    val containing: DeclaredType,
+    val executableElement: XMethodElement,
+    val containing: XDeclaredType,
     val dbVerifier: DatabaseVerifier? = null
 ) {
     fun processQuery(input: String?): QueryMethod {
@@ -127,7 +122,7 @@
             ParsedQuery.MISSING
         }
 
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(
             returnTypeName, executableElement,
             ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_QUERY_METHODS
@@ -180,7 +175,7 @@
 
     private fun getPreparedQueryMethod(
         delegate: MethodProcessorDelegate,
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ): WriteQueryMethod {
         val resultBinder = delegate.findPreparedResultBinder(returnType, query)
@@ -203,7 +198,7 @@
 
     private fun getQueryMethod(
         delegate: MethodProcessorDelegate,
-        returnType: TypeMirror,
+        returnType: XType,
         query: ParsedQuery
     ): QueryMethod {
         val resultBinder = delegate.findResultBinder(returnType, query)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt
index 279aac3..45ecebc 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryParameterProcessor.kt
@@ -16,24 +16,19 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XVariableElement
 import androidx.room.vo.QueryParameter
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
 
 class QueryParameterProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val element: VariableElement,
+    val containing: XDeclaredType,
+    val element: XVariableElement,
     private val sqlName: String? = null
 ) {
     val context = baseContext.fork(element)
     fun process(): QueryParameter {
-        val asMember = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+        val asMember = element.asMemberOf(containing)
         val parameterAdapter = context.typeAdapterStore.findQueryParameterAdapter(asMember)
         context.checker.check(parameterAdapter != null, element,
                 ProcessorErrors.CANNOT_BIND_QUERY_PARAMETER_INTO_STMT)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt
index 6b81e0d..c177f63 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/RawQueryMethodProcessor.kt
@@ -19,27 +19,18 @@
 import androidx.room.RawQuery
 import androidx.room.Transaction
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.hasAnnotation
 import androidx.room.ext.isEntityElement
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.type
-import androidx.room.ext.typeName
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.ProcessorErrors.RAW_QUERY_STRING_PARAMETER_REMOVED
 import androidx.room.vo.RawQueryMethod
-import asTypeElement
-import isAssignableFrom
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
 
 class RawQueryMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
 
@@ -50,7 +41,7 @@
         context.checker.check(executableElement.hasAnnotation(RawQuery::class), executableElement,
                 ProcessorErrors.MISSING_RAWQUERY_ANNOTATION)
 
-        val returnTypeName = returnType.typeName()
+        val returnTypeName = returnType.typeName
         context.checker.notUnbound(returnTypeName, executableElement,
                 ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_QUERY_METHODS)
         val observedTableNames = processObservedTables()
@@ -76,7 +67,7 @@
 
     private fun processObservedTables(): Set<String> {
         val annotation = executableElement.toAnnotationBox(RawQuery::class)
-        return annotation?.getAsTypeMirrorList("observedEntities")
+        return annotation?.getAsTypeList("observedEntities")
                 ?.map {
                     it.asTypeElement()
                 }
@@ -98,7 +89,7 @@
                         // if it is empty, report error as it does not make sense
                         if (tableNames.isEmpty()) {
                             context.logger.e(executableElement,
-                                    ProcessorErrors.rawQueryBadEntity(it.type.typeName()))
+                                    ProcessorErrors.rawQueryBadEntity(it.type.typeName))
                         }
                         tableNames
                     }
@@ -106,21 +97,20 @@
     }
 
     private fun findRuntimeQueryParameter(
-        extractParams: List<VariableElement>
+        extractParams: List<XVariableElement>
     ): RawQueryMethod.RuntimeQueryParameter? {
-        val types = context.processingEnv.typeUtils
-        if (extractParams.size == 1 && !executableElement.isVarArgs) {
-            val param = extractParams.first().asMemberOf(types, containing)
+        if (extractParams.size == 1 && !executableElement.isVarArgs()) {
+            val param = extractParams.first().asMemberOf(containing)
             val processingEnv = context.processingEnv
-            val supportQueryType = processingEnv.requireTypeMirror(SupportDbTypeNames.QUERY)
-            val isSupportSql = supportQueryType.isAssignableFrom(types, param)
+            val supportQueryType = processingEnv.requireType(SupportDbTypeNames.QUERY)
+            val isSupportSql = supportQueryType.isAssignableFrom(param)
             if (isSupportSql) {
                 return RawQueryMethod.RuntimeQueryParameter(
                         paramName = extractParams[0].name,
-                        type = supportQueryType.typeName())
+                        type = supportQueryType.typeName)
             }
-            val stringType = processingEnv.requireTypeMirror("java.lang.String")
-            val isString = stringType.isAssignableFrom(types, param)
+            val stringType = processingEnv.requireType("java.lang.String")
+            val isString = stringType.isAssignableFrom(param)
             if (isString) {
                 // special error since this was initially allowed but removed in 1.1 beta1
                 context.logger.e(executableElement, RAW_QUERY_STRING_PARAMETER_REMOVED)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt
index 118f4eb..66955d6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutMethodProcessor.kt
@@ -15,21 +15,17 @@
  */
 package androidx.room.processor
 
-import androidx.room.ext.AnnotationBox
 import androidx.room.ext.isEntityElement
-import androidx.room.ext.toAnnotationBox
+import androidx.room.processing.XAnnotationBox
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.vo.Entity
 import androidx.room.vo.Pojo
 import androidx.room.vo.ShortcutEntity
 import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.vo.findFieldByColumnName
-import asTypeElement
-import isSameType
-import isTypeOf
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 import kotlin.reflect.KClass
 
 /**
@@ -37,13 +33,13 @@
  */
 class ShortcutMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
     private val delegate = MethodProcessorDelegate.createFor(context, containing, executableElement)
 
-    fun <T : Annotation> extractAnnotation(klass: KClass<T>, errorMsg: String): AnnotationBox<T>? {
+    fun <T : Annotation> extractAnnotation(klass: KClass<T>, errorMsg: String): XAnnotationBox<T>? {
         val annotation = executableElement.toAnnotationBox(klass)
         context.checker.check(annotation != null, executableElement, errorMsg)
         return annotation
@@ -52,7 +48,7 @@
     fun extractReturnType() = delegate.extractReturnType()
 
     fun extractParams(
-        targetEntityType: TypeMirror?,
+        targetEntityType: XType?,
         missingParamError: String,
         onValidatePartialEntity: (Entity, Pojo) -> Unit
     ): Pair<Map<String, ShortcutEntity>, List<ShortcutQueryParameter>> {
@@ -93,7 +89,7 @@
         params: List<ShortcutQueryParameter>,
         onValidatePartialEntity: (Entity, Pojo) -> Unit
     ) = params.associateBy({ it.name }, { param ->
-        if (targetEntity.type.isSameType(context.processingEnv.typeUtils, param.pojoType!!)) {
+        if (targetEntity.type.isSameType(param.pojoType!!)) {
             ShortcutEntity(entity = targetEntity, partialEntity = null)
         } else {
             // Target entity and pojo param are not the same, process and validate partial entity.
@@ -130,7 +126,7 @@
             it.name to ShortcutEntity(entity = entity!!, partialEntity = null)
         }.toMap()
 
-    private inline fun processEntity(element: TypeElement, onInvalid: () -> Unit) =
+    private inline fun processEntity(element: XTypeElement, onInvalid: () -> Unit) =
         if (element.isEntityElement()) {
             EntityProcessor(
                 context = context,
@@ -141,10 +137,10 @@
         }
 
     fun findInsertMethodBinder(
-        returnType: TypeMirror,
+        returnType: XType,
         params: List<ShortcutQueryParameter>
     ) = delegate.findInsertMethodBinder(returnType, params)
 
-    fun findDeleteOrUpdateMethodBinder(returnType: TypeMirror) =
+    fun findDeleteOrUpdateMethodBinder(returnType: XType) =
         delegate.findDeleteOrUpdateMethodBinder(returnType)
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt
index fd6b658..310dcb8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ShortcutParameterProcessor.kt
@@ -16,36 +16,24 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asMemberOf
-import androidx.room.ext.extendsBound
-import androidx.room.ext.getAllNonPrivateInstanceMethods
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isArray
 import androidx.room.vo.ShortcutQueryParameter
-import asDeclaredType
-import asTypeElement
-import erasure
-import isAssignableFrom
-import isType
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.ArrayType
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Processes parameters of methods that are annotated with Insert, Update or Delete.
  */
 class ShortcutParameterProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val element: VariableElement
+    val containing: XDeclaredType,
+    val element: XVariableElement
 ) {
     val context = baseContext.fork(element)
     fun process(): ShortcutQueryParameter {
-        val asMember = element.asMemberOf(
-            context.processingEnv.typeUtils,
-            containing
-        )
+        val asMember = element.asMemberOf(containing)
         val name = element.name
         context.checker.check(!name.startsWith("_"), element,
                 ProcessorErrors.QUERY_PARAMETERS_CANNOT_START_WITH_UNDERSCORE)
@@ -61,12 +49,11 @@
     }
 
     @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-    private fun extractPojoType(typeMirror: TypeMirror): Pair<TypeMirror?, Boolean> {
+    private fun extractPojoType(typeMirror: XType): Pair<XType?, Boolean> {
 
         val processingEnv = context.processingEnv
-        val typeUtils = context.processingEnv.typeUtils
 
-        fun verifyAndPair(pojoType: TypeMirror, isMultiple: Boolean): Pair<TypeMirror?, Boolean> {
+        fun verifyAndPair(pojoType: XType, isMultiple: Boolean): Pair<XType?, Boolean> {
             if (!pojoType.isType()) {
                 // kotlin may generate ? extends T so we should reduce it.
                 val boundedVar = pojoType.extendsBound()
@@ -77,10 +64,10 @@
             return Pair(pojoType, isMultiple)
         }
 
-        fun extractPojoTypeFromIterator(iterableType: DeclaredType): TypeMirror {
-            iterableType.asTypeElement().getAllNonPrivateInstanceMethods(processingEnv).forEach {
+        fun extractPojoTypeFromIterator(iterableType: XDeclaredType): XType {
+            iterableType.asTypeElement().getAllNonPrivateInstanceMethods().forEach {
                 if (it.name == "iterator") {
-                    return it.asMemberOf(typeUtils, iterableType)
+                    return it.asMemberOf(iterableType)
                         .returnType
                         .asDeclaredType()
                         .typeArguments
@@ -91,13 +78,13 @@
         }
 
         val iterableType = processingEnv
-                .requireTypeMirror("java.lang.Iterable").erasure(typeUtils)
-        if (iterableType.isAssignableFrom(typeUtils, typeMirror)) {
+                .requireType("java.lang.Iterable").erasure()
+        if (iterableType.isAssignableFrom(typeMirror)) {
             val declared = typeMirror.asDeclaredType()
             val pojo = extractPojoTypeFromIterator(declared)
             return verifyAndPair(pojo, true)
         }
-        if (typeMirror is ArrayType) {
+        if (typeMirror.isArray()) {
             val pojo = typeMirror.componentType
             return verifyAndPair(pojo, true)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt
index c294886..70f2ecd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/SuppressWarningProcessor.kt
@@ -16,16 +16,15 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.toAnnotationBox
+import androidx.room.processing.XElement
 import androidx.room.vo.Warning
-import javax.lang.model.element.Element
 
 /**
  * A visitor that reads SuppressWarnings annotations and keeps the ones we know about.
  */
 object SuppressWarningProcessor {
 
-    fun getSuppressedWarnings(element: Element): Set<Warning> {
+    fun getSuppressedWarnings(element: XElement): Set<Warning> {
         val annotation = element.toAnnotationBox(SuppressWarnings::class)?.value
         return if (annotation == null) {
             emptySet()
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
index d28e888..f8ac9e7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/TableEntityProcessor.kt
@@ -16,10 +16,10 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.name
-import androidx.room.ext.toAnnotationBox
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.EntityProcessor.Companion.createIndexName
 import androidx.room.processor.EntityProcessor.Companion.extractForeignKeys
 import androidx.room.processor.EntityProcessor.Companion.extractIndices
@@ -38,15 +38,10 @@
 import androidx.room.vo.Warning
 import androidx.room.vo.columnNames
 import androidx.room.vo.findFieldByColumnName
-import asTypeElement
-import isNone
-import isNotNone
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 class TableEntityProcessor internal constructor(
     baseContext: Context,
-    val element: TypeElement,
+    val element: XTypeElement,
     private val referenceStack: LinkedHashSet<String> = LinkedHashSet()
 ) : EntityProcessor {
     val context = baseContext.fork(element)
@@ -96,7 +91,8 @@
                         it.indexed = false
                         context.logger.w(Warning.INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED, it.element,
                                 ProcessorErrors.droppedEmbeddedFieldIndex(
-                                        it.getPath(), element.qualifiedName.toString()))
+                                        it.getPath(), element.qualifiedName
+                                ))
                         null
                     } else if (it.element.enclosingElement != element && !inheritSuperIndices) {
                         it.indexed = false
@@ -114,7 +110,7 @@
                         )
                     }
                 }
-        val superIndices = loadSuperIndices(element.superclass, tableName, inheritSuperIndices)
+        val superIndices = loadSuperIndices(element.superType, tableName, inheritSuperIndices)
         val indexInputs = entityIndices + fieldIndices + superIndices
         val indices = validateAndCreateIndices(indexInputs, pojo)
 
@@ -311,7 +307,7 @@
                             Warning.PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED,
                             grandParentField,
                             ProcessorErrors.embeddedPrimaryKeyIsDropped(
-                                    element.qualifiedName.toString(), field.name))
+                                element.qualifiedName, field.name))
                     null
                 } else {
                     PrimaryKey(declaredIn = field.element.enclosingElement,
@@ -326,7 +322,7 @@
      * Check classes for @Entity(primaryKeys = ?).
      */
     private fun collectPrimaryKeysFromEntityAnnotations(
-        typeElement: TypeElement,
+        typeElement: XTypeElement,
         availableFields: List<Field>
     ): List<PrimaryKey> {
         val myPkeys = typeElement.toAnnotationBox(androidx.room.Entity::class)?.let {
@@ -347,7 +343,7 @@
             }
         } ?: emptyList()
         // checks supers.
-        val mySuper = typeElement.superclass
+        val mySuper = typeElement.superType
         val superPKeys = if (mySuper != null && mySuper.isNotNone()) {
             // my super cannot see my fields so remove them.
             val remainingFields = availableFields.filterNot {
@@ -379,7 +375,7 @@
     // pkey, if so, use it.
     private fun choosePrimaryKey(
         candidates: List<PrimaryKey>,
-        typeElement: TypeElement
+        typeElement: XTypeElement
     ): PrimaryKey {
         // If 1 of these primary keys is declared in this class, then it is the winner. Just print
         //    a note for the others.
@@ -398,7 +394,7 @@
             myPKeys.first()
         } else if (myPKeys.isEmpty()) {
             // i have not declared anything, delegate to super
-            val mySuper = typeElement.superclass
+            val mySuper = typeElement.superType
             if (mySuper != null && mySuper.isNotNone()) {
                 return choosePrimaryKey(candidates, mySuper.asTypeElement())
             }
@@ -449,7 +445,8 @@
                             embedded.field.element, ProcessorErrors.droppedEmbeddedIndex(
                             entityName = embedded.pojo.typeName.toString(),
                             fieldPath = embedded.field.getPath(),
-                            grandParent = element.qualifiedName.toString()))
+                            grandParent = element.qualifiedName
+                        ))
                 }
             }
         }
@@ -458,7 +455,7 @@
 
     // check if parent is an Entity, if so, report its annotation indices
     private fun loadSuperIndices(
-        typeMirror: TypeMirror?,
+        typeMirror: XType?,
         tableName: String,
         inherit: Boolean
     ): List<IndexInput> {
@@ -483,11 +480,12 @@
                 context.logger.w(Warning.INDEX_FROM_PARENT_IS_DROPPED,
                         parentElement,
                         ProcessorErrors.droppedSuperClassIndex(
-                                childEntity = element.qualifiedName.toString(),
-                                superEntity = parentElement.qualifiedName.toString()))
+                                childEntity = element.qualifiedName,
+                                superEntity = parentElement.qualifiedName
+                        ))
                 emptyList()
             }
         } ?: emptyList()
-        return myIndices + loadSuperIndices(parentElement.superclass, tableName, inherit)
+        return myIndices + loadSuperIndices(parentElement.superType, tableName, inherit)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt
index f5808d2..8a4cd01 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/TransactionMethodProcessor.kt
@@ -20,41 +20,32 @@
 import androidx.room.ext.LifecyclesTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.findKotlinDefaultImpl
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isJavaDefault
-import androidx.room.ext.isOverrideableIgnoringContainer
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.TransactionMethod
-import erasure
-import isAssignableFrom
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class TransactionMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
 
     val context = baseContext.fork(executableElement)
 
     fun process(): TransactionMethod {
         val delegate = MethodProcessorDelegate.createFor(context, containing, executableElement)
-        val typeUtils = context.processingEnv.typeUtils
-        val kotlinDefaultImpl = executableElement.findKotlinDefaultImpl(typeUtils)
+        val kotlinDefaultImpl = executableElement.findKotlinDefaultImpl()
         context.checker.check(
                 executableElement.isOverrideableIgnoringContainer() &&
                         (!executableElement.isAbstract() || kotlinDefaultImpl != null),
                 executableElement, ProcessorErrors.TRANSACTION_METHOD_MODIFIERS)
 
         val returnType = delegate.extractReturnType()
-        val erasureReturnType = returnType.erasure(typeUtils)
+        val erasureReturnType = returnType.erasure()
 
         DEFERRED_TYPES.firstOrNull { className ->
-            context.processingEnv.findTypeMirror(className)?.let {
-                erasureReturnType.isAssignableFrom(typeUtils, it)
+            context.processingEnv.findType(className)?.let {
+                erasureReturnType.isAssignableFrom(it)
             } ?: false
         }?.let { returnTypeName ->
             context.logger.e(
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt
index 10a9e93..79a4a67 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/UpdateMethodProcessor.kt
@@ -19,16 +19,15 @@
 import androidx.room.OnConflictStrategy.IGNORE
 import androidx.room.OnConflictStrategy.REPLACE
 import androidx.room.Update
-import androidx.room.ext.name
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.vo.UpdateMethod
 import androidx.room.vo.findFieldByColumnName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 class UpdateMethodProcessor(
     baseContext: Context,
-    val containing: DeclaredType,
-    val executableElement: ExecutableElement
+    val containing: XDeclaredType,
+    val executableElement: XMethodElement
 ) {
     val context = baseContext.fork(executableElement)
 
@@ -42,7 +41,7 @@
                 executableElement, ProcessorErrors.INVALID_ON_CONFLICT_VALUE)
 
         val (entities, params) = delegate.extractParams(
-            targetEntityType = annotation?.getAsTypeMirror("entity"),
+            targetEntityType = annotation?.getAsType("entity"),
             missingParamError = ProcessorErrors.UPDATE_MISSING_PARAMS,
             onValidatePartialEntity = { entity, pojo ->
                 val missingPrimaryKeys = entity.primaryKey.fields.filter {
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt b/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt
index c6d1ba1..1e0dab2 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegate.kt
@@ -17,21 +17,10 @@
 package androidx.room.processor.autovalue
 
 import androidx.room.Ignore
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getDeclaredMethods
-import androidx.room.ext.getPackage
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.hasAnyOf
-import androidx.room.ext.isAbstract
-import androidx.room.ext.isPrivate
-import androidx.room.ext.isStatic
-import androidx.room.ext.isType
-import androidx.room.ext.kindName
-import androidx.room.ext.name
-import androidx.room.ext.type
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XExecutableElement
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.isType
 import androidx.room.processor.Context
 import androidx.room.processor.PojoProcessor
 import androidx.room.processor.PojoProcessor.Companion.TARGET_METHOD_ANNOTATIONS
@@ -42,33 +31,27 @@
 import androidx.room.vo.Pojo
 import androidx.room.vo.Warning
 import com.google.auto.value.AutoValue.CopyAnnotations
-import isSameType
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 /**
  * Delegate to process generated AutoValue class as a Pojo.
  */
 class AutoValuePojoProcessorDelegate(
     private val context: Context,
-    private val autoValueElement: TypeElement
+    private val autoValueElement: XTypeElement
 ) : PojoProcessor.Delegate {
 
-    private val autoValueDeclaredType: DeclaredType by lazy {
+    private val autoValueDeclaredType: XDeclaredType by lazy {
         autoValueElement.asDeclaredType()
     }
 
-    override fun onPreProcess(element: TypeElement) {
-        val allMethods = autoValueElement.getAllMethods(context.processingEnv)
+    override fun onPreProcess(element: XTypeElement) {
+        val allMethods = autoValueElement.getAllMethods()
         val autoValueAbstractGetters = allMethods
             .filter { it.isAbstract() && it.parameters.size == 0 }
 
         // Warn about missing @AutoValue.CopyAnnotations in the property getters.
         autoValueAbstractGetters.forEach {
-            val hasRoomAnnotation = it.annotationMirrors.map {
-                it.annotationType.typeName().toString()
-            }.any { it.contains("androidx.room") }
+            val hasRoomAnnotation = it.hasAnnotationWithPackage("androidx.room")
             if (hasRoomAnnotation && !it.hasAnnotation(CopyAnnotations::class)) {
                 context.logger.w(Warning.MISSING_COPY_ANNOTATIONS, it,
                         ProcessorErrors.MISSING_COPY_ANNOTATIONS)
@@ -87,19 +70,18 @@
             }
     }
 
-    override fun findConstructors(element: TypeElement): List<ExecutableElement> {
-        val typeUtils = context.processingEnv.typeUtils
+    override fun findConstructors(element: XTypeElement): List<XExecutableElement> {
         return autoValueElement.getDeclaredMethods().filter {
             it.isStatic() &&
                     !it.hasAnnotation(Ignore::class) &&
                     !it.isPrivate() &&
-                    it.returnType.isSameType(typeUtils, autoValueElement.type)
+                    it.returnType.isSameType(autoValueElement.type)
         }
     }
 
     override fun createPojo(
-        element: TypeElement,
-        declaredType: DeclaredType,
+        element: XTypeElement,
+        declaredType: XDeclaredType,
         fields: List<Field>,
         embeddedFields: List<EmbeddedField>,
         relations: List<androidx.room.vo.Relation>,
@@ -119,14 +101,14 @@
          *
          * This is the same naming strategy used by AutoValue's processor.
          */
-        fun getGeneratedClassName(element: TypeElement): String {
+        fun getGeneratedClassName(element: XTypeElement): String {
             var type = element
             var name = type.name
-            while (type.enclosingElement.isType()) {
-                type = type.enclosingElement.asTypeElement()
+            while (type.enclosingElement?.isType() == true) {
+                type = type.enclosingElement!!.asTypeElement()
                 name = "${type.name}_$name"
             }
-            val pkg = type.getPackage()
+            val pkg = type.packageName
             return "$pkg${if (pkg.isEmpty()) "" else "."}AutoValue_$name"
         }
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt b/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt
index 115f85e..16b9ab3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/cache/Cache.kt
@@ -18,14 +18,14 @@
 
 package androidx.room.processor.cache
 
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
 import androidx.room.processor.FieldProcessor
 import androidx.room.vo.EmbeddedField
 import androidx.room.vo.Entity
 import androidx.room.vo.Pojo
 import androidx.room.vo.Warning
 import java.util.LinkedHashSet
-import javax.lang.model.element.Element
-import javax.lang.model.type.TypeMirror
 
 /**
  * A cache key can be used to avoid re-processing elements.
@@ -35,7 +35,7 @@
  */
 class Cache(
     val parent: Cache?,
-    val converters: LinkedHashSet<TypeMirror>,
+    val converters: LinkedHashSet<XType>,
     val suppressedWarnings: Set<Warning>
 ) {
     val entities: Bucket<EntityKey, Entity> = Bucket(parent?.entities)
@@ -54,13 +54,13 @@
     /**
      * Key for Entity cache
      */
-    data class EntityKey(val element: Element)
+    data class EntityKey(val element: XElement)
 
     /**
      * Key for Pojo cache
      */
     data class PojoKey(
-        val element: Element,
+        val element: XElement,
         val scope: FieldProcessor.BindingScope,
         val parent: EmbeddedField?
     )
@@ -71,7 +71,7 @@
      * Converters are kept in a linked set since the order is important for the TypeAdapterStore.
      */
     private data class FullKey<T>(
-        val converters: LinkedHashSet<TypeMirror>,
+        val converters: LinkedHashSet<XType>,
         val suppressedWarnings: Set<Warning>,
         val key: T
     )
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt
index 139d491..87e668f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/KotlinDefaultMethodDelegateBinder.kt
@@ -20,9 +20,8 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import com.squareup.javapoet.ClassName
-import isVoid
-import javax.lang.model.type.TypeMirror
 
 /**
  * Method binder that delegates to concrete DAO function in a Kotlin interface.
@@ -32,7 +31,7 @@
         daoName: ClassName,
         daoImplName: ClassName,
         methodName: String,
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         scope: CodeGenScope
     ) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt
index e156a4c..159bf397 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/ObservableQueryResultBinderProvider.kt
@@ -17,26 +17,26 @@
 package androidx.room.solver
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.query.result.QueryResultAdapter
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder provider class that has common functionality for observables.
  */
 abstract class ObservableQueryResultBinderProvider(val context: Context) :
     QueryResultBinderProvider {
-    protected abstract fun extractTypeArg(declared: DeclaredType): TypeMirror
+    protected abstract fun extractTypeArg(declared: XDeclaredType): XType
     protected abstract fun create(
-        typeArg: TypeMirror,
+        typeArg: XType,
         resultAdapter: QueryResultAdapter?,
         tableNames: Set<String>
     ): QueryResultBinder
 
-    final override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    final override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = extractTypeArg(declared)
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
         val tableNames = ((adapter?.accessedTableNames() ?: emptyList()) +
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt
index 2fda890..8290d7a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/QueryResultBinderProvider.kt
@@ -17,10 +17,10 @@
 package androidx.room.solver
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 interface QueryResultBinderProvider {
-    fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder
-    fun matches(declared: DeclaredType): Boolean
+    fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder
+    fun matches(declared: XDeclaredType): Boolean
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt b/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
index 365e3eb..740806b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
@@ -18,13 +18,13 @@
 
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.GuavaBaseTypeNames
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.extendsBoundOrSelf
-import androidx.room.ext.isAssignableFromWithoutVariance
 import androidx.room.ext.isEntityElement
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XType
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isArray
+import androidx.room.processing.isDeclared
 import androidx.room.processor.Context
 import androidx.room.processor.EntityProcessor
 import androidx.room.processor.FieldProcessor
@@ -92,21 +92,9 @@
 import androidx.room.solver.types.StringColumnTypeAdapter
 import androidx.room.solver.types.TypeConverter
 import androidx.room.vo.ShortcutQueryParameter
-import asDeclaredType
-import asTypeElement
 import com.google.common.annotations.VisibleForTesting
 import com.google.common.collect.ImmutableList
-import erasure
-import isArray
-import isAssignableFrom
-import isDeclared
-import isError
-import isNotByte
-import isSameType
-import isType
-import isTypeOf
 import java.util.LinkedList
-import javax.lang.model.type.TypeMirror
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 /**
@@ -158,7 +146,7 @@
                     .createPrimitiveAdapters(context.processingEnv)
             primitives.forEach(::addColumnAdapter)
             BoxedPrimitiveColumnTypeAdapter
-                    .createBoxedPrimitiveAdapters(context.processingEnv, primitives)
+                    .createBoxedPrimitiveAdapters(primitives)
                     .forEach(::addColumnAdapter)
             addColumnAdapter(StringColumnTypeAdapter(context.processingEnv))
             addColumnAdapter(ByteArrayColumnTypeAdapter(context.processingEnv))
@@ -215,7 +203,7 @@
      * Searches 1 way to bind a value into a statement.
      */
     fun findStatementValueBinder(
-        input: TypeMirror,
+        input: XType,
         affinity: SQLTypeAffinity?
     ): StatementValueBinder? {
         if (input.isError()) {
@@ -237,7 +225,7 @@
     /**
      * Returns which entities targets the given affinity.
      */
-    private fun targetTypeMirrorsFor(affinity: SQLTypeAffinity?): List<TypeMirror> {
+    private fun targetTypeMirrorsFor(affinity: SQLTypeAffinity?): List<XType> {
         val specifiedTargets = affinity?.getTypeMirrors(context.processingEnv)
         return if (specifiedTargets == null || specifiedTargets.isEmpty()) {
             knownColumnTypeMirrors
@@ -249,7 +237,7 @@
     /**
      * Searches 1 way to read it from cursor
      */
-    fun findCursorValueReader(output: TypeMirror, affinity: SQLTypeAffinity?): CursorValueReader? {
+    fun findCursorValueReader(output: XType, affinity: SQLTypeAffinity?): CursorValueReader? {
         if (output.isError()) {
             return null
         }
@@ -278,10 +266,9 @@
                 CompositeTypeConverter(r2, r1)
             }
             else -> {
-                val types = context.processingEnv.typeUtils
                 typeConverters.firstOrNull {
-                    it.from.isSameType(types, converter.to) &&
-                            it.to.isSameType(types, converter.from)
+                    it.from.isSameType(converter.to) &&
+                            it.to.isSameType(converter.from)
                 }
             }
         }
@@ -291,7 +278,7 @@
      * Finds a two way converter, if you need 1 way, use findStatementValueBinder or
      * findCursorValueReader.
      */
-    fun findColumnTypeAdapter(out: TypeMirror, affinity: SQLTypeAffinity?): ColumnTypeAdapter? {
+    fun findColumnTypeAdapter(out: XType, affinity: SQLTypeAffinity?): ColumnTypeAdapter? {
         if (out.isError()) {
             return null
         }
@@ -309,7 +296,7 @@
     }
 
     private fun findDirectAdapterFor(
-        out: TypeMirror,
+        out: XType,
         affinity: SQLTypeAffinity?
     ): ColumnTypeAdapter? {
         return getAllColumnAdapters(out).firstOrNull {
@@ -317,11 +304,11 @@
         }
     }
 
-    fun findTypeConverter(input: TypeMirror, output: TypeMirror): TypeConverter? {
+    fun findTypeConverter(input: XType, output: XType): TypeConverter? {
         return findTypeConverter(listOf(input), listOf(output))
     }
 
-    fun findDeleteOrUpdateMethodBinder(typeMirror: TypeMirror): DeleteOrUpdateMethodBinder {
+    fun findDeleteOrUpdateMethodBinder(typeMirror: XType): DeleteOrUpdateMethodBinder {
         val adapter = findDeleteOrUpdateAdapter(typeMirror)
         return if (typeMirror.isDeclared()) {
             deleteOrUpdateBinderProvider.first {
@@ -333,7 +320,7 @@
     }
 
     fun findInsertMethodBinder(
-        typeMirror: TypeMirror,
+        typeMirror: XType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         return if (typeMirror.isDeclared()) {
@@ -345,7 +332,7 @@
         }
     }
 
-    fun findQueryResultBinder(typeMirror: TypeMirror, query: ParsedQuery): QueryResultBinder {
+    fun findQueryResultBinder(typeMirror: XType, query: ParsedQuery): QueryResultBinder {
         return if (typeMirror.isDeclared()) {
             return queryResultBinderProviders.first {
                 it.matches(typeMirror)
@@ -356,7 +343,7 @@
     }
 
     fun findPreparedQueryResultBinder(
-        typeMirror: TypeMirror,
+        typeMirror: XType,
         query: ParsedQuery
     ): PreparedQueryResultBinder {
         return if (typeMirror.isDeclared()) {
@@ -368,21 +355,21 @@
         }
     }
 
-    fun findPreparedQueryResultAdapter(typeMirror: TypeMirror, query: ParsedQuery) =
+    fun findPreparedQueryResultAdapter(typeMirror: XType, query: ParsedQuery) =
         PreparedQueryResultAdapter.create(typeMirror, query.type)
 
-    fun findDeleteOrUpdateAdapter(typeMirror: TypeMirror): DeleteOrUpdateMethodAdapter? {
+    fun findDeleteOrUpdateAdapter(typeMirror: XType): DeleteOrUpdateMethodAdapter? {
         return DeleteOrUpdateMethodAdapter.create(typeMirror)
     }
 
     fun findInsertAdapter(
-        typeMirror: TypeMirror,
+        typeMirror: XType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodAdapter? {
         return InsertMethodAdapter.create(typeMirror, params)
     }
 
-    fun findQueryResultAdapter(typeMirror: TypeMirror, query: ParsedQuery): QueryResultAdapter? {
+    fun findQueryResultAdapter(typeMirror: XType, query: ParsedQuery): QueryResultAdapter? {
         if (typeMirror.isError()) {
             return null
         }
@@ -390,15 +377,13 @@
             if (typeMirror.typeArguments.isEmpty()) {
                 val rowAdapter = findRowAdapter(typeMirror, query) ?: return null
                 return SingleEntityQueryResultAdapter(rowAdapter)
-            } else if (typeMirror.erasure(context.processingEnv.typeUtils).typeName() ==
-                    GuavaBaseTypeNames.OPTIONAL) {
+            } else if (typeMirror.erasure().typeName == GuavaBaseTypeNames.OPTIONAL) {
                 // Handle Guava Optional by unpacking its generic type argument and adapting that.
                 // The Optional adapter will reappend the Optional type.
                 val typeArg = typeMirror.typeArguments.first()
                 val rowAdapter = findRowAdapter(typeArg, query) ?: return null
                 return GuavaOptionalQueryResultAdapter(SingleEntityQueryResultAdapter(rowAdapter))
-            } else if (typeMirror.erasure(context.processingEnv.typeUtils).typeName() ==
-                    CommonTypeNames.OPTIONAL) {
+            } else if (typeMirror.erasure().typeName == CommonTypeNames.OPTIONAL) {
                 // Handle java.util.Optional similarly.
                 val typeArg = typeMirror.typeArguments.first()
                 val rowAdapter = findRowAdapter(typeArg, query) ?: return null
@@ -427,7 +412,7 @@
      * Find a converter from cursor to the given type mirror.
      * If there is information about the query result, we try to use it to accept *any* POJO.
      */
-    fun findRowAdapter(typeMirror: TypeMirror, query: ParsedQuery): RowAdapter? {
+    fun findRowAdapter(typeMirror: XType, query: ParsedQuery): RowAdapter? {
         if (typeMirror.isError()) {
             return null
         }
@@ -460,7 +445,7 @@
 
             if (rowAdapter == null && query.resultInfo == null) {
                 // we don't know what query returns. Check for entity.
-                val asElement = typeMirror.asElement()
+                val asElement = typeMirror.asTypeElement()
                 if (asElement.isEntityElement()) {
                     return EntityRowAdapter(EntityProcessor(
                             context = context,
@@ -508,13 +493,9 @@
         }
     }
 
-    fun findQueryParameterAdapter(typeMirror: TypeMirror): QueryParameterAdapter? {
-        val typeUtils = context.processingEnv.typeUtils
+    fun findQueryParameterAdapter(typeMirror: XType): QueryParameterAdapter? {
         if (typeMirror.isType() &&
-            context.COMMON_TYPES.COLLECTION.erasure(typeUtils).isAssignableFrom(
-                typeUtils,
-                typeMirror
-            )) {
+            context.COMMON_TYPES.COLLECTION.erasure().isAssignableFrom(typeMirror)) {
             val declared = typeMirror.asDeclaredType()
             val binder = findStatementValueBinder(
                 declared.typeArguments.first().extendsBoundOrSelf(), null)
@@ -535,34 +516,33 @@
         }
     }
 
-    private fun findTypeConverter(input: TypeMirror, outputs: List<TypeMirror>): TypeConverter? {
+    private fun findTypeConverter(input: XType, outputs: List<XType>): TypeConverter? {
         return findTypeConverter(listOf(input), outputs)
     }
 
-    private fun findTypeConverter(input: List<TypeMirror>, output: TypeMirror): TypeConverter? {
+    private fun findTypeConverter(input: List<XType>, output: XType): TypeConverter? {
         return findTypeConverter(input, listOf(output))
     }
 
     private fun findTypeConverter(
-        inputs: List<TypeMirror>,
-        outputs: List<TypeMirror>
+        inputs: List<XType>,
+        outputs: List<XType>
     ): TypeConverter? {
         if (inputs.isEmpty()) {
             return null
         }
-        val types = context.processingEnv.typeUtils
         inputs.forEach { input ->
-            if (outputs.any { output -> input.isSameType(types, output) }) {
+            if (outputs.any { output -> input.isSameType(output) }) {
                 return NoOpConverter(input)
             }
         }
 
-        val excludes = arrayListOf<TypeMirror>()
+        val excludes = arrayListOf<XType>()
 
         val queue = LinkedList<TypeConverter>()
         fun exactMatch(candidates: List<TypeConverter>): TypeConverter? {
             return candidates.firstOrNull {
-                outputs.any { output -> it.to.isAssignableFromWithoutVariance(types, output) }
+                outputs.any { output -> it.to.isAssignableFromWithoutVariance(output) }
             }
         }
         inputs.forEach { input ->
@@ -593,9 +573,9 @@
         return null
     }
 
-    private fun getAllColumnAdapters(input: TypeMirror): List<ColumnTypeAdapter> {
+    private fun getAllColumnAdapters(input: XType): List<ColumnTypeAdapter> {
         return columnTypeAdapters.filter {
-            input.isSameType(context.processingEnv.typeUtils, it.out)
+            input.isSameType(it.out)
         }
     }
 
@@ -604,17 +584,16 @@
      * The returned list is ordered by priority such that if we have an exact match, it is
      * prioritized.
      */
-    private fun getAllTypeConverters(input: TypeMirror, excludes: List<TypeMirror>):
+    private fun getAllTypeConverters(input: XType, excludes: List<XType>):
             List<TypeConverter> {
-        val types = context.processingEnv.typeUtils
         // for input, check assignability because it defines whether we can use the method or not.
         // for excludes, use exact match
         return typeConverters.filter { converter ->
-            converter.from.isAssignableFrom(types, input) &&
-                    !excludes.any { it.isSameType(types, converter.to) }
+            converter.from.isAssignableFrom(input) &&
+                    !excludes.any { it.isSameType(converter.to) }
         }.sortedByDescending {
             // if it is the same, prioritize
-            if (it.from.isSameType(types, input)) {
+            if (it.from.isSameType(input)) {
                 2
             } else {
                 1
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt
index 3e145b1..286d620 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CoroutineFlowResultBinderProvider.kt
@@ -18,15 +18,13 @@
 
 import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.RoomCoroutinesTypeNames
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.CoroutineFlowResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 @Suppress("FunctionName")
 fun CoroutineFlowResultBinderProvider(context: Context): QueryResultBinderProvider =
@@ -49,7 +47,7 @@
         )
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = declared.typeArguments.first()
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
         val tableNames = ((adapter?.accessedTableNames() ?: emptyList()) +
@@ -60,11 +58,11 @@
         return CoroutineFlowResultBinder(typeArg, tableNames, adapter)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (declared.typeArguments.size != 1) {
             return false
         }
-        val typeName = declared.erasure(context.processingEnv.typeUtils).typeName()
+        val typeName = declared.erasure().typeName
         if (typeName in CHANNEL_TYPE_NAMES) {
             context.logger.e(ProcessorErrors.invalidChannelType(typeName.toString()))
             return false
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
index 1dcbfbd..6e08b73 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/CursorQueryResultBinderProvider.kt
@@ -17,19 +17,18 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.AndroidTypeNames
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.CursorQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 class CursorQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         return CursorQueryResultBinder()
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
-        declared.typeArguments.size == 0 && declared.typeName() == AndroidTypeNames.CURSOR
+    override fun matches(declared: XDeclaredType): Boolean =
+        declared.typeArguments.isEmpty() && declared.typeName == AndroidTypeNames.CURSOR
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt
index 9f2db8c..bf79b16 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceFactoryQueryResultBinderProvider.kt
@@ -17,8 +17,9 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.findTypeMirror
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
@@ -26,17 +27,13 @@
 import androidx.room.solver.query.result.ListQueryResultAdapter
 import androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class DataSourceFactoryQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    private val dataSourceFactoryTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.DATA_SOURCE_FACTORY)
+    private val dataSourceFactoryTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.DATA_SOURCE_FACTORY)
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         if (query.tables.isEmpty()) {
             context.logger.e(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
         }
@@ -51,19 +48,15 @@
         return DataSourceFactoryQueryResultBinder(countedBinder)
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 2 && isLivePagedList(declared)
 
-    private fun isLivePagedList(declared: DeclaredType): Boolean {
+    private fun isLivePagedList(declared: XDeclaredType): Boolean {
         if (dataSourceFactoryTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
+        val erasure = declared.erasure()
         // we don't want to return paged list unless explicitly requested
-        return erasure.isAssignableFrom(
-            typeUtils,
-            dataSourceFactoryTypeMirror!!
-        )
+        return erasure.isAssignableFrom(dataSourceFactoryTypeMirror!!)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt
index 7cd0505..b7d5ef12 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/DataSourceQueryResultBinderProvider.kt
@@ -17,29 +17,26 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.findTypeMirror
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.ListQueryResultAdapter
 import androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class DataSourceQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    private val dataSourceTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.DATA_SOURCE)
+    private val dataSourceTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.DATA_SOURCE)
     }
 
-    private val positionalDataSourceTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.POSITIONAL_DATA_SOURCE)
+    private val positionalDataSourceTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.POSITIONAL_DATA_SOURCE)
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         if (query.tables.isEmpty()) {
             context.logger.e(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
         }
@@ -52,25 +49,19 @@
         return PositionalDataSourceQueryResultBinder(listAdapter, tableNames)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (dataSourceTypeMirror == null || positionalDataSourceTypeMirror == null) {
             return false
         }
         if (declared.typeArguments.isEmpty()) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        val isDataSource = dataSourceTypeMirror!!.isAssignableFrom(
-            typeUtils,
-            erasure
-        )
+        val erasure = declared.erasure()
+        val isDataSource = dataSourceTypeMirror!!.isAssignableFrom(erasure)
         if (!isDataSource) {
             return false
         }
-        val isPositional = positionalDataSourceTypeMirror!!.isAssignableFrom(
-            typeUtils, erasure
-        )
+        val isPositional = positionalDataSourceTypeMirror!!.isAssignableFrom(erasure)
         if (!isPositional) {
             context.logger.e(ProcessorErrors.PAGING_SPECIFY_DATA_SOURCE_TYPE)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt
index 2eabc87..31aae30 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/GuavaListenableFutureQueryResultBinderProvider.kt
@@ -18,15 +18,13 @@
 
 import androidx.room.ext.GuavaUtilConcurrentTypeNames
 import androidx.room.ext.RoomGuavaTypeNames
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.GuavaListenableFutureQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 @Suppress("FunctionName")
 fun GuavaListenableFutureQueryResultBinderProvider(context: Context): QueryResultBinderProvider =
@@ -47,7 +45,7 @@
      *
      * <p>Emits a compiler error if the Guava Room extension library is not linked.
      */
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         // Use the type T inside ListenableFuture<T> as the type to adapt and to pass into
         // the binder.
         val adapter = context.typeAdapterStore.findQueryResultAdapter(
@@ -59,8 +57,7 @@
     /**
      * Returns true iff the input {@code declared} type is ListenableFuture<T>.
      */
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
-                        GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
+                declared.erasure().typeName == GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
index d0b1660..7e9a40c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/InstantQueryResultBinderProvider.kt
@@ -17,17 +17,17 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.InstantQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 class InstantQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         return InstantQueryResultBinder(
                 context.typeAdapterStore.findQueryResultAdapter(declared, query))
     }
 
-    override fun matches(declared: DeclaredType): Boolean = true
+    override fun matches(declared: XDeclaredType): Boolean = true
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
index 320343d..b1cae91 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/LiveDataQueryResultBinderProvider.kt
@@ -17,27 +17,24 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.LifecyclesTypeNames
-import androidx.room.ext.findTypeMirror
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.ObservableQueryResultBinderProvider
 import androidx.room.solver.query.result.LiveDataQueryResultBinder
 import androidx.room.solver.query.result.QueryResultAdapter
 import androidx.room.solver.query.result.QueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class LiveDataQueryResultBinderProvider(context: Context) :
     ObservableQueryResultBinderProvider(context) {
-    private val liveDataTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(LifecyclesTypeNames.LIVE_DATA)
+    private val liveDataTypeMirror: XType? by lazy {
+        context.processingEnv.findType(LifecyclesTypeNames.LIVE_DATA)
     }
 
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    override fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
     override fun create(
-        typeArg: TypeMirror,
+        typeArg: XType,
         resultAdapter: QueryResultAdapter?,
         tableNames: Set<String>
     ): QueryResultBinder {
@@ -47,15 +44,14 @@
                 adapter = resultAdapter)
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 1 && isLiveData(declared)
 
-    private fun isLiveData(declared: DeclaredType): Boolean {
+    private fun isLiveData(declared: XDeclaredType): Boolean {
         if (liveDataTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, liveDataTypeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(liveDataTypeMirror!!)
     }
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt
index 19b5fb9..81053a5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/PagingSourceQueryResultBinderProvider.kt
@@ -17,9 +17,9 @@
 package androidx.room.solver.binderprovider
 
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.QueryResultBinderProvider
@@ -28,17 +28,13 @@
 import androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
 import com.squareup.javapoet.TypeName
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class PagingSourceQueryResultBinderProvider(val context: Context) : QueryResultBinderProvider {
-    private val pagingSourceTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(PagingTypeNames.PAGING_SOURCE)
+    private val pagingSourceTypeMirror: XType? by lazy {
+        context.processingEnv.findType(PagingTypeNames.PAGING_SOURCE)
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         if (query.tables.isEmpty()) {
             context.logger.e(ProcessorErrors.OBSERVABLE_QUERY_NOTHING_TO_OBSERVE)
         }
@@ -53,7 +49,7 @@
         )
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (pagingSourceTypeMirror == null) {
             return false
         }
@@ -62,13 +58,12 @@
             return false
         }
 
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        if (!pagingSourceTypeMirror!!.isAssignableFrom(typeUtils, erasure)) {
+        val erasure = declared.erasure()
+        if (!pagingSourceTypeMirror!!.isAssignableFrom(erasure)) {
             return false
         }
 
-        if (declared.typeArguments.first().typeName() != TypeName.INT.box()) {
+        if (declared.typeArguments.first().typeName != TypeName.INT.box()) {
             context.logger.e(ProcessorErrors.PAGING_SPECIFY_PAGING_SOURCE_TYPE)
         }
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt
index 2a6c57a..7e39c45 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/QueryResultBinderProviderWithRequiredArtifact.kt
@@ -15,13 +15,12 @@
  */
 package androidx.room.solver.binderprovider
 
-import androidx.room.ext.findTypeElement
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.query.result.QueryResultBinder
 import com.squareup.javapoet.TypeName
-import javax.lang.model.type.DeclaredType
 
 /**
  * Common functionality for binder providers that require an additional artifact
@@ -47,11 +46,11 @@
         context.processingEnv.findTypeElement(requiredType) != null
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         return delegate.provide(declared, query)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         val result = delegate.matches(declared)
         if (result && !hasRequiredArtifact) {
             context.logger.e(missingArtifactErrorMsg)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
index 4725127..278a1aa 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxCallableQueryResultBinderProvider.kt
@@ -16,32 +16,30 @@
 
 package androidx.room.solver.binderprovider
 
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.QueryResultBinderProvider
 import androidx.room.solver.RxType
 import androidx.room.solver.query.result.QueryResultBinder
 import androidx.room.solver.query.result.RxCallableQueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 class RxCallableQueryResultBinderProvider private constructor(
     val context: Context,
     private val rxType: RxType
 ) : QueryResultBinderProvider {
-    override fun provide(declared: DeclaredType, query: ParsedQuery): QueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): QueryResultBinder {
         val typeArg = declared.typeArguments.first()
         val adapter = context.typeAdapterStore.findQueryResultAdapter(typeArg, query)
         return RxCallableQueryResultBinder(rxType, typeArg, adapter)
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
     companion object {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt
index 938deea..fae68af 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/binderprovider/RxQueryResultBinderProvider.kt
@@ -16,30 +16,27 @@
 
 package androidx.room.solver.binderprovider
 
-import androidx.room.ext.findTypeMirror
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.ObservableQueryResultBinderProvider
 import androidx.room.solver.RxType
 import androidx.room.solver.query.result.QueryResultAdapter
 import androidx.room.solver.query.result.QueryResultBinder
 import androidx.room.solver.query.result.RxQueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 class RxQueryResultBinderProvider private constructor(
     context: Context,
     private val rxType: RxType
 ) : ObservableQueryResultBinderProvider(context) {
-    private val typeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val typeMirror: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    override fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
     override fun create(
-        typeArg: TypeMirror,
+        typeArg: XType,
         resultAdapter: QueryResultAdapter?,
         tableNames: Set<String>
     ): QueryResultBinder {
@@ -51,16 +48,15 @@
         )
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
         if (typeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, typeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(typeMirror!!)
     }
 
     companion object {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
index 74b084f..617dab3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
@@ -17,13 +17,12 @@
 package androidx.room.solver.prepared.binder
 
 import androidx.room.ext.CallableTypeSpecBuilder
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.prepared.result.PreparedQueryResultAdapter
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder for deferred queries.
@@ -33,14 +32,14 @@
  * function.
  */
 class CallablePreparedQueryResultBinder private constructor(
-    val returnType: TypeMirror,
+    val returnType: XType,
     val addStmntBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit,
     adapter: PreparedQueryResultAdapter?
 ) : PreparedQueryResultBinder(adapter) {
 
     companion object {
         fun createPreparedBinder(
-            returnType: TypeMirror,
+            returnType: XType,
             adapter: PreparedQueryResultAdapter?,
             addCodeBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit
         ) = CallablePreparedQueryResultBinder(returnType, addCodeBlock, adapter)
@@ -53,7 +52,7 @@
         scope: CodeGenScope
     ) {
         val binderScope = scope.fork()
-        val callableImpl = CallableTypeSpecBuilder(returnType.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(returnType.typeName) {
             adapter?.executeAndReturn(
                 binderScope.prepareQueryStmtBlock(),
                 preparedStmtField,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt
index 8063f81..5656cad 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/GuavaListenableFuturePreparedQueryResultBinderProvider.kt
@@ -21,15 +21,12 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.prepared.binder.CallablePreparedQueryResultBinder.Companion.createPreparedBinder
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 class GuavaListenableFuturePreparedQueryResultBinderProvider(val context: Context) :
     PreparedQueryResultBinderProvider {
@@ -38,12 +35,12 @@
         context.processingEnv.findTypeElement(RoomGuavaTypeNames.GUAVA_ROOM) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
+                declared.erasure().typeName ==
                 GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
         if (!hasGuavaRoom) {
             context.logger.e(ProcessorErrors.MISSING_ROOM_GUAVA_ARTIFACT)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt
index 4086648..2082ac4 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/InstantPreparedQueryResultBinderProvider.kt
@@ -17,18 +17,18 @@
 package androidx.room.solver.prepared.binderprovider
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.prepared.binder.InstantPreparedQueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 class InstantPreparedQueryResultBinderProvider(
     val context: Context
 ) : PreparedQueryResultBinderProvider {
 
-    override fun matches(declared: DeclaredType) = true
+    override fun matches(declared: XDeclaredType) = true
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         query: ParsedQuery
     ) = InstantPreparedQueryResultBinder(
         context.typeAdapterStore.findPreparedQueryResultAdapter(declared, query)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt
index 3a639b1..fd97081 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/PreparedQueryResultBinderProvider.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.prepared.binderprovider
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
-import javax.lang.model.type.DeclaredType
 
 /**
  * Interface for for providing the appropriate [PreparedQueryResultBinder] given a query and a
@@ -26,13 +26,13 @@
  */
 interface PreparedQueryResultBinderProvider {
     /**
-     * Check whether the [DeclaredType] can be handled by the [PreparedQueryResultBinder] provided
+     * Check whether the [XDeclaredType] can be handled by the [PreparedQueryResultBinder] provided
      * by this provider.
      */
-    fun matches(declared: DeclaredType): Boolean
+    fun matches(declared: XDeclaredType): Boolean
 
     /**
      * Provides a [PreparedQueryResultBinder]
      */
-    fun provide(declared: DeclaredType, query: ParsedQuery): PreparedQueryResultBinder
+    fun provide(declared: XDeclaredType, query: ParsedQuery): PreparedQueryResultBinder
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt
index 85d7b98..c12bf40 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/binderprovider/RxPreparedQueryResultBinderProvider.kt
@@ -18,18 +18,13 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.RxType
 import androidx.room.solver.prepared.binder.CallablePreparedQueryResultBinder.Companion.createPreparedBinder
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 open class RxPreparedQueryResultBinderProvider internal constructor(
     val context: Context,
@@ -40,15 +35,15 @@
         context.processingEnv.findTypeElement(rxType.version.rxRoomClassName) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
-    override fun provide(declared: DeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
+    override fun provide(declared: XDeclaredType, query: ParsedQuery): PreparedQueryResultBinder {
         if (!hasRxJavaArtifact) {
             context.logger.e(rxType.version.missingArtifactMessage)
         }
@@ -61,7 +56,7 @@
         }
     }
 
-    open fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    open fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
     companion object {
         fun getAll(context: Context) = listOf(
@@ -80,18 +75,17 @@
     rxType: RxType
 ) : RxPreparedQueryResultBinderProvider(context, rxType) {
 
-    private val completableType: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val completableType: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
-    override fun matches(declared: DeclaredType): Boolean {
+    override fun matches(declared: XDeclaredType): Boolean {
         if (completableType == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, completableType!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(completableType!!)
     }
 
-    override fun extractTypeArg(declared: DeclaredType) = context.COMMON_TYPES.VOID
+    override fun extractTypeArg(declared: XDeclaredType) = context.COMMON_TYPES.VOID
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt
index d612453..4928df3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/prepared/result/PreparedQueryResultAdapter.kt
@@ -20,29 +20,23 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.parser.QueryType
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
 import com.squareup.javapoet.FieldSpec
-import isInt
-import isKotlinUnit
-import isLong
-import isVoid
-import isVoidObject
-import javax.lang.model.type.TypeMirror
 
 /**
  * An adapter for [PreparedQueryResultBinder] that executes queries with INSERT, UPDATE or DELETE
  * statements.
  */
 class PreparedQueryResultAdapter(
-    private val returnType: TypeMirror,
+    private val returnType: XType,
     private val queryType: QueryType
 ) {
     companion object {
         fun create(
-            returnType: TypeMirror,
+            returnType: XType,
             queryType: QueryType
         ) = if (isValidReturnType(returnType, queryType)) {
             PreparedQueryResultAdapter(returnType, queryType)
@@ -50,7 +44,7 @@
             null
         }
 
-        private fun isValidReturnType(returnType: TypeMirror, queryType: QueryType): Boolean {
+        private fun isValidReturnType(returnType: XType, queryType: QueryType): Boolean {
             if (returnType.isVoid() || returnType.isVoidObject() || returnType.isKotlinUnit()) {
                 return true
             } else {
@@ -89,7 +83,7 @@
                     val resultVar = scope.getTmpVar("_result")
                     addStatement(
                         "final $L $L = $L.$L()",
-                        returnType.typeName(), resultVar, stmtQueryVal, stmtMethod
+                        returnType.typeName, resultVar, stmtQueryVal, stmtMethod
                     )
                     addStatement("$N.setTransactionSuccessful()", dbField)
                     addStatement("return $L", resultVar)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt
index 0dd9732..477e0e9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/ArrayQueryParameterAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.types.StatementValueBinder
 import com.squareup.javapoet.TypeName
@@ -36,7 +35,7 @@
     ) {
         scope.builder().apply {
             val itrVar = scope.getTmpVar("_item")
-            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName(), itrVar,
+            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName, itrVar,
                     inputVarName).apply {
                         bindAdapter.bindToStmt(stmtVarName, startIndexVarName, itrVar, scope)
                         addStatement("$L ++", startIndexVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt
index e61f014..b935167 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/parameter/CollectionQueryParameterAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.types.StatementValueBinder
 import com.squareup.javapoet.TypeName
@@ -36,7 +35,7 @@
     ) {
         scope.builder().apply {
             val itrVar = scope.getTmpVar("_item")
-            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName(), itrVar,
+            beginControlFlow("for ($T $L : $L)", bindAdapter.typeMirror().typeName, itrVar,
                     inputVarName).apply {
                         bindAdapter.bindToStmt(stmtVarName, startIndexVarName, itrVar, scope)
                         addStatement("$L ++", startIndexVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
index 86a1c41..549e0df 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ArrayQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ArrayTypeName
 import com.squareup.javapoet.TypeName
@@ -29,14 +28,14 @@
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
 
-            val arrayType = ArrayTypeName.of(type.typeName())
+            val arrayType = ArrayTypeName.of(type.typeName)
             addStatement("final $T $L = new $T[$L.getCount()]",
-                    arrayType, outVarName, type.typeName(), cursorVarName)
+                    arrayType, outVarName, type.typeName, cursorVarName)
             val tmpVarName = scope.getTmpVar("_item")
             val indexVar = scope.getTmpVar("_index")
             addStatement("$T $L = 0", TypeName.INT, indexVar)
             beginControlFlow("while($L.moveToNext())", cursorVarName).apply {
-                addStatement("final $T $L", type.typeName(), tmpVarName)
+                addStatement("final $T $L", type.typeName, tmpVarName)
                 rowAdapter?.convert(tmpVarName, cursorVarName, scope)
                 addStatement("$L[$L] = $L", outVarName, indexVar, tmpVarName)
                 addStatement("$L ++", indexVar)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt
index 3feb379..a582db4 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineFlowResultBinder.kt
@@ -22,16 +22,15 @@
 import androidx.room.ext.RoomCoroutinesTypeNames
 import androidx.room.ext.T
 import androidx.room.ext.arrayTypeName
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds the result of a of a Kotlin Coroutine Flow<T>
  */
 class CoroutineFlowResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val tableNames: Set<String>,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
@@ -43,7 +42,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
@@ -64,7 +63,7 @@
                 RoomCoroutinesTypeNames.COROUTINES_ROOM,
                 dbField,
                 if (inTransaction) "true" else "false",
-                String::class.arrayTypeName(),
+                String::class.arrayTypeName,
                 tableNamesList,
                 callableImpl)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt
index 861fa1f..ee02de6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/CoroutineResultBinder.kt
@@ -23,17 +23,16 @@
 import androidx.room.ext.RoomCoroutinesTypeNames
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds the result of a of a Kotlin coroutine suspend function.
  */
 class CoroutineResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     private val continuationParamName: String,
     adapter: QueryResultAdapter?
 ) : QueryResultBinder(adapter) {
@@ -53,7 +52,7 @@
             RoomTypeNames.DB_UTIL
         )
 
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt
index 5a6536f..b181526 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaListenableFutureQueryResultBinder.kt
@@ -17,16 +17,15 @@
 package androidx.room.solver.query.result
 
 import androidx.room.ext.AndroidTypeNames
+import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
-import androidx.room.ext.T
-import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.typeName
+import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * A ResultBinder that emits a ListenableFuture<T> where T is the input {@code typeArg}.
@@ -34,7 +33,7 @@
  * <p>The Future runs on the background thread Executor.
  */
 class GuavaListenableFutureQueryResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
 
@@ -54,7 +53,7 @@
         )
 
         // Callable<T> // Note that this callable does not release the query object.
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt
index 73da7aa..bbd3d4f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/GuavaOptionalQueryResultAdapter.kt
@@ -19,7 +19,6 @@
 import androidx.room.ext.GuavaBaseTypeNames
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ParameterizedTypeName
 
@@ -40,7 +39,7 @@
             resultAdapter.convert(valueVarName, cursorVarName, scope)
             addStatement(
                     "final $T $L = $T.fromNullable($L)",
-                    ParameterizedTypeName.get(GuavaBaseTypeNames.OPTIONAL, type?.typeName()),
+                    ParameterizedTypeName.get(GuavaBaseTypeNames.OPTIONAL, type?.typeName),
                     outVarName,
                     GuavaBaseTypeNames.OPTIONAL,
                     valueVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt
index 33dd5ab..3bf310d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ImmutableListQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.google.common.collect.ImmutableList
 import com.squareup.javapoet.ClassName
@@ -30,16 +29,16 @@
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
             val collectionType = ParameterizedTypeName
-                .get(ClassName.get(ImmutableList::class.java), type.typeName())
+                .get(ClassName.get(ImmutableList::class.java), type.typeName)
             val immutableListBuilderType = ParameterizedTypeName
-                .get(ClassName.get(ImmutableList.Builder::class.java), type.typeName())
+                .get(ClassName.get(ImmutableList.Builder::class.java), type.typeName)
             val immutableListBuilderName = scope.getTmpVar("_immutableListBuilder")
             addStatement("final $T $L = $T.<$T>builder()",
                 immutableListBuilderType, immutableListBuilderName,
-                ClassName.get(ImmutableList::class.java), type.typeName())
+                ClassName.get(ImmutableList::class.java), type.typeName)
             val tmpVarName = scope.getTmpVar("_item")
             beginControlFlow("while($L.moveToNext())", cursorVarName).apply {
-                addStatement("final $T $L", type.typeName(), tmpVarName)
+                addStatement("final $T $L", type.typeName, tmpVarName)
                 rowAdapter?.convert(tmpVarName, cursorVarName, scope)
                 addStatement("$L.add($L)", immutableListBuilderName, tmpVarName)
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt
index a38c431..ba5f29d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/ListQueryResultAdapter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.ParameterizedTypeName
@@ -30,14 +29,14 @@
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
             val collectionType = ParameterizedTypeName
-                    .get(ClassName.get(List::class.java), type.typeName())
+                    .get(ClassName.get(List::class.java), type.typeName)
             val arrayListType = ParameterizedTypeName
-                    .get(ClassName.get(ArrayList::class.java), type.typeName())
+                    .get(ClassName.get(ArrayList::class.java), type.typeName)
             addStatement("final $T $L = new $T($L.getCount())",
                     collectionType, outVarName, arrayListType, cursorVarName)
             val tmpVarName = scope.getTmpVar("_item")
             beginControlFlow("while($L.moveToNext())", cursorVarName).apply {
-                addStatement("final $T $L", type.typeName(), tmpVarName)
+                addStatement("final $T $L", type.typeName, tmpVarName)
                 rowAdapter?.convert(tmpVarName, cursorVarName, scope)
                 addStatement("$L.add($L)", outVarName, tmpVarName)
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt
index 4491567..5aaf677 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/LiveDataQueryResultBinder.kt
@@ -21,16 +21,15 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.arrayTypeName
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Converts the query into a LiveData and returns it. No query is run until necessary.
  */
 class LiveDataQueryResultBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val tableNames: Set<String>,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
@@ -42,7 +41,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(
                 builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
@@ -62,7 +61,7 @@
             addStatement(
                 "return $N.getInvalidationTracker().createLiveData(new $T{$L}, $L, $L)",
                 dbField,
-                String::class.arrayTypeName(),
+                String::class.arrayTypeName,
                 tableNamesList,
                 if (inTransaction) "true" else "false",
                 callableImpl
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt
index a79ad7b..f6f5157 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/OptionalQueryResultAdapter.kt
@@ -19,7 +19,6 @@
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.ParameterizedTypeName
 
@@ -42,7 +41,7 @@
             resultAdapter.convert(valueVarName, cursorVarName, scope)
             addStatement(
                     "final $T $L = $T.ofNullable($L)",
-                    ParameterizedTypeName.get(CommonTypeNames.OPTIONAL, type?.typeName()),
+                    ParameterizedTypeName.get(CommonTypeNames.OPTIONAL, type?.typeName),
                     outVarName,
                     CommonTypeNames.OPTIONAL,
                     valueVarName)
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt
index a8a426f..4b08701 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PagingQueryResultBinder.kt
@@ -51,7 +51,7 @@
                     superclass(
                         ParameterizedTypeName.get(
                             PagingTypeNames.DATA_SOURCE_FACTORY,
-                            Integer::class.typeName(),
+                            Integer::class.typeName,
                             typeName
                         )
                     )
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
index 74d1a49..c3ec269 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
@@ -20,6 +20,7 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.S
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.CodeGenScope
@@ -33,7 +34,6 @@
 import androidx.room.writer.FieldReadWriteWriter
 import com.squareup.javapoet.TypeName
 import stripNonJava
-import javax.lang.model.type.TypeMirror
 
 /**
  * Creates the entity from the given info.
@@ -44,7 +44,7 @@
     context: Context,
     private val info: QueryResultInfo?,
     val pojo: Pojo,
-    out: TypeMirror
+    out: XType
 ) : RowAdapter(out) {
     val mapping: Mapping
     val relationCollectors: List<RelationCollector>
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
index 8ddf99f..7da04a0f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/PositionalDataSourceQueryResultBinder.kt
@@ -21,7 +21,6 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
@@ -35,7 +34,7 @@
     val listAdapter: ListQueryResultAdapter?,
     val tableNames: Set<String>
 ) : QueryResultBinder(listAdapter) {
-    val itemTypeName: TypeName = listAdapter?.rowAdapter?.out?.typeName() ?: TypeName.OBJECT
+    val itemTypeName: TypeName = listAdapter?.rowAdapter?.out?.typeName ?: TypeName.OBJECT
     val typeName: ParameterizedTypeName = ParameterizedTypeName.get(
             RoomTypeNames.LIMIT_OFFSET_DATA_SOURCE, itemTypeName)
     override fun convertAndReturn(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt
index a9d4db6f..99a89a0 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RowAdapter.kt
@@ -16,15 +16,15 @@
 
 package androidx.room.solver.query.result
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Converts a row of a cursor result into an Entity or a primitive.
  * <p>
  * An instance of this is created for each usage so that it can keep local variables.
  */
-abstract class RowAdapter(val out: TypeMirror) {
+abstract class RowAdapter(val out: XType) {
     /**
      * Called when cursor variable is ready, good place to put initialization code.
      */
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
index d1eee32..9932e82 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
@@ -23,20 +23,19 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.S
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.RxType
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
 import javax.lang.model.element.Modifier
-import javax.lang.model.type.TypeMirror
 
 /**
  * Generic Result binder for Rx classes that accept a callable.
  */
 internal class RxCallableQueryResultBinder(
     private val rxType: RxType,
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     adapter: QueryResultAdapter?
 ) : QueryResultBinder(adapter) {
     override fun convertAndReturn(
@@ -46,7 +45,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callable = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callable = CallableTypeSpecBuilder(typeArg.typeName) {
             fillInCallMethod(
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
                 dbField = dbField,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt
index 109df19..45b862ff 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/RxQueryResultBinder.kt
@@ -21,18 +21,17 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.arrayTypeName
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.RxType
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds the result as an RxJava2 Flowable, Publisher and Observable.
  */
 internal class RxQueryResultBinder(
     private val rxType: RxType,
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val queryTableNames: Set<String>,
     adapter: QueryResultAdapter?
 ) : BaseObservableQueryResultBinder(adapter) {
@@ -43,7 +42,7 @@
         inTransaction: Boolean,
         scope: CodeGenScope
     ) {
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             createRunQueryAndReturnStatements(builder = this,
                 roomSQLiteQueryVar = roomSQLiteQueryVar,
                 inTransaction = inTransaction,
@@ -62,7 +61,7 @@
                 rxType.factoryMethodName,
                 dbField,
                 if (inTransaction) "true" else "false",
-                String::class.arrayTypeName(),
+                String::class.arrayTypeName,
                 tableNamesList,
                 callableImpl)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt
index c6eef30..de66448 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/query/result/SingleEntityQueryResultAdapter.kt
@@ -18,9 +18,7 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
-import defaultValue
 
 /**
  * Wraps a row adapter when there is only 1 item in the result
@@ -30,7 +28,7 @@
     override fun convert(outVarName: String, cursorVarName: String, scope: CodeGenScope) {
         scope.builder().apply {
             rowAdapter?.onCursorReady(cursorVarName, scope)
-            addStatement("final $T $L", type.typeName(), outVarName)
+            addStatement("final $T $L", type.typeName, outVarName)
             beginControlFlow("if($L.moveToFirst())", cursorVarName)
                 rowAdapter?.convert(outVarName, cursorVarName, scope)
             nextControlFlow("else").apply {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
index 3d539ba..5b743db5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
@@ -17,14 +17,13 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.ext.CallableTypeSpecBuilder
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder for deferred delete and update methods.
@@ -34,14 +33,14 @@
  * function.
  */
 class CallableDeleteOrUpdateMethodBinder private constructor(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val addStmntBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit,
     adapter: DeleteOrUpdateMethodAdapter?
 ) : DeleteOrUpdateMethodBinder(adapter) {
 
     companion object {
         fun createDeleteOrUpdateBinder(
-            typeArg: TypeMirror,
+            typeArg: XType,
             adapter: DeleteOrUpdateMethodAdapter?,
             addCodeBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit
         ) = CallableDeleteOrUpdateMethodBinder(typeArg, addCodeBlock, adapter)
@@ -54,7 +53,7 @@
         scope: CodeGenScope
     ) {
         val adapterScope = scope.fork()
-        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+        val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
             adapter?.createDeleteOrUpdateMethodBody(
                 parameters = parameters,
                 adapters = adapters,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
index b0da79e..8c5d892f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
@@ -17,14 +17,13 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.ext.CallableTypeSpecBuilder
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder for deferred insert methods.
@@ -34,14 +33,14 @@
  * function.
  */
 class CallableInsertMethodBinder(
-    val typeArg: TypeMirror,
+    val typeArg: XType,
     val addStmntBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit,
     adapter: InsertMethodAdapter?
 ) : InsertMethodBinder(adapter) {
 
         companion object {
             fun createInsertBinder(
-                typeArg: TypeMirror,
+                typeArg: XType,
                 adapter: InsertMethodAdapter?,
                 addCodeBlock: CodeBlock.Builder.(callableImpl: TypeSpec, dbField: FieldSpec) -> Unit
             ) = CallableInsertMethodBinder(typeArg, addCodeBlock, adapter)
@@ -54,7 +53,7 @@
             scope: CodeGenScope
         ) {
             val adapterScope = scope.fork()
-            val callableImpl = CallableTypeSpecBuilder(typeArg.typeName()) {
+            val callableImpl = CallableTypeSpecBuilder(typeArg.typeName) {
                 adapter?.createInsertionMethodBody(
                     parameters = parameters,
                     insertionAdapters = insertionAdapters,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt
index 16fb5b2..c576cc9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/DeleteOrUpdateMethodBinder.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt
index d95fddf..2a6c3bc 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InsertMethodBinder.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.shortcut.binder
 
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt
index 2db1aa3..3e3e938 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantDeleteOrUpdateMethodBinder.kt
@@ -18,8 +18,8 @@
 
 import androidx.room.ext.N
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.writer.DaoWriter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt
index 7d8d2c1..d0f1310 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/InstantInsertMethodBinder.kt
@@ -18,8 +18,8 @@
 
 import androidx.room.ext.N
 import androidx.room.solver.CodeGenScope
-import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
+import androidx.room.vo.ShortcutQueryParameter
 import androidx.room.writer.DaoWriter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeSpec
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt
index cfc6247..3ed980d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/DeleteOrUpdateMethodBinderProvider.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
-import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.type.DeclaredType
+import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
 
 /**
  * Provider for delete or update binders
@@ -26,12 +26,12 @@
 interface DeleteOrUpdateMethodBinderProvider {
 
     /**
-     * Check whether the [DeclaredType] can be handled by the [DeleteOrUpdateMethodBinder]
+     * Check whether the [XDeclaredType] can be handled by the [DeleteOrUpdateMethodBinder]
      */
-    fun matches(declared: DeclaredType): Boolean
+    fun matches(declared: XDeclaredType): Boolean
 
     /**
-     * Provider of [DeleteOrUpdateMethodAdapter], based on the [DeclaredType]
+     * Provider of [DeleteOrUpdateMethodAdapter], based on the [XDeclaredType]
      */
-    fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder
+    fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt
index db4276d..43b663f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureDeleteOrUpdateMethodBinderProvider.kt
@@ -21,14 +21,11 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.shortcut.binder.CallableDeleteOrUpdateMethodBinder.Companion.createDeleteOrUpdateBinder
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import erasure
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for Guava ListenableFuture binders.
@@ -41,12 +38,11 @@
         context.processingEnv.findTypeElement(RoomGuavaTypeNames.GUAVA_ROOM) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
-                GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
+                declared.erasure().typeName == GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 
-    override fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder {
+    override fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder {
         if (!hasGuavaRoom) {
             context.logger.e(ProcessorErrors.MISSING_ROOM_GUAVA_ARTIFACT)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt
index 82cecb0a..485d138 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/GuavaListenableFutureInsertMethodBinderProvider.kt
@@ -21,15 +21,12 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomGuavaTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.shortcut.binder.CallableInsertMethodBinder.Companion.createInsertBinder
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import erasure
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for Guava ListenableFuture binders.
@@ -42,13 +39,12 @@
         context.processingEnv.findTypeElement(RoomGuavaTypeNames.GUAVA_ROOM) != null
     }
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
         declared.typeArguments.size == 1 &&
-                declared.erasure(context.processingEnv.typeUtils).typeName() ==
-                GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
+                declared.erasure().typeName == GuavaUtilConcurrentTypeNames.LISTENABLE_FUTURE
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         if (!hasGuavaRoom) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt
index 3e0909c..18f77c3 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InsertMethodBinderProvider.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
+import androidx.room.processing.XDeclaredType
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for insert method binders.
@@ -26,12 +26,12 @@
 interface InsertMethodBinderProvider {
 
     /**
-     * Check whether the [DeclaredType] can be handled by the [InsertMethodBinder]
+     * Check whether the [XDeclaredType] can be handled by the [InsertMethodBinder]
      */
-    fun matches(declared: DeclaredType): Boolean
+    fun matches(declared: XDeclaredType): Boolean
 
     /**
-     * Provider of [InsertMethodBinder], based on the [DeclaredType] and the list of parameters
+     * Provider of [InsertMethodBinder], based on the [XDeclaredType] and the list of parameters
      */
-    fun provide(declared: DeclaredType, params: List<ShortcutQueryParameter>): InsertMethodBinder
+    fun provide(declared: XDeclaredType, params: List<ShortcutQueryParameter>): InsertMethodBinder
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt
index da916e0..54a4f13 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantDeleteOrUpdateMethodBinderProvider.kt
@@ -16,10 +16,10 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
 import androidx.room.solver.shortcut.binder.InstantDeleteOrUpdateMethodBinder
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for instant (blocking) delete or update method binder
@@ -28,9 +28,9 @@
     private val context: Context
 ) : DeleteOrUpdateMethodBinderProvider {
 
-    override fun matches(declared: DeclaredType) = true
+    override fun matches(declared: XDeclaredType) = true
 
-    override fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder {
+    override fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder {
         val adapter = context.typeAdapterStore.findDeleteOrUpdateAdapter(declared)
         return InstantDeleteOrUpdateMethodBinder(adapter)
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt
index 64b5082..2bae5fb 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/InstantInsertMethodBinderProvider.kt
@@ -16,21 +16,21 @@
 
 package androidx.room.solver.shortcut.binderprovider
 
+import androidx.room.processing.XDeclaredType
 import androidx.room.processor.Context
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.solver.shortcut.binder.InstantInsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import javax.lang.model.type.DeclaredType
 
 /**
  * Provider for instant (blocking) insert method binder.
  */
 class InstantInsertMethodBinderProvider(private val context: Context) : InsertMethodBinderProvider {
 
-    override fun matches(declared: DeclaredType) = true
+    override fun matches(declared: XDeclaredType) = true
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         return InstantInsertMethodBinder(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt
index 98eb7ba..06b58ed 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableDeleteOrUpdateMethodBinderProvider.kt
@@ -18,16 +18,12 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.RxType
 import androidx.room.solver.shortcut.binder.CallableDeleteOrUpdateMethodBinder.Companion.createDeleteOrUpdateBinder
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Provider for Rx Callable binders.
@@ -41,17 +37,17 @@
      * [Single] and [Maybe] are generics but [Completable] is not so each implementation of this
      * class needs to define how to extract the type argument.
      */
-    open fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    open fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
-    override fun provide(declared: DeclaredType): DeleteOrUpdateMethodBinder {
+    override fun provide(declared: XDeclaredType): DeleteOrUpdateMethodBinder {
         val typeArg = extractTypeArg(declared)
         val adapter = context.typeAdapterStore.findDeleteOrUpdateAdapter(typeArg)
         return createDeleteOrUpdateBinder(typeArg, adapter) { callableImpl, _ ->
@@ -76,25 +72,24 @@
     rxType: RxType
 ) : RxCallableDeleteOrUpdateMethodBinderProvider(context, rxType) {
 
-    private val completableTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val completableTypeMirror: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
     /**
      * Since Completable is not a generic, the supported return type should be Void.
      * Like this, the generated Callable.call method will return Void.
      */
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror =
+    override fun extractTypeArg(declared: XDeclaredType): XType =
             context.COMMON_TYPES.VOID
 
-    override fun matches(declared: DeclaredType): Boolean = isCompletable(declared)
+    override fun matches(declared: XDeclaredType): Boolean = isCompletable(declared)
 
-    private fun isCompletable(declared: DeclaredType): Boolean {
+    private fun isCompletable(declared: XDeclaredType): Boolean {
         if (completableTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, completableTypeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(completableTypeMirror!!)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt
index 38258f1..b3a2a03 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/binderprovider/RxCallableInsertMethodBinderProvider.kt
@@ -18,17 +18,13 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.findTypeMirror
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.solver.RxType
 import androidx.room.solver.shortcut.binder.CallableInsertMethodBinder.Companion.createInsertBinder
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
 import androidx.room.vo.ShortcutQueryParameter
-import erasure
-import isAssignableFrom
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 /**
  * Provider for Rx Callable binders.
@@ -42,18 +38,18 @@
      * [Single] and [Maybe] are generics but [Completable] is not so each implementation of this
      * class needs to define how to extract the type argument.
      */
-    open fun extractTypeArg(declared: DeclaredType): TypeMirror = declared.typeArguments.first()
+    open fun extractTypeArg(declared: XDeclaredType): XType = declared.typeArguments.first()
 
-    override fun matches(declared: DeclaredType): Boolean =
+    override fun matches(declared: XDeclaredType): Boolean =
             declared.typeArguments.size == 1 && matchesRxType(declared)
 
-    private fun matchesRxType(declared: DeclaredType): Boolean {
-        val erasure = declared.erasure(context.processingEnv.typeUtils)
-        return erasure.typeName() == rxType.className
+    private fun matchesRxType(declared: XDeclaredType): Boolean {
+        val erasure = declared.erasure()
+        return erasure.typeName == rxType.className
     }
 
     override fun provide(
-        declared: DeclaredType,
+        declared: XDeclaredType,
         params: List<ShortcutQueryParameter>
     ): InsertMethodBinder {
         val typeArg = extractTypeArg(declared)
@@ -80,25 +76,24 @@
     rxType: RxType
 ) : RxCallableInsertMethodBinderProvider(context, rxType) {
 
-    private val completableTypeMirror: TypeMirror? by lazy {
-        context.processingEnv.findTypeMirror(rxType.className)
+    private val completableTypeMirror: XType? by lazy {
+        context.processingEnv.findType(rxType.className)
     }
 
     /**
      * Since Completable is not a generic, the supported return type should be Void.
      * Like this, the generated Callable.call method will return Void.
      */
-    override fun extractTypeArg(declared: DeclaredType): TypeMirror =
+    override fun extractTypeArg(declared: XDeclaredType): XType =
             context.COMMON_TYPES.VOID
 
-    override fun matches(declared: DeclaredType): Boolean = isCompletable(declared)
+    override fun matches(declared: XDeclaredType): Boolean = isCompletable(declared)
 
-    private fun isCompletable(declared: DeclaredType): Boolean {
+    private fun isCompletable(declared: XDeclaredType): Boolean {
         if (completableTypeMirror == null) {
             return false
         }
-        val typeUtils = context.processingEnv.typeUtils
-        val erasure = declared.erasure(typeUtils)
-        return erasure.isAssignableFrom(typeUtils, completableTypeMirror!!)
+        val erasure = declared.erasure()
+        return erasure.isAssignableFrom(completableTypeMirror!!)
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt
index dd925df..8bf5418 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/DeleteOrUpdateMethodAdapter.kt
@@ -20,30 +20,26 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.ShortcutQueryParameter
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import isInt
-import isKotlinUnit
-import isVoid
-import isVoidObject
-import javax.lang.model.type.TypeMirror
 
 /**
  * Class that knows how to generate a delete or update method body.
  */
-class DeleteOrUpdateMethodAdapter private constructor(private val returnType: TypeMirror) {
+class DeleteOrUpdateMethodAdapter private constructor(private val returnType: XType) {
     companion object {
-        fun create(returnType: TypeMirror): DeleteOrUpdateMethodAdapter? {
+        fun create(returnType: XType): DeleteOrUpdateMethodAdapter? {
             if (isDeleteOrUpdateValid(returnType)) {
                 return DeleteOrUpdateMethodAdapter(returnType)
             }
             return null
         }
 
-        private fun isDeleteOrUpdateValid(returnType: TypeMirror): Boolean {
+        private fun isDeleteOrUpdateValid(returnType: XType): Boolean {
             return returnType.isVoid() ||
                     returnType.isInt() ||
                     returnType.isVoidObject() ||
@@ -90,13 +86,13 @@
         }
     }
 
-    private fun hasResultValue(returnType: TypeMirror): Boolean {
+    private fun hasResultValue(returnType: XType): Boolean {
         return !(returnType.isVoid() ||
                 returnType.isVoidObject() ||
                 returnType.isKotlinUnit())
     }
 
-    private fun hasNullReturn(returnType: TypeMirror) = returnType.isVoidObject()
+    private fun hasNullReturn(returnType: XType) = returnType.isVoidObject()
 
-    private fun hasUnitReturn(returnType: TypeMirror) = returnType.isKotlinUnit()
+    private fun hasUnitReturn(returnType: XType) = returnType.isKotlinUnit()
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt
index 0f3b013..4c1dada 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/shortcut/result/InsertMethodAdapter.kt
@@ -21,24 +21,16 @@
 import androidx.room.ext.N
 import androidx.room.ext.T
 import androidx.room.ext.typeName
+import androidx.room.processing.XType
+import androidx.room.processing.asDeclaredType
+import androidx.room.processing.isArray
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.ShortcutQueryParameter
-import asArray
-import asDeclaredType
 import com.squareup.javapoet.ArrayTypeName
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import isArray
-import isBoxedLong
-import isKotlinUnit
-import isList
-import isLong
-import isPrimitiveLong
-import isVoid
-import isVoidObject
-import javax.lang.model.type.TypeMirror
 
 /**
  * Class that knows how to generate an insert method body.
@@ -46,7 +38,7 @@
 class InsertMethodAdapter private constructor(private val insertionType: InsertionType) {
     companion object {
         fun create(
-            returnType: TypeMirror,
+            returnType: XType,
             params: List<ShortcutQueryParameter>
         ): InsertMethodAdapter? {
             val insertionType = getInsertionType(returnType)
@@ -87,7 +79,7 @@
         }
 
         @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
-        private fun getInsertionType(returnType: TypeMirror): InsertionType? {
+        private fun getInsertionType(returnType: XType): InsertionType? {
 
             return if (returnType.isVoid()) {
                 InsertionType.INSERT_VOID
@@ -183,6 +175,6 @@
         INSERT_ID_ARRAY_BOX("insertAndReturnIdsArrayBox",
                 ArrayTypeName.of(TypeName.LONG.box())), // return Long[]
         INSERT_ID_LIST("insertAndReturnIdsList", // return List<Long>
-                ParameterizedTypeName.get(List::class.typeName(), TypeName.LONG.box())),
+                ParameterizedTypeName.get(List::class.typeName, TypeName.LONG.box())),
     }
 }
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
index bfdc32c..64da959 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
@@ -22,14 +22,13 @@
 import androidx.room.ext.N
 import androidx.room.ext.RoomTypeNames.ROOM_DB_KT
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.WildcardTypeName
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder that knows how to write suspending transaction wrapper methods.
@@ -39,7 +38,7 @@
     private val continuationParamName: String
 ) : TransactionMethodBinder(adapter) {
     override fun executeAndReturn(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
@@ -49,7 +48,7 @@
         val innerContinuationParamName = "__cont"
         val functionImpl = Function1TypeSpecBuilder(
             parameterTypeName = ParameterizedTypeName.get(
-                CONTINUATION, WildcardTypeName.supertypeOf(returnType.typeName())),
+                CONTINUATION, WildcardTypeName.supertypeOf(returnType.typeName)),
             parameterName = innerContinuationParamName,
             returnTypeName = ClassName.OBJECT
         ) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
index e121afb..9aaef20 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
@@ -17,12 +17,11 @@
 package androidx.room.solver.transaction.binder
 
 import androidx.room.ext.N
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
-import isNotVoid
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binder that knows how to write instant (blocking) transaction wrapper methods.
@@ -31,7 +30,7 @@
     adapter: TransactionMethodAdapter
 ) : TransactionMethodBinder(adapter) {
     override fun executeAndReturn(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt
index a9b6d7c..f98d436 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/binder/TransactionMethodBinder.kt
@@ -16,11 +16,11 @@
 
 package androidx.room.solver.transaction.binder
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
-import javax.lang.model.type.TypeMirror
 
 /**
  * Connects a transaction method, database and a [TransactionMethodAdapter].
@@ -36,7 +36,7 @@
      * transaction wrapper body that delegates to the non-abstract or default dao method.
      */
     abstract fun executeAndReturn(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt
index 0df5ca1..579c5bd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/transaction/result/TransactionMethodAdapter.kt
@@ -20,11 +20,10 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.TransactionMethod
 import com.squareup.javapoet.ClassName
-import java.lang.IllegalStateException
-import javax.lang.model.type.TypeMirror
 
 /**
  * Class that knows how to generate the transaction method delegate statement.
@@ -34,7 +33,7 @@
     private val callType: TransactionMethod.CallType
 ) {
     fun createDelegateToSuperStatement(
-        returnType: TypeMirror,
+        returnType: XType,
         parameterNames: List<String>,
         daoName: ClassName,
         daoImplName: ClassName,
@@ -50,7 +49,7 @@
                         "Can't assign to var and return in the same statement.")
                 } else if (resultVar != null) {
                     append("$T $L = ")
-                    params.add(returnType)
+                    params.add(returnType.typeName)
                     params.add(resultVar)
                 } else if (returnStmt) {
                     append("return ")
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt
index fd8d789..726cce8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedBooleanToBoxedIntConverter.kt
@@ -17,17 +17,16 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
 
 /**
  * int to boolean adapter.
  */
 object BoxedBooleanToBoxedIntConverter {
-    fun create(processingEnvironment: ProcessingEnvironment): List<TypeConverter> {
-        val tBoolean = processingEnvironment.requireTypeMirror("java.lang.Boolean")
-        val tInt = processingEnvironment.requireTypeMirror("java.lang.Integer")
+    fun create(processingEnvironment: XProcessingEnv): List<TypeConverter> {
+        val tBoolean = processingEnvironment.requireType("java.lang.Boolean")
+        val tInt = processingEnvironment.requireType("java.lang.Integer")
         return listOf(
                 object : TypeConverter(tBoolean, tInt) {
                     override fun convert(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt
index 29c636d..646ada5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/BoxedPrimitiveColumnTypeAdapter.kt
@@ -17,27 +17,24 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import box
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 /**
  * Adapters for all boxed primitives that has direct cursor mappings.
  */
 open class BoxedPrimitiveColumnTypeAdapter(
-    boxed: TypeMirror,
+    boxed: XType,
     val primitiveAdapter: PrimitiveColumnTypeAdapter
 ) : ColumnTypeAdapter(boxed, primitiveAdapter.typeAffinity) {
     companion object {
         fun createBoxedPrimitiveAdapters(
-            processingEnvironment: ProcessingEnvironment,
             primitiveAdapters: List<PrimitiveColumnTypeAdapter>
         ): List<ColumnTypeAdapter> {
 
             return primitiveAdapters.map {
                 BoxedPrimitiveColumnTypeAdapter(
-                    it.out.box(processingEnvironment.typeUtils),
+                    it.out.boxed(),
                     it
                 )
             }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt
index 5645a7b..690c9d1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteArrayColumnTypeAdapter.kt
@@ -17,13 +17,12 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.getArrayType
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName
-import javax.annotation.processing.ProcessingEnvironment
 
-class ByteArrayColumnTypeAdapter(env: ProcessingEnvironment) : ColumnTypeAdapter(
+class ByteArrayColumnTypeAdapter(env: XProcessingEnv) : ColumnTypeAdapter(
         out = env.getArrayType(TypeName.BYTE),
         typeAffinity = SQLTypeAffinity.BLOB) {
     override fun readFromCursor(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt
index 1289f08..8559a33 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/ByteBufferColumnTypeAdapter.kt
@@ -18,15 +18,14 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName
 import java.nio.ByteBuffer
-import javax.annotation.processing.ProcessingEnvironment
 
-class ByteBufferColumnTypeAdapter(env: ProcessingEnvironment) : ColumnTypeAdapter(
-    out = env.requireTypeMirror("java.nio.ByteBuffer"),
+class ByteBufferColumnTypeAdapter(env: XProcessingEnv) : ColumnTypeAdapter(
+    out = env.requireType("java.nio.ByteBuffer"),
     typeAffinity = SQLTypeAffinity.BLOB
 ) {
     override fun readFromCursor(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt
index 8f6498f..b9f65cf 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/ColumnTypeAdapter.kt
@@ -16,17 +16,16 @@
 
 package androidx.room.solver.types
 
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XType
 import com.squareup.javapoet.TypeName
-import javax.lang.model.type.TypeMirror
 
 /**
  * A code generator that can read a field from Cursor and write a field to a Statement
  */
-abstract class ColumnTypeAdapter(val out: TypeMirror, val typeAffinity: SQLTypeAffinity) :
+abstract class ColumnTypeAdapter(val out: XType, val typeAffinity: SQLTypeAffinity) :
         StatementValueBinder, CursorValueReader {
-    val outTypeName: TypeName by lazy { out.typeName() }
+    val outTypeName: TypeName by lazy { out.typeName }
     override fun typeMirror() = out
     override fun affinity(): SQLTypeAffinity = typeAffinity
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt
index 5c1a098..b616765 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeAdapter.kt
@@ -18,15 +18,15 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * A column adapter that uses a type converter to do the conversion. The type converter may be
  * a composite one.
  */
 class CompositeAdapter(
-    out: TypeMirror,
+    out: XType,
     val columnTypeAdapter: ColumnTypeAdapter,
     val intoStatementConverter: TypeConverter?,
     val fromCursorConverter: TypeConverter?
@@ -60,7 +60,7 @@
         }
         scope.builder().apply {
             val tmpVar = scope.getTmpVar()
-            addStatement("final $T $L", columnTypeAdapter.out, tmpVar)
+            addStatement("final $T $L", columnTypeAdapter.out.typeName, tmpVar)
             intoStatementConverter.convert(valueVarName, tmpVar, scope)
             columnTypeAdapter.bindToStmt(stmtName, indexVarName, tmpVar, scope)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt
index e233b50..450a6b6 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/CompositeTypeConverter.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 
 /**
@@ -29,7 +28,7 @@
     override fun convert(inputVarName: String, outputVarName: String, scope: CodeGenScope) {
         scope.builder().apply {
             val tmp = scope.getTmpVar()
-            addStatement("final $T $L", conv1.to.typeName(), tmp)
+            addStatement("final $T $L", conv1.to.typeName, tmp)
             conv1.convert(inputVarName, tmp, scope)
             conv2.convert(tmp, outputVarName, scope)
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt
index 4bf4785..c8cd2b9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/CursorValueReader.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.types
 
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Reads value from a cursor at the given index.
@@ -26,7 +26,7 @@
  */
 interface CursorValueReader {
     fun affinity(): SQLTypeAffinity
-    fun typeMirror(): TypeMirror
+    fun typeMirror(): XType
     fun readFromCursor(
         outVarName: String,
         cursorVarName: String,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt
index 352843c..fad7af7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/NoOpConverter.kt
@@ -17,8 +17,8 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Yes, we need this when user input is the same as the desired output.
@@ -28,7 +28,7 @@
  * the query. Not having this would require us to special case handle String, String[], List<String>
  * etc.
  */
-class NoOpConverter(type: TypeMirror) : TypeConverter(
+class NoOpConverter(type: XType) : TypeConverter(
         type, type) {
     override fun convert(inputVarName: String, outputVarName: String, scope: CodeGenScope) {
         scope.builder()
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt
index e2bfffe..bc0d7e1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveBooleanToIntConverter.kt
@@ -17,18 +17,17 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName
-import javax.annotation.processing.ProcessingEnvironment
 
 /**
  * int to boolean adapter.
  */
 object PrimitiveBooleanToIntConverter {
-    fun create(processingEnvironment: ProcessingEnvironment): List<TypeConverter> {
-        val tBoolean = processingEnvironment.requireTypeMirror(TypeName.BOOLEAN)
-        val tInt = processingEnvironment.requireTypeMirror(TypeName.INT)
+    fun create(processingEnvironment: XProcessingEnv): List<TypeConverter> {
+        val tBoolean = processingEnvironment.requireType(TypeName.BOOLEAN)
+        val tInt = processingEnvironment.requireType(TypeName.INT)
         return listOf(
                 object : TypeConverter(tBoolean, tInt) {
                     override fun convert(
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt
index b2d7e5d..3fe4b51 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/PrimitiveColumnTypeAdapter.kt
@@ -17,10 +17,10 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SQLTypeAffinity.REAL
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
 import com.squareup.javapoet.TypeName.BYTE
 import com.squareup.javapoet.TypeName.CHAR
@@ -29,26 +29,24 @@
 import com.squareup.javapoet.TypeName.INT
 import com.squareup.javapoet.TypeName.LONG
 import com.squareup.javapoet.TypeName.SHORT
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 /**
  * Adapters for all primitives that has direct cursor mappings.
  */
 open class PrimitiveColumnTypeAdapter(
-    out: TypeMirror,
+    out: XType,
     val cursorGetter: String,
     val stmtSetter: String,
     typeAffinity: SQLTypeAffinity
 ) : ColumnTypeAdapter(out, typeAffinity) {
-    val cast = if (cursorGetter == "get${out.typeName().toString().capitalize()}")
+    val cast = if (cursorGetter == "get${out.typeName.toString().capitalize()}")
                     ""
                 else
-                    "(${out.typeName()}) "
+                    "(${out.typeName}) "
 
     companion object {
         fun createPrimitiveAdapters(
-            processingEnvironment: ProcessingEnvironment
+            processingEnvironment: XProcessingEnv
         ): List<PrimitiveColumnTypeAdapter> {
             return listOf(
                     Triple(INT, "getInt", "bindLong"),
@@ -60,7 +58,7 @@
                     Triple(DOUBLE, "getDouble", "bindDouble")
             ).map {
                 PrimitiveColumnTypeAdapter(
-                        out = processingEnvironment.requireTypeMirror(it.first),
+                        out = processingEnvironment.requireType(it.first),
                         cursorGetter = it.second,
                         stmtSetter = it.third,
                         typeAffinity = when (it.first) {
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt
index 026ad25..f4f9a98 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/StatementValueBinder.kt
@@ -16,15 +16,15 @@
 
 package androidx.room.solver.types
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * Binds a value into a statement
  * see: CursorValueReader
  */
 interface StatementValueBinder {
-    fun typeMirror(): TypeMirror
+    fun typeMirror(): XType
     fun bindToStmt(
         stmtName: String,
         indexVarName: String,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt
index 2a8fa53..67ac944 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/StringColumnTypeAdapter.kt
@@ -17,13 +17,12 @@
 package androidx.room.solver.types
 
 import androidx.room.ext.L
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.SQLTypeAffinity.TEXT
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
 
-class StringColumnTypeAdapter(processingEnvironment: ProcessingEnvironment) :
-    ColumnTypeAdapter((processingEnvironment.requireTypeMirror(String::class)), TEXT) {
+class StringColumnTypeAdapter(processingEnvironment: XProcessingEnv) :
+    ColumnTypeAdapter((processingEnvironment.requireType(String::class)), TEXT) {
     override fun readFromCursor(
         outVarName: String,
         cursorVarName: String,
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt b/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt
index f967135..ed5f55c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/types/TypeConverter.kt
@@ -16,12 +16,12 @@
 
 package androidx.room.solver.types
 
+import androidx.room.processing.XType
 import androidx.room.solver.CodeGenScope
-import javax.lang.model.type.TypeMirror
 
 /**
  * A code generator that can convert from 1 type to another
  */
-abstract class TypeConverter(val from: TypeMirror, val to: TypeMirror) {
+abstract class TypeConverter(val from: XType, val to: XType) {
     abstract fun convert(inputVarName: String, outputVarName: String, scope: CodeGenScope)
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
index a57927b..8beb639 100644
--- a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.verifier
 
+import androidx.room.processing.XElement
 import androidx.room.processor.Context
 import androidx.room.vo.DatabaseView
 import androidx.room.vo.Entity
@@ -30,7 +31,6 @@
 import java.sql.Connection
 import java.sql.SQLException
 import java.util.regex.Pattern
-import javax.lang.model.element.Element
 
 /**
  * Builds an in-memory version of the database and verifies the queries against it.
@@ -99,7 +99,7 @@
          */
         fun create(
             context: Context,
-            element: Element,
+            element: XElement,
             entities: List<Entity>,
             views: List<DatabaseView>
         ): DatabaseVerifier? {
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
index eee8a6a..016ac82 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Constructor.kt
@@ -18,21 +18,17 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.isConstructor
-import androidx.room.ext.isMethod
-import androidx.room.ext.kindName
-import androidx.room.ext.name
-import androidx.room.ext.typeName
+import androidx.room.processing.XExecutableElement
+import androidx.room.processing.isConstructor
+import androidx.room.processing.isMethod
 import com.squareup.javapoet.CodeBlock
-import javax.lang.model.element.ExecutableElement
 
 /**
  * For each Entity / Pojo we process has a constructor. It might be the empty constructor or a
  * constructor with fields. It can also be a static factory method, such as in the case of an
  * AutoValue Pojo.
  */
-data class Constructor(val element: ExecutableElement, val params: List<Param>) {
+data class Constructor(val element: XExecutableElement, val params: List<Param>) {
 
     fun hasField(field: Field): Boolean {
         return params.any {
@@ -48,11 +44,11 @@
         when {
             element.isConstructor() -> {
                 builder.addStatement("$L = new $T($L)", outVar,
-                        element.enclosingElement.asDeclaredType().typeName(), args)
+                        element.enclosingElement.asDeclaredType().typeName, args)
             }
             element.isMethod() -> {
                 builder.addStatement("$L = $T.$L($L)", outVar,
-                        element.enclosingElement.asDeclaredType().typeName(),
+                        element.enclosingElement.asDeclaredType().typeName,
                         element.name, args)
             }
             else -> throw IllegalStateException("Invalid constructor kind ${element.kindName()}")
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt
index 986fa79..012b6a0 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/CustomTypeConverter.kt
@@ -16,26 +16,23 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.isStatic
-import androidx.room.ext.name
-import androidx.room.ext.typeName
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * Generated when we parse a method annotated with TypeConverter.
  */
 data class CustomTypeConverter(
-    val enclosingClass: TypeMirror,
+    val enclosingClass: XType,
     val isEnclosingClassKotlinObject: Boolean,
-    val method: ExecutableElement,
-    val from: TypeMirror,
-    val to: TypeMirror
+    val method: XMethodElement,
+    val from: XType,
+    val to: XType
 ) {
-    val typeName: TypeName by lazy { enclosingClass.typeName() }
-    val fromTypeName: TypeName by lazy { from.typeName() }
-    val toTypeName: TypeName by lazy { to.typeName() }
+    val typeName: TypeName by lazy { enclosingClass.typeName }
+    val fromTypeName: TypeName by lazy { from.typeName }
+    val toTypeName: TypeName by lazy { to.typeName }
     val methodName by lazy { method.name }
     val isStatic by lazy { method.isStatic() }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt
index cb955f8..c65ef88 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Dao.kt
@@ -16,16 +16,15 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.isType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.isType
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 data class Dao(
-    val element: TypeElement,
-    val type: DeclaredType,
+    val element: XTypeElement,
+    val type: XDeclaredType,
     val queryMethods: List<QueryMethod>,
     val rawQueryMethods: List<RawQueryMethod>,
     val insertionMethods: List<InsertionMethod>,
@@ -45,7 +44,7 @@
         this.suffix = if (newSuffix == "") "" else "_$newSuffix"
     }
 
-    val typeName: ClassName by lazy { ClassName.get(element) }
+    val typeName: ClassName by lazy { element.className }
 
     val shortcutMethods: List<ShortcutMethod> by lazy {
         deletionMethods + updateMethods
@@ -57,9 +56,9 @@
         }
         val path = arrayListOf<String>()
         var enclosing = element.enclosingElement
-        while (enclosing.isType()) {
-            path.add(ClassName.get(enclosing.asTypeElement()).simpleName())
-            enclosing = enclosing.enclosingElement
+        while (enclosing?.isType() == true) {
+            path.add(enclosing!!.name)
+            enclosing = enclosing!!.enclosingElement
         }
         path.reversed().joinToString("_") + "${typeName.simpleName()}${suffix}_Impl"
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt
index 9c52209b..13dfbfd 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DaoMethod.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.ExecutableElement
+import androidx.room.processing.XMethodElement
 
 /**
  * References a method that returns a dao in a Database
  */
-data class DaoMethod(val element: ExecutableElement, val name: String, val dao: Dao)
+data class DaoMethod(val element: XMethodElement, val name: String, val dao: Dao)
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
index 31cdba2..62faeac 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
@@ -19,18 +19,18 @@
 import androidx.room.RoomMasterTable
 import androidx.room.migration.bundle.DatabaseBundle
 import androidx.room.migration.bundle.SchemaBundle
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import com.squareup.javapoet.ClassName
 import org.apache.commons.codec.digest.DigestUtils
 import java.io.File
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * Holds information about a class annotated with Database.
  */
 data class Database(
-    val element: TypeElement,
-    val type: TypeMirror,
+    val element: XTypeElement,
+    val type: XType,
     val entities: List<Entity>,
     val views: List<DatabaseView>,
     val daoMethods: List<DaoMethod>,
@@ -38,7 +38,7 @@
     val exportSchema: Boolean,
     val enableForeignKeys: Boolean
 ) {
-    val typeName: ClassName by lazy { ClassName.get(element) }
+    val typeName: ClassName by lazy { element.className }
 
     private val implClassName by lazy {
         "${typeName.simpleNames().joinToString("_")}_Impl"
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
index 6177e02..46d77c5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
@@ -19,14 +19,14 @@
 import androidx.room.migration.bundle.BundleUtil
 import androidx.room.migration.bundle.DatabaseViewBundle
 import androidx.room.parser.ParsedQuery
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 
 class DatabaseView(
-    element: TypeElement,
+    element: XTypeElement,
     val viewName: String,
     val query: ParsedQuery,
-    type: DeclaredType,
+    type: XDeclaredType,
     fields: List<Field>,
     embeddedFields: List<EmbeddedField>,
     constructor: Constructor?
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt
index c863479..61c9270 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DeletionMethod.kt
@@ -15,11 +15,11 @@
  */
 package androidx.room.vo
 
+import androidx.room.processing.XMethodElement
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.element.ExecutableElement
 
 class DeletionMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     name: String,
     entities: Map<String, ShortcutEntity>,
     parameters: List<ShortcutQueryParameter>,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt b/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt
index 060fce12..6d98f81 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/EmbeddedField.kt
@@ -17,7 +17,6 @@
 package androidx.room.vo
 
 import androidx.annotation.NonNull
-import androidx.room.ext.hasAnnotation
 
 /**
  * Used when a field is embedded inside an Entity or Pojo.
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt
index d65a08c..c0e9756 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Entity.kt
@@ -18,16 +18,16 @@
 
 import androidx.room.migration.bundle.BundleUtil
 import androidx.room.migration.bundle.EntityBundle
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 
 /**
  * A Pojo with a mapping SQLite table.
  */
 open class Entity(
-    element: TypeElement,
+    element: XTypeElement,
     override val tableName: String,
-    type: DeclaredType,
+    type: XDeclaredType,
     fields: List<Field>,
     embeddedFields: List<EmbeddedField>,
     val primaryKey: PrimaryKey,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
index 3d9cf46..a71b42b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
@@ -16,23 +16,21 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.isNonNull
-import androidx.room.ext.typeName
 import androidx.room.migration.bundle.FieldBundle
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 import androidx.room.solver.types.CursorValueReader
 import androidx.room.solver.types.StatementValueBinder
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.Element
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeMirror
 
 // used in cache matching, must stay as a data class or implement equals
 data class Field(
-    val element: VariableElement,
+    val element: XVariableElement,
     val name: String,
-    val type: TypeMirror,
+    val type: XType,
     var affinity: SQLTypeAffinity?,
     val collate: Collate? = null,
     val columnName: String = name,
@@ -51,7 +49,7 @@
     var statementBinder: StatementValueBinder? = null
     // reads this field from a cursor column
     var cursorValueReader: CursorValueReader? = null
-    val typeName: TypeName by lazy { type.typeName() }
+    val typeName: TypeName by lazy { type.typeName }
 
     override fun getIdKey(): String {
         return buildString {
@@ -150,7 +148,7 @@
     )
 
     companion object {
-        fun calcNonNull(element: Element, parent: EmbeddedField?): Boolean {
+        fun calcNonNull(element: XElement, parent: EmbeddedField?): Boolean {
             return element.isNonNull() && (parent == null || parent.isNonNullRecursively())
         }
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt
index e3fe7c8..31e96f9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/FieldGetter.kt
@@ -18,11 +18,10 @@
 
 import androidx.room.ext.L
 import androidx.room.ext.T
-import androidx.room.ext.typeName
+import androidx.room.processing.XType
 import com.squareup.javapoet.CodeBlock
-import javax.lang.model.type.TypeMirror
 
-data class FieldGetter(val name: String, val type: TypeMirror, val callType: CallType) {
+data class FieldGetter(val name: String, val type: XType, val callType: CallType) {
     fun writeGet(ownerVar: String, outVar: String, builder: CodeBlock.Builder) {
         val stmt = when (callType) {
             CallType.FIELD -> "final $T $L = $L.$L"
@@ -30,7 +29,7 @@
             CallType.CONSTRUCTOR -> null
         }
         stmt?.let {
-            builder.addStatement(stmt, type.typeName(), outVar, ownerVar, name)
+            builder.addStatement(stmt, type.typeName, outVar, ownerVar, name)
         }
     }
 }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt
index 7c0001c..ba1bd679 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/FieldSetter.kt
@@ -17,10 +17,10 @@
 package androidx.room.vo
 
 import androidx.room.ext.L
+import androidx.room.processing.XType
 import com.squareup.javapoet.CodeBlock
-import javax.lang.model.type.TypeMirror
 
-data class FieldSetter(val name: String, val type: TypeMirror, val callType: CallType) {
+data class FieldSetter(val name: String, val type: XType, val callType: CallType) {
     fun writeSet(ownerVar: String, inVar: String, builder: CodeBlock.Builder) {
         val stmt = when (callType) {
             CallType.FIELD -> "$L.$L = $L"
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt b/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt
index 2d16827..5fbaf5c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/ForeignKeyAction.kt
@@ -29,7 +29,7 @@
     CASCADE(ForeignKey.CASCADE, "CASCADE");
     companion object {
         private val mapping by lazy {
-            ForeignKeyAction.values().associateBy { it.annotationValue }
+            values().associateBy { it.annotationValue }
         }
         fun fromAnnotationValue(value: Int?) = mapping[value]
     }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt b/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt
index ad21c50..e316f9d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/FtsEntity.kt
@@ -19,16 +19,16 @@
 import androidx.room.migration.bundle.BundleUtil
 import androidx.room.migration.bundle.FtsEntityBundle
 import androidx.room.parser.FtsVersion
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 
 /**
  * An Entity with a mapping FTS table.
  */
 class FtsEntity(
-    element: TypeElement,
+    element: XTypeElement,
     tableName: String,
-    type: DeclaredType,
+    type: XDeclaredType,
     fields: List<Field>,
     embeddedFields: List<EmbeddedField>,
     primaryKey: PrimaryKey,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt
index f7ed330..9b969f7 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/InsertionMethod.kt
@@ -17,16 +17,16 @@
 package androidx.room.vo
 
 import androidx.room.OnConflictStrategy
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.shortcut.binder.InsertMethodBinder
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 data class InsertionMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val name: String,
     @OnConflictStrategy val onConflict: Int,
     val entities: Map<String, ShortcutEntity>,
-    val returnType: TypeMirror,
+    val returnType: XType,
     val parameters: List<ShortcutQueryParameter>,
     val methodBinder: InsertMethodBinder
 )
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt b/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt
index 219c954..9b961ad 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/KotlinDefaultMethodDelegate.kt
@@ -16,13 +16,13 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.ExecutableElement
+import androidx.room.processing.XMethodElement
 
 /**
  * Represents a DAO method that delegates to a concrete implementation, such as a concrete function
  * in a Kotlin interface.
  */
 data class KotlinDefaultMethodDelegate(
-    val element: ExecutableElement,
-    val delegateElement: ExecutableElement
+    val element: XMethodElement,
+    val delegateElement: XMethodElement
 )
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt b/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt
index 58733ee..4a12c7d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/LanguageId.kt
@@ -16,12 +16,12 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.Element
+import androidx.room.processing.XElement
 
 /**
  * Represents the 'languageid' column of an FTS entity.
  */
-data class LanguageId(val declaredIn: Element?, val field: Field?) {
+data class LanguageId(val declaredIn: XElement?, val field: Field?) {
 
     companion object {
         val MISSING = LanguageId(null, null)
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt
index 7eb34c19..43ebcd5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Pojo.kt
@@ -16,26 +16,24 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.toAnnotationBox
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.DatabaseViewProcessor
 import androidx.room.processor.EntityProcessor
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 /**
  * A class is turned into a Pojo if it is used in a query response.
  */
 open class Pojo(
-    val element: TypeElement,
-    val type: DeclaredType,
+    val element: XTypeElement,
+    val type: XDeclaredType,
     fields: List<Field>,
     val embeddedFields: List<EmbeddedField>,
     val relations: List<Relation>,
     val constructor: Constructor? = null
 ) : HasFields {
-    val typeName: TypeName by lazy { type.typeName() }
+    val typeName: TypeName by lazy { type.typeName }
 
     override val fields = Fields(fields)
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt
index 63f6436..fd678e4 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/PojoMethod.kt
@@ -16,14 +16,14 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.ExecutableType
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XMethodType
 
 /**
  * An executable element processed as member of a class (pojo or entity)
  */
 class PojoMethod(
-    val element: ExecutableElement,
-    val resolvedType: ExecutableType,
+    val element: XMethodElement,
+    val resolvedType: XMethodType,
     val name: String
 )
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt b/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt
index 236ee8e..671f5e8 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/PrimaryKey.kt
@@ -16,13 +16,13 @@
 package androidx.room.vo
 
 import androidx.room.migration.bundle.PrimaryKeyBundle
-import javax.lang.model.element.Element
+import androidx.room.processing.XElement
 
 /**
  * Represents a PrimaryKey for an Entity.
  */
 data class PrimaryKey(
-    val declaredIn: Element?,
+    val declaredIn: XElement?,
     override val fields: Fields,
     val autoGenerateId: Boolean
 ) : HasSchemaIdentity, HasFields {
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt
index cc62b4c..2d9af9e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/QueryMethod.kt
@@ -17,20 +17,20 @@
 package androidx.room.vo
 
 import androidx.room.parser.ParsedQuery
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.prepared.binder.PreparedQueryResultBinder
 import androidx.room.solver.query.result.QueryResultBinder
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * A class that holds information about a QueryMethod.
  * It is self sufficient and must have all generics etc resolved once created.
  */
 sealed class QueryMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val query: ParsedQuery,
     val name: String,
-    val returnType: TypeMirror,
+    val returnType: XType,
     val parameters: List<QueryParameter>
 ) {
     val sectionToParamMapping by lazy {
@@ -53,10 +53,10 @@
  * A query method who's query is a SELECT statement.
  */
 class ReadQueryMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     query: ParsedQuery,
     name: String,
-    returnType: TypeMirror,
+    returnType: XType,
     parameters: List<QueryParameter>,
     val inTransaction: Boolean,
     val queryResultBinder: QueryResultBinder
@@ -66,10 +66,10 @@
  * A query method who's query is a INSERT, UPDATE or DELETE statement.
  */
 class WriteQueryMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     query: ParsedQuery,
     name: String,
-    returnType: TypeMirror,
+    returnType: XType,
     parameters: List<QueryParameter>,
     val preparedQueryResultBinder: PreparedQueryResultBinder
 ) : QueryMethod(element, query, name, returnType, parameters)
\ No newline at end of file
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt
index 4187378..b3265ab 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/QueryParameter.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XType
 import androidx.room.solver.query.parameter.QueryParameterAdapter
-import javax.lang.model.type.TypeMirror
 
 /**
  * Holds the parameter for a {@link QueryMethod}.
@@ -27,6 +27,6 @@
     val name: String,
         // this is the name used in the query. Might be different for kotlin queries
     val sqlName: String,
-    val type: TypeMirror,
+    val type: XType,
     val queryParamAdapter: QueryParameterAdapter?
 )
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt
index 0ffe998..fb4ad76 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/RawQueryMethod.kt
@@ -17,29 +17,27 @@
 package androidx.room.vo
 
 import androidx.room.ext.CommonTypeNames
-import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.typeName
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.query.result.QueryResultBinder
 import com.squareup.javapoet.TypeName
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 /**
  * A class that holds information about a method annotated with RawQuery.
  * It is self sufficient and must have all generics etc resolved once created.
  */
 data class RawQueryMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val name: String,
-    val returnType: TypeMirror,
+    val returnType: XType,
     val inTransaction: Boolean,
     val observedTableNames: Set<String>,
     val runtimeQueryParam: RuntimeQueryParameter?,
     val queryResultBinder: QueryResultBinder
 ) {
     val returnsValue by lazy {
-        returnType.typeName() != TypeName.VOID && returnType.typeName() != KotlinTypeNames.UNIT
+        returnType.isNotVoid() && !returnType.isKotlinUnit()
     }
 
     data class RuntimeQueryParameter(
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt
index 233a707..85d9ad1 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Relation.kt
@@ -16,8 +16,7 @@
 
 package androidx.room.vo
 
-import androidx.room.ext.typeName
-import javax.lang.model.type.TypeMirror
+import androidx.room.processing.XType
 
 /**
  * Value object created from processing a @Relation annotation.
@@ -25,7 +24,7 @@
 class Relation(
     val entity: EntityOrView,
     // return type. e..g. String in @Relation List<String>
-    val pojoType: TypeMirror,
+    val pojoType: XType,
     // field in Pojo that holds these relations (e.g. List<Pet> pets)
     val field: Field,
     // the parent field referenced for matching
@@ -38,7 +37,7 @@
     // the projection for the query
     val projection: List<String>
 ) {
-    val pojoTypeName by lazy { pojoType.typeName() }
+    val pojoTypeName by lazy { pojoType.typeName }
 
     fun createLoadAllSql(): String {
         val resultFields = projection.toSet()
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
index 86ff8bf..f58ef3d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
@@ -21,14 +21,10 @@
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.findTypeElement
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
 import androidx.room.processor.ProcessorErrors.relationAffinityMismatch
@@ -49,7 +45,6 @@
 import java.nio.ByteBuffer
 import java.util.ArrayList
 import java.util.HashSet
-import javax.lang.model.type.TypeMirror
 
 /**
  * Internal class that is used to manage fetching 1/N to N relationships.
@@ -263,7 +258,7 @@
                 } else {
                     val keyTypeMirror = keyTypeMirrorFor(context, affinity)
                     val set = context.processingEnv.requireTypeElement("java.util.Set")
-                    val keySet = context.processingEnv.typeUtils.getDeclaredType(set, keyTypeMirror)
+                    val keySet = context.processingEnv.getDeclaredType(set, keyTypeMirror)
                     QueryParameter(
                             name = RelationCollectorMethodWriter.KEY_SET_VARIABLE,
                             sqlName = RelationCollectorMethodWriter.KEY_SET_VARIABLE,
@@ -413,13 +408,13 @@
         }
 
         // Gets the type mirror of the relationship key.
-        private fun keyTypeMirrorFor(context: Context, affinity: SQLTypeAffinity): TypeMirror {
+        private fun keyTypeMirrorFor(context: Context, affinity: SQLTypeAffinity): XType {
             val processingEnv = context.processingEnv
             return when (affinity) {
-                SQLTypeAffinity.INTEGER -> processingEnv.requireTypeMirror("java.lang.Long")
-                SQLTypeAffinity.REAL -> processingEnv.requireTypeMirror("java.lang.Double")
+                SQLTypeAffinity.INTEGER -> processingEnv.requireType("java.lang.Long")
+                SQLTypeAffinity.REAL -> processingEnv.requireType("java.lang.Double")
                 SQLTypeAffinity.TEXT -> context.COMMON_TYPES.STRING
-                SQLTypeAffinity.BLOB -> processingEnv.requireTypeMirror("java.nio.ByteBuffer")
+                SQLTypeAffinity.BLOB -> processingEnv.requireType("java.nio.ByteBuffer")
                 else -> {
                     context.COMMON_TYPES.STRING
                 }
@@ -435,7 +430,7 @@
                 SQLTypeAffinity.BLOB -> TypeName.get(ByteBuffer::class.java)
                 else -> {
                     // no affinity select from type
-                    context.COMMON_TYPES.STRING.typeName()
+                    context.COMMON_TYPES.STRING.typeName
                 }
             }
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt
index 6595460..7acd642 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutMethod.kt
@@ -16,14 +16,14 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XMethodElement
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.element.ExecutableElement
 
 /**
  * Base class for shortcut methods in @DAO.
  */
 abstract class ShortcutMethod(
-    val element: ExecutableElement,
+    val element: XMethodElement,
     val name: String,
     val entities: Map<String, ShortcutEntity>,
     val parameters: List<ShortcutQueryParameter>,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt
index 59f5192..00d786c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/ShortcutQueryParameter.kt
@@ -16,17 +16,17 @@
 
 package androidx.room.vo
 
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeMirror
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 
 /**
  * Parameters used in DAO methods that are annotated with Insert, Delete, Update.
  */
 data class ShortcutQueryParameter(
-    val element: VariableElement,
+    val element: XVariableElement,
     val name: String,
-    val type: TypeMirror, // actual param type (List<Foo>, Set<Foo>, Foo, etc...)
-    val pojoType: TypeMirror?, // extracted type, never a Collection
+    val type: XType, // actual param type (List<Foo>, Set<Foo>, Foo, etc...)
+    val pojoType: XType?, // extracted type, never a Collection
     val isMultiple: Boolean
 ) {
     /**
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt
index ff9af62..317fbe0 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/TransactionMethod.kt
@@ -16,13 +16,13 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XType
 import androidx.room.solver.transaction.binder.TransactionMethodBinder
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.TypeMirror
 
 class TransactionMethod(
-    val element: ExecutableElement,
-    val returnType: TypeMirror,
+    val element: XMethodElement,
+    val returnType: XType,
     val parameterNames: List<String>,
     val callType: CallType,
     val methodBinder: TransactionMethodBinder
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt b/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt
index 183dd6e..a4d921b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/UpdateMethod.kt
@@ -17,11 +17,11 @@
 package androidx.room.vo
 
 import androidx.room.OnConflictStrategy
+import androidx.room.processing.XMethodElement
 import androidx.room.solver.shortcut.binder.DeleteOrUpdateMethodBinder
-import javax.lang.model.element.ExecutableElement
 
 class UpdateMethod(
-    element: ExecutableElement,
+    element: XMethodElement,
     name: String,
     entities: Map<String, ShortcutEntity>,
     parameters: List<ShortcutQueryParameter>,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt
index 6509b6f..d63b495 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Warning.kt
@@ -46,7 +46,7 @@
     EXPAND_PROJECTION_WITH_REMOVE_UNUSED_COLUMNS("ROOM_EXPAND_PROJECTION_WITH_UNUSED_COLUMNS");
 
     companion object {
-        val PUBLIC_KEY_MAP = Warning.values().associateBy { it.publicKey }
+        val PUBLIC_KEY_MAP = values().associateBy { it.publicKey }
         fun fromPublicKey(publicKey: String): Warning? {
             return PUBLIC_KEY_MAP[publicKey.toUpperCase()]
         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
index 0fdcd22..8ba34d2 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
@@ -18,8 +18,8 @@
 
 import androidx.room.RoomProcessor
 import androidx.room.ext.S
-import androidx.room.ext.getGeneratedAnnotation
 import androidx.room.ext.typeName
+import androidx.room.processing.XProcessingEnv
 import androidx.room.solver.CodeGenScope.Companion.CLASS_PROPERTY_PREFIX
 import com.squareup.javapoet.AnnotationSpec
 import com.squareup.javapoet.ClassName
@@ -28,7 +28,6 @@
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import javax.annotation.processing.ProcessingEnvironment
 
 /**
  * Base class for all writers that can produce a class.
@@ -41,7 +40,7 @@
 
     abstract fun createTypeSpecBuilder(): TypeSpec.Builder
 
-    fun write(processingEnv: ProcessingEnvironment) {
+    fun write(processingEnv: XProcessingEnv) {
         val builder = createTypeSpecBuilder()
         sharedFieldSpecs.values.forEach { builder.addField(it) }
         sharedMethodSpecs.values.forEach { builder.addMethod(it) }
@@ -53,7 +52,7 @@
     }
 
     private fun addSuppressWarnings(builder: TypeSpec.Builder) {
-        val suppressSpec = AnnotationSpec.builder(SuppressWarnings::class.typeName())
+        val suppressSpec = AnnotationSpec.builder(SuppressWarnings::class.typeName)
             .addMember(
                 "value",
                 "{$S, $S}",
@@ -64,11 +63,11 @@
 
     private fun addGeneratedAnnotationIfAvailable(
         adapterTypeSpecBuilder: TypeSpec.Builder,
-        processingEnv: ProcessingEnvironment
+        processingEnv: XProcessingEnv
     ) {
-        processingEnv.getGeneratedAnnotation()?.let {
+        processingEnv.findGeneratedAnnotation()?.let {
             val generatedAnnotationSpec =
-                AnnotationSpec.builder(ClassName.get(it))
+                AnnotationSpec.builder(it.className)
                     .addMember("value", S, RoomProcessor::class.java.canonicalName)
                     .build()
             adapterTypeSpecBuilder.addAnnotation(generatedAnnotationSpec)
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
index 0955ff1..bfd8511 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
@@ -21,9 +21,12 @@
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.SupportDbTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.isInterface
-import androidx.room.ext.name
+import androidx.room.processing.MethodSpecHelper
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XMethodElement
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.addOriginatingElement
 import androidx.room.processor.OnConflictProcessor
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.KotlinDefaultMethodDelegateBinder
@@ -46,21 +49,17 @@
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
 import stripNonJava
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
 import javax.lang.model.element.Modifier.FINAL
 import javax.lang.model.element.Modifier.PRIVATE
 import javax.lang.model.element.Modifier.PUBLIC
-import javax.lang.model.type.DeclaredType
 
 /**
  * Creates the implementation for a class annotated with Dao.
  */
 class DaoWriter(
     val dao: Dao,
-    private val dbElement: Element,
-    val processingEnv: ProcessingEnvironment
+    private val dbElement: XElement,
+    val processingEnv: XProcessingEnv
 ) :
     ClassWriter(dao.typeName) {
     private val declaredDao = dao.element.asDeclaredType()
@@ -213,7 +212,7 @@
                 addStatement("super($N)", dbParam)
             }
             addStatement("this.$N = $N", dbField, dbParam)
-            shortcutMethods.filterNot {
+            shortcutMethods.asSequence().filterNot {
                 it.fields.isEmpty()
             }.map {
                 it.fields.values
@@ -449,22 +448,10 @@
     }
 
     private fun overrideWithoutAnnotations(
-        elm: ExecutableElement,
-        owner: DeclaredType
+        elm: XMethodElement,
+        owner: XDeclaredType
     ): MethodSpec.Builder {
-        val baseSpec = MethodSpec.overriding(elm, owner, processingEnv.typeUtils)
-                .build()
-
-        // make all the params final
-        val params = baseSpec.parameters.map { it.toBuilder().addModifiers(FINAL).build() }
-
-        return MethodSpec.methodBuilder(baseSpec.name).apply {
-            addAnnotation(Override::class.java)
-            addModifiers(baseSpec.modifiers)
-            addParameters(params)
-            varargs(baseSpec.varargs)
-            returns(baseSpec.returnType)
-        }
+        return MethodSpecHelper.overridingWithFinalParams(elm, owner)
     }
 
     /**
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
index 5f586be..1baca0e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
@@ -24,8 +24,9 @@
 import androidx.room.ext.S
 import androidx.room.ext.SupportDbTypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asExecutableElement
 import androidx.room.ext.typeName
+import androidx.room.processing.MethodSpecHelper
+import androidx.room.processing.addOriginatingElement
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.DaoMethod
 import androidx.room.vo.Database
@@ -37,7 +38,6 @@
 import com.squareup.javapoet.TypeSpec
 import stripNonJava
 import java.util.Locale
-import javax.lang.model.element.Modifier
 import javax.lang.model.element.Modifier.FINAL
 import javax.lang.model.element.Modifier.PRIVATE
 import javax.lang.model.element.Modifier.PROTECTED
@@ -122,7 +122,7 @@
             addModifiers(PROTECTED)
             returns(RoomTypeNames.INVALIDATION_TRACKER)
             val shadowTablesVar = "_shadowTablesMap"
-            val shadowTablesTypeName = ParameterizedTypeName.get(HashMap::class.typeName(),
+            val shadowTablesTypeName = ParameterizedTypeName.get(HashMap::class.typeName,
                     CommonTypeNames.STRING, CommonTypeNames.STRING)
             val tableNames = database.entities.joinToString(",") {
                 "\"${it.tableName}\""
@@ -138,9 +138,9 @@
                 addStatement("$L.put($S, $S)", shadowTablesVar, tableName, shadowTableName)
             }
             val viewTablesVar = scope.getTmpVar("_viewTables")
-            val tablesType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val tablesType = ParameterizedTypeName.get(HashSet::class.typeName,
                     CommonTypeNames.STRING)
-            val viewTablesType = ParameterizedTypeName.get(HashMap::class.typeName(),
+            val viewTablesType = ParameterizedTypeName.get(HashMap::class.typeName,
                     CommonTypeNames.STRING,
                     ParameterizedTypeName.get(CommonTypeNames.SET,
                             CommonTypeNames.STRING))
@@ -176,7 +176,10 @@
     }
 
     private fun createDaoGetter(field: FieldSpec, method: DaoMethod): MethodSpec {
-        return MethodSpec.overriding(method.element.asExecutableElement()).apply {
+        return MethodSpecHelper.overridingWithFinalParams(
+            elm = method.element,
+            owner = database.element.type
+        ).apply {
             beginControlFlow("if ($N != null)", field).apply {
                 addStatement("return $N", field)
             }
@@ -197,7 +200,7 @@
     private fun createCreateOpenHelper(): MethodSpec {
         val scope = CodeGenScope(this)
         return MethodSpec.methodBuilder("createOpenHelper").apply {
-            addModifiers(Modifier.PROTECTED)
+            addModifiers(PROTECTED)
             addAnnotation(Override::class.java)
             returns(SupportDbTypeNames.SQLITE_OPEN_HELPER)
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
index fa83626..72de740 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
@@ -24,7 +24,6 @@
 import androidx.room.vo.FieldWithIndex
 import androidx.room.vo.Fields
 import androidx.room.vo.ShortcutEntity
-import androidx.room.vo.columnNames
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.ParameterSpec
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
index f2163b5..43adb6e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
@@ -31,7 +31,6 @@
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
-import isPrimitive
 import javax.lang.model.element.Modifier.PUBLIC
 
 class EntityInsertionAdapterWriter private constructor(
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt
index 4ffb54a..aa4e649 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/FieldReadWriteWriter.kt
@@ -19,7 +19,6 @@
 import androidx.room.ext.L
 import androidx.room.ext.T
 import androidx.room.ext.defaultValue
-import androidx.room.ext.typeName
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.CallType
 import androidx.room.vo.Constructor
@@ -191,7 +190,7 @@
                     }.associateBy { fwi ->
                         FieldReadWriteWriter(fwi).readIntoTmpVar(
                             cursorVar,
-                            fwi.field.setter.type.typeName(),
+                            fwi.field.setter.type.typeName,
                             scope)
                     }
                     // read decomposed fields (e.g. embedded)
@@ -326,7 +325,7 @@
                         }
                         CallType.METHOD -> {
                             val tmpField = scope.getTmpVar("_tmp${field.name.capitalize()}")
-                            addStatement("final $T $L", field.setter.type.typeName(), tmpField)
+                            addStatement("final $T $L", field.setter.type.typeName, tmpField)
                             reader.readFromCursor(tmpField, cursorVar, indexVar, scope)
                             addStatement("$L.$L($L)", ownerVar, field.setter.name, tmpField)
                         }
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt
index 6280baf..2d5ffa9 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/FtsTableInfoValidationWriter.kt
@@ -34,7 +34,7 @@
         val expectedInfoVar = scope.getTmpVar("_info$suffix")
         scope.builder().apply {
             val columnListVar = scope.getTmpVar("_columns$suffix")
-            val columnListType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val columnListType = ParameterizedTypeName.get(HashSet::class.typeName,
                     CommonTypeNames.STRING)
 
             addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
index c59c6ed..8b27b53 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
@@ -103,7 +103,7 @@
                     }
                 }
 
-                addStatement("final $T $L = $L.toString()", String::class.typeName(),
+                addStatement("final $T $L = $L.toString()", String::class.typeName,
                         outSqlQueryName, stringBuilderVar)
                 if (outArgsName != null) {
                     val argCount = scope.getTmpVar("_argCount")
@@ -114,7 +114,7 @@
                             argCount)
                 }
             } else {
-                addStatement("final $T $L = $S", String::class.typeName(),
+                addStatement("final $T $L = $S", String::class.typeName,
                         outSqlQueryName, query.queryWithReplacedBindParams)
                 if (outArgsName != null) {
                     addStatement("final $T $L = $T.acquire($L, $L)",
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
index 84bb9bd..578dd43 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
@@ -44,7 +44,7 @@
         val expectedInfoVar = scope.getTmpVar("_info$suffix")
         scope.builder().apply {
             val columnListVar = scope.getTmpVar("_columns$suffix")
-            val columnListType = ParameterizedTypeName.get(HashMap::class.typeName(),
+            val columnListType = ParameterizedTypeName.get(HashMap::class.typeName,
                     CommonTypeNames.STRING, RoomTypeNames.TABLE_INFO_COLUMN)
 
             addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
@@ -61,7 +61,7 @@
             }
 
             val foreignKeySetVar = scope.getTmpVar("_foreignKeys$suffix")
-            val foreignKeySetType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val foreignKeySetType = ParameterizedTypeName.get(HashSet::class.typeName,
                     RoomTypeNames.TABLE_INFO_FOREIGN_KEY)
             addStatement("final $T $L = new $T($L)", foreignKeySetType, foreignKeySetVar,
                     foreignKeySetType, entity.foreignKeys.size)
@@ -76,14 +76,14 @@
                         /*parent table*/ it.parentTable,
                         /*on delete*/ it.onDelete.sqlName,
                         /*on update*/ it.onUpdate.sqlName,
-                        Arrays::class.typeName(),
+                        Arrays::class.typeName,
                         /*parent names*/ myColumnNames,
-                        Arrays::class.typeName(),
+                        Arrays::class.typeName,
                         /*parent column names*/ refColumnNames)
             }
 
             val indicesSetVar = scope.getTmpVar("_indices$suffix")
-            val indicesType = ParameterizedTypeName.get(HashSet::class.typeName(),
+            val indicesType = ParameterizedTypeName.get(HashSet::class.typeName,
                     RoomTypeNames.TABLE_INFO_INDEX)
             addStatement("final $T $L = new $T($L)", indicesType, indicesSetVar,
                     indicesType, entity.indices.size)
@@ -94,7 +94,7 @@
                         RoomTypeNames.TABLE_INFO_INDEX,
                         index.name,
                         index.unique,
-                        Arrays::class.typeName(),
+                        Arrays::class.typeName,
                         columnNames)
             }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt b/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt
index 0f5c55d..1beb56b 100644
--- a/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/ext/ElementExtTest.kt
@@ -16,7 +16,7 @@
 
 package androidx.room.ext
 
-import box
+import androidx.room.processing.XExecutableElement
 import com.google.common.truth.Truth.assertThat
 import com.google.testing.compile.JavaFileObjects
 import com.squareup.javapoet.ClassName
@@ -25,7 +25,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import simpleRun
-import javax.lang.model.element.ExecutableElement
 
 @RunWith(JUnit4::class)
 class ElementExtTest {
@@ -65,7 +64,7 @@
             val parent = it.processingEnv.requireTypeElement("foo.bar.Parent")
             val child = it.processingEnv.requireTypeElement("foo.bar.Child")
             val objectMethods = it.processingEnv.requireTypeElement("java.lang.Object")
-                .getAllMethods(it.processingEnv).map {
+                .getAllMethods().map {
                     it.name
                 } - "registerNatives"
             val parentMethods = listOf(
@@ -77,9 +76,9 @@
                 "childStaticPublic", "overridden"
             )
             assertThat(parent.getDeclaredMethods()).containsExactlyElementsIn(parentMethods)
-            assertThat(parent.getAllMethods(it.processingEnv))
+            assertThat(parent.getAllMethods())
                 .containsExactlyElementsIn(parentMethods + objectMethods)
-            assertThat(parent.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(parent.getAllNonPrivateInstanceMethods())
                 .containsExactlyElementsIn(
                     parentMethods + objectMethods -
                             listOf("parentPrivate", "parentStaticPrivate", "parentStaticPublic")
@@ -88,12 +87,12 @@
             assertThat(child.getDeclaredMethods()).containsExactlyElementsIn(
                 childMethods
             )
-            assertThat(child.getAllMethods(it.processingEnv)).containsExactlyElementsIn(
+            assertThat(child.getAllMethods()).containsExactlyElementsIn(
                 childMethods + parentMethods + objectMethods -
                         listOf("parentPrivate", "parentStaticPrivate", "overridden") +
                         "overridden" // add 1 overridden back
             )
-            assertThat(child.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(child.getAllNonPrivateInstanceMethods())
                 .containsExactlyElementsIn(
                     childMethods + parentMethods + objectMethods -
                             listOf(
@@ -140,7 +139,7 @@
             val parent = it.processingEnv.requireTypeElement("foo.bar.Parent")
             val child = it.processingEnv.requireTypeElement("foo.bar.Child")
             val objectMethods = it.processingEnv.requireTypeElement("java.lang.Object")
-                .getAllMethods(it.processingEnv).map {
+                .getAllMethods().map {
                     it.name
                 } - listOf("registerNatives", "clone", "finalize")
             val parentMethods = listOf(
@@ -151,19 +150,19 @@
             )
             assertThat(parent.getDeclaredMethods())
                 .containsExactlyElementsIn(parentMethods)
-            assertThat(parent.getAllMethods(it.processingEnv))
+            assertThat(parent.getAllMethods())
                 .containsExactlyElementsIn(parentMethods + objectMethods)
-            assertThat(parent.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(parent.getAllNonPrivateInstanceMethods())
                 .containsExactly("parentPublic", "overridden")
 
             assertThat(child.getDeclaredMethods())
                 .containsExactlyElementsIn(childMethods)
-            assertThat(child.getAllMethods(it.processingEnv)).containsExactlyElementsIn(
+            assertThat(child.getAllMethods()).containsExactlyElementsIn(
                 childMethods + parentMethods + objectMethods -
                         listOf("parentStaticPrivate", "parentStaticPublic", "overridden") +
                         "overridden" // add 1 overridden back
             )
-            assertThat(child.getAllNonPrivateInstanceMethods(it.processingEnv))
+            assertThat(child.getAllNonPrivateInstanceMethods())
                 .containsExactly(
                     "childPublic", "parentPublic", "overridden"
                 )
@@ -191,7 +190,7 @@
             jfos = *arrayOf(testCode)
         ) {
             val element = it.processingEnv.requireTypeElement("foo.bar.Baz")
-            val field = element.getAllFieldsIncludingPrivateSupers(it.processingEnv)
+            val field = element.getAllFieldsIncludingPrivateSupers()
                 .first {
                     it.name == "field"
                 }
@@ -199,9 +198,9 @@
                 .first {
                     it.name == "method"
                 }
-            assertThat(field.type.typeName()).isEqualTo(TypeName.INT)
-            assertThat(method.returnType.typeName()).isEqualTo(TypeName.INT)
-            assertThat(element.type.typeName()).isEqualTo(ClassName.get("foo.bar", "Baz"))
+            assertThat(field.type.typeName).isEqualTo(TypeName.INT)
+            assertThat(method.returnType.typeName).isEqualTo(TypeName.INT)
+            assertThat(element.type.typeName).isEqualTo(ClassName.get("foo.bar", "Baz"))
         }.compilesWithoutError()
     }
 
@@ -221,17 +220,17 @@
         simpleRun { invocation ->
             val processingEnv = invocation.processingEnv
             primitiveTypeNames.forEach { primitiveTypeName ->
-                val typeMirror = processingEnv.requireTypeMirror(primitiveTypeName)
-                assertThat(typeMirror.kind.isPrimitive).isTrue()
-                assertThat(typeMirror.typeName()).isEqualTo(primitiveTypeName)
+                val typeMirror = processingEnv.requireType(primitiveTypeName)
+                assertThat(typeMirror.isPrimitive()).isTrue()
+                assertThat(typeMirror.typeName).isEqualTo(primitiveTypeName)
                 assertThat(
-                    typeMirror.box(invocation.typeUtils).typeName()
+                    typeMirror.boxed().typeName
                 ).isEqualTo(primitiveTypeName.box())
             }
         }.compilesWithoutError()
     }
 
-    private fun assertThat(executables: Iterable<ExecutableElement>) = assertThat(
+    private fun assertThat(executables: Iterable<XExecutableElement>) = assertThat(
         executables.map { it.name }
     )
 }
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/kotlin/JvmDescriptorUtilsTest.kt b/room/compiler/src/test/kotlin/androidx/room/kotlin/JvmDescriptorUtilsTest.kt
deleted file mode 100644
index 2ea893f..0000000
--- a/room/compiler/src/test/kotlin/androidx/room/kotlin/JvmDescriptorUtilsTest.kt
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright 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 androidx.room.kotlin
-
-import androidx.room.ext.isConstructor
-import androidx.room.ext.isMethod
-import androidx.room.ext.isField
-import androidx.room.testing.TestProcessor
-import com.google.common.truth.Truth
-import com.google.common.truth.Truth.assertThat
-import com.google.testing.compile.CompileTester
-import com.google.testing.compile.JavaSourcesSubjectFactory
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import toJFO
-import javax.tools.JavaFileObject
-
-@RunWith(JUnit4::class)
-class JvmDescriptorUtilsTest {
-
-    private val describeAnnotation =
-        """
-        package androidx.room.test;
-
-        import java.lang.annotation.ElementType;
-        import java.lang.annotation.Target;
-
-        @Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-        public @interface Describe { }
-        """.toJFO("androidx.room.test.Describe")
-
-    @Test
-    fun descriptor_method_simple() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            public class DummyClass {
-                @Describe
-                public void emptyMethod() {
-                }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors.first())
-                .isEqualTo("emptyMethod()V")
-        }
-    }
-
-    @Test
-    fun descriptor_field() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            import java.util.List;
-
-            class DummyClass<T> {
-                @Describe
-                int field1;
-
-                @Describe
-                String field2;
-
-                @Describe
-                T field3;
-
-                @Describe
-                List<String> field4;
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "field1:I",
-                    "field2:Ljava/lang/String;",
-                    "field3:Ljava/lang/Object;",
-                    "field4:Ljava/util/List;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_erasured() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            import java.util.ArrayList;
-            import java.util.Collection;
-            import java.util.List;
-            import java.util.Map;
-
-            class DummyClass<T> {
-                @Describe
-                void method1(T something) { }
-
-                @Describe
-                T method2() { return null; }
-
-                @Describe
-                List<? extends String> method3() { return null; }
-
-                @Describe
-                Map<T, String> method4() { return null; }
-
-                @Describe
-                ArrayList<Map<T, String>> method5() { return null; }
-
-                @Describe
-                static <I, O extends I> O method6(I input) { return null; }
-
-                @Describe
-                static <I, O extends String> O method7(I input) { return null; }
-
-                @Describe
-                static <P extends Collection & Comparable> P method8() { return null; }
-
-                @Describe
-                static <P extends String & List<Character>> P method9() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Ljava/lang/Object;)V",
-                    "method2()Ljava/lang/Object;",
-                    "method3()Ljava/util/List;",
-                    "method4()Ljava/util/Map;",
-                    "method5()Ljava/util/ArrayList;",
-                    "method6(Ljava/lang/Object;)Ljava/lang/Object;",
-                    "method7(Ljava/lang/Object;)Ljava/lang/String;",
-                    "method8()Ljava/util/Collection;",
-                    "method9()Ljava/lang/String;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_primitiveParams() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(boolean yesOrNo, int number) { }
-
-                @Describe
-                byte method2(char letter) { return 0; }
-
-                @Describe
-                void method3(double realNumber1, float realNummber2) { }
-
-                @Describe
-                void method4(long bigNumber, short littlerNumber) { }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors)
-                .isEqualTo(setOf("method1(ZI)V", "method2(C)B", "method3(DF)V", "method4(JS)V"))
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_classParam_javaTypes() {
-        singleRun(
-            """
-            package androidx.room.test;
-
-            import java.util.ArrayList;
-            import java.util.List;
-            import java.util.Map;
-
-            class DummyClass {
-                @Describe
-                void method1(Object something) { }
-
-                @Describe
-                Object method2() { return null; }
-
-                @Describe
-                List<String> method3(ArrayList<Integer> list) { return null; }
-
-                @Describe
-                Map<String, Object> method4() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass")
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Ljava/lang/Object;)V",
-                    "method2()Ljava/lang/Object;",
-                    "method3(Ljava/util/ArrayList;)Ljava/util/List;",
-                    "method4()Ljava/util/Map;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_classParam_testClass() {
-        val extraJfo =
-            """
-            package androidx.room.test;
-
-            class DataClass { }
-            """.toJFO("androidx.room.test.DataClass")
-
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(DataClass data) { }
-
-                @Describe
-                DataClass method2() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass"), extraJfo
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Landroidx/room/test/DataClass;)V",
-                    "method2()Landroidx/room/test/DataClass;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_classParam_innerTestClass() {
-        val extraJfo =
-            """
-            package androidx.room.test;
-
-            class DataClass {
-
-                class MemberInnerData { }
-
-                static class StaticInnerData { }
-
-                enum EnumData {
-                    VALUE1, VALUE2
-                }
-            }
-            """.toJFO("androidx.room.test.DataClass")
-
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(DataClass.MemberInnerData data) { }
-
-                @Describe
-                void method2(DataClass.StaticInnerData data) { }
-
-                @Describe
-                void method3(DataClass.EnumData enumData) { }
-
-                @Describe
-                DataClass.StaticInnerData method4() { return null; }
-            }
-            """.toJFO("androidx.room.test.DummyClass"), extraJfo
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1(Landroidx/room/test/DataClass\$MemberInnerData;)V",
-                    "method2(Landroidx/room/test/DataClass\$StaticInnerData;)V",
-                    "method3(Landroidx/room/test/DataClass\$EnumData;)V",
-                    "method4()Landroidx/room/test/DataClass\$StaticInnerData;"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun descriptor_method_arrayParams() {
-        val extraJfo =
-            """
-            package androidx.room.test;
-
-            class DataClass { }
-            """.toJFO("androidx.room.test.DataClass")
-
-        singleRun(
-            """
-            package androidx.room.test;
-
-            class DummyClass {
-                @Describe
-                void method1(DataClass[] data) { }
-
-                @Describe
-                DataClass[] method2() { return null; }
-
-                @Describe
-                void method3(int[] array) { }
-
-                @Describe
-                void method4(int... array) { }
-            }
-            """.toJFO("androidx.room.test.DummyClass"), extraJfo
-        ) { descriptors ->
-            assertThat(descriptors).isEqualTo(
-                setOf(
-                    "method1([Landroidx/room/test/DataClass;)V",
-                    "method2()[Landroidx/room/test/DataClass;",
-                    "method3([I)V",
-                    "method4([I)V"
-                )
-            )
-        }.compilesWithoutError()
-    }
-
-    private fun singleRun(
-        vararg jfo: JavaFileObject,
-        handler: (Set<String>) -> Unit
-    ): CompileTester = Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
-        .that(listOf(describeAnnotation) + jfo)
-        .processedWith(TestProcessor.builder()
-            .nextRunHandler {
-                it.roundEnv.getElementsAnnotatedWith(it.annotations.first()).map { element ->
-                    when {
-                        element.isField() -> element.descriptor()
-                        element.isMethod() || element.isConstructor() -> element.descriptor()
-                        else -> error("Unsupported element to describe.")
-                    }
-                }.toSet().let(handler)
-                true
-            }
-            .forAnnotations("androidx.room.test.Describe")
-            .build())
-}
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/kotlin/KotlinMetadataElementTest.kt b/room/compiler/src/test/kotlin/androidx/room/kotlin/KotlinMetadataElementTest.kt
deleted file mode 100644
index 66d1152..0000000
--- a/room/compiler/src/test/kotlin/androidx/room/kotlin/KotlinMetadataElementTest.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 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 androidx.room.kotlin
-
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.getConstructors
-import androidx.room.ext.getDeclaredMethods
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeElement
-import androidx.room.processor.Context
-import androidx.room.testing.TestInvocation
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import simpleRun
-import kotlin.reflect.KClass
-
-@RunWith(JUnit4::class)
-class KotlinMetadataElementTest {
-
-    @Test
-    fun getParameterNames() {
-        simpleRun { invocation ->
-            val (testClassElement, metadataElement) = getMetadataElement(
-                invocation,
-                TestData::class
-            )
-            assertThat(testClassElement.getDeclaredMethods()
-                .first { it.name == "functionWithParams" }
-                .let { metadataElement.getParameterNames(it.asExecutableElement()) }
-            ).isEqualTo(
-                listOf("param1", "yesOrNo", "number")
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun findPrimaryConstructorSignature() {
-        simpleRun { invocation ->
-            val (testClassElement, metadataElement) = getMetadataElement(
-                invocation,
-                TestData::class
-            )
-            assertThat(
-                testClassElement.getConstructors().map {
-                    val desc = it.asExecutableElement().descriptor()
-                    desc to (desc == metadataElement.findPrimaryConstructorSignature())
-                }
-            ).containsExactly(
-                "<init>(Ljava/lang/String;)V" to true,
-                "<init>()V" to false
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun isSuspendFunction() {
-        simpleRun { invocation ->
-            val (testClassElement, metadataElement) = getMetadataElement(
-                invocation,
-                TestData::class
-            )
-            assertThat(testClassElement.getDeclaredMethods().map {
-                val executableElement = it.asExecutableElement()
-                executableElement.name to metadataElement.isSuspendFunction(
-                    executableElement
-                )
-            }).containsExactly(
-                "emptyFunction" to false,
-                "suspendFunction" to true,
-                "functionWithParams" to false,
-                "getConstructorParam" to false
-            )
-        }.compilesWithoutError()
-    }
-
-    @Test
-    fun isObject() {
-        simpleRun { invocation ->
-            val (_, objectTypeMetadata) = getMetadataElement(invocation, ObjectType::class)
-            assertThat(objectTypeMetadata.isObject()).isTrue()
-            val (_, testDataMetadata) = getMetadataElement(invocation, TestData::class)
-            assertThat(testDataMetadata.isObject()).isFalse()
-        }.compilesWithoutError()
-    }
-
-    private fun getMetadataElement(invocation: TestInvocation, klass: KClass<*>) =
-        invocation.processingEnv.requireTypeElement(klass).let {
-            it to KotlinMetadataElement.createFor(Context(invocation.processingEnv), it)!!
-        }
-
-    @Suppress("unused")
-    private class TestData(val constructorParam: String) {
-
-        constructor() : this("anything")
-
-        fun emptyFunction() {}
-
-        suspend fun suspendFunction() {}
-
-        @Suppress("UNUSED_PARAMETER")
-        fun functionWithParams(param1: String, yesOrNo: Boolean, number: Int) {
-        }
-    }
-
-    object ObjectType {
-        val foo: String = ""
-    }
-}
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt b/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt
index d5ee6e0..271df55 100644
--- a/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/log/RLogTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.log
 
+import androidx.room.processing.XMessager
 import androidx.room.vo.Warning
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -25,7 +26,7 @@
 @RunWith(JUnit4::class)
 class RLogTest {
 
-    val messager = mock(RLog.Messager::class.java)
+    val messager = mock(XMessager::class.java)
 
     @Test
     fun testSafeFormat() {
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
index 408a633..d549ae8 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
@@ -2,8 +2,6 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.requireTypeElement
 import androidx.room.vo.Dao
 import androidx.room.writer.DaoWriter
 import com.google.testing.compile.JavaFileObjects
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
index d2cf838..3520da9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.annotation.NonNull
 import androidx.room.Embedded
-import androidx.room.ext.asTypeElement
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Entity
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
index 703c3f2..91c53cb 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
@@ -20,7 +20,6 @@
 import androidx.room.Embedded
 import androidx.room.Fts3
 import androidx.room.Fts4
-import androidx.room.ext.asTypeElement
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.FtsEntity
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
index 5fef51b..fe9215e 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/CustomConverterProcessorTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.processor
 
 import androidx.room.TypeConverter
-import androidx.room.ext.requireTypeElement
 import androidx.room.ext.typeName
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_EMPTY_CLASS
 import androidx.room.processor.ProcessorErrors.TYPE_CONVERTER_MISSING_NOARG_CONSTRUCTOR
@@ -92,8 +91,8 @@
 
     @Test
     fun nonNullButNotBoxed() {
-        val string = String::class.typeName()
-        val date = Date::class.typeName()
+        val string = String::class.typeName
+        val date = Date::class.typeName
         singleClass(createConverter(string, date)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(string as TypeName))
             assertThat(converter?.toTypeName, `is`(date as TypeName))
@@ -103,9 +102,9 @@
     @Test
     fun parametrizedTypeUnbound() {
         val typeVarT = TypeVariableName.get("T")
-        val list = ParameterizedTypeName.get(List::class.typeName(), typeVarT)
+        val list = ParameterizedTypeName.get(List::class.typeName, typeVarT)
         val typeVarK = TypeVariableName.get("K")
-        val map = ParameterizedTypeName.get(Map::class.typeName(), typeVarK, typeVarT)
+        val map = ParameterizedTypeName.get(Map::class.typeName, typeVarK, typeVarT)
         singleClass(createConverter(list, map, listOf(typeVarK, typeVarT))) {
             _, _ ->
         }.failsToCompile().withErrorContaining(TYPE_CONVERTER_UNBOUND_GENERIC)
@@ -113,10 +112,10 @@
 
     @Test
     fun parametrizedTypeSpecific() {
-        val string = String::class.typeName()
-        val date = Date::class.typeName()
-        val list = ParameterizedTypeName.get(List::class.typeName(), string)
-        val map = ParameterizedTypeName.get(Map::class.typeName(), string, date)
+        val string = String::class.typeName
+        val date = Date::class.typeName
+        val list = ParameterizedTypeName.get(List::class.typeName, string)
+        val map = ParameterizedTypeName.get(Map::class.typeName, string, date)
         singleClass(createConverter(list, map)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(list as TypeName))
             assertThat(converter?.toTypeName, `is`(map as TypeName))
@@ -192,9 +191,9 @@
     @Test
     fun parametrizedTypeBoundViaParent() {
         val typeVarT = TypeVariableName.get("T")
-        val list = ParameterizedTypeName.get(List::class.typeName(), typeVarT)
+        val list = ParameterizedTypeName.get(List::class.typeName, typeVarT)
         val typeVarK = TypeVariableName.get("K")
-        val map = ParameterizedTypeName.get(Map::class.typeName(), typeVarK, typeVarT)
+        val map = ParameterizedTypeName.get(Map::class.typeName, typeVarK, typeVarT)
 
         val baseConverter = createConverter(list, map, listOf(typeVarT, typeVarK))
         val extendingQName = "foo.bar.Extending"
@@ -202,8 +201,8 @@
                 "package foo.bar;\n" +
                         TypeSpec.classBuilder(ClassName.bestGuess(extendingQName)).apply {
                             superclass(
-                                    ParameterizedTypeName.get(CONVERTER, String::class.typeName(),
-                                    Integer::class.typeName()))
+                                    ParameterizedTypeName.get(CONVERTER, String::class.typeName,
+                                    Integer::class.typeName))
                         }.build().toString())
 
         simpleRun(baseConverter, extendingClass) { invocation ->
@@ -211,10 +210,10 @@
             val converter = CustomConverterProcessor(invocation.context, element)
                     .process().firstOrNull()
             assertThat(converter?.fromTypeName, `is`(ParameterizedTypeName.get(
-                    List::class.typeName(), String::class.typeName()) as TypeName
+                    List::class.typeName, String::class.typeName) as TypeName
             ))
-            assertThat(converter?.toTypeName, `is`(ParameterizedTypeName.get(Map::class.typeName(),
-                    Integer::class.typeName(), String::class.typeName()) as TypeName
+            assertThat(converter?.toTypeName, `is`(ParameterizedTypeName.get(Map::class.typeName,
+                    Integer::class.typeName, String::class.typeName) as TypeName
             ))
         }.compilesWithoutError()
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
index 68e8bf9..e757ca2 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
@@ -18,15 +18,12 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.requireTypeMirror
+import androidx.room.processing.asDeclaredType
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Dao
 import androidx.room.vo.ReadQueryMethod
 import androidx.room.vo.Warning
-import asDeclaredType
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -171,7 +168,7 @@
             }
             """) { dao, invocation ->
             val dbType = invocation.context.processingEnv
-                    .requireTypeMirror(RoomTypeNames.ROOM_DB).asDeclaredType()
+                    .requireType(RoomTypeNames.ROOM_DB).asDeclaredType()
             val daoProcessor =
                 DaoProcessor(invocation.context, dao.element, dbType, null)
 
@@ -200,7 +197,7 @@
             }
             """) { dao, invocation ->
             val dbType = invocation.context.processingEnv
-                    .requireTypeMirror(RoomTypeNames.ROOM_DB).asDeclaredType()
+                    .requireType(RoomTypeNames.ROOM_DB).asDeclaredType()
             val daoProcessor =
                 DaoProcessor(invocation.context, dao.element, dbType, null)
             assertThat(daoProcessor.context.logger
@@ -330,7 +327,7 @@
                                 null
                             }
                             val dbType = invocation.context.processingEnv
-                                            .requireTypeMirror(RoomTypeNames.ROOM_DB)
+                                            .requireType(RoomTypeNames.ROOM_DB)
                                 .asDeclaredType()
                             val parser = DaoProcessor(invocation.context,
                                     dao.asTypeElement(), dbType, dbVerifier)
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index 1556fbe..d23b8c9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -18,10 +18,11 @@
 
 import COMMON
 import androidx.room.RoomProcessor
-import androidx.room.ext.asTypeElement
 import androidx.room.parser.ParsedQuery
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XTypeElement
 import androidx.room.solver.query.result.EntityRowAdapter
 import androidx.room.solver.query.result.PojoRowAdapter
 import androidx.room.testing.TestInvocation
@@ -49,8 +50,6 @@
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
 import java.io.File
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 import javax.tools.JavaFileObject
 import javax.tools.StandardLocation
 
@@ -913,14 +912,14 @@
 
                     val list = views.map { (viewName, names) ->
                         DatabaseView(
-                            element = mock(TypeElement::class.java),
+                            element = mock(XTypeElement::class.java),
                             viewName = viewName,
                             query = ParsedQuery(
                                 "", QueryType.SELECT, emptyList(),
                                 names.map { Table(it, it) }.toSet(),
                                 emptyList(), false
                             ),
-                            type = mock(DeclaredType::class.java),
+                            type = mock(XDeclaredType::class.java),
                             fields = emptyList(),
                             embeddedFields = emptyList(),
                             constructor = null
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
index 7837244..94b3f84 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.processor
 
 import androidx.annotation.NonNull
-import androidx.room.ext.asTypeElement
 import androidx.room.parser.ParserErrors
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.testing.TestInvocation
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt
index e484fcf..027287d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DeletionMethodProcessorTest.kt
@@ -16,13 +16,13 @@
 package androidx.room.processor
 
 import androidx.room.Delete
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_DELETE_RESULT_ADAPTER
 import androidx.room.processor.ProcessorErrors.DELETION_MISSING_PARAMS
 import androidx.room.vo.DeletionMethod
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
@@ -33,8 +33,8 @@
 
     override fun process(
         baseContext: Context,
-        containing: DeclaredType,
-        executableElement: ExecutableElement
+        containing: XDeclaredType,
+        executableElement: XMethodElement
     ): DeletionMethod {
         return DeletionMethodProcessor(baseContext, containing, executableElement).process()
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt
index 0596817..f8cf008 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/EntityNameMatchingVariationsTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
 import androidx.room.vo.Field
@@ -28,7 +27,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
-import javax.lang.model.type.TypeKind.INT
 
 @RunWith(Parameterized::class)
 class EntityNameMatchingVariationsTest(triple: Triple<String, String, String>) :
@@ -64,7 +62,7 @@
             assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
             assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
             assertThat(field, `is`(Field(
                     element = field.element,
                     name = fieldName,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
index 6fe96ea..f2e3fed 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
@@ -17,19 +17,13 @@
 package androidx.room.processor
 
 import androidx.room.Entity
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.asVariableElement
-import androidx.room.ext.getAllFieldsIncludingPrivateSupers
-import androidx.room.ext.getArrayType
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XVariableElement
 import androidx.room.solver.types.ColumnTypeAdapter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.Field
-import box
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -44,7 +38,6 @@
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
 import simpleRun
-import javax.lang.model.element.VariableElement
 
 @Suppress("HasPlatformType")
 @RunWith(JUnit4::class)
@@ -97,10 +90,10 @@
         }
 
         private fun TypeName.box(invocation: TestInvocation) =
-            typeMirror(invocation).box(invocation.typeUtils)
+            typeMirror(invocation).boxed()
 
         private fun TypeName.typeMirror(invocation: TestInvocation) =
-            invocation.processingEnv.requireTypeMirror(this)
+            invocation.processingEnv.requireType(this)
     }
 
     @Test
@@ -248,7 +241,7 @@
     @Test
     fun nameVariations() {
         simpleRun {
-            val variableElement = mock(VariableElement::class.java)
+            val variableElement = mock(XVariableElement::class.java)
             assertThat(Field(variableElement, "x", TypeName.INT.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("x")))
             assertThat(Field(variableElement, "x", TypeName.BOOLEAN.typeMirror(it),
@@ -261,7 +254,7 @@
 
     @Test
     fun nameVariations_is() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "isX", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("isX", "x")))
@@ -277,7 +270,7 @@
 
     @Test
     fun nameVariations_has() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "hasX", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("hasX", "x")))
@@ -293,7 +286,7 @@
 
     @Test
     fun nameVariations_m() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "mall", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("mall")))
@@ -314,7 +307,7 @@
 
     @Test
     fun nameVariations_underscore() {
-        val elm = mock(VariableElement::class.java)
+        val elm = mock(XVariableElement::class.java)
         simpleRun {
             assertThat(Field(elm, "_all", TypeName.BOOLEAN.typeMirror(it),
                     SQLTypeAffinity.INTEGER).nameWithVariations, `is`(arrayListOf("_all", "all")))
@@ -431,9 +424,7 @@
                                     .getElementsAnnotatedWith(Entity::class.java)
                                     .map {
                                         Pair(it, it.asTypeElement()
-                                            .getAllFieldsIncludingPrivateSupers(
-                                                invocation.processingEnv
-                                            ).firstOrNull())
+                                            .getAllFieldsIncludingPrivateSupers().firstOrNull())
                                     }
                                     .first { it.second != null }
                             val entityContext =
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt
index cfd4511e..7147a29 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/Fts3TableEntityProcessorTest.kt
@@ -33,7 +33,6 @@
 package androidx.room.processor
 
 import androidx.room.FtsOptions
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
@@ -42,7 +41,6 @@
 import androidx.room.vo.FieldSetter
 import androidx.room.vo.Fields
 import com.squareup.javapoet.TypeName
-import org.hamcrest.CoreMatchers
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
@@ -64,16 +62,17 @@
                 public void setRowId(int id) { this.rowId = rowId; }
             """
         ) { entity, invocation ->
-            assertThat(entity.type.toString(), CoreMatchers.`is`("foo.bar.MyEntity"))
-            assertThat(entity.fields.size, CoreMatchers.`is`(1))
+            assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
+            assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
-            assertThat(field, CoreMatchers.`is`(Field(
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
+            assertThat(field, `is`(Field(
                     element = field.element,
                     name = "rowId",
                     type = intType,
                     columnName = "rowid",
-                    affinity = SQLTypeAffinity.INTEGER)))
+                    affinity = SQLTypeAffinity.INTEGER))
+            )
             assertThat(field.setter, `is`(FieldSetter("setRowId", intType, CallType.METHOD)))
             assertThat(field.getter, `is`(FieldGetter("getRowId", intType, CallType.METHOD)))
             assertThat(entity.primaryKey.fields, `is`(Fields(field)))
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
index ed9f9db..1888c6f 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/Fts4TableEntityProcessorTest.kt
@@ -18,8 +18,6 @@
 
 import androidx.room.Fts4
 import androidx.room.FtsOptions
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.FtsVersion
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.vo.CallType
@@ -29,7 +27,6 @@
 import androidx.room.vo.Fields
 import com.google.testing.compile.JavaFileObjects
 import com.squareup.javapoet.TypeName
-import org.hamcrest.CoreMatchers
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
@@ -52,16 +49,17 @@
                 public void setRowId(int id) { this.rowId = rowId; }
             """
         ) { entity, invocation ->
-            assertThat(entity.type.toString(), CoreMatchers.`is`("foo.bar.MyEntity"))
-            assertThat(entity.fields.size, CoreMatchers.`is`(1))
+            assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
+            assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
-            assertThat(field, CoreMatchers.`is`(Field(
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
+            assertThat(field, `is`(Field(
                     element = field.element,
                     name = "rowId",
                     type = intType,
                     columnName = "rowid",
-                    affinity = SQLTypeAffinity.INTEGER)))
+                    affinity = SQLTypeAffinity.INTEGER))
+            )
             assertThat(field.setter, `is`(FieldSetter("setRowId", intType, CallType.METHOD)))
             assertThat(field.getter, `is`(FieldGetter("getRowId", intType, CallType.METHOD)))
             assertThat(entity.primaryKey.fields, `is`(Fields(field)))
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
index e146b71..011428c 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/InsertionMethodProcessorTest.kt
@@ -23,12 +23,6 @@
 import androidx.room.ext.CommonTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.typeName
 import androidx.room.solver.shortcut.result.InsertMethodAdapter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
@@ -77,7 +71,7 @@
                 """) { insertion, _ ->
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(0))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
             assertThat(insertion.entities.size, `is`(0))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.INSERTION_DOES_NOT_HAVE_ANY_PARAMETERS_TO_INSERT)
@@ -93,12 +87,12 @@
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(USER_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USER_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities["user"]?.isPartialEntity, `is`(false))
             assertThat(insertion.entities["user"]?.pojo?.typeName,
                     `is`(ClassName.get("foo.bar", "User") as TypeName))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.LONG))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.LONG))
         }.compilesWithoutError()
     }
 
@@ -128,14 +122,14 @@
 
             assertThat(insertion.parameters.size, `is`(2))
             insertion.parameters.forEach {
-                assertThat(it.type.typeName(), `is`(USER_TYPE_NAME))
-                assertThat(it.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+                assertThat(it.type.typeName, `is`(USER_TYPE_NAME))
+                assertThat(it.pojoType?.typeName, `is`(USER_TYPE_NAME))
             }
             assertThat(insertion.entities.size, `is`(2))
             assertThat(insertion.entities["u1"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities["u2"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.parameters.map { it.name }, `is`(listOf("u1", "u2")))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -149,14 +143,14 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "List"),
                             USER_TYPE_NAME) as TypeName))
-            assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(
+            assertThat(insertion.returnType.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "List"),
                             ClassName.get("java.lang", "Long")) as TypeName
@@ -174,11 +168,11 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ArrayTypeName.of(COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -192,13 +186,13 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "Set"),
                             COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -212,13 +206,13 @@
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "Queue"),
                             USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -231,13 +225,13 @@
             assertThat(insertion.name, `is`("insert"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.lang", "Iterable"),
                             USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -251,12 +245,12 @@
             assertThat(insertion.name, `is`("insert"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(ParameterizedTypeName.get(
+            assertThat(param.type.typeName, `is`(ParameterizedTypeName.get(
                     ClassName.get("foo.bar", "MyClass.MyList"),
                     CommonTypeNames.STRING, USER_TYPE_NAME) as TypeName))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -268,12 +262,12 @@
                 abstract public void foo(User u1, Book b1);
                 """) { insertion, _ ->
             assertThat(insertion.parameters.size, `is`(2))
-            assertThat(insertion.parameters[0].type.typeName().toString(),
+            assertThat(insertion.parameters[0].type.typeName.toString(),
                     `is`("foo.bar.User"))
-            assertThat(insertion.parameters[1].type.typeName().toString(),
+            assertThat(insertion.parameters[1].type.typeName.toString(),
                     `is`("foo.bar.Book"))
             assertThat(insertion.parameters.map { it.name }, `is`(listOf("u1", "b1")))
-            assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(insertion.returnType.typeName, `is`(TypeName.VOID))
             assertThat(insertion.entities.size, `is`(2))
             assertThat(insertion.entities["u1"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             assertThat(insertion.entities["b1"]?.pojo?.typeName, `is`(BOOK_TYPE_NAME))
@@ -470,8 +464,8 @@
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
-            assertThat(param.type.typeName(), `is`(USERNAME_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USERNAME_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USERNAME_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USERNAME_TYPE_NAME))
             assertThat(insertion.entities.size, `is`(1))
             assertThat(insertion.entities["username"]?.isPartialEntity, `is`(true))
             assertThat(insertion.entities["username"]?.entityTypeName, `is`(USER_TYPE_NAME))
@@ -765,17 +759,15 @@
                                 .getElementsAnnotatedWith(Dao::class.java)
                                 .map {
                                     Pair(it,
-                                        it.asTypeElement().getAllMethods(
-                                            invocation.processingEnv
-                                        ).filter {
-                                            it.hasAnnotation(Insert::class.java)
+                                        it.asTypeElement().getAllMethods().filter {
+                                            it.hasAnnotation(Insert::class)
                                         }
                                     )
                                 }.first { it.second.isNotEmpty() }
                             val processor = InsertionMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val processed = processor.process()
                             handler(processed, invocation)
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt
index ccd4956..61ada5a 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTargetMethodTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.requireTypeElement
 import com.google.testing.compile.CompileTester
 import com.squareup.javapoet.ClassName
 import org.junit.Test
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
index cd2edcd..d2bdde9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
@@ -18,8 +18,8 @@
 
 import COMMON
 import androidx.room.Embedded
-import androidx.room.ext.requireTypeElement
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_TYPE
 import androidx.room.processor.ProcessorErrors.POJO_FIELD_HAS_DUPLICATE_COLUMN_NAME
@@ -53,7 +53,6 @@
 import simpleRun
 import toJFO
 import java.io.File
-import javax.lang.model.element.VariableElement
 import javax.tools.JavaFileObject
 
 /**
@@ -872,8 +871,8 @@
             assertThat(pojo5, sameInstance(pojo4))
 
             val type = invocation.context.COMMON_TYPES.STRING
-            val mockElement = mock(VariableElement::class.java)
-            doReturn(type).`when`(mockElement).asType()
+            val mockElement = mock(XVariableElement::class.java)
+            doReturn(type).`when`(mockElement).type
             val fakeField = Field(
                     element = mockElement,
                     name = "foo",
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
index 399fe55..03f627f 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/ProjectionExpanderTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.room.processor
 
-import androidx.room.ext.asTypeElement
 import androidx.room.parser.SqlParser
 import androidx.room.parser.expansion.ProjectionExpander
 import androidx.room.testing.TestInvocation
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
index c5e251f..4f421f4 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
@@ -23,16 +23,11 @@
 import androidx.room.ext.KotlinTypeNames
 import androidx.room.ext.LifecyclesTypeNames
 import androidx.room.ext.PagingTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getArrayType
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.requireTypeMirror
 import androidx.room.ext.typeName
 import androidx.room.parser.QueryType
 import androidx.room.parser.Table
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XType
 import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
 import androidx.room.solver.query.result.DataSourceFactoryQueryResultBinder
 import androidx.room.solver.query.result.ListQueryResultAdapter
@@ -71,8 +66,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
 import org.mockito.Mockito
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 import javax.tools.JavaFileObject
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
@@ -113,7 +106,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(0))
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ArrayTypeName.of(TypeName.INT) as TypeName))
         }.compilesWithoutError()
     }
@@ -126,13 +119,13 @@
                 abstract public long foo(int x);
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("foo"))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.LONG))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.LONG))
             assertThat(parsedQuery.parameters.size, `is`(1))
             val param = parsedQuery.parameters.first()
             assertThat(param.name, `is`("x"))
             assertThat(param.sqlName, `is`("x"))
             assertThat(param.type,
-                    `is`(invocation.processingEnv.requireTypeMirror(TypeName.INT)))
+                    `is`(invocation.processingEnv.requireType(TypeName.INT)))
         }.compilesWithoutError()
     }
 
@@ -144,14 +137,14 @@
                 abstract public long foo(int... ids);
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("foo"))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.LONG))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.LONG))
             assertThat(parsedQuery.parameters.size, `is`(1))
             val param = parsedQuery.parameters.first()
             assertThat(param.name, `is`("ids"))
             assertThat(param.sqlName, `is`("ids"))
             val env = invocation.processingEnv
             assertThat(param.type,
-                    `is`(env.getArrayType(TypeName.INT) as TypeMirror))
+                    `is`(env.getArrayType(TypeName.INT) as XType))
         }.compilesWithoutError()
     }
 
@@ -286,7 +279,7 @@
                 """) { parsedQuery, _ ->
             val expected: TypeName = ParameterizedTypeName.get(ClassName.get(List::class.java),
                     TypeVariableName.get("T"))
-            assertThat(parsedQuery.returnType.typeName(), `is`(expected))
+            assertThat(parsedQuery.returnType.typeName, `is`(expected))
         }.failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_QUERY_METHODS)
     }
@@ -357,7 +350,7 @@
                 static abstract class ExtendingModel extends BaseModel<Integer> {
                 }
                 """) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ClassName.get(Integer::class.java) as TypeName))
         }.compilesWithoutError()
     }
@@ -376,7 +369,7 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.parameters.first().type,
                     `is`(invocation.processingEnv
-                            .requireTypeMirror("java.lang.Integer")))
+                            .requireType("java.lang.Integer")))
         }.compilesWithoutError()
     }
 
@@ -401,7 +394,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.INT))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.INT))
         }.compilesWithoutError()
     }
 
@@ -414,7 +407,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.VOID))
         }.compilesWithoutError()
     }
 
@@ -427,9 +420,9 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("updateAllNames"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
-            assertThat(parsedQuery.parameters.first().type.typeName(),
-                    `is`(invocation.context.COMMON_TYPES.STRING.typeName()))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.VOID))
+            assertThat(parsedQuery.parameters.first().type.typeName,
+                    `is`(invocation.context.COMMON_TYPES.STRING.typeName))
         }.compilesWithoutError()
     }
 
@@ -442,9 +435,9 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("insertUsername"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
-            assertThat(parsedQuery.parameters.first().type.typeName(),
-                `is`(invocation.context.COMMON_TYPES.STRING.typeName()))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.VOID))
+            assertThat(parsedQuery.parameters.first().type.typeName,
+                `is`(invocation.context.COMMON_TYPES.STRING.typeName))
         }.compilesWithoutError()
     }
 
@@ -457,9 +450,9 @@
                 """) { parsedQuery, invocation ->
             assertThat(parsedQuery.name, `is`("insertUsername"))
             assertThat(parsedQuery.parameters.size, `is`(1))
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.LONG))
-            assertThat(parsedQuery.parameters.first().type.typeName(),
-                `is`(invocation.context.COMMON_TYPES.STRING.typeName()))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.LONG))
+            assertThat(parsedQuery.parameters.first().type.typeName,
+                `is`(invocation.context.COMMON_TYPES.STRING.typeName))
         }.compilesWithoutError()
     }
 
@@ -470,7 +463,7 @@
                 @Query("insert into user (name) values (:name)")
                 abstract public int insert(String name);
                 """) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.INT))
+            assertThat(parsedQuery.returnType.typeName, `is`(TypeName.INT))
         }.failsToCompile().withErrorContaining(
             ProcessorErrors.cannotFindPreparedQueryResultAdapter("int", QueryType.INSERT)
         )
@@ -484,9 +477,9 @@
                 abstract ${LifecyclesTypeNames.LIVE_DATA}<String> nameLiveData(String id);
                 """
         ) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ParameterizedTypeName.get(LifecyclesTypeNames.LIVE_DATA,
-                            String::class.typeName()) as TypeName))
+                            String::class.typeName) as TypeName))
             assertThat(parsedQuery.queryResultBinder,
                     instanceOf(LiveDataQueryResultBinder::class.java))
         }.compilesWithoutError()
@@ -527,9 +520,9 @@
                 nameDataSourceFactory();
                 """
         ) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ParameterizedTypeName.get(PagingTypeNames.DATA_SOURCE_FACTORY,
-                            Integer::class.typeName(), String::class.typeName()) as TypeName))
+                            Integer::class.typeName, String::class.typeName) as TypeName))
             assertThat(parsedQuery.queryResultBinder,
                     instanceOf(DataSourceFactoryQueryResultBinder::class.java))
             val tableNames =
@@ -548,9 +541,9 @@
                 nameDataSourceFactory();
                 """
         ) { parsedQuery, _ ->
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ParameterizedTypeName.get(PagingTypeNames.DATA_SOURCE_FACTORY,
-                            Integer::class.typeName(), String::class.typeName()) as TypeName))
+                            Integer::class.typeName, String::class.typeName) as TypeName))
             assertThat(parsedQuery.queryResultBinder,
                     instanceOf(DataSourceFactoryQueryResultBinder::class.java))
             val tableNames =
@@ -637,7 +630,7 @@
                 """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(0))
-            assertThat(parsedQuery.returnType.typeName(),
+            assertThat(parsedQuery.returnType.typeName,
                     `is`(ArrayTypeName.of(TypeName.INT) as TypeName))
         }.compilesWithoutError()
     }
@@ -652,7 +645,7 @@
             assertThat(
                 QueryMethodProcessor(
                     baseContext = invocation.context,
-                    containing = Mockito.mock(DeclaredType::class.java),
+                    containing = Mockito.mock(XDeclaredType::class.java),
                     executableElement = method.element,
                     dbVerifier = null
                 ).context.logger.suppressedWarnings,
@@ -985,9 +978,7 @@
                         .getElementsAnnotatedWith(Dao::class.java)
                         .map {
                             Pair(it,
-                                it.asTypeElement().getAllMethods(
-                                    invocation.processingEnv
-                                ).filter {
+                                it.asTypeElement().getAllMethods().filter {
                                     it.hasAnnotation(Query::class)
                                 }
                             )
@@ -1002,7 +993,7 @@
                     val parser = QueryMethodProcessor(
                         baseContext = invocation.context,
                         containing = owner.asDeclaredType(),
-                        executableElement = methods.first().asExecutableElement(),
+                        executableElement = methods.first(),
                         dbVerifier = verifier
                     )
                     val parsedQuery = parser.process()
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
index 60f2877..1f247e9 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/RawQueryMethodProcessorTest.kt
@@ -25,14 +25,6 @@
 import androidx.room.RawQuery
 import androidx.room.ext.PagingTypeNames
 import androidx.room.ext.SupportDbTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.getDeclaredMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.typeName
 import androidx.room.processor.ProcessorErrors.RAW_QUERY_STRING_PARAMETER_REMOVED
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
@@ -65,7 +57,7 @@
                             type = SupportDbTypeNames.QUERY
                     )
             ))
-            assertThat(query.returnType.typeName(),
+            assertThat(query.returnType.typeName,
                     `is`(ArrayTypeName.of(TypeName.INT) as TypeName))
         }.compilesWithoutError()
     }
@@ -174,7 +166,7 @@
                             type = SupportDbTypeNames.QUERY
                     )
             ))
-            assertThat(query.returnType.typeName(), `is`(pojo))
+            assertThat(query.returnType.typeName, `is`(pojo))
             assertThat(query.observedTableNames, `is`(emptySet()))
         }.compilesWithoutError()
     }
@@ -316,9 +308,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                                it.asTypeElement().getAllMethods(
-                                                    invocation.processingEnv
-                                                ).filter {
+                                                it.asTypeElement().getAllMethods().filter {
                                                     it.hasAnnotation(RawQuery::class)
                                                 }
                                         )
@@ -326,7 +316,7 @@
                             val parser = RawQueryMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val parsedQuery = parser.process()
                             handler(parsedQuery, invocation)
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
index c534f7a..8ee23dd 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/ShortcutMethodProcessorTest.kt
@@ -22,12 +22,8 @@
 import androidx.room.ext.GuavaUtilConcurrentTypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.typeName
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.ShortcutMethod
@@ -43,8 +39,6 @@
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import toJFO
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 import javax.tools.JavaFileObject
 import kotlin.reflect.KClass
 
@@ -92,8 +86,8 @@
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(USER_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USER_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
             assertThat(shortcut.entities.size, `is`(1))
             assertThat(shortcut.entities["user"]?.isPartialEntity, `is`(false))
             assertThat(shortcut.entities["user"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
@@ -126,8 +120,8 @@
 
             assertThat(shortcut.parameters.size, `is`(2))
             shortcut.parameters.forEach {
-                assertThat(it.type.typeName(), `is`(USER_TYPE_NAME))
-                assertThat(it.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+                assertThat(it.type.typeName, `is`(USER_TYPE_NAME))
+                assertThat(it.pojoType?.typeName, `is`(USER_TYPE_NAME))
             }
             assertThat(shortcut.entities.size, `is`(2))
             assertThat(shortcut.entities["u1"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
@@ -158,10 +152,10 @@
                 assertThat(shortcut.name, `is`("users"))
                 assertThat(shortcut.parameters.size, `is`(1))
                 val param = shortcut.parameters.first()
-                assertThat(param.type.typeName(), `is`(
+                assertThat(param.type.typeName, `is`(
                         ParameterizedTypeName.get(
                                 ClassName.get("java.util", "List"), USER_TYPE_NAME) as TypeName))
-                assertThat(param.pojoType?.typeName(), `is`(USER_TYPE_NAME))
+                assertThat(param.pojoType?.typeName, `is`(USER_TYPE_NAME))
                 assertThat(shortcut.entities.size, `is`(1))
                 assertThat(shortcut.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
             }.compilesWithoutError()
@@ -178,7 +172,7 @@
             assertThat(shortcut.name, `is`("users"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ArrayTypeName.of(COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(shortcut.entities.size, `is`(1))
             assertThat(shortcut.entities["users"]?.pojo?.typeName, `is`(USER_TYPE_NAME))
@@ -195,7 +189,7 @@
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(
                             ClassName.get("java.util", "Set"),
                             COMMON.USER_TYPE_NAME
@@ -215,7 +209,7 @@
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(ClassName.get("java.lang", "Iterable"),
                             COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(shortcut.entities.size, `is`(1))
@@ -234,7 +228,7 @@
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(
+            assertThat(param.type.typeName, `is`(
                     ParameterizedTypeName.get(ClassName.get("foo.bar", "MyClass.MyList"),
                             CommonTypeNames.STRING, COMMON.USER_TYPE_NAME) as TypeName))
             assertThat(shortcut.entities.size, `is`(1))
@@ -262,9 +256,9 @@
                 abstract public $type foo(User u1, Book b1);
                 """) { shortcut, _ ->
                 assertThat(shortcut.parameters.size, `is`(2))
-                assertThat(shortcut.parameters[0].type.typeName().toString(),
+                assertThat(shortcut.parameters[0].type.typeName.toString(),
                         `is`("foo.bar.User"))
-                assertThat(shortcut.parameters[1].type.typeName().toString(),
+                assertThat(shortcut.parameters[1].type.typeName.toString(),
                         `is`("foo.bar.Book"))
                 assertThat(shortcut.parameters.map { it.name }, `is`(listOf("u1", "b1")))
                 assertThat(shortcut.entities.size, `is`(2))
@@ -319,8 +313,8 @@
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
-            assertThat(param.type.typeName(), `is`(USERNAME_TYPE_NAME))
-            assertThat(param.pojoType?.typeName(), `is`(USERNAME_TYPE_NAME))
+            assertThat(param.type.typeName, `is`(USERNAME_TYPE_NAME))
+            assertThat(param.pojoType?.typeName, `is`(USERNAME_TYPE_NAME))
             assertThat(shortcut.entities.size, `is`(1))
             assertThat(shortcut.entities["username"]?.isPartialEntity, `is`(true))
             assertThat(shortcut.entities["username"]?.entityTypeName, `is`(USER_TYPE_NAME))
@@ -450,8 +444,8 @@
 
     abstract fun process(
         baseContext: Context,
-        containing: DeclaredType,
-        executableElement: ExecutableElement
+        containing: XDeclaredType,
+        executableElement: XMethodElement
     ): T
 
     fun singleShortcutMethod(
@@ -474,9 +468,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                            it.asTypeElement().getAllMethods(
-                                                invocation.processingEnv
-                                            ).filter {
+                                            it.asTypeElement().getAllMethods().filter {
                                                 it.hasAnnotation(annotation)
                                             }
                                         )
@@ -484,7 +476,7 @@
                             val processed = process(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             handler(processed, invocation)
                             true
                         }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
index 9611aba..62a30e5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
@@ -17,8 +17,6 @@
 package androidx.room.processor
 
 import COMMON
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.processor.ProcessorErrors.RELATION_IN_ENTITY
 import androidx.room.vo.CallType
@@ -53,7 +51,7 @@
             assertThat(entity.type.toString(), `is`("foo.bar.MyEntity"))
             assertThat(entity.fields.size, `is`(1))
             val field = entity.fields.first()
-            val intType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
+            val intType = invocation.processingEnv.requireType(TypeName.INT)
             assertThat(field, `is`(Field(
                     element = field.element,
                     name = "id",
@@ -154,8 +152,8 @@
             val idField = entity.fields.first()
             val cursorValueReader = idField.cursorValueReader
                 ?: throw AssertionError("must have a cursor value reader")
-            assertThat(cursorValueReader.typeMirror().typeName(),
-                `is`(invocation.processingEnv.requireTypeMirror(TypeName.INT).typeName()))
+            assertThat(cursorValueReader.typeMirror().typeName,
+                `is`(invocation.processingEnv.requireType(TypeName.INT).typeName))
         }.compilesWithoutError()
             .withWarningContaining(
                 ProcessorErrors.mismatchedSetter(
@@ -178,8 +176,8 @@
             val idField = entity.fields.first()
             val statementBinder = idField.statementBinder
                 ?: throw AssertionError("must have a statement binder")
-            assertThat(statementBinder.typeMirror().typeName(),
-                `is`(invocation.processingEnv.requireTypeMirror(TypeName.INT).typeName()))
+            assertThat(statementBinder.typeMirror().typeName,
+                `is`(invocation.processingEnv.requireType(TypeName.INT).typeName))
         }.compilesWithoutError()
     }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
index 1bdcf39..0b17a05 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TransactionMethodProcessorTest.kt
@@ -19,12 +19,6 @@
 import COMMON
 import androidx.room.Dao
 import androidx.room.Transaction
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
-import androidx.room.ext.name
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
 import androidx.room.vo.TransactionMethod
@@ -242,9 +236,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                            it.asTypeElement().getAllMethods(
-                                                invocation.processingEnv
-                                            ).filter {
+                                            it.asTypeElement().getAllMethods().filter {
                                                 it.hasAnnotation(Transaction::class)
                                             }
                                         )
@@ -252,7 +244,7 @@
                             val processor = TransactionMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val processed = processor.process()
                             handler(processed, invocation)
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt
index 9d8874c..ecc252d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/UpdateMethodProcessorTest.kt
@@ -17,6 +17,8 @@
 
 import androidx.room.OnConflictStrategy
 import androidx.room.Update
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XMethodElement
 import androidx.room.processor.ProcessorErrors.CANNOT_FIND_UPDATE_RESULT_ADAPTER
 import androidx.room.processor.ProcessorErrors.UPDATE_MISSING_PARAMS
 import androidx.room.vo.UpdateMethod
@@ -26,8 +28,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import toJFO
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.type.DeclaredType
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
@@ -38,8 +38,8 @@
 
     override fun process(
         baseContext: Context,
-        containing: DeclaredType,
-        executableElement: ExecutableElement
+        containing: XDeclaredType,
+        executableElement: XMethodElement
     ): UpdateMethod {
         return UpdateMethodProcessor(baseContext, containing, executableElement).process()
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
index c9122a4..0daa352 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
@@ -16,8 +16,6 @@
 
 package androidx.room.processor.autovalue
 
-import androidx.room.ext.isMethod
-import androidx.room.ext.requireTypeElement
 import androidx.room.processor.FieldProcessor
 import androidx.room.processor.PojoProcessor
 import androidx.room.processor.ProcessorErrors
@@ -28,6 +26,7 @@
 import com.squareup.javapoet.ClassName
 import compileLibrarySources
 import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.CoreMatchers.notNullValue
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -84,7 +83,7 @@
         ) { pojo ->
             assertThat(pojo.type.toString(), `is`("foo.bar.MyPojo"))
             assertThat(pojo.fields.size, `is`(1))
-            assertThat(pojo.constructor?.element?.isMethod(), `is`(true))
+            assertThat(pojo.constructor?.element, `is`(notNullValue()))
         }.compilesWithoutError().withWarningCount(0)
     }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
index 3bee5af..1d6e7d6 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
@@ -16,11 +16,10 @@
 
 package androidx.room.solver
 
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XType
 import androidx.room.processor.Context
 import androidx.room.testing.TestInvocation
-import box
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.JavaFile
@@ -34,8 +33,6 @@
 import org.junit.runners.Parameterized
 import simpleRun
 import testCodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.type.TypeMirror
 
 @RunWith(Parameterized::class)
 class BasicColumnTypeAdaptersTest(
@@ -146,8 +143,8 @@
         val spec = TypeSpec.classBuilder("OutClass")
             .addField(FieldSpec.builder(SQLITE_STMT, "st").build())
             .addField(FieldSpec.builder(CURSOR, "crs").build())
-            .addField(FieldSpec.builder(typeMirror.typeName(), "out").build())
-            .addField(FieldSpec.builder(typeMirror.typeName(), "inp").build())
+            .addField(FieldSpec.builder(typeMirror.typeName, "out").build())
+            .addField(FieldSpec.builder(typeMirror.typeName, "inp").build())
             .addMethod(
                 MethodSpec.methodBuilder("foo")
                     .addCode(scope.builder().build())
@@ -195,14 +192,12 @@
     }
 
     data class Input(val typeName: TypeName) {
-        fun getTypeMirror(processingEnv: ProcessingEnvironment): TypeMirror {
-            return processingEnv.requireTypeMirror(typeName)
+        fun getTypeMirror(processingEnv: XProcessingEnv): XType {
+            return processingEnv.requireType(typeName)
         }
 
-        fun getBoxedTypeMirror(processingEnv: ProcessingEnvironment): TypeMirror {
-            return getTypeMirror(processingEnv).box(
-                processingEnv.typeUtils
-            )
+        fun getBoxedTypeMirror(processingEnv: XProcessingEnv): XType {
+            return getTypeMirror(processingEnv).boxed()
         }
     }
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index c1309b5..4c4a252 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -29,11 +29,9 @@
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
 import androidx.room.ext.T
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.requireTypeMirror
-import androidx.room.ext.typeName
 import androidx.room.parser.SQLTypeAffinity
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.asDeclaredType
 import androidx.room.processor.Context
 import androidx.room.processor.ProcessorErrors
 import androidx.room.solver.binderprovider.DataSourceFactoryQueryResultBinderProvider
@@ -49,7 +47,6 @@
 import androidx.room.solver.types.TypeConverter
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
-import asDeclaredType
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -65,7 +62,6 @@
 import org.junit.runners.JUnit4
 import simpleRun
 import testCodeGenScope
-import javax.annotation.processing.ProcessingEnvironment
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
@@ -78,7 +74,7 @@
     fun testDirect() {
         singleRun { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
-            val primitiveType = invocation.processingEnv.requireTypeMirror(TypeName.INT)
+            val primitiveType = invocation.processingEnv.requireType(TypeName.INT)
             val adapter = store.findColumnTypeAdapter(primitiveType, null)
             assertThat(adapter, notNullValue())
         }.compilesWithoutError()
@@ -90,14 +86,14 @@
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
             val boolean = invocation
                     .processingEnv
-                    .requireTypeMirror("java.lang.Boolean")
+                    .requireType("java.lang.Boolean")
             val adapter = store.findColumnTypeAdapter(boolean, null)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
             val composite = adapter as CompositeAdapter
-            assertThat(composite.intoStatementConverter?.from?.typeName(),
+            assertThat(composite.intoStatementConverter?.from?.typeName,
                     `is`(TypeName.BOOLEAN.box()))
-            assertThat(composite.columnTypeAdapter.out.typeName(),
+            assertThat(composite.columnTypeAdapter.out.typeName,
                     `is`(TypeName.INT.box()))
         }.compilesWithoutError()
     }
@@ -106,7 +102,7 @@
     fun testVia1TypeAdapter() {
         singleRun { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
-            val booleanType = invocation.processingEnv.requireTypeMirror(TypeName.BOOLEAN)
+            val booleanType = invocation.processingEnv.requireType(TypeName.BOOLEAN)
             val adapter = store.findColumnTypeAdapter(booleanType, null)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
@@ -133,7 +129,7 @@
         singleRun { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv),
                     pointTypeConverters(invocation.processingEnv))
-            val pointType = invocation.processingEnv.requireTypeMirror("foo.bar.Point")
+            val pointType = invocation.processingEnv.requireType("foo.bar.Point")
             val adapter = store.findColumnTypeAdapter(pointType, null)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
@@ -165,7 +161,7 @@
         singleRun { (processingEnv) ->
             val store = TypeAdapterStore.create(Context(processingEnv),
                     dateTypeConverters(processingEnv))
-            val tDate = processingEnv.requireTypeMirror("java.util.Date")
+            val tDate = processingEnv.requireType("java.util.Date")
             val adapter = store.findCursorValueReader(tDate, SQLTypeAffinity.INTEGER)
             assertThat(adapter, notNullValue())
             assertThat(adapter?.typeMirror(), `is`(tDate))
@@ -442,8 +438,8 @@
         simpleRun { invocation ->
             val pagingSourceElement = invocation.processingEnv
                 .requireTypeElement(PagingSource::class)
-            val intType = invocation.processingEnv.requireTypeMirror(Integer::class)
-            val pagingSourceIntIntType = invocation.processingEnv.typeUtils
+            val intType = invocation.processingEnv.requireType(Integer::class)
+            val pagingSourceIntIntType = invocation.processingEnv
                 .getDeclaredType(pagingSourceElement, intType, intType)
 
             assertThat(pagingSourceIntIntType, notNullValue())
@@ -457,8 +453,8 @@
         simpleRun { invocation ->
             val pagingSourceElement = invocation.processingEnv
                 .requireTypeElement(PagingSource::class)
-            val stringType = invocation.processingEnv.requireTypeMirror(String::class)
-            val pagingSourceIntIntType = invocation.processingEnv.typeUtils
+            val stringType = invocation.processingEnv.requireType(String::class)
+            val pagingSourceIntIntType = invocation.processingEnv
                 .getDeclaredType(pagingSourceElement, stringType, stringType)
 
             assertThat(pagingSourceIntIntType, notNullValue())
@@ -504,9 +500,9 @@
     }
 
     private fun createIntListToStringBinders(invocation: TestInvocation): List<TypeConverter> {
-        val intType = invocation.processingEnv.requireTypeMirror(Integer::class)
+        val intType = invocation.processingEnv.requireType(Integer::class)
         val listElement = invocation.processingEnv.requireTypeElement(java.util.List::class)
-        val listOfInts = invocation.processingEnv.typeUtils.getDeclaredType(listElement, intType)
+        val listOfInts = invocation.processingEnv.getDeclaredType(listElement, intType)
 
         val intListConverter = object : TypeConverter(listOfInts,
                 invocation.context.COMMON_TYPES.STRING) {
@@ -576,9 +572,9 @@
                         .build())
     }
 
-    fun pointTypeConverters(env: ProcessingEnvironment): List<TypeConverter> {
-        val tPoint = env.requireTypeMirror("foo.bar.Point")
-        val tBoolean = env.requireTypeMirror(TypeName.BOOLEAN)
+    fun pointTypeConverters(env: XProcessingEnv): List<TypeConverter> {
+        val tPoint = env.requireType("foo.bar.Point")
+        val tBoolean = env.requireType(TypeName.BOOLEAN)
         return listOf(
                 object : TypeConverter(tPoint, tBoolean) {
                     override fun convert(
@@ -587,7 +583,8 @@
                         scope: CodeGenScope
                     ) {
                         scope.builder().apply {
-                            addStatement("$L = $T.toBoolean($L)", outputVarName, from, inputVarName)
+                            addStatement("$L = $T.toBoolean($L)", outputVarName, from.typeName,
+                                inputVarName)
                         }
                     }
                 },
@@ -598,7 +595,7 @@
                         scope: CodeGenScope
                     ) {
                         scope.builder().apply {
-                            addStatement("$L = $T.fromBoolean($L)", outputVarName, tPoint,
+                            addStatement("$L = $T.fromBoolean($L)", outputVarName, tPoint.typeName,
                                     inputVarName)
                         }
                     }
@@ -606,9 +603,9 @@
         )
     }
 
-    fun dateTypeConverters(env: ProcessingEnvironment): List<TypeConverter> {
-        val tDate = env.requireTypeMirror("java.util.Date")
-        val tLong = env.requireTypeMirror("java.lang.Long")
+    fun dateTypeConverters(env: XProcessingEnv): List<TypeConverter> {
+        val tDate = env.requireType("java.util.Date")
+        val tLong = env.requireType("java.lang.Long")
         return listOf(
                 object : TypeConverter(tDate, tLong) {
                     override fun convert(
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt
index c85dd25..b7e94e3 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAssignmentTest.kt
@@ -16,20 +16,14 @@
 
 package androidx.room.solver
 
-import androidx.room.ext.getAllFieldsIncludingPrivateSupers
-import androidx.room.ext.isAssignableFromWithoutVariance
-import androidx.room.ext.name
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.type
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.XVariableElement
 import androidx.room.testing.TestInvocation
 import com.google.testing.compile.JavaFileObjects
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import simpleRun
-import javax.annotation.processing.ProcessingEnvironment
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
 
 class TypeAssignmentTest {
     companion object {
@@ -55,10 +49,10 @@
     fun basic() {
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val string = testObject.getField(processingEnv, "mString")
-            val integer = testObject.getField(processingEnv, "mInteger")
+            val string = testObject.getField("mString")
+            val integer = testObject.getField("mInteger")
             assertThat( integer.type
-                .isAssignableFromWithoutVariance(typeUtils, string.type),
+                .isAssignableFromWithoutVariance(string.type),
                     `is`(false))
         }
     }
@@ -67,10 +61,10 @@
     fun generics() {
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val set = testObject.getField(processingEnv, "mSet").type
-            val hashSet = testObject.getField(processingEnv, "mHashSet").type
-            assertThat(hashSet.isAssignableFromWithoutVariance(typeUtils, set), `is`(false))
-            assertThat(set.isAssignableFromWithoutVariance(typeUtils, hashSet), `is`(true))
+            val set = testObject.getField("mSet").type
+            val hashSet = testObject.getField("mHashSet").type
+            assertThat(hashSet.isAssignableFromWithoutVariance(set), `is`(false))
+            assertThat(set.isAssignableFromWithoutVariance(hashSet), `is`(true))
         }
     }
 
@@ -84,10 +78,10 @@
          */
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val set = testObject.getField(processingEnv, "mSet").type
-            val varianceSet = testObject.getField(processingEnv, "mVarianceSet").type
-            assertThat(varianceSet.isAssignableFromWithoutVariance(typeUtils, set), `is`(true))
-            assertThat(set.isAssignableFromWithoutVariance(typeUtils, varianceSet), `is`(true))
+            val set = testObject.getField("mSet").type
+            val varianceSet = testObject.getField("mVarianceSet").type
+            assertThat(varianceSet.isAssignableFromWithoutVariance(set), `is`(true))
+            assertThat(set.isAssignableFromWithoutVariance(varianceSet), `is`(true))
         }
     }
 
@@ -95,18 +89,17 @@
     fun unboundedVariance() {
         runTest {
             val testObject = processingEnv.requireTypeElement("foo.bar.MyObject")
-            val unbounded = testObject.getField(processingEnv, "mUnboundedMap").type
-            val objectMap = testObject.getField(processingEnv, "mStringMap").type
-            assertThat(objectMap.isAssignableFromWithoutVariance(typeUtils, unbounded), `is`(false))
-            assertThat(unbounded.isAssignableFromWithoutVariance(typeUtils, objectMap), `is`(true))
+            val unbounded = testObject.getField("mUnboundedMap").type
+            val objectMap = testObject.getField("mStringMap").type
+            assertThat(objectMap.isAssignableFromWithoutVariance(unbounded), `is`(false))
+            assertThat(unbounded.isAssignableFromWithoutVariance(objectMap), `is`(true))
         }
     }
 
-    private fun TypeElement.getField(
-        env: ProcessingEnvironment,
+    private fun XTypeElement.getField(
         name: String
-    ): VariableElement {
-        return getAllFieldsIncludingPrivateSupers(env).first {
+    ): XVariableElement {
+        return getAllFieldsIncludingPrivateSupers().first {
             it.name == name
         }
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
index 793b2de..0634281 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
@@ -20,11 +20,6 @@
 import androidx.room.Query
 import androidx.room.ext.RoomTypeNames.ROOM_SQL_QUERY
 import androidx.room.ext.RoomTypeNames.STRING_UTIL
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asExecutableElement
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.getAllMethods
-import androidx.room.ext.hasAnnotation
 import androidx.room.processor.QueryMethodProcessor
 import androidx.room.testing.TestProcessor
 import androidx.room.writer.QueryWriter
@@ -306,9 +301,7 @@
                                     .getElementsAnnotatedWith(Dao::class.java)
                                     .map {
                                         Pair(it,
-                                            it.asTypeElement().getAllMethods(
-                                                invocation.processingEnv
-                                            ).filter {
+                                            it.asTypeElement().getAllMethods().filter {
                                                 it.hasAnnotation(Query::class)
                                             }
                                         )
@@ -316,7 +309,7 @@
                             val parser = QueryMethodProcessor(
                                     baseContext = invocation.context,
                                     containing = owner.asDeclaredType(),
-                                    executableElement = methods.first().asExecutableElement())
+                                    executableElement = methods.first())
                             val method = parser.process()
                             handler(QueryWriter(method))
                             true
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt b/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt
index 79acd1d..e32b344 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/TestInvocation.kt
@@ -16,17 +16,22 @@
 
 package androidx.room.testing
 
+import androidx.room.processing.XProcessingEnv
+import androidx.room.processing.XRoundEnv
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.Context
-import javax.annotation.processing.ProcessingEnvironment
 import javax.annotation.processing.RoundEnvironment
-import javax.lang.model.element.TypeElement
 
 data class TestInvocation(
-    val processingEnv: ProcessingEnvironment,
-    val annotations: MutableSet<out TypeElement>,
-    val roundEnv: RoundEnvironment
+    val processingEnv: XProcessingEnv,
+    val annotations: Set<XTypeElement>,
+    val roundEnv: XRoundEnv
 ) {
-    val context = Context(processingEnv)
+    constructor(
+        processingEnv: XProcessingEnv,
+        annotations: Set<XTypeElement>,
+        roundEnv: RoundEnvironment
+    ) : this(processingEnv, annotations, XRoundEnv.create(processingEnv, roundEnv))
 
-    val typeUtils by lazy { processingEnv.typeUtils }
+    val context = Context(processingEnv)
 }
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt b/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
index 29106e0..6496fec 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
@@ -16,24 +16,21 @@
 
 package androidx.room.testing
 
+import androidx.room.processing.JavacTestProcessor
+import androidx.room.processing.XRoundEnv
+import androidx.room.processing.XTypeElement
 import androidx.room.processor.Context
-import javax.annotation.processing.AbstractProcessor
-import javax.annotation.processing.RoundEnvironment
 import javax.lang.model.SourceVersion
-import javax.lang.model.element.TypeElement
 import kotlin.reflect.KClass
 
 class TestProcessor(
     val handlers: List<(TestInvocation) -> Boolean>,
     val annotations: MutableSet<String>
-) : AbstractProcessor() {
+) : JavacTestProcessor() {
     var count = 0
-    override fun process(
-        annotations: MutableSet<out TypeElement>,
-        roundEnv: RoundEnvironment
-    ): Boolean {
+    override fun doProcess(annotations: Set<XTypeElement>, roundEnv: XRoundEnv): Boolean {
         return handlers.getOrNull(count++)?.invoke(
-                    TestInvocation(processingEnv, annotations, roundEnv)) ?: true
+            TestInvocation(xProcessingEnv, annotations, roundEnv)) ?: true
     }
 
     override fun getSupportedSourceVersion(): SourceVersion {
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
index 96333e8..f7cab4d 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
@@ -26,7 +26,9 @@
 import androidx.room.ext.RoomRxJava3TypeNames
 import androidx.room.ext.RxJava2TypeNames
 import androidx.room.ext.RxJava3TypeNames
-import androidx.room.ext.asTypeElement
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.DatabaseViewProcessor
 import androidx.room.processor.TableEntityProcessor
 import androidx.room.solver.CodeGenScope
@@ -41,16 +43,11 @@
 import com.google.testing.compile.JavaFileObjects
 import com.google.testing.compile.JavaSourcesSubjectFactory
 import com.squareup.javapoet.ClassName
-import org.mockito.Mockito
 import org.mockito.Mockito.doReturn
 import org.mockito.Mockito.mock
 import java.io.File
 import java.nio.charset.StandardCharsets.UTF_8
 import java.util.Locale
-import javax.lang.model.element.Element
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.TypeKind
-import javax.lang.model.type.TypeMirror
 import javax.tools.JavaFileObject
 import javax.tools.StandardLocation
 import javax.tools.ToolProvider.getSystemJavaCompiler
@@ -188,7 +185,7 @@
     }
 }
 fun testCodeGenScope(): CodeGenScope {
-    return CodeGenScope(Mockito.mock(ClassWriter::class.java))
+    return CodeGenScope(mock(ClassWriter::class.java))
 }
 
 fun simpleRun(
@@ -220,7 +217,7 @@
 }
 
 fun createVerifierFromEntitiesAndViews(invocation: TestInvocation): DatabaseVerifier {
-    return DatabaseVerifier.create(invocation.context, Mockito.mock(Element::class.java),
+    return DatabaseVerifier.create(invocation.context, mock(XElement::class.java),
             invocation.getEntities(), invocation.getViews())!!
 }
 
@@ -238,14 +235,13 @@
 }
 
 /**
- * Create mocks of [Element] and [TypeMirror] so that they can be used for instantiating a fake
+ * Create mocks of [XElement] and [XType] so that they can be used for instantiating a fake
  * [androidx.room.vo.Field].
  */
-fun mockElementAndType(): Pair<VariableElement, TypeMirror> {
-    val element = mock(VariableElement::class.java)
-    val type = mock(TypeMirror::class.java)
-    doReturn(TypeKind.DECLARED).`when`(type).kind
-    doReturn(type).`when`(element).asType()
+fun mockElementAndType(): Pair<XVariableElement, XType> {
+    val element = mock(XVariableElement::class.java)
+    val type = mock(XType::class.java)
+    doReturn(type).`when`(element).type
     return element to type
 }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
index 8ae3d2e..bbe2969 100644
--- a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
@@ -16,11 +16,15 @@
 
 package androidx.room.verifier
 
-import androidx.room.ext.requireTypeElement
-import androidx.room.ext.requireTypeMirror
 import androidx.room.parser.Collate
 import androidx.room.parser.SQLTypeAffinity
 import androidx.room.parser.SqlParser
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
+import androidx.room.processing.XVariableElement
 import androidx.room.processor.Context
 import androidx.room.testing.TestInvocation
 import androidx.room.vo.CallType
@@ -48,12 +52,6 @@
 import org.mockito.Mockito.mock
 import simpleRun
 import java.sql.Connection
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.element.VariableElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 @RunWith(Parameterized::class)
 class DatabaseVerifierTest(private val useLocalizedCollation: Boolean) {
@@ -74,7 +72,7 @@
 
     private fun createVerifier(invocation: TestInvocation): DatabaseVerifier {
         val db = userDb(invocation)
-        return DatabaseVerifier.create(invocation.context, mock(Element::class.java),
+        return DatabaseVerifier.create(invocation.context, mock(XElement::class.java),
                 db.entities, db.views)!!
     }
 
@@ -238,7 +236,7 @@
                 ),
                 emptyList()
             )
-            val element = mock(Element::class.java)
+            val element = mock(XElement::class.java)
             DatabaseVerifier.create(invocation.context, element, db.entities, db.views)!!
         }.failsToCompile().withErrorContaining("default value of column [name]")
     }
@@ -276,8 +274,8 @@
 
     private fun database(entities: List<Entity>, views: List<DatabaseView>): Database {
         return Database(
-                element = mock(TypeElement::class.java),
-                type = mock(TypeMirror::class.java),
+                element = mock(XTypeElement::class.java),
+                type = mock(XType::class.java),
                 entities = entities,
                 views = views,
                 daoMethods = emptyList(),
@@ -295,37 +293,37 @@
         return Entity(
             element = element,
             tableName = tableName,
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = fields.toList(),
             embeddedFields = emptyList(),
             indices = emptyList(),
             primaryKey = PrimaryKey(null, Fields(fields.take(1)), false),
             foreignKeys = emptyList(),
-            constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+            constructor = Constructor(mock(XConstructorElement::class.java), emptyList()),
             shadowTableName = null
         )
     }
 
     private fun view(viewName: String, query: String, vararg fields: Field): DatabaseView {
         return DatabaseView(
-                element = mock(TypeElement::class.java),
+                element = mock(XTypeElement::class.java),
                 viewName = viewName,
-                type = mock(DeclaredType::class.java),
+                type = mock(XDeclaredType::class.java),
                 fields = fields.toList(),
                 embeddedFields = emptyList(),
                 query = SqlParser.parse(query),
-                constructor = Constructor(mock(ExecutableElement::class.java), emptyList())
+                constructor = Constructor(mock(XConstructorElement::class.java), emptyList())
         )
     }
 
     private fun field(
         name: String,
-        type: TypeMirror,
+        type: XType,
         affinity: SQLTypeAffinity,
         defaultValue: String? = null
     ): Field {
-        val element = mock(VariableElement::class.java)
-        doReturn(type).`when`(element).asType()
+        val element = mock(XVariableElement::class.java)
+        doReturn(type).`when`(element).type
         val f = Field(
             element = element,
             name = name,
@@ -343,13 +341,13 @@
         return f
     }
 
-    private fun assignGetterSetter(f: Field, name: String, type: TypeMirror) {
+    private fun assignGetterSetter(f: Field, name: String, type: XType) {
         f.getter = FieldGetter(name, type, CallType.FIELD)
         f.setter = FieldSetter(name, type, CallType.FIELD)
     }
 
-    private fun primitive(context: Context, typeName: TypeName): TypeMirror {
-        return context.processingEnv.requireTypeMirror(typeName)
+    private fun primitive(context: Context, typeName: TypeName): XType {
+        return context.processingEnv.requireType(typeName)
     }
 
     private fun getPrimaryKeys(connection: Connection, tableName: String): List<String> {
diff --git a/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt b/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt
index 41f070b..b9f67e0 100644
--- a/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/vo/DatabaseTest.kt
@@ -16,17 +16,17 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XType
+import androidx.room.processing.XTypeElement
 import org.apache.commons.codec.digest.DigestUtils
 import org.junit.Assert.assertEquals
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
-import javax.lang.model.type.TypeMirror
 
 @RunWith(JUnit4::class)
 class DatabaseTest {
@@ -34,16 +34,16 @@
     @Test
     fun indexLegacyHash() {
         val database = Database(
-            element = mock(TypeElement::class.java),
-            type = mock(TypeMirror::class.java),
+            element = mock(XTypeElement::class.java),
+            type = mock(XType::class.java),
             entities = listOf(
                 Entity(
-                    mock(TypeElement::class.java),
+                    mock(XTypeElement::class.java),
                     tableName = "TheTable",
-                    type = mock(DeclaredType::class.java),
+                    type = mock(XDeclaredType::class.java),
                     fields = emptyList(),
                     embeddedFields = emptyList(),
-                    primaryKey = PrimaryKey(mock(Element::class.java), Fields(), false),
+                    primaryKey = PrimaryKey(mock(XElement::class.java), Fields(), false),
                     indices = listOf(
                         Index(
                             name = "leIndex",
@@ -55,7 +55,7 @@
                             fields = Fields())
                     ),
                     foreignKeys = emptyList(),
-                    constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+                    constructor = Constructor(mock(XConstructorElement::class.java), emptyList()),
                     shadowTableName = null
                 )
             ),
diff --git a/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt b/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt
index fe3ba67..5d81dc1 100644
--- a/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/vo/EntityTest.kt
@@ -16,16 +16,16 @@
 
 package androidx.room.vo
 
+import androidx.room.processing.XConstructorElement
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XTypeElement
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.element.ExecutableElement
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 @RunWith(JUnit4::class)
 class EntityTest {
@@ -72,15 +72,15 @@
         foreignKeys: List<ForeignKey> = emptyList()
     ): Entity {
         return Entity(
-                element = mock(TypeElement::class.java),
+                element = mock(XTypeElement::class.java),
                 tableName = tableName,
-                type = mock(DeclaredType::class.java),
+                type = mock(XDeclaredType::class.java),
                 fields = emptyList(),
                 embeddedFields = emptyList(),
-                primaryKey = PrimaryKey(mock(Element::class.java), Fields(), false),
+                primaryKey = PrimaryKey(mock(XElement::class.java), Fields(), false),
                 indices = emptyList(),
                 foreignKeys = foreignKeys,
-                constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+                constructor = Constructor(mock(XConstructorElement::class.java), emptyList()),
                 shadowTableName = null)
     }
 
diff --git a/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt b/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt
index ca7c58d..acc4574 100644
--- a/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/vo/FtsEntityTest.kt
@@ -17,6 +17,9 @@
 package androidx.room.vo
 
 import androidx.room.parser.FtsVersion
+import androidx.room.processing.XDeclaredType
+import androidx.room.processing.XElement
+import androidx.room.processing.XTypeElement
 import mockElementAndType
 import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.MatcherAssert.assertThat
@@ -24,9 +27,6 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.mockito.Mockito.mock
-import javax.lang.model.element.Element
-import javax.lang.model.element.TypeElement
-import javax.lang.model.type.DeclaredType
 
 @RunWith(JUnit4::class)
 class FtsEntityTest {
@@ -39,14 +39,14 @@
         val dontIndexMe1Field = createField("dontIndexMe1")
         val dontIndexMe2Field = createField("dontIndexMe2")
         val entity = FtsEntity(
-                element = mock(TypeElement::class.java),
+                element = mock(XTypeElement::class.java),
                 tableName = "Mail",
-                type = mock(DeclaredType::class.java),
+                type = mock(XDeclaredType::class.java),
                 fields = listOf(primaryKeyField, bodyField, languageIdField, dontIndexMe1Field,
                         dontIndexMe2Field),
                 embeddedFields = emptyList(),
                 primaryKey = PrimaryKey(
-                        declaredIn = mock(Element::class.java),
+                        declaredIn = mock(XElement::class.java),
                         fields = Fields(primaryKeyField),
                         autoGenerateId = true),
                 constructor = null,
@@ -84,13 +84,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
@@ -120,13 +120,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
@@ -155,13 +155,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
@@ -191,13 +191,13 @@
         val primaryKeyField = createField("rowid")
         val bodyField = createField("body")
         val entity = FtsEntity(
-            element = mock(TypeElement::class.java),
+            element = mock(XTypeElement::class.java),
             tableName = "Mail",
-            type = mock(DeclaredType::class.java),
+            type = mock(XDeclaredType::class.java),
             fields = listOf(primaryKeyField, bodyField),
             embeddedFields = emptyList(),
             primaryKey = PrimaryKey(
-                declaredIn = mock(Element::class.java),
+                declaredIn = mock(XElement::class.java),
                 fields = Fields(primaryKeyField),
                 autoGenerateId = true),
             constructor = null,
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
index 7be4e69..4370c29 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
@@ -18,9 +18,6 @@
 
 import COMMON
 import androidx.room.ext.RoomTypeNames
-import androidx.room.ext.asDeclaredType
-import androidx.room.ext.asTypeElement
-import androidx.room.ext.requireTypeElement
 import androidx.room.processor.DaoProcessor
 import androidx.room.testing.TestProcessor
 import com.google.common.truth.Truth
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
index 581ff9d..72cfd81 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/SQLiteOpenHelperWriterTest.kt
@@ -17,7 +17,6 @@
 package androidx.room.writer
 
 import androidx.annotation.NonNull
-import androidx.room.ext.asTypeElement
 import androidx.room.processor.DatabaseProcessor
 import androidx.room.testing.TestInvocation
 import androidx.room.testing.TestProcessor
diff --git a/settings.gradle b/settings.gradle
index cc0caa4..689b512 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -141,11 +141,12 @@
 includeProject(":collection:collection-ktx", "collection/collection-ktx")
 includeProject(":concurrent:concurrent-futures", "concurrent/futures")
 includeProject(":concurrent:concurrent-futures-ktx", "concurrent/futures-ktx")
-includeProject(":contentaccess:contentaccess-runtime", "contentaccess/contentaccess-runtime")
 includeProject(":contentaccess:contentaccess-annotations", "contentaccess/contentaccess-annotations")
 includeProject(":contentaccess:contentaccess-compiler", "contentaccess/contentaccess-compiler")
+includeProject(":contentaccess:contentaccess-entities", "contentaccess/contentaccess-entities")
 includeProject(":contentaccess:integration-tests:testapp",
         "contentaccess/integration-tests/testapp")
+includeProject(":contentaccess:contentaccess-runtime", "contentaccess/contentaccess-runtime")
 includeProject(":contentpager:contentpager", "contentpager/contentpager")
 includeProject(":coordinatorlayout:coordinatorlayout", "coordinatorlayout/coordinatorlayout")
 includeProject(":core:core", "core/core")
diff --git a/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt b/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt
index 448ec19..7f5a337 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt
+++ b/transition/transition/src/androidTest/java/androidx/transition/FragmentTestUtil.kt
@@ -43,6 +43,27 @@
 object Reordered : ReorderingAllowed()
 object Ordered : ReorderingAllowed()
 
+sealed class StateManager {
+    abstract fun setup()
+
+    override fun toString(): String = this.javaClass.simpleName
+
+    fun teardown() {
+        // Reset it back to the default
+        FragmentManager.enableNewStateManager(true)
+    }
+}
+object NewStateManager : StateManager() {
+    override fun setup() {
+        FragmentManager.enableNewStateManager(true)
+    }
+}
+object OldStateManager : StateManager() {
+    override fun setup() {
+        FragmentManager.enableNewStateManager(false)
+    }
+}
+
 @Suppress("DEPRECATION")
 fun androidx.test.rule.ActivityTestRule<out FragmentActivity>.executePendingTransactions(
     fm: FragmentManager = activity.supportFragmentManager
diff --git a/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt b/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt
index a3cddd3..cb80119 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt
+++ b/transition/transition/src/androidTest/java/androidx/transition/FragmentTransitionTest.kt
@@ -47,7 +47,10 @@
 @MediumTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
-class FragmentTransitionTest(private val reorderingAllowed: ReorderingAllowed) {
+class FragmentTransitionTest(
+    private val reorderingAllowed: ReorderingAllowed,
+    private val stateManager: StateManager
+) {
 
     @Suppress("DEPRECATION")
     @get:Rule
@@ -63,6 +66,7 @@
 
     @Before
     fun setup() {
+        stateManager.setup()
         onBackStackChangedTimes = 0
         fragmentManager = activityRule.activity.supportFragmentManager
         fragmentManager.addOnBackStackChangedListener(onBackStackChangedListener)
@@ -71,6 +75,7 @@
     @After
     fun teardown() {
         fragmentManager.removeOnBackStackChangedListener(onBackStackChangedListener)
+        stateManager.teardown()
     }
 
     // Test that normal view transitions (enter, exit, reenter, return) run with
@@ -150,14 +155,20 @@
             assertThat(onBackStackChangedTimes).isEqualTo(2)
             assertThat(fragment.requireView()).isEqualTo(view1)
         } else {
-            // If reorder is not allowed we will get the exit Transition and the fragment will be
-            // added with a different view.
-            fragment.waitForTransition()
-            fragment.exitTransition.verifyAndClearTransition {
-                exitingViews += listOf(green, blue)
-            }
             assertThat(onBackStackChangedTimes).isEqualTo(3)
-            assertThat(fragment.requireView()).isNotEqualTo(view1)
+            if (stateManager is NewStateManager) {
+                // When using FragmentStateManager, the transition gets cancelled and the
+                // Fragment  does not go all the way through to destroying the view before
+                // coming back up, so the view instances will still match
+                assertThat(fragment.requireView()).isEqualTo(view1)
+            } else {
+                // If reorder is not allowed we will get the exit Transition
+                fragment.waitForTransition()
+                fragment.exitTransition.verifyAndClearTransition {
+                    exitingViews += listOf(green, blue)
+                }
+                assertThat(fragment.requireView()).isNotEqualTo(view1)
+            }
         }
         verifyNoOtherTransitions(fragment)
     }
@@ -362,11 +373,9 @@
             names.capture(), views.capture(),
             snapshots.capture()
         )
-        assertThat(names.value.size).isEqualTo(1)
-        assertThat(views.value.size).isEqualTo(1)
+        assertThat(names.value).containsExactly("blueSquare")
+        assertThat(views.value).containsExactly(startBlue)
         assertThat(snapshots.value).isNull()
-        assertThat(names.value[0]).isEqualTo("blueSquare")
-        assertThat(views.value[0]).isEqualTo(startBlue)
 
         val endBlue = activityRule.findBlue()
 
@@ -374,11 +383,9 @@
             names.capture(), views.capture(),
             snapshots.capture()
         )
-        assertThat(names.value.size).isEqualTo(1)
-        assertThat(views.value.size).isEqualTo(1)
+        assertThat(names.value).containsExactly("blueSquare")
+        assertThat(views.value).containsExactly(endBlue)
         assertThat(snapshots.value).isNull()
-        assertThat(names.value[0]).isEqualTo("blueSquare")
-        assertThat(views.value[0]).isEqualTo(endBlue)
 
         // Now pop the back stack
         reset(enterCallback)
@@ -388,11 +395,9 @@
             names.capture(), views.capture(),
             snapshots.capture()
         )
-        assertThat(names.value.size).isEqualTo(1)
-        assertThat(views.value.size).isEqualTo(1)
+        assertThat(names.value).containsExactly("blueSquare")
+        assertThat(views.value).containsExactly(endBlue)
         assertThat(snapshots.value).isNull()
-        assertThat(names.value[0]).isEqualTo("blueSquare")
-        assertThat(views.value[0]).isEqualTo(endBlue)
 
         val reenterBlue = activityRule.findBlue()
 
@@ -400,11 +405,9 @@
             names.capture(), views.capture(),
             snapshots.capture()
         )
-        assertThat(names.value.size).isEqualTo(1)
-        assertThat(views.value.size).isEqualTo(1)
+        assertThat(names.value).containsExactly("blueSquare")
+        assertThat(views.value).containsExactly(reenterBlue)
         assertThat(snapshots.value).isNull()
-        assertThat(names.value[0]).isEqualTo("blueSquare")
-        assertThat(views.value[0]).isEqualTo(reenterBlue)
     }
 
     // Make sure that onMapSharedElement works to change the shared element going out
@@ -425,10 +428,8 @@
                 names: List<String>,
                 sharedElements: MutableMap<String, View>
             ) {
-                assertThat(names.size).isEqualTo(1)
-                assertThat(names[0]).isEqualTo("blueSquare")
-                assertThat(sharedElements.size).isEqualTo(1)
-                assertThat(sharedElements["blueSquare"]).isEqualTo(startBlue)
+                assertThat(names).containsExactly("blueSquare")
+                assertThat(sharedElements).containsExactly("blueSquare", startBlue)
                 sharedElements["blueSquare"] = startGreen
             }
         }
@@ -459,11 +460,9 @@
                 names: List<String>,
                 sharedElements: MutableMap<String, View>
             ) {
-                assertThat(names.size).isEqualTo(1)
-                assertThat(names[0]).isEqualTo("blueSquare")
-                assertThat(sharedElements.size).isEqualTo(1)
+                assertThat(names).containsExactly("blueSquare")
                 val expectedBlue = findViewById(fragment1, R.id.blueSquare)
-                assertThat(sharedElements["blueSquare"]).isEqualTo(expectedBlue)
+                assertThat(sharedElements).containsExactly("blueSquare", expectedBlue)
                 val greenSquare = findViewById(fragment1, R.id.greenSquare)
                 sharedElements["blueSquare"] = greenSquare
             }
@@ -499,11 +498,9 @@
                 names: List<String>,
                 sharedElements: MutableMap<String, View>
             ) {
-                assertThat(names.size).isEqualTo(1)
-                assertThat(names[0]).isEqualTo("blueSquare")
-                assertThat(sharedElements.size).isEqualTo(1)
+                assertThat(names).containsExactly("blueSquare")
                 val blueSquare = findViewById(fragment2, R.id.blueSquare)
-                assertThat(sharedElements["blueSquare"]).isEqualTo(blueSquare)
+                assertThat(sharedElements).containsExactly("blueSquare", blueSquare)
                 val greenSquare = findViewById(fragment2, R.id.greenSquare)
                 sharedElements["blueSquare"] = greenSquare
             }
@@ -536,10 +533,8 @@
                 names: List<String>,
                 sharedElements: MutableMap<String, View>
             ) {
-                assertThat(names.size).isEqualTo(1)
-                assertThat(names[0]).isEqualTo("blueSquare")
-                assertThat(sharedElements.size).isEqualTo(1)
-                assertThat(sharedElements["blueSquare"]).isEqualTo(endBlue)
+                assertThat(names).containsExactly("blueSquare")
+                assertThat(sharedElements).containsExactly("blueSquare", endBlue)
                 sharedElements["blueSquare"] = endGreen
             }
         }
@@ -630,9 +625,9 @@
         val fragment2 = TransitionFragment(R.layout.fragment_scene2)
 
         verifyTransition(fragment1, fragment2, "blueSquare")
-        assertThat(fragment1.exitTransition.targets.size).isEqualTo(0)
-        assertThat(fragment2.sharedElementEnter.targets.size).isEqualTo(0)
-        assertThat(fragment2.enterTransition.targets.size).isEqualTo(0)
+        assertThat(fragment1.exitTransition.targets).isEmpty()
+        assertThat(fragment2.sharedElementEnter.targets).isEmpty()
+        assertThat(fragment2.enterTransition.targets).isEmpty()
         assertThat(fragment1.exitTransition.epicenterCallback).isNull()
         assertThat(fragment2.enterTransition.epicenterCallback).isNull()
         assertThat(fragment2.sharedElementEnter.epicenterCallback).isNull()
@@ -640,9 +635,9 @@
         // Now pop the back stack
         verifyPopTransition(1, fragment2, fragment1)
 
-        assertThat(fragment2.returnTransition.targets.size).isEqualTo(0)
-        assertThat(fragment2.sharedElementReturn.targets.size).isEqualTo(0)
-        assertThat(fragment1.reenterTransition.targets.size).isEqualTo(0)
+        assertThat(fragment2.returnTransition.targets).isEmpty()
+        assertThat(fragment2.sharedElementReturn.targets).isEmpty()
+        assertThat(fragment1.reenterTransition.targets).isEmpty()
         assertThat(fragment2.returnTransition.epicenterCallback).isNull()
         assertThat(fragment2.sharedElementReturn.epicenterCallback).isNull()
         assertThat(fragment2.reenterTransition.epicenterCallback).isNull()
@@ -791,7 +786,9 @@
         val endBlue = activityRule.findBlue()
         val endGreen = activityRule.findGreen()
 
-        if (reorderingAllowed is Reordered) {
+        // FragmentStateManager is able to build the correct transition
+        // whether you use reordering or not
+        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
             fragment1.exitTransition.verifyAndClearTransition {
                 exitingViews += listOf(startGreen, startBlue)
             }
@@ -939,8 +936,16 @@
         if (reorderingAllowed is Reordered) {
             // reordering allowed fragment3 to get a transition so we should wait for it to finish
             fragment3.waitForTransition()
-            fragment2.returnTransition.verifyAndClearTransition {
-                exitingViews += listOf(midGreen, midBlue)
+            if (stateManager is NewStateManager) {
+                // When using the NewStateManager, the last operation sets the direction.
+                // In this case, the forward direction since we did a replace() after the pop
+                fragment2.exitTransition.verifyAndClearTransition {
+                    exitingViews += listOf(midGreen, midBlue)
+                }
+            } else {
+                fragment2.returnTransition.verifyAndClearTransition {
+                    exitingViews += listOf(midGreen, midBlue)
+                }
             }
             val endGreen = activityRule.findGreen()
             val endBlue = activityRule.findBlue()
@@ -989,18 +994,36 @@
 
         // It does not transition properly for ordered transactions, though.
         if (reorderingAllowed is Reordered) {
-            fragment1.returnTransition.verifyAndClearTransition {
-                exitingViews += startGreen
-            }
+            // reordering allowed fragment3 to get a transition so we should wait for it to finish
+            fragment2.waitForTransition()
+
             val endGreen = activityRule.findGreen()
             val endBlue = activityRule.findBlue()
+            val endGreenBounds = endGreen.boundsOnScreen
+
+            if (stateManager is NewStateManager) {
+                // When using the NewStateManager, the last operation sets the direction.
+                // In this case, the forward direction since we did a replace() after the pop
+                fragment1.exitTransition.verifyAndClearTransition {
+                    epicenter = endGreenBounds
+                    exitingViews += startGreen
+                }
+            } else {
+                fragment1.returnTransition.verifyAndClearTransition {
+                    exitingViews += startGreen
+                }
+            }
             fragment2.enterTransition.verifyAndClearTransition {
                 epicenter = startGreenBounds
                 enteringViews += endGreen
             }
             fragment2.sharedElementEnter.verifyAndClearTransition {
-                // In this case, we can't find an epicenter
-                epicenter = Rect()
+                epicenter = if (stateManager is NewStateManager) {
+                    endGreenBounds
+                } else {
+                    // In this case, we can't find an epicenter
+                    Rect()
+                }
                 exitingViews += startBlue
                 enteringViews += endBlue
             }
@@ -1038,7 +1061,10 @@
         val midBlue = activityRule.findBlue()
         val midRed = activityRule.findRed()
         val midGreenBounds = midGreen.boundsOnScreen
-        if (reorderingAllowed is Reordered) {
+
+        // FragmentStateManager is able to build the correct transition
+        // whether you use reordering or not
+        if (stateManager is NewStateManager || reorderingAllowed is Reordered) {
             fragment2.sharedElementEnter.verifyAndClearTransition {
                 epicenter = startGreenBounds
                 exitingViews += startGreen
@@ -1385,9 +1411,17 @@
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters(name = "ordering={0}")
-        fun data(): Array<ReorderingAllowed> {
-            return arrayOf(Ordered, Reordered)
+        @Parameterized.Parameters(name = "ordering={0}, stateManager={1}")
+        fun data() = mutableListOf<Array<Any>>().apply {
+            arrayOf(
+                Ordered,
+                Reordered
+            ).forEach { ordering ->
+                // Run the test with the new state manager
+                add(arrayOf(ordering, NewStateManager))
+                // Run the test with the old state manager
+                add(arrayOf(ordering, OldStateManager))
+            }
         }
     }
 }
diff --git a/ui/ui-core-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt b/ui/ui-core-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt
index a706cd34..85bc737 100644
--- a/ui/ui-core-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt
+++ b/ui/ui-core-viewbinding/src/androidTest/java/androidx/compose/ui/viewinterop/AndroidViewBindingTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.ui.viewinterop
 
+import android.os.Build
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -25,6 +26,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.databinding.TestLayoutBinding
 import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
 import androidx.ui.test.assertPixels
 import androidx.ui.test.captureToBitmap
 import androidx.ui.test.createComposeRule
@@ -37,6 +39,7 @@
 
 @MediumTest
 @RunWith(JUnit4::class)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
 class AndroidViewBindingTest {
 
     @get:Rule
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
index 2496a5d..de425c6 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/SubcomposeLayoutTest.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.layout
 
 import android.graphics.Bitmap
+import android.os.Build
 import androidx.compose.runtime.Composable
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.Stack
@@ -42,6 +43,7 @@
 import androidx.ui.test.waitForIdle
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
+import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert.assertEquals
 import org.junit.Rule
@@ -309,6 +311,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun slotsAreDrawnInTheOrderTheyComposed() {
         val layoutTag = "layout"
 
@@ -335,6 +338,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun slotsCouldBeReordered() {
         val layoutTag = "layout"
         val firstSlotIsRed = mutableStateOf(true)
@@ -370,6 +374,7 @@
     }
 
     @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun drawingOrderCouldBeChangedUsingZIndex() {
         val layoutTag = "layout"
 
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AllowlistActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AllowlistActivity.java
index d08d44e..9a9be51 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AllowlistActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AllowlistActivity.java
@@ -16,12 +16,14 @@
 
 package com.example.androidx.webkit;
 
+import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.os.Bundle;
 import android.webkit.ValueCallback;
 import android.webkit.WebView;
 import android.widget.CompoundButton;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.SwitchCompat;
@@ -30,8 +32,9 @@
 import androidx.webkit.WebViewCompat;
 import androidx.webkit.WebViewFeature;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * An {@link Activity} to demonstrate how to allowlist a set of domains from Safe Browsing checks.
@@ -48,7 +51,7 @@
         setTitle(R.string.allowlist_activity_title);
         WebkitHelpers.appendWebViewVersionToTitle(this);
 
-        if (!WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_WHITELIST)) {
+        if (!isSafeBrowsingAllowlistSupported()) {
             WebkitHelpers.showMessageInActivity(this, R.string.webkit_api_not_available);
             return;
         }
@@ -99,11 +102,25 @@
         }
     }
 
+    // TODO(b/160326030): remove SuppressLint and inline when we unhide
+    // WebViewCompat.setSafeBrowsingAllowlist
+    @SuppressLint("RestrictedApi")
+    private void setSafeBrowsingAllowlist(@NonNull Set<String> hosts,
+            @Nullable ValueCallback<Boolean> callback) {
+        WebViewCompat.setSafeBrowsingAllowlist(hosts, callback);
+    }
+
+    // TODO(b/160326030): remove SuppressLint and inline when we unhide
+    // WebViewCompat.setSafeBrowsingAllowlist
+    @SuppressLint("RestrictedApi")
+    private boolean isSafeBrowsingAllowlistSupported() {
+        return WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_ALLOWLIST);
+    }
+
     private void clearAllowlist() {
         // To clear the allowlist (and check all domains with Safe Browsing), pass an empty list.
-        final List<String> emptyAllowlist = new ArrayList<>();
         final Activity activity = this;
-        WebViewCompat.setSafeBrowsingWhitelist(emptyAllowlist, new ValueCallback<Boolean>() {
+        setSafeBrowsingAllowlist(Collections.emptySet(), new ValueCallback<Boolean>() {
             @Override
             public void onReceiveValue(Boolean success) {
                 if (!success) {
@@ -117,10 +134,10 @@
     private void allowlistSafeBrowsingTestSite(@Nullable Runnable onSuccess) {
         // Configure an allowlist of domains. Pages/resources loaded from these domains will never
         // be checked by Safe Browsing (until a new allowlist is applied).
-        final List<String> allowlist = new ArrayList<>();
+        final Set<String> allowlist = new HashSet<>();
         allowlist.add(SafeBrowsingHelpers.TEST_SAFE_BROWSING_DOMAIN);
         final Activity activity = this;
-        WebViewCompat.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
+        setSafeBrowsingAllowlist(allowlist, new ValueCallback<Boolean>() {
             @Override
             public void onReceiveValue(Boolean success) {
                 if (success) {
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
index 4dba0cf..9e33b4e 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
+++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebViewCompatTest.java
@@ -49,8 +49,8 @@
 
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 
 @MediumTest
 @RunWith(AndroidJUnit4.class)
@@ -191,13 +191,13 @@
      */
     @Test
     public void testSetSafeBrowsingAllowlistWithMalformedList() throws Exception {
-        WebkitUtils.checkFeature(WebViewFeature.SAFE_BROWSING_WHITELIST);
+        WebkitUtils.checkFeature(WebViewFeature.SAFE_BROWSING_ALLOWLIST);
 
-        List<String> allowlist = new ArrayList<>();
+        Set<String> allowlist = new HashSet<>();
         // Protocols are not supported in the allowlist
         allowlist.add("http://google.com");
         final ResolvableFuture<Boolean> safeBrowsingAllowlistFuture = ResolvableFuture.create();
-        WebViewCompat.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
+        WebViewCompat.setSafeBrowsingAllowlist(allowlist, new ValueCallback<Boolean>() {
             @Override
             public void onReceiveValue(Boolean success) {
                 safeBrowsingAllowlistFuture.set(success);
@@ -213,14 +213,14 @@
      */
     @Test
     public void testSetSafeBrowsingAllowlistWithValidList() throws Exception {
-        WebkitUtils.checkFeature(WebViewFeature.SAFE_BROWSING_WHITELIST);
+        WebkitUtils.checkFeature(WebViewFeature.SAFE_BROWSING_ALLOWLIST);
         // This test relies on the onSafeBrowsingHit callback to verify correctness.
         WebkitUtils.checkFeature(WebViewFeature.SAFE_BROWSING_HIT);
 
-        List<String> allowlist = new ArrayList<>();
+        Set<String> allowlist = new HashSet<>();
         allowlist.add("safe-browsing");
         final ResolvableFuture<Boolean> safeBrowsingAllowlistFuture = ResolvableFuture.create();
-        WebViewCompat.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
+        WebViewCompat.setSafeBrowsingAllowlist(allowlist, new ValueCallback<Boolean>() {
             @Override
             public void onReceiveValue(Boolean success) {
                 safeBrowsingAllowlistFuture.set(success);
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
index d53f1ec..6274aff 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -45,6 +45,8 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Executor;
@@ -216,6 +218,61 @@
     }
 
     /**
+     * Configures a set of hosts (domain names/IP addresses) that are exempt from SafeBrowsing
+     * checks. The set is global for all the WebViews.
+     * <p>
+     * Each rule should take one of these:
+     * <table>
+     * <tr><th> Rule </th> <th> Example </th> <th> Matches Subdomain</th> </tr>
+     * <tr><td> HOSTNAME </td> <td> example.com </td> <td> Yes </td> </tr>
+     * <tr><td> .HOSTNAME </td> <td> .example.com </td> <td> No </td> </tr>
+     * <tr><td> IPV4_LITERAL </td> <td> 192.168.1.1 </td> <td> No </td></tr>
+     * <tr><td> IPV6_LITERAL_WITH_BRACKETS </td><td>[10:20:30:40:50:60:70:80]</td><td>No</td></tr>
+     * </table>
+     * <p>
+     * All other rules, including wildcards, are invalid.
+     * <p>
+     * The correct syntax for hosts is defined by <a
+     * href="https://tools.ietf.org/html/rfc3986#section-3.2.2">RFC 3986</a>.
+     *
+     * <p>
+     * This method should only be called if
+     * {@link WebViewFeature#isFeatureSupported(String)}
+     * returns true for {@link WebViewFeature#SAFE_BROWSING_ALLOWLIST}.
+     *
+     * @param hosts the set of hosts for which to skip Safe Browsing checks
+     * @param callback will be called with {@code true} if hosts are successfully added to the
+     * allowlist, {@code false} if any hosts are malformed. The callback will be run on the UI
+     * thread
+     *
+     * @hide
+     */
+    // TODO(b/160326030): unhide this API and deprecate setSafeBrowsingWhitelist
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    @SuppressLint("NewApi")
+    @RequiresFeature(name = WebViewFeature.SAFE_BROWSING_ALLOWLIST,
+            enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
+    public static void setSafeBrowsingAllowlist(@NonNull Set<String> hosts,
+            @Nullable ValueCallback<Boolean> callback) {
+        WebViewFeatureInternal preferredFeature =
+                WebViewFeatureInternal.SAFE_BROWSING_ALLOWLIST_PREFERRED_TO_PREFERRED;
+        WebViewFeatureInternal deprecatedFeature =
+                WebViewFeatureInternal.SAFE_BROWSING_ALLOWLIST_PREFERRED_TO_DEPRECATED;
+        if (preferredFeature.isSupportedByWebView()) {
+            getFactory().getStatics().setSafeBrowsingAllowlist(hosts, callback);
+            return;
+        }
+        List<String> hostsList = new ArrayList<>(hosts);
+        if (deprecatedFeature.isSupportedByFramework()) {
+            WebView.setSafeBrowsingWhitelist(hostsList, callback);
+        } else if (deprecatedFeature.isSupportedByWebView()) {
+            getFactory().getStatics().setSafeBrowsingWhitelist(hostsList, callback);
+        } else {
+            throw WebViewFeatureInternal.getUnsupportedOperationException();
+        }
+    }
+
+    /**
      * Sets the list of hosts (domain names/IP addresses) that are exempt from SafeBrowsing checks.
      * The list is global for all the WebViews.
      * <p>
@@ -240,22 +297,16 @@
      *
      * @param hosts the list of hosts
      * @param callback will be called with {@code true} if hosts are successfully added to the
-     * whitelist. It will be called with {@code false} if any hosts are malformed. The callback
+     * allowlist. It will be called with {@code false} if any hosts are malformed. The callback
      * will be run on the UI thread
      */
+    // TODO(b/160326030): unhide setSafeBrowsingAllowlist and deprecate this API
     @SuppressLint("NewApi")
     @RequiresFeature(name = WebViewFeature.SAFE_BROWSING_WHITELIST,
             enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
     public static void setSafeBrowsingWhitelist(@NonNull List<String> hosts,
             @Nullable ValueCallback<Boolean> callback) {
-        WebViewFeatureInternal feature = WebViewFeatureInternal.SAFE_BROWSING_WHITELIST;
-        if (feature.isSupportedByFramework()) {
-            WebView.setSafeBrowsingWhitelist(hosts, callback);
-        } else if (feature.isSupportedByWebView()) {
-            getFactory().getStatics().setSafeBrowsingWhitelist(hosts, callback);
-        } else {
-            throw WebViewFeatureInternal.getUnsupportedOperationException();
-        }
+        setSafeBrowsingAllowlist(new HashSet<>(hosts), callback);
     }
 
     /**
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index 1e529b9..0670587 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -55,6 +55,7 @@
             SAFE_BROWSING_ENABLE,
             DISABLED_ACTION_MODE_MENU_ITEMS,
             START_SAFE_BROWSING,
+            SAFE_BROWSING_ALLOWLIST,
             SAFE_BROWSING_WHITELIST,
             SAFE_BROWSING_PRIVACY_POLICY_URL,
             SERVICE_WORKER_BASIC_USAGE,
@@ -142,8 +143,20 @@
     /**
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
+     * {@link androidx.webkit.WebViewCompat#setSafeBrowsingAllowlist(List, ValueCallback)}.
+     *
+     * @hide
+     */
+    // TODO(b/160326030): unhide this API and deprecate SAFE_BROWSING_WHITELIST
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public static final String SAFE_BROWSING_ALLOWLIST = "SAFE_BROWSING_ALLOWLIST";
+
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     * This feature covers
      * {@link androidx.webkit.WebViewCompat#setSafeBrowsingWhitelist(List, ValueCallback)}.
      */
+    // TODO(b/160326030): deprecate this API and unhide SAFE_BROWSING_ALLOWLIST
     public static final String SAFE_BROWSING_WHITELIST = "SAFE_BROWSING_WHITELIST";
 
     /**
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
index 8794398..2bec18d 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -98,13 +98,50 @@
             Build.VERSION_CODES.O_MR1),
 
     /**
-     * This feature covers
-     * {@link androidx.webkit.WebViewCompat#setSafeBrowsingWhitelist(List, ValueCallback)}.
+     * This feature covers {@link androidx.webkit.WebViewCompat#setSafeBrowsingWhitelist(Set,
+     * ValueCallback)}, plumbing through the deprecated boundary interface.
+     *
+     * <p>Don't use this value directly. This exists only so {@link WebViewFeature#isSupported}
+     * supports the <b>deprecated</b> public feature when running against <b>old</b> WebView
+     * versions.
+     *
+     * @deprecated use {@link #SAFE_BROWSING_ALLOWLIST_PREFERRED_TO_DEPRECATED} to test for the
+     * <b>old</b> boundary interface
      */
-    SAFE_BROWSING_WHITELIST(WebViewFeature.SAFE_BROWSING_WHITELIST,
+    @Deprecated
+    SAFE_BROWSING_ALLOWLIST_DEPRECATED_TO_DEPRECATED(WebViewFeature.SAFE_BROWSING_WHITELIST,
             Features.SAFE_BROWSING_WHITELIST, Build.VERSION_CODES.O_MR1),
 
     /**
+     * This feature covers {@link androidx.webkit.WebViewCompat#setSafeBrowsingWhitelist(Set,
+     * ValueCallback)}, plumbing through the new boundary interface.
+     *
+     * <p>Don't use this value directly. This exists only so {@link WebViewFeature#isSupported}
+     * supports the <b>deprecated</b> public feature when running against <b>new</b> WebView
+     * versions.
+     *
+     * @deprecated use {@link #SAFE_BROWSING_ALLOWLIST_PREFERRED_TO_PREFERRED} to test for the
+     * <b>new</b> boundary interface.
+     */
+    @Deprecated
+    SAFE_BROWSING_ALLOWLIST_DEPRECATED_TO_PREFERRED(WebViewFeature.SAFE_BROWSING_WHITELIST,
+            Features.SAFE_BROWSING_ALLOWLIST, Build.VERSION_CODES.O_MR1),
+
+    /**
+     * This feature covers {@link androidx.webkit.WebViewCompat#setSafeBrowsingAllowlist(Set,
+     * ValueCallback)}, plumbing through the deprecated boundary interface.
+     */
+    SAFE_BROWSING_ALLOWLIST_PREFERRED_TO_DEPRECATED(WebViewFeature.SAFE_BROWSING_ALLOWLIST,
+            Features.SAFE_BROWSING_WHITELIST, Build.VERSION_CODES.O_MR1),
+
+    /**
+     * This feature covers {@link androidx.webkit.WebViewCompat#setSafeBrowsingAllowlist(Set,
+     * ValueCallback)}, plumbing through the new boundary interface.
+     */
+    SAFE_BROWSING_ALLOWLIST_PREFERRED_TO_PREFERRED(WebViewFeature.SAFE_BROWSING_ALLOWLIST,
+            Features.SAFE_BROWSING_ALLOWLIST, Build.VERSION_CODES.O_MR1),
+
+    /**
      * This feature covers
      * {@link WebViewCompat#getSafeBrowsingPrivacyPolicyUrl()}.
      */