diff --git a/app-toolkit/dependencies.gradle b/app-toolkit/dependencies.gradle
index 5d7ba57..bec804a 100644
--- a/app-toolkit/dependencies.gradle
+++ b/app-toolkit/dependencies.gradle
@@ -84,5 +84,5 @@
 ext.tools.current_sdk = gradle.ext.currentSdk
 ext.tools.build_tools_version = rootProject.ext.buildToolsVersion
 ext.flatfoot = [:]
-ext.flatfoot.release_version = "1.0.0-alpha7"
+ext.flatfoot.release_version = "1.0.0-alpha8"
 ext.flatfoot.min_sdk = 14
diff --git a/app-toolkit/gradle/wrapper/gradle-wrapper.properties b/app-toolkit/gradle/wrapper/gradle-wrapper.properties
index 1b987ef..54575d6 100644
--- a/app-toolkit/gradle/wrapper/gradle-wrapper.properties
+++ b/app-toolkit/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=../../../../../tools/external/gradle/gradle-4.1-milestone-1-bin.zip
+distributionUrl=../../../../../tools/external/gradle/gradle-4.1-rc-2-bin.zip
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 8a7d69a..64dc797 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -32,7 +32,7 @@
     libs.gradle = 'com.android.tools.build:gradle:' + androidPluginVersionOverride
 } else {
     // Keep gradle plugin version in sync with ub_supportlib-master manifest.
-    libs.gradle = 'com.android.tools.build:gradle:3.0.0-alpha7'
+    libs.gradle = 'com.android.tools.build:gradle:3.0.0-alpha9'
 }
 
 // Other dependencies
diff --git a/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java b/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
index b217c00..c7066c8 100644
--- a/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
+++ b/compat/java/android/support/v4/graphics/TypefaceCompatApi26Impl.java
@@ -284,7 +284,7 @@
     public Typeface createFromResourcesFontFile(
             Context context, Resources resources, int id, String path, int style) {
         if (!isFontFamilyPrivateAPIAvailable()) {
-            super.createFromResourcesFontFile(context, resources, id, path, style);
+            return super.createFromResourcesFontFile(context, resources, id, path, style);
         }
         Object fontFamily = newFamily();
         if (!addFontFromAssetManager(context, fontFamily, path,
diff --git a/core-utils/Android.mk b/core-utils/Android.mk
index b22c376..5ea200e 100644
--- a/core-utils/Android.mk
+++ b/core-utils/Android.mk
@@ -29,10 +29,7 @@
 LOCAL_SRC_FILES := \
     $(call all-java-files-under,gingerbread) \
     $(call all-java-files-under,kitkat) \
-    $(call all-java-files-under,api20) \
     $(call all-java-files-under,api21) \
-    $(call all-java-files-under,api23) \
-    $(call all-java-files-under,api24) \
     $(call all-java-files-under,java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 2a386c4..4e68a5b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=../../../../tools/external/gradle/gradle-4.1-milestone-1-bin.zip
+distributionUrl=../../../../tools/external/gradle/gradle-4.1-rc-2-bin.zip
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt
index 78849eb..3b11efd 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/RoomProcessor.kt
@@ -55,7 +55,7 @@
                     }
             val allDaoMethods = databases?.flatMap { it.daoMethods }
             allDaoMethods?.let {
-                prepareDaosForWriting(databases!!, it)
+                prepareDaosForWriting(databases, it)
                 it.forEach {
                     DaoWriter(it.dao, context.processingEnv).write(context.processingEnv)
                 }
@@ -81,9 +81,7 @@
                     }
                 }
             }
-            context.databaseVerifier?.let {
-                it.closeConnection()
-            }
+            context.databaseVerifier?.closeConnection()
             return mutableSetOf()
         }
         override fun annotations(): MutableSet<out Class<out Annotation>> {
@@ -104,9 +102,7 @@
                             // first suffix guess: Database's simple name
                             val db = databases.first { db -> db.daoMethods.contains(daoMethod) }
                             db.typeName.simpleName()
-                        }.forEach { entry ->
-                            val dbName = entry.key
-                            val methods = entry.value
+                        }.forEach { (dbName, methods) ->
                             if (methods.size == 1) {
                                 //good, db names do not clash, use db name as suffix
                                 methods.first().dao.setSuffix(dbName)
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/ParsedQuery.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/ParsedQuery.kt
index 85d578d..fcf2e08 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/ParsedQuery.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/parser/ParsedQuery.kt
@@ -118,7 +118,6 @@
                 TEXT -> it.text
                 BIND_VAR -> "?"
                 NEWLINE -> "\n"
-                else -> throw IllegalArgumentException("??")
             }
         }
     }
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
index 29a6ba7..a800966 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DaoWriter.kt
@@ -270,7 +270,7 @@
      * Creates EntityUpdateAdapter for each deletion method.
      */
     private fun createDeletionMethods(): List<PreparedStmtQuery> {
-        return createShortcutMethods(dao.deletionMethods, "deletion", { deletionMethod, entity ->
+        return createShortcutMethods(dao.deletionMethods, "deletion", { _, entity ->
             EntityDeletionAdapterWriter(entity)
                     .createAnonymous(this@DaoWriter, dbField.name)
         })
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
index e27600a..fe9e743 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/TableInfoValidationWriter.kt
@@ -44,7 +44,7 @@
 
             addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
                     columnListType, entity.fields.size)
-            entity.fields.forEachIndexed { index, field ->
+            entity.fields.forEach { field ->
                 addStatement("$L.put($S, new $T($S, $S, $L, $L))",
                         columnListVar, field.columnName, RoomTypeNames.TABLE_INFO_COLUMN,
                         /*name*/ field.columnName,
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/CustomConverterProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/CustomConverterProcessorTest.kt
index 34bbd24..6b8dbaf 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/CustomConverterProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/CustomConverterProcessorTest.kt
@@ -61,7 +61,7 @@
     @Test
     fun validCase() {
         singleClass(createConverter(TypeName.SHORT.box(), TypeName.CHAR.box()))
-        { converter, invocation ->
+        { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.SHORT.box()))
             assertThat(converter?.toTypeName, `is`(TypeName.CHAR.box()))
         }.compilesWithoutError()
@@ -69,7 +69,7 @@
 
     @Test
     fun primitiveFrom() {
-        singleClass(createConverter(TypeName.SHORT, TypeName.CHAR.box())) { converter, invocation ->
+        singleClass(createConverter(TypeName.SHORT, TypeName.CHAR.box())) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.SHORT))
             assertThat(converter?.toTypeName, `is`(TypeName.CHAR.box()))
         }.compilesWithoutError()
@@ -77,7 +77,7 @@
 
     @Test
     fun primitiveTo() {
-        singleClass(createConverter(TypeName.INT.box(), TypeName.DOUBLE)) { converter, invocation ->
+        singleClass(createConverter(TypeName.INT.box(), TypeName.DOUBLE)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.INT.box()))
             assertThat(converter?.toTypeName, `is`(TypeName.DOUBLE))
         }.compilesWithoutError()
@@ -85,7 +85,7 @@
 
     @Test
     fun primitiveBoth() {
-        singleClass(createConverter(TypeName.INT, TypeName.DOUBLE)) { converter, invocation ->
+        singleClass(createConverter(TypeName.INT, TypeName.DOUBLE)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.INT))
             assertThat(converter?.toTypeName, `is`(TypeName.DOUBLE))
         }.compilesWithoutError()
@@ -95,7 +95,7 @@
     fun nonNullButNotBoxed() {
         val string = String::class.typeName()
         val date = Date::class.typeName()
-        singleClass(createConverter(string, date)) { converter, invocation ->
+        singleClass(createConverter(string, date)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(string as TypeName))
             assertThat(converter?.toTypeName, `is`(date as TypeName))
         }
@@ -108,7 +108,7 @@
         val typeVarK = TypeVariableName.get("K")
         val map = ParameterizedTypeName.get(Map::class.typeName(), typeVarK, typeVarT)
         singleClass(createConverter(list, map, listOf(typeVarK, typeVarT))) {
-            converter, invocation ->
+            _, _ ->
         }.failsToCompile().withErrorContaining(TYPE_CONVERTER_UNBOUND_GENERIC)
     }
 
@@ -118,7 +118,7 @@
         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, invocation ->
+        singleClass(createConverter(list, map)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(list as TypeName))
             assertThat(converter?.toTypeName, `is`(map as TypeName))
         }.compilesWithoutError()
@@ -131,7 +131,7 @@
                 package ${CONVERTER.packageName()};
                 public class ${CONVERTER.simpleName()} {
                 }
-                """)) { converter, invocation ->
+                """)) { _, _ ->
         }.failsToCompile().withErrorContaining(TYPE_CONVERTER_EMPTY_CLASS)
     }
 
@@ -147,7 +147,7 @@
                     @TypeConverter
                     public int x(short y) {return 0;}
                 }
-                """)) { converter, invocation ->
+                """)) { _, _ ->
         }.failsToCompile().withErrorContaining(TYPE_CONVERTER_MISSING_NOARG_CONSTRUCTOR)
     }
 
@@ -163,7 +163,7 @@
                     @TypeConverter
                     public static int x(short y) {return 0;}
                 }
-                """)) { converter, invocation ->
+                """)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.SHORT))
             assertThat(converter?.toTypeName, `is`(TypeName.INT))
             assertThat(converter?.isStatic, `is`(true))
@@ -181,7 +181,7 @@
                     @TypeConverter static int x(short y) {return 0;}
                     @TypeConverter private static int y(boolean y) {return 0;}
                 }
-                """)) { converter, invocation ->
+                """)) { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.SHORT))
             assertThat(converter?.toTypeName, `is`(TypeName.INT))
             assertThat(converter?.isStatic, `is`(true))
@@ -223,7 +223,7 @@
     @Test
     fun checkDuplicates() {
         singleClass(createConverter(TypeName.SHORT.box(), TypeName.CHAR.box(), duplicate = true))
-        { converter, invocation ->
+        { converter, _ ->
             assertThat(converter?.fromTypeName, `is`(TypeName.SHORT.box()))
             assertThat(converter?.toTypeName, `is`(TypeName.CHAR.box()))
         }.failsToCompile().withErrorContaining("Multiple methods define the same conversion")
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt
index a53cc1e..3ade277 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DaoProcessorTest.kt
@@ -49,7 +49,7 @@
 
     @Test
     fun testNonAbstract() {
-        singleDao("@Dao public class MyDao {}") { dao, invocation -> }
+        singleDao("@Dao public class MyDao {}") { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.DAO_MUST_BE_AN_ABSTRACT_CLASS_OR_AN_INTERFACE)
     }
@@ -60,7 +60,7 @@
                 @Dao public interface MyDao {
                     int getFoo();
                 }
-        """) { dao, invocation ->
+        """) { _, _ ->
         }.failsToCompile()
                 .withErrorContaining(ProcessorErrors.ABSTRACT_METHOD_IN_DAO_MISSING_ANY_ANNOTATION)
     }
@@ -73,7 +73,7 @@
                     @Insert
                     int getFoo(int x);
                 }
-        """) { dao, invocation ->
+        """) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.CANNOT_USE_MORE_THAN_ONE_DAO_METHOD_ANNOTATION)
     }
@@ -85,7 +85,7 @@
                     @Query("SELECT uid FROM User")
                     abstract int[] getIds();
                 }
-                """) { dao, invocation ->
+                """) { dao, _ ->
             assertThat(dao.queryMethods.size, `is`(1))
             val method = dao.queryMethods.first()
             assertThat(method.name, `is`("getIds"))
@@ -99,7 +99,7 @@
                     @Query("SELECT uid FROM User")
                     abstract int[] getIds();
                 }
-                """) { dao, invocation ->
+                """) { dao, _ ->
             assertThat(dao.queryMethods.size, `is`(1))
             val method = dao.queryMethods.first()
             assertThat(method.name, `is`("getIds"))
@@ -115,7 +115,7 @@
                     @Insert
                     abstract void insert(User user);
                 }
-                """) { dao, invocation ->
+                """) { dao, _ ->
             assertThat(dao.queryMethods.size, `is`(1))
             val method = dao.queryMethods.first()
             assertThat(method.name, `is`("getIds"))
@@ -132,7 +132,7 @@
                     @Query("SELECT nonExistingField FROM User")
                     abstract int[] getIds();
                 }
-                """) { dao, invocation ->
+                """) { dao, _ ->
             assertThat(dao.queryMethods.size, `is`(1))
             val method = dao.queryMethods.first()
             assertThat(method.name, `is`("getIds"))
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DatabaseProcessorTest.kt
index 56e6641..40e9a96 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/DatabaseProcessorTest.kt
@@ -151,7 +151,7 @@
             public abstract class MyDb extends RoomDatabase {
                 abstract UserDao userDao();
             }
-            """, USER, USER_DAO) { db, invocation ->
+            """, USER, USER_DAO) { db, _ ->
             assertThat(db.daoMethods.size, `is`(1))
             assertThat(db.entities.size, `is`(1))
         }.compilesWithoutError()
@@ -165,7 +165,7 @@
                 abstract UserDao userDao();
                 abstract BookDao bookDao();
             }
-            """, USER, USER_DAO, BOOK, BOOK_DAO) { db, invocation ->
+            """, USER, USER_DAO, BOOK, BOOK_DAO) { db, _ ->
             assertThat(db.daoMethods.size, `is`(2))
             assertThat(db.entities.size, `is`(2))
             assertThat(db.daoMethods.map { it.name }, `is`(listOf("userDao", "bookDao")))
@@ -180,7 +180,7 @@
             @Database(entities = {User.class, Book.class}, version = 42)
             public abstract class MyDb {
             }
-            """, USER, BOOK) { db, invocation ->
+            """, USER, BOOK) { _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.DB_MUST_EXTEND_ROOM_DB)
     }
 
@@ -201,7 +201,7 @@
                     @Query("SELECT * FROM nonExistentTable")
                     public java.util.List<Book> loadAllBooks();
                 }
-                """)){ db, invocation ->
+                """)){ _, _ ->
 
         }.failsToCompile().withErrorContaining("no such table: nonExistentTable")
     }
@@ -222,7 +222,7 @@
                     @PrimaryKey
                     int uid;
                 }
-                """)) { db, invocation ->
+                """)) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.duplicateTableNames("user",
                         listOf("foo.bar.User", "foo.bar.AnotherClass"))
@@ -247,7 +247,7 @@
                     @Query("SELECT nonExistingField FROM Book")
                     public java.util.List<Book> loadAllBooks();
                 }
-                """)){ db, invocation ->
+                """)){ _, _ ->
 
         }.compilesWithoutError()
     }
@@ -294,7 +294,7 @@
                     abstract UserDao userDao();
                     abstract UserDao userDao2();
                 }
-                """, USER, USER_DAO){db, invocation -> }
+                """, USER, USER_DAO){ _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.DAO_METHOD_CONFLICTS_WITH_OTHERS)
                 .and()
@@ -347,7 +347,7 @@
                 @Database(entities = {Entity1.class, Entity2.class}, version = 42)
                 public abstract class MyDb extends RoomDatabase {
                 }
-                """, entity1, entity2){ db, invocation ->
+                """, entity1, entity2){ _, _ ->
 
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.duplicateIndexInDatabase("index_name",
@@ -374,7 +374,7 @@
                 @Database(entities = {Entity1.class}, version = 42)
                 public abstract class MyDb extends RoomDatabase {
                 }
-                """, entity1, COMMON.USER){ db, invocation ->
+                """, entity1, COMMON.USER){ _, _ ->
 
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.foreignKeyMissingParentEntityInDatabase("User", "foo.bar.Entity1")
@@ -400,7 +400,7 @@
                 @Database(entities = {Entity1.class, User.class}, version = 42)
                 public abstract class MyDb extends RoomDatabase {
                 }
-                """, entity1, COMMON.USER){ db, invocation ->
+                """, entity1, COMMON.USER){ _, _ ->
 
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.foreignKeyMissingIndexInParent(
@@ -444,7 +444,7 @@
                 @Database(entities = {Entity1.class, Entity2.class}, version = 42)
                 public abstract class MyDb extends RoomDatabase {
                 }
-                """, entity1, entity2){ db, invocation ->
+                """, entity1, entity2){ _, _ ->
 
         }.compilesWithoutError()
     }
@@ -481,7 +481,7 @@
                 @Database(entities = {Entity1.class, Entity2.class}, version = 42)
                 public abstract class MyDb extends RoomDatabase {
                 }
-                """, entity1, entity2){ db, invocation ->
+                """, entity1, entity2){ _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.foreignKeyParentColumnDoesNotExist("foo.bar.Entity2",
                         "anotherName2", listOf("uid", "anotherName"))
@@ -521,7 +521,7 @@
                 @Database(entities = {Entity1.class, Entity2.class}, version = 42)
                 public abstract class MyDb extends RoomDatabase {
                 }
-                """, entity1, entity2){ db, invocation ->
+                """, entity1, entity2){ _, _ ->
         }.compilesWithoutError()
     }
 
@@ -532,7 +532,7 @@
                 public abstract class MyDb extends RoomDatabase {
                     abstract BookDao bookDao();
                 }
-                """, USER, USER_DAO, BOOK, BOOK_DAO){ db, invocation ->
+                """, USER, USER_DAO, BOOK, BOOK_DAO){ _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.shortcutEntityIsNotInDatabase(
                         database = "foo.bar.MyDb",
@@ -566,7 +566,7 @@
                         public static java.util.Date foo(Long input) {return null;}
                     }
                 }
-                """, USER, USER_DAO){ db, invocation ->
+                """, USER, USER_DAO){ db, _ ->
             val userDao = db.daoMethods.first().dao
             val insertionMethod = userDao.insertionMethods.find { it.name == "insert" }
             assertThat(insertionMethod, notNullValue())
@@ -597,7 +597,7 @@
                 public abstract class MyDb extends RoomDatabase {
                     public abstract UserDao userDao();
                 }
-                """, USER, USER_DAO){ db, invocation ->
+                """, USER, USER_DAO){ db, _ ->
             val userDao = db.daoMethods.first().dao
             val loadOne = userDao.queryMethods.find { it.name == "loadOnePojo" }
             assertThat(loadOne, notNullValue())
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
index 34c522e..2238eb2 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/EntityProcessorTest.kt
@@ -65,7 +65,7 @@
                 @PrimaryKey
                 private int id;
                 public void setId(int id) {this.id = id;}
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD)
     }
@@ -77,7 +77,7 @@
                 private int id;
                 public float getId() {return 0f;}
                 public void setId(int id) {this.id = id;}
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD)
     }
@@ -89,7 +89,7 @@
                 private int id;
                 public int getId() {return id;}
                 public void setId(float id) {}
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_FIND_SETTER_FOR_FIELD)
     }
@@ -101,7 +101,7 @@
                 private int id;
                 public int getId() {return id;}
                 public void setId(Integer id) {}
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .compilesWithoutError()
     }
 
@@ -112,7 +112,7 @@
                 private int id;
                 public Integer getId() {return id;}
                 public void setId(int id) {}
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .compilesWithoutError()
     }
 
@@ -122,7 +122,7 @@
                 @PrimaryKey
                 private int id;
                 public int getId(){ return id; }
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_FIND_SETTER_FOR_FIELD)
     }
@@ -135,7 +135,7 @@
                 public void setId(int id) {}
                 public int getId(){ return id; }
                 public int id(){ return id; }
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining("getId, id")
     }
@@ -148,7 +148,7 @@
                 public void setId(int id) {}
                 public int getId(){ return id; }
                 @Ignore public int id(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().getter.name, `is`("getId"))
         }.compilesWithoutError()
     }
@@ -161,7 +161,7 @@
                 public void setId(int id) {}
                 public int getId(){ return id; }
                 protected int id(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().getter.name, `is`("getId"))
         }.compilesWithoutError()
     }
@@ -173,7 +173,7 @@
                 public int id;
                 public void setId(int id) {}
                 public int getId(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().getter.name, `is`("id"))
             assertThat(entity.fields.first().getter.callType, `is`(CallType.FIELD))
         }.compilesWithoutError()
@@ -187,7 +187,7 @@
                 public void setId(int id) {}
                 public void id(int id) {}
                 public int getId(){ return id; }
-                """) { entity, invocation -> }
+                """) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining("setId, id")
     }
@@ -200,7 +200,7 @@
                 public void setId(int id) {}
                 @Ignore public void id(int id) {}
                 public int getId(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().setter.name, `is`("setId"))
         }.compilesWithoutError()
     }
@@ -213,7 +213,7 @@
                 public void setId(int id) {}
                 protected void id(int id) {}
                 public int getId(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().setter.name, `is`("setId"))
         }.compilesWithoutError()
     }
@@ -225,7 +225,7 @@
                 public int id;
                 public void setId(int id) {}
                 public int getId(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().setter.name, `is`("id"))
             assertThat(entity.fields.first().setter.callType, `is`(CallType.FIELD))
         }.compilesWithoutError()
@@ -238,7 +238,7 @@
                 int id;
                 public void setId(int id) {}
                 public int getId(){ return id; }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.fields.first().setter.name, `is`("setId"))
             assertThat(entity.fields.first().getter.name, `is`("getId"))
         }.compilesWithoutError()
@@ -249,7 +249,7 @@
         singleEntity("""
                 @PrimaryKey
                 int x;
-                """, hashMapOf(Pair("tableName", "\"foo_table\""))) { entity, invocation ->
+                """, hashMapOf(Pair("tableName", "\"foo_table\""))) { entity, _ ->
             assertThat(entity.tableName, `is`("foo_table"))
         }.compilesWithoutError()
     }
@@ -259,14 +259,14 @@
         singleEntity("""
                 @PrimaryKey
                 int x;
-                """, hashMapOf(Pair("tableName", "\" \""))) { entity, invocation ->
+                """, hashMapOf(Pair("tableName", "\" \""))) { _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.ENTITY_TABLE_NAME_CANNOT_BE_EMPTY)
     }
 
     @Test
     fun missingPrimaryKey() {
         singleEntity("""
-                """) { entity, invocation ->
+                """) { _, _ ->
         }.failsToCompile()
                 .withErrorContaining(ProcessorErrors.MISSING_PRIMARY_KEY)
     }
@@ -276,7 +276,7 @@
         singleEntity("""
                 @PrimaryKey
                 public java.util.Date myDate;
-                """) { entity, invocation ->
+                """) { _, _ ->
 
         }.failsToCompile().withErrorContaining(ProcessorErrors.CANNOT_FIND_COLUMN_TYPE_ADAPTER)
     }
@@ -295,7 +295,7 @@
                     int y;
                 }
                 """
-        ) { entity, invocation ->
+        ) { entity, _ ->
             assertThat(entity.primaryKey.fields.map { it.name }, `is`(listOf("id")))
         }.compilesWithoutError()
                 .withWarningCount(1)
@@ -318,7 +318,7 @@
                     int y;
                 }
                 """
-        ) { entity, invocation ->
+        ) { entity, _ ->
             assertThat(entity.primaryKey.fields.map { it.name }, `is`(listOf("id")))
         }.compilesWithoutError().withWarningCount(0)
     }
@@ -355,7 +355,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "index_MyEntity_foo",
                             unique = false,
@@ -371,7 +371,7 @@
                 public int id;
                 @ColumnInfo(index = true)
                 public String foo;
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "index_MyEntity_foo",
                             unique = false,
@@ -391,7 +391,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "index_MyEntity_foo_id",
                             unique = false,
@@ -413,7 +413,7 @@
                 @ColumnInfo(name = "bar_column")
                 public String bar;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "index_MyEntity_foo_id",
                             unique = false,
@@ -436,7 +436,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "index_MyEntity_foo_id",
                             unique = true,
@@ -456,7 +456,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "myName",
                             unique = false,
@@ -477,7 +477,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { entity, _ ->
             assertThat(entity.indices, `is`(
                     listOf(Index(name = "index_MyTable_foo",
                             unique = false,
@@ -497,7 +497,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.INDEX_COLUMNS_CANNOT_BE_EMPTY
         )
@@ -514,7 +514,7 @@
                 public int id;
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.indexColumnDoesNotExist("bar", listOf("id, foo"))
         )
@@ -532,7 +532,7 @@
                 @ColumnInfo(index = true)
                 public String foo;
                 """
-                , annotation) { entity, invocation ->
+                , annotation) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.duplicateIndexInEntity("index_MyEntity_foo")
         )
@@ -556,7 +556,7 @@
                 """
                 @PrimaryKey
                 public int id;
-                """, baseClass = "foo.bar.Base", jfos = listOf(parent)) { entity, invocation ->
+                """, baseClass = "foo.bar.Base", jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.indices.isEmpty(), `is`(true))
         }.compilesWithoutError()
                 .withWarningContaining(
@@ -597,7 +597,7 @@
                 baseClass = "foo.bar.Parent",
                 attributes = hashMapOf("inheritSuperIndices" to "true"),
                 jfos = listOf(parent, grandParent)) {
-            entity, invocation ->
+            entity, _ ->
             assertThat(entity.indices.size, `is`(1))
             assertThat(entity.indices.first(),
                     `is`(Index(name = "index_MyEntity_name_lastName",
@@ -626,7 +626,7 @@
                 """,
                 baseClass = "foo.bar.Base",
                 attributes = hashMapOf("inheritSuperIndices" to "true"),
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.indices.size, `is`(1))
             assertThat(entity.indices.first(),
                     `is`(Index(name = "index_MyEntity_name_lastName",
@@ -656,7 +656,7 @@
                 """,
                 baseClass = "foo.bar.Base",
                 attributes = hashMapOf("inheritSuperIndices" to "true"),
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.indices.size, `is`(1))
             assertThat(entity.indices.first(),
                     `is`(Index(name = "index_MyEntity_name",
@@ -693,7 +693,7 @@
                 @PrimaryKey
                 public int id;
                 """, baseClass = "foo.bar.Parent", jfos = listOf(parent, grandParent)) {
-            entity, invocation ->
+            entity, _ ->
             assertThat(entity.indices.isEmpty(), `is`(true))
         }.compilesWithoutError()
                 .withWarningContaining(
@@ -720,7 +720,7 @@
                 """
                 @PrimaryKey
                 public int id;
-                """, baseClass = "foo.bar.Base", jfos = listOf(parent)) { entity, invocation ->
+                """, baseClass = "foo.bar.Base", jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.indices.isEmpty(), `is`(true))
         }.compilesWithoutError()
                 .withWarningContaining(
@@ -746,7 +746,7 @@
                     @ColumnInfo(index = true)
                     public int a;
                 }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.indices.isEmpty(), `is`(true))
         }.compilesWithoutError()
                 .withWarningContaining(
@@ -770,7 +770,7 @@
                     @ColumnInfo(index = true)
                     public int a;
                 }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.indices.isEmpty(), `is`(true))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.CANNOT_USE_MORE_THAN_ONE_POJO_FIELD_ANNOTATION
@@ -789,7 +789,7 @@
                     @ColumnInfo(index = true)
                     public int a;
                 }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.indices.isEmpty(), `is`(true))
         }.compilesWithoutError()
                 .withWarningContaining(
@@ -808,7 +808,7 @@
                 static class Foo {
                     public int a;
                 }
-                """, attributes = mapOf("indices" to "@Index(\"a\")")) { entity, invocation ->
+                """, attributes = mapOf("indices" to "@Index(\"a\")")) { entity, _ ->
             assertThat(entity.indices.size, `is`(1))
             assertThat(entity.indices.first(), `is`(
                     Index(
@@ -828,7 +828,7 @@
                 @PrimaryKey
                 public String foo;
                 """,
-                attributes = mapOf("primaryKeys" to "\"id\"")) { entity, invocation ->
+                attributes = mapOf("primaryKeys" to "\"id\"")) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.multiplePrimaryKeyAnnotations(
                         listOf("PrimaryKey[id]", "PrimaryKey[foo]")
@@ -841,7 +841,7 @@
                 """
                 public int id;
                 """,
-                attributes = mapOf("primaryKeys" to "\"foo\"")) { entity, invocation ->
+                attributes = mapOf("primaryKeys" to "\"foo\"")) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.primaryKeyColumnDoesNotExist("foo", listOf("id")))
     }
@@ -853,7 +853,7 @@
                 int x;
                 @PrimaryKey
                 int y;
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.primaryKey.fields.isEmpty(), `is`(true))
         }.failsToCompile()
                 .withErrorContaining(
@@ -878,7 +878,7 @@
                 public int id;
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("baseId"))
 
         }.compilesWithoutError().withWarningCount(0)
@@ -901,7 +901,7 @@
                 public int id;
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("baseId"))
         }.compilesWithoutError().withWarningCount(0)
     }
@@ -924,7 +924,7 @@
                 public int id;
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.size, `is`(1))
             assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
             assertThat(entity.primaryKey.autoGenerateId, `is`(false))
@@ -951,7 +951,7 @@
                 public int id;
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.size, `is`(1))
             assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
         }.compilesWithoutError().withNoteContaining(
@@ -977,7 +977,7 @@
                 """,
                 baseClass = "foo.bar.Base",
                 jfos = listOf(parent),
-                attributes = mapOf("primaryKeys" to "\"id\"")) { entity, invocation ->
+                attributes = mapOf("primaryKeys" to "\"id\"")) { entity, _ ->
             assertThat(entity.primaryKey.fields.size, `is`(1))
             assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
             assertThat(entity.primaryKey.autoGenerateId, `is`(false))
@@ -993,7 +993,7 @@
                     """
                 @PrimaryKey(autoGenerate = true)
                 public $type id;
-                """) { entity, invocation ->
+                """) { entity, _ ->
                 assertThat(entity.primaryKey.fields.size, `is`(1))
                 assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
                 assertThat(entity.primaryKey.autoGenerateId, `is`(true))
@@ -1008,7 +1008,7 @@
                     """
                 @PrimaryKey(autoGenerate = true)
                 public $type id;
-                """) { entity, invocation ->
+                """) { entity, _ ->
                 assertThat(entity.primaryKey.fields.size, `is`(1))
                 assertThat(entity.primaryKey.fields.firstOrNull()?.name, `is`("id"))
                 assertThat(entity.primaryKey.autoGenerateId, `is`(true))
@@ -1031,7 +1031,7 @@
                     public int a;
                     public int b;
                 }
-                """) { entity, invocation ->
+                """) { entity, _ ->
             assertThat(entity.primaryKey.fields.map { it.columnName },
                     `is`(listOf("bar_a", "bar_b")))
         }.compilesWithoutError().withWarningCount(0)
@@ -1062,7 +1062,7 @@
                 public int id;
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.map { it.columnName },
                     `is`(listOf("bar_a", "bar_b")))
         }.compilesWithoutError().withWarningCount(0)
@@ -1094,7 +1094,7 @@
                 }
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.map { it.columnName },
                     `is`(listOf("bar_a", "bar_b")))
         }.compilesWithoutError().withNoteContaining(
@@ -1127,7 +1127,7 @@
                 public int id;
                 """,
                 baseClass = "foo.bar.Base",
-                jfos = listOf(parent)) { entity, invocation ->
+                jfos = listOf(parent)) { entity, _ ->
             assertThat(entity.primaryKey.fields.map { it.columnName },
                     `is`(listOf("id")))
         }.compilesWithoutError().withNoteContaining(
@@ -1143,7 +1143,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid")
                 java.util.List<User> users;
                 """, jfos = listOf(COMMON.USER)
-        ) { entity, invocation ->
+        ) { _, _ ->
         }.failsToCompile().withErrorContaining(RELATION_IN_ENTITY)
     }
 
@@ -1164,7 +1164,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.INVALID_FOREIGN_KEY_ACTION)
     }
 
@@ -1184,7 +1184,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining("cannot find symbol")
     }
 
@@ -1204,7 +1204,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.NOT_AN_ENTITY)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.foreignKeyNotAnEntity(
                 COMMON.NOT_AN_ENTITY_TYPE_NAME.toString()))
     }
@@ -1225,7 +1225,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.foreignKeyChildColumnDoesNotExist(
                 "namex", listOf("id", "name")))
     }
@@ -1246,7 +1246,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.foreignKeyColumnNumberMismatch(
                 listOf("name", "id"), listOf("lastName")))
     }
@@ -1267,7 +1267,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.FOREIGN_KEY_EMPTY_CHILD_COLUMN_LIST)
     }
 
@@ -1287,7 +1287,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.FOREIGN_KEY_EMPTY_PARENT_COLUMN_LIST)
     }
 
@@ -1310,7 +1310,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ entity, _ ->
             assertThat(entity.foreignKeys.size, `is`(1))
             val fKey = entity.foreignKeys.first()
             assertThat(fKey.parentTable, `is`("User"))
@@ -1342,7 +1342,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ) { entity, invocation ->
+        ) { _, _ ->
         }.compilesWithoutWarnings()
     }
 
@@ -1367,7 +1367,7 @@
                 String lName;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ) { entity, invocation ->
+        ) { entity, _ ->
             assertThat(entity.indices.size, `is`(1))
         }.compilesWithoutWarnings()
     }
@@ -1393,7 +1393,7 @@
                 String lName;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ) { entity, invocation ->
+        ) { entity, _ ->
             assertThat(entity.indices.size, `is`(1))
         }.compilesWithoutWarnings()
     }
@@ -1417,7 +1417,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ entity, _ ->
             assertThat(entity.indices, `is`(emptyList()))
         }.compilesWithoutError().withWarningContaining(
                 ProcessorErrors.foreignKeyMissingIndexInChildColumn("name"))
@@ -1440,7 +1440,7 @@
                 String lName;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ entity, _ ->
             assertThat(entity.indices, `is`(emptyList()))
         }.compilesWithoutError().withWarningContaining(
                 ProcessorErrors.foreignKeyMissingIndexInChildColumns(listOf("lName", "name")))
@@ -1465,7 +1465,7 @@
                 String name;
                 """,
                 attributes = annotation, jfos = listOf(COMMON.USER)
-        ){ entity, invocation ->
+        ){ entity, _ ->
             assertThat(entity.indices, `is`(emptyList()))
         }.compilesWithoutWarnings()
     }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/FieldProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/FieldProcessorTest.kt
index fb64c7c..5498340 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/FieldProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/FieldProcessorTest.kt
@@ -170,7 +170,7 @@
         singleEntity("""
             @ColumnInfo(name = "")
             int x;
-            """) { field, invocation ->
+            """) { _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.COLUMN_NAME_CANNOT_BE_EMPTY)
     }
 
@@ -246,7 +246,7 @@
                 static class BaseClass<T> {
                     T item;
                 }
-                """) { field, invocation -> }.failsToCompile()
+                """) { _, _ -> }.failsToCompile()
                 .withErrorContaining(ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_ENTITY_FIELDS)
     }
 
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/InsertionMethodProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/InsertionMethodProcessorTest.kt
index aff6346..ffb07ed 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/InsertionMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/InsertionMethodProcessorTest.kt
@@ -65,7 +65,7 @@
                 """
                 @Insert
                 abstract public void foo();
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(0))
             assertThat(insertion.returnType.typeName(), `is`(TypeName.VOID))
@@ -80,7 +80,7 @@
                 """
                 @Insert
                 abstract public long foo(User user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -98,7 +98,7 @@
                 """
                 @Insert
                 abstract public void foo(NotAnEntity notValid);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("foo"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -115,7 +115,7 @@
                 """
                 @Insert
                 abstract public void foo(User u1, User u2);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("foo"))
 
             assertThat(insertion.parameters.size, `is`(2))
@@ -137,7 +137,7 @@
                 """
                 @Insert
                 abstract public List<Long> insertUsers(List<User> users);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -160,7 +160,7 @@
                 """
                 @Insert
                 abstract public void insertUsers(User[] users);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -178,7 +178,7 @@
                 """
                 @Insert
                 abstract public void insertUsers(Set<User> users);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -197,7 +197,7 @@
                 """
                 @Insert
                 abstract public void insertUsers(Queue<User> users);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("insertUsers"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -215,7 +215,7 @@
         singleInsertMethod("""
                 @Insert
                 abstract public void insert(Iterable<User> users);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("insert"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -233,7 +233,7 @@
                 static class MyList<Irrelevant, Item> extends ArrayList<Item> {}
                 @Insert
                 abstract public void insert(MyList<String, User> users);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.name, `is`("insert"))
             assertThat(insertion.parameters.size, `is`(1))
             val param = insertion.parameters.first()
@@ -252,7 +252,7 @@
                 """
                 @Insert
                 abstract public void foo(User u1, Book b1);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.parameters.size, `is`(2))
             assertThat(insertion.parameters[0].type.typeName().toString(),
                     `is`("foo.bar.User"))
@@ -272,7 +272,7 @@
                 """
                 @Insert
                 abstract public void foo(User user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.onConflict, `is`(OnConflictStrategy.ABORT))
         }.compilesWithoutError()
     }
@@ -283,7 +283,7 @@
                 """
                 @Insert(onConflict = -1)
                 abstract public void foo(User user);
-                """) { insertion, invocation ->
+                """) { _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.INVALID_ON_CONFLICT_VALUE)
     }
 
@@ -300,7 +300,7 @@
                     """
                 @Insert(onConflict=OnConflictStrategy.${pair.first})
                 abstract public void foo(User user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
                 assertThat(insertion.onConflict, `is`(pair.second))
             }.compilesWithoutError()
         }
@@ -312,7 +312,7 @@
                 """
                 @Insert
                 abstract public int foo(User user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.insertionType, `is`(nullValue()))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.INVALID_INSERTION_METHOD_RETURN_TYPE)
@@ -324,7 +324,7 @@
                 """
                 @Insert
                 abstract public long[] foo(User user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.insertionType, `is`(nullValue()))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.insertionMethodReturnTypeMismatch(
@@ -338,7 +338,7 @@
                 """
                 @Insert
                 abstract public long foo(User... user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.insertionType, `is`(nullValue()))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.insertionMethodReturnTypeMismatch(
@@ -352,7 +352,7 @@
                 """
                 @Insert
                 abstract public long foo(User user1, User user2);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
             assertThat(insertion.insertionType, `is`(nullValue()))
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.insertionMethodReturnTypeMismatch(
@@ -379,7 +379,7 @@
                     """
                 @Insert
                 abstract public ${pair.first} foo(User$dots user);
-                """) { insertion, invocation ->
+                """) { insertion, _ ->
                 assertThat(insertion.insertMethodTypeFor(insertion.parameters.first()),
                         `is`(pair.second))
                 assertThat(pair.toString(), insertion.insertionType, `is`(pair.second))
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
index 0a5026a..faa6024 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/PojoProcessorTest.kt
@@ -58,7 +58,7 @@
 class PojoProcessorTest {
 
     companion object {
-        val MY_POJO = ClassName.get("foo.bar", "MyPojo")
+        val MY_POJO: ClassName = ClassName.get("foo.bar", "MyPojo")
         val HEADER = """
             package foo.bar;
             import android.arch.persistence.room.*;
@@ -186,7 +186,7 @@
                 @ColumnInfo(name = "id")
                 int another;
                 """
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.pojoDuplicateFieldNames("id", listOf("id", "another"))
         ).and().withErrorContaining(
@@ -206,7 +206,7 @@
                     int x;
                 }
                 """
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.pojoDuplicateFieldNames("id", listOf("id", "foo > x"))
         ).and().withErrorContaining(
@@ -228,7 +228,7 @@
                     int y;
                 }
                 """
-        ) { pojo ->
+        ) { _ ->
         }.compilesWithoutError().withWarningCount(0)
     }
 
@@ -240,7 +240,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid")
                 public User user;
                 """, COMMON.USER
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(RELATION_NOT_COLLECTION)
     }
 
@@ -253,7 +253,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid")
                 public List<User> user;
                 """, COMMON.USER
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.CANNOT_USE_MORE_THAN_ONE_POJO_FIELD_ANNOTATION)
     }
@@ -266,7 +266,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid")
                 public List<NotAnEntity> user;
                 """, COMMON.NOT_AN_ENTITY
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(ENTITY_MUST_BE_ANNOTATED_WITH_ENTITY)
     }
 
@@ -278,7 +278,7 @@
                 @Relation(parentColumn = "idk", entityColumn = "uid")
                 public List<User> user;
                 """, COMMON.USER
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(
                 relationCannotFindParentEntityField("foo.bar.MyPojo", "idk", listOf("id"))
         )
@@ -292,7 +292,7 @@
                 @Relation(parentColumn = "id", entityColumn = "idk")
                 public List<User> user;
                 """, COMMON.USER
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(
                 relationCannotFindEntityField("foo.bar.User", "idk",
                         listOf("uid", "name", "lastName", "age"))
@@ -307,7 +307,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid")
                 public List<User> user;
                 """
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(CANNOT_FIND_TYPE)
     }
 
@@ -343,7 +343,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid", entity = User.class)
                 public List<UserWithNested> user;
                 """, COMMON.USER
-        ) { pojo, invocation ->
+        ) { pojo, _ ->
             assertThat(pojo.relations.first().parentField.name, `is`("id"))
         }.compilesWithoutError().withWarningCount(0)
     }
@@ -394,7 +394,7 @@
                 @Relation(parentColumn = "id", entityColumn = "uid", projection={"i_dont_exist"})
                 public List<User> user;
                 """, COMMON.USER
-        ) { pojo ->
+        ) { _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.relationBadProject("foo.bar.User", listOf("i_dont_exist"),
                         listOf("uid", "name", "lastName", "ageColumn"))
@@ -461,10 +461,10 @@
 
     @Test
     fun constructor_empty() {
-        val pojo = """
+        val pojoCode = """
             public String mName;
             """
-        singleRun(pojo) { pojo ->
+        singleRun(pojoCode) { pojo ->
             assertThat(pojo.constructor, notNullValue())
             assertThat(pojo.constructor?.params, `is`(emptyList<Constructor.Param>()))
         }.compilesWithoutError()
@@ -472,13 +472,13 @@
 
     @Test
     fun constructor_ambiguous_twoFieldsExcatMatch() {
-        val pojo = """
+        val pojoCode = """
             public String mName;
             public String _name;
             public MyPojo(String mName) {
             }
             """
-        singleRun(pojo) { pojo ->
+        singleRun(pojoCode) { pojo ->
             val param = pojo.constructor?.params?.first()
             assertThat(param, instanceOf(Constructor.FieldParam::class.java))
             assertThat((param as Constructor.FieldParam).field.name,  `is`("mName"))
@@ -489,13 +489,13 @@
 
     @Test
     fun constructor_ambiguous_oneTypeMatches() {
-        val pojo = """
+        val pojoCode = """
             public String mName;
             public int _name;
             public MyPojo(String name) {
             }
             """
-        singleRun(pojo) { pojo ->
+        singleRun(pojoCode) { pojo ->
             val param = pojo.constructor?.params?.first()
             assertThat(param, instanceOf(Constructor.FieldParam::class.java))
             assertThat((param as Constructor.FieldParam).field.name,  `is`("mName"))
@@ -512,7 +512,7 @@
             public MyPojo(String name) {
             }
             """
-        singleRun(pojo) { pojo ->
+        singleRun(pojo) { _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.ambigiousConstructor(MY_POJO.toString(),
                         "name", listOf("mName", "_name"))
@@ -525,7 +525,7 @@
             int foo;
             public MyPojo(String foo) {
             }
-        """) { pojo ->
+        """) { _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.MISSING_POJO_CONSTRUCTOR)
     }
 
@@ -536,7 +536,7 @@
             String _name;
             public MyPojo(String foo) {
             }
-        """) { pojo ->
+        """) { _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.MISSING_POJO_CONSTRUCTOR)
     }
 
@@ -547,7 +547,7 @@
             int bar;
             public MyPojo(String foo, String name) {
             }
-        """) { pojo ->
+        """) { _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.MISSING_POJO_CONSTRUCTOR)
     }
 
@@ -560,7 +560,7 @@
             }
             public MyPojo(String name, String lastName) {
             }
-        """) { pojo ->
+        """) { _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.TOO_MANY_POJO_CONSTRUCTORS)
     }
 
@@ -589,7 +589,7 @@
         singleRun("""
             String mName;
             String mLastName;
-        """) { pojo, invocation ->
+        """) { _, invocation ->
             val process2 = PojoProcessor(baseContext = invocation.context,
                     element = invocation.typeElement(MY_POJO.toString()),
                     bindingScope = FieldProcessor.BindingScope.BIND_TO_STMT,
@@ -603,7 +603,7 @@
         singleRun("""
             String mName;
             String mLastName;
-        """) { pojo, invocation ->
+        """) { _, invocation ->
             val process2 = PojoProcessor(baseContext = invocation.context,
                     element = invocation.typeElement(MY_POJO.toString()),
                     bindingScope = FieldProcessor.BindingScope.TWO_WAY,
@@ -614,7 +614,7 @@
 
     fun singleRun(code: String, vararg jfos:JavaFileObject, handler: (Pojo) -> Unit)
             : CompileTester {
-        return singleRun(code, *jfos) { pojo, invocation ->
+        return singleRun(code, *jfos) { pojo, _ ->
             handler(pojo)
         }
     }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
index f7affbc..c80dd87 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/QueryMethodProcessorTest.kt
@@ -71,7 +71,7 @@
                 abstract class MyClass {
                 """
         const val DAO_SUFFIX = "}"
-        val POJO = ClassName.get("foo.bar", "MyClass.Pojo")
+        val POJO: ClassName = ClassName.get("foo.bar", "MyClass.Pojo")
         @Parameterized.Parameters(name = "enableDbVerification={0}")
         @JvmStatic
         fun getParams() = arrayOf(true, false)
@@ -94,7 +94,7 @@
                 """
                 @Query("SELECT * from User")
                 abstract public int[] foo();
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(0))
             assertThat(parsedQuery.returnType.typeName(),
@@ -143,7 +143,7 @@
                 """
                 @Query("SELECT uid from User where uid = :id")
                 abstract public long getIdById(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val section = parsedQuery.query.bindSections.first()
             val param = parsedQuery.parameters.firstOrNull()
             assertThat(section, notNullValue())
@@ -158,7 +158,7 @@
                 """
                 @Query("SELECT uid from User where uid = :id")
                 abstract public long getIdById(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val section = parsedQuery.query.bindSections.first()
             val param = parsedQuery.parameters.firstOrNull()
             assertThat(section, notNullValue())
@@ -174,7 +174,7 @@
                 """
                 @Query("SELECT uid from User where uid = :id OR uid = :id")
                 abstract public long getIdById(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val section = parsedQuery.query.bindSections[0]
             val section2 = parsedQuery.query.bindSections[1]
             val param = parsedQuery.parameters.firstOrNull()
@@ -192,7 +192,7 @@
                 """
                 @Query("SELECT uid from User where uid = :id OR uid = :uid")
                 abstract public long getIdById(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val section = parsedQuery.query.bindSections[0]
             val section2 = parsedQuery.query.bindSections[1]
             val param = parsedQuery.parameters.firstOrNull()
@@ -213,7 +213,7 @@
                 """
                 @Query("SELECT uid from User where name = :bar AND uid = :id OR uid = :uid")
                 abstract public long getIdById(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val bar = parsedQuery.query.bindSections[0]
             val id = parsedQuery.query.bindSections[1]
             val uid = parsedQuery.query.bindSections[2]
@@ -236,7 +236,7 @@
                 """
                 @Query("SELECT uid from User where name = :bar")
                 abstract public long getIdById(int bar, int whyNotUseMe);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val bar = parsedQuery.query.bindSections[0]
             val barParam = parsedQuery.parameters.firstOrNull()
             assertThat(bar, notNullValue())
@@ -254,7 +254,7 @@
                 @Query("select * from User where uid = :_blah")
                 abstract public long getSth(int _blah);
                 """
-        ) { parsedQuery, invocation -> }
+        ) { _, _ -> }
                 .failsToCompile()
                 .withErrorContaining(ProcessorErrors.QUERY_PARAMETERS_CANNOT_START_WITH_UNDERSCORE)
     }
@@ -265,7 +265,7 @@
                 """
                 @Query("select * from User")
                 abstract public <T> java.util.List<T> foo(int x);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             val expected: TypeName = ParameterizedTypeName.get(ClassName.get(List::class.java),
                     TypeVariableName.get("T"))
             assertThat(parsedQuery.returnType.typeName(), `is`(expected))
@@ -279,7 +279,7 @@
                 """
                 @Query("select * from :1 :2")
                 abstract public long foo(int x);
-                """) { parsedQuery, invocation ->
+                """) { _, _ ->
             // do nothing
         }.failsToCompile()
                 .withErrorContaining("UNEXPECTED_CHAR=:")
@@ -296,7 +296,7 @@
                 @Dao
                 static abstract class ExtendingModel extends BaseModel<Integer> {
                 }
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             assertThat(parsedQuery.returnType.typeName(),
                     `is`(ClassName.get(Integer::class.java) as TypeName))
         }.compilesWithoutError()
@@ -326,7 +326,7 @@
                 """
                 @Query("DELETE from User where uid = :id")
                 abstract public float foo(int id);
-                """) { parsedQuery, invocation ->
+                """) { _, _ ->
         }.failsToCompile().withErrorContaining(
                 ProcessorErrors.DELETION_METHODS_MUST_RETURN_VOID_OR_INT
         )
@@ -338,7 +338,7 @@
                 """
                 @Query("DELETE from User where uid = :id")
                 abstract public int foo(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(1))
             assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.INT))
@@ -351,7 +351,7 @@
                 """
                 @Query("DELETE from User where uid = :id")
                 abstract public void foo(int id);
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(1))
             assertThat(parsedQuery.returnType.typeName(), `is`(TypeName.VOID))
@@ -380,7 +380,7 @@
                 @Query("select name from user where uid = :id")
                 abstract ${LifecyclesTypeNames.LIVE_DATA}<String> nameLiveData(String id);
                 """
-        ) { parsedQuery, invocation ->
+        ) { parsedQuery, _ ->
             assertThat(parsedQuery.returnType.typeName(),
                     `is`(ParameterizedTypeName.get(LifecyclesTypeNames.LIVE_DATA,
                             String::class.typeName()) as TypeName))
@@ -396,7 +396,7 @@
                 @Query("delete from user where uid = :id")
                 abstract ${LifecyclesTypeNames.LIVE_DATA}<Integer> deleteLiveData(String id);
                 """
-        ) { parsedQuery, invocation ->
+        ) { _, _ ->
         }.failsToCompile()
                 .withErrorContaining(ProcessorErrors.DELETION_METHODS_MUST_RETURN_VOID_OR_INT)
     }
@@ -408,7 +408,7 @@
                 @SkipQueryVerification
                 @Query("SELECT foo from User")
                 abstract public int[] foo();
-                """) { parsedQuery, invocation ->
+                """) { parsedQuery, _ ->
             assertThat(parsedQuery.name, `is`("foo"))
             assertThat(parsedQuery.parameters.size, `is`(0))
             assertThat(parsedQuery.returnType.typeName(),
@@ -437,7 +437,7 @@
         pojoTest("""
                 String name;
                 String lName;
-                """, listOf("name", "lastName as lName")) { adapter, queryMethod, invocation ->
+                """, listOf("name", "lastName as lName")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(emptyList()))
             assertThat(adapter?.mapping?.unusedFields, `is`(emptyList()))
         }?.compilesWithoutError()?.withWarningCount(0)
@@ -448,7 +448,7 @@
         pojoTest("""
                 String name;
                 String lastName;
-                """, listOf("name", "lastName")) { adapter, queryMethod, invocation ->
+                """, listOf("name", "lastName")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(emptyList()))
             assertThat(adapter?.mapping?.unusedFields, `is`(emptyList()))
         }?.compilesWithoutError()?.withWarningCount(0)
@@ -462,7 +462,7 @@
             int uid;
             @ColumnInfo(name = "ageColumn")
             int age;
-        """, listOf("*")) { adapter, queryMethod, invocation ->
+        """, listOf("*")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(emptyList()))
             assertThat(adapter?.mapping?.unusedFields, `is`(emptyList()))
         }?.compilesWithoutError()?.withWarningCount(0)
@@ -474,7 +474,7 @@
             @ColumnInfo(name = "MAX(ageColumn)")
             int maxAge;
             String name;
-            """, listOf("MAX(ageColumn)", "name")) { adapter, queryMethod, invocation ->
+            """, listOf("MAX(ageColumn)", "name")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(emptyList()))
             assertThat(adapter?.mapping?.unusedFields, `is`(emptyList()))
         }?.compilesWithoutError()?.withWarningCount(0)
@@ -485,7 +485,7 @@
         pojoTest("""
                 String nameX;
                 String lastNameX;
-                """, listOf("name", "lastName")) { adapter, queryMethod, invocation ->
+                """, listOf("name", "lastName")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(listOf("name", "lastName")))
             assertThat(adapter?.mapping?.unusedFields, `is`(adapter?.pojo?.fields))
         }?.failsToCompile()
@@ -510,7 +510,7 @@
             @ColumnInfo(name = "MAX(ageColumn)")
             int maxAge;
             String name;
-            """, listOf("MAX(age)", "name")) { adapter, queryMethod, invocation ->
+            """, listOf("MAX(age)", "name")) { _, _, _ ->
         }?.failsToCompile()
                 ?.withErrorContaining("no such column: age")
                 ?.and()
@@ -523,7 +523,7 @@
         pojoTest("""
             String name;
             String lastName;
-            """, listOf("uid", "name", "lastName")) { adapter, queryMethod, invocation ->
+            """, listOf("uid", "name", "lastName")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(listOf("uid")))
             assertThat(adapter?.mapping?.unusedFields, `is`(emptyList()))
         }?.compilesWithoutError()?.withWarningContaining(
@@ -541,7 +541,7 @@
         pojoTest("""
             String name;
             String lastName;
-            """, listOf("lastName")) { adapter, queryMethod, invocation ->
+            """, listOf("lastName")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(emptyList()))
             assertThat(adapter?.mapping?.unusedFields, `is`(
                     adapter?.pojo?.fields?.filter { it.name == "name" }
@@ -561,7 +561,7 @@
         pojoTest("""
             String name;
             String lastName;
-            """, listOf("uid", "name")) { adapter, queryMethod, invocation ->
+            """, listOf("uid", "name")) { adapter, _, _ ->
             assertThat(adapter?.mapping?.unusedColumns, `is`(listOf("uid")))
             assertThat(adapter?.mapping?.unusedFields, `is`(
                     adapter?.pojo?.fields?.filter { it.name == "lastName" }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/ShortcutMethodProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/ShortcutMethodProcessorTest.kt
index a4d670c..c4ef416 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/ShortcutMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/ShortcutMethodProcessorTest.kt
@@ -64,7 +64,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void foo();
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(0))
             assertThat(shortcut.returnCount, `is`(false))
@@ -79,7 +79,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public int foo(User user);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -97,7 +97,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void foo(NotAnEntity notValid);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("foo"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -114,7 +114,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void foo(User u1, User u2);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("foo"))
 
             assertThat(shortcut.parameters.size, `is`(2))
@@ -137,7 +137,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public int users(List<User> users);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("users"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -157,7 +157,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void users(User[] users);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("users"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -175,7 +175,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void modifyUsers(Set<User> users);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -194,7 +194,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void modifyUsers(Iterable<User> users);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -214,7 +214,7 @@
                 static class MyList<Irrelevant, Item> extends ArrayList<Item> {}
                 @${annotation.java.canonicalName}
                 abstract public void modifyUsers(MyList<String, User> users);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.name, `is`("modifyUsers"))
             assertThat(shortcut.parameters.size, `is`(1))
             val param = shortcut.parameters.first()
@@ -234,7 +234,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public void foo(User u1, Book b1);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.parameters.size, `is`(2))
             assertThat(shortcut.parameters[0].type.typeName().toString(),
                     `is`("foo.bar.User"))
@@ -254,7 +254,7 @@
                 """
                 @${annotation.java.canonicalName}
                 abstract public long foo(User user);
-                """) { shortcut, invocation ->
+                """) { _, _ ->
         }.failsToCompile().withErrorContaining(invalidReturnTypeError())
     }
 
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/UpdateMethodProcessorTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/UpdateMethodProcessorTest.kt
index c8a88ae..84ff0f1 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/UpdateMethodProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/processor/UpdateMethodProcessorTest.kt
@@ -47,7 +47,7 @@
                 """
                 @Update(onConflict = OnConflictStrategy.REPLACE)
                 abstract public void foo(User user);
-                """) { shortcut, invocation ->
+                """) { shortcut, _ ->
             assertThat(shortcut.onConflictStrategy, `is`(OnConflictStrategy.REPLACE))
         }.compilesWithoutError()
     }
@@ -58,7 +58,7 @@
                 """
                 @Update(onConflict = -1)
                 abstract public void foo(User user);
-                """) { shortcut, invocation ->
+                """) { _, _ ->
         }.failsToCompile().withErrorContaining(ProcessorErrors.INVALID_ON_CONFLICT_VALUE)
     }
 }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/CustomTypeConverterResolutionTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/CustomTypeConverterResolutionTest.kt
index 1790788..545556e 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/CustomTypeConverterResolutionTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/solver/CustomTypeConverterResolutionTest.kt
@@ -30,7 +30,6 @@
 import android.arch.persistence.room.ext.S
 import android.arch.persistence.room.ext.T
 import android.arch.persistence.room.processor.ProcessorErrors.CANNOT_BIND_QUERY_PARAMETER_INTO_STMT
-import android.arch.persistence.room.testing.TestInvocation
 import com.google.common.truth.Truth
 import com.google.testing.compile.CompileTester
 import com.google.testing.compile.JavaFileObjects
@@ -91,9 +90,7 @@
         val entity = createEntity(hasCustomField = true)
         val database = createDatabase(hasConverters = true, hasDao = true)
         val dao = createDao(hasQueryReturningEntity = true, hasQueryWithCustomParam = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -101,9 +98,7 @@
         val entity = createEntity()
         val database = createDatabase(hasConverters = true, hasDao = true)
         val dao = createDao(hasQueryWithCustomParam = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -111,9 +106,7 @@
         val entity = createEntity(hasCustomField = true)
         val database = createDatabase(hasConverters = true, hasDao = true)
         val dao = createDao(hasQueryReturningEntity = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -122,9 +115,7 @@
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasConverters = true, hasQueryReturningEntity = true,
                 hasQueryWithCustomParam = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -132,9 +123,7 @@
         val entity = createEntity(hasCustomField = true, hasConverters = true)
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasQueryReturningEntity = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -142,9 +131,7 @@
         val entity = createEntity(hasCustomField = true, hasConverterOnField = true)
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasQueryReturningEntity = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -152,9 +139,8 @@
         val entity = createEntity(hasCustomField = true, hasConverters = true)
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasQueryWithCustomParam = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.failsToCompile().withErrorContaining(CANNOT_BIND_QUERY_PARAMETER_INTO_STMT)
+        run(entity.toJFO(), dao.toJFO(), database.toJFO())
+                .failsToCompile().withErrorContaining(CANNOT_BIND_QUERY_PARAMETER_INTO_STMT)
     }
 
     @Test
@@ -162,9 +148,8 @@
         val entity = createEntity(hasCustomField = true, hasConverterOnField = true)
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasQueryWithCustomParam = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.failsToCompile().withErrorContaining(CANNOT_BIND_QUERY_PARAMETER_INTO_STMT)
+        run(entity.toJFO(), dao.toJFO(), database.toJFO())
+                .failsToCompile().withErrorContaining(CANNOT_BIND_QUERY_PARAMETER_INTO_STMT)
     }
 
     @Test
@@ -172,9 +157,7 @@
         val entity = createEntity()
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasQueryWithCustomParam = true, hasMethodConverters = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
     @Test
@@ -182,12 +165,10 @@
         val entity = createEntity()
         val database = createDatabase(hasDao = true)
         val dao = createDao(hasQueryWithCustomParam = true, hasParameterConverters = true)
-        run(entity.toJFO(), dao.toJFO(), database.toJFO()){
-
-        }.compilesWithoutError()
+        run(entity.toJFO(), dao.toJFO(), database.toJFO()).compilesWithoutError()
     }
 
-    fun run(vararg jfos : JavaFileObject, f: (TestInvocation) -> Unit): CompileTester {
+    fun run(vararg jfos : JavaFileObject): CompileTester {
         return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
                 .that(jfos.toList() + CUSTOM_TYPE_JFO + CUSTOM_TYPE_CONVERTER_JFO)
                 .processedWith(RoomProcessor())
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt
index 604c50f..ef5c4ef 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/verifier/DatabaseVerifierTest.kt
@@ -157,7 +157,7 @@
     fun testBadQuery() {
         simpleRun { invocation ->
             val verifier = createVerifier(invocation)
-            val (columns, error) = verifier.analyze("select foo from User")
+            val (_, error) = verifier.analyze("select foo from User")
             assertThat(error, notNullValue())
         }.compilesWithoutError()
     }
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt
index 26efb4b..b93972f 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/writer/SQLiteOpenHelperWriterTest.kt
@@ -59,7 +59,7 @@
                 String name;
                 int age;
                 """.trimIndent()
-        ) { database, invocation ->
+        ) { database, _ ->
             val query = SQLiteOpenHelperWriter(database)
                     .createQuery(database.entities.first())
             assertThat(query, `is`("CREATE TABLE IF NOT EXISTS" +
@@ -76,7 +76,7 @@
                 String name;
                 int age;
                 """.trimIndent(), attributes = mapOf("primaryKeys" to "{\"uuid\", \"name\"}")
-        ) { database, invocation ->
+        ) { database, _ ->
             val query = SQLiteOpenHelperWriter(database)
                     .createQuery(database.entities.first())
             assertThat(query, `is`("CREATE TABLE IF NOT EXISTS" +
@@ -94,7 +94,7 @@
                 String name;
                 int age;
                 """.trimIndent()
-        ) { database, invocation ->
+        ) { database, _ ->
             val query = SQLiteOpenHelperWriter(database)
                     .createQuery(database.entities.first())
             assertThat(query, `is`("CREATE TABLE IF NOT EXISTS" +
