diff --git a/api/26.1.0-SNAPSHOT.txt b/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from api/26.1.0-SNAPSHOT.txt
rename to api/27.0.0-SNAPSHOT.txt
diff --git a/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java b/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java
index 16a7607..00e102f 100644
--- a/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java
+++ b/app-toolkit/common/src/main/java/android/arch/core/internal/SafeIterableMap.java
@@ -300,18 +300,19 @@
 
     private class IteratorWithAdditions implements Iterator<Map.Entry<K, V>>, SupportRemove<K, V> {
         private Entry<K, V> mCurrent;
-        private boolean mFirstStep = true;
+        private boolean mBeforeStart = true;
 
         @Override
         public void supportRemove(@NonNull Entry<K, V> entry) {
             if (entry == mCurrent) {
                 mCurrent = mCurrent.mPrevious;
+                mBeforeStart = mCurrent == null;
             }
         }
 
         @Override
         public boolean hasNext() {
-            if (mFirstStep) {
+            if (mBeforeStart) {
                 return mStart != null;
             }
             return mCurrent != null && mCurrent.mNext != null;
@@ -319,8 +320,8 @@
 
         @Override
         public Map.Entry<K, V> next() {
-            if (mFirstStep) {
-                mFirstStep = false;
+            if (mBeforeStart) {
+                mBeforeStart = false;
                 mCurrent = mStart;
             } else {
                 mCurrent = mCurrent != null ? mCurrent.mNext : null;
diff --git a/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java b/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
index 4b25e34..d879543 100644
--- a/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
+++ b/app-toolkit/common/src/test/java/android/arch/core/internal/SafeIterableMapTest.java
@@ -200,6 +200,20 @@
     }
 
     @Test
+    public void testRemoveDuringIteration4() {
+        SafeIterableMap<Integer, Boolean> map = mapOf(1, 2);
+        int[] expected = new int[]{1, 2};
+        int index = 0;
+        for (Entry<Integer, Boolean> entry : map) {
+            assertThat(entry.getKey(), is(expected[index++]));
+            if (index == 1) {
+                map.remove(1);
+            }
+        }
+        assertThat(index, is(2));
+    }
+
+    @Test
     public void testAdditionDuringIteration() {
         SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
         int[] expected = new int[]{1, 2, 3, 4};
@@ -317,6 +331,22 @@
     }
 
     @Test
+    public void testIteratorWithAddition5() {
+        SafeIterableMap<Integer, Boolean> map = mapOf(1, 2);
+        int[] expected = new int[]{1, 2};
+        int index = 0;
+        Iterator<Entry<Integer, Boolean>> iterator = map.iteratorWithAdditions();
+        while (iterator.hasNext()) {
+            Entry<Integer, Boolean> entry = iterator.next();
+            assertThat(entry.getKey(), is(expected[index++]));
+            if (index == 1) {
+                map.remove(1);
+            }
+        }
+        assertThat(index, is(2));
+    }
+
+    @Test
     public void testDescendingIteration() {
         SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
         int[] expected = new int[]{4, 3, 2, 1};
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index b9f85d3..014e3dc 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -300,6 +300,12 @@
                                 // e.g. palette-v7-debug-androidTest.apk becomes
                                 // support-palette-v7_palette-v7-debug-androidTest.apk
                                 "${project.getPath().replace(':', '-').substring(1)}_${fileName}"
+
+                                // Exclude media-compat-test-* modules from existing support library
+                                // presubmit tests.
+                                if (fileName.contains("media-compat-test")) {
+                                    fileName.replace("-debug-androidTest", "")
+                                }
                             }
                         }
                     }
diff --git a/buildSrc/src/main/java/android/support/LibraryVersions.java b/buildSrc/src/main/java/android/support/LibraryVersions.java
index 6b15a48..a99363e 100644
--- a/buildSrc/src/main/java/android/support/LibraryVersions.java
+++ b/buildSrc/src/main/java/android/support/LibraryVersions.java
@@ -23,7 +23,7 @@
     /**
      * Version code of the support library components.
      */
-    public static final Version SUPPORT_LIBRARY = new Version("26.1.0-SNAPSHOT");
+    public static final Version SUPPORT_LIBRARY = new Version("27.0.0-SNAPSHOT");
 
     /**
      * Version code of the flatfoot libraries.
diff --git a/compat/api/26.1.0-SNAPSHOT.txt b/compat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from compat/api/26.1.0-SNAPSHOT.txt
rename to compat/api/27.0.0-SNAPSHOT.txt
diff --git a/content/api/26.1.0-SNAPSHOT.txt b/content/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from content/api/26.1.0-SNAPSHOT.txt
rename to content/api/27.0.0-SNAPSHOT.txt
diff --git a/core-ui/api/26.1.0-SNAPSHOT.txt b/core-ui/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from core-ui/api/26.1.0-SNAPSHOT.txt
rename to core-ui/api/27.0.0-SNAPSHOT.txt
diff --git a/core-utils/api/26.1.0-SNAPSHOT.txt b/core-utils/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from core-utils/api/26.1.0-SNAPSHOT.txt
rename to core-utils/api/27.0.0-SNAPSHOT.txt
diff --git a/customtabs/api/26.1.0-SNAPSHOT.txt b/customtabs/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from customtabs/api/26.1.0-SNAPSHOT.txt
rename to customtabs/api/27.0.0-SNAPSHOT.txt
diff --git a/design/api/26.1.0-SNAPSHOT.txt b/design/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from design/api/26.1.0-SNAPSHOT.txt
rename to design/api/27.0.0-SNAPSHOT.txt
diff --git a/dynamic-animation/api/26.1.0-SNAPSHOT.txt b/dynamic-animation/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from dynamic-animation/api/26.1.0-SNAPSHOT.txt
rename to dynamic-animation/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/appcompat/api/26.1.0-SNAPSHOT.txt b/emoji/appcompat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/appcompat/api/26.1.0-SNAPSHOT.txt
rename to emoji/appcompat/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/bundled/api/26.1.0-SNAPSHOT.txt b/emoji/bundled/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/bundled/api/26.1.0-SNAPSHOT.txt
rename to emoji/bundled/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/core/api/26.1.0-SNAPSHOT.txt b/emoji/core/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/core/api/26.1.0-SNAPSHOT.txt
rename to emoji/core/api/27.0.0-SNAPSHOT.txt
diff --git a/exifinterface/api/26.1.0-SNAPSHOT.txt b/exifinterface/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from exifinterface/api/26.1.0-SNAPSHOT.txt
rename to exifinterface/api/27.0.0-SNAPSHOT.txt
diff --git a/fragment/api/26.1.0-SNAPSHOT.txt b/fragment/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from fragment/api/26.1.0-SNAPSHOT.txt
rename to fragment/api/27.0.0-SNAPSHOT.txt
diff --git a/graphics/drawable/animated/api/26.1.0-SNAPSHOT.txt b/graphics/drawable/animated/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from graphics/drawable/animated/api/26.1.0-SNAPSHOT.txt
rename to graphics/drawable/animated/api/27.0.0-SNAPSHOT.txt
diff --git a/graphics/drawable/static/api/26.1.0-SNAPSHOT.txt b/graphics/drawable/static/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from graphics/drawable/static/api/26.1.0-SNAPSHOT.txt
rename to graphics/drawable/static/api/27.0.0-SNAPSHOT.txt
diff --git a/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java b/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java
index d689442..99d859c 100644
--- a/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java
+++ b/lifecycle/extensions/src/main/java/android/arch/lifecycle/LiveData.java
@@ -87,7 +87,7 @@
 
     // how many observers are in active state
     private int mActiveCount = 0;
-    private Object mData = NOT_SET;
+    private volatile Object mData = NOT_SET;
     // when setData is called, we set the pending data and actual data swap happens on the main
     // thread
     private volatile Object mPendingData = NOT_SET;
@@ -302,12 +302,10 @@
      */
     @Nullable
     public T getValue() {
-        // we do not return pending data here to be able to serve a consistent view to the main
-        // thread.
         Object data = mData;
-        if (mData != NOT_SET) {
+        if (data != NOT_SET) {
             //noinspection unchecked
-            return (T) mData;
+            return (T) data;
         }
         return null;
     }
diff --git a/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java b/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java
index f401e1c..1802d94 100644
--- a/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java
+++ b/lifecycle/extensions/src/test/java/android/arch/lifecycle/LiveDataTest.java
@@ -368,6 +368,22 @@
     }
 
     @Test
+    public void testRemoveDuringSetValue() {
+        mRegistry.handleLifecycleEvent(ON_START);
+        final Observer observer1 = spy(new Observer<String>() {
+            @Override
+            public void onChanged(String o) {
+                mLiveData.removeObserver(this);
+            }
+        });
+        Observer<String> observer2 = (Observer<String>) mock(Observer.class);
+        mLiveData.observeForever(observer1);
+        mLiveData.observe(mOwner, observer2);
+        mLiveData.setValue("gt");
+        verify(observer2).onChanged("gt");
+    }
+
+    @Test
     public void testDataChangeDuringStateChange() {
         mRegistry.handleLifecycleEvent(ON_START);
         mRegistry.addObserver(new LifecycleObserver() {
diff --git a/media-compat-test-client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java b/media-compat-test-client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java
new file mode 100644
index 0000000..8c20794
--- /dev/null
+++ b/media-compat-test-client/tests/src/android/support/mediacompat/client/MediaBrowserCompatTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.mediacompat.client;
+
+import static android.support.mediacompat.testlib.MediaBrowserConstants.EXTRAS_KEY;
+import static android.support.mediacompat.testlib.MediaBrowserConstants.EXTRAS_VALUE;
+import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_ID_ROOT;
+import static android.support.test.InstrumentationRegistry.getInstrumentation;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.fail;
+
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.testutils.PollingCheck;
+import android.support.v4.media.MediaBrowserCompat;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Test {@link android.support.v4.media.MediaBrowserCompat}.
+ */
+@RunWith(AndroidJUnit4.class)
+public class MediaBrowserCompatTest {
+    static final ComponentName TEST_BROWSER_SERVICE = new ComponentName(
+            "android.support.mediacompat.service.test",
+            "android.support.mediacompat.service.StubMediaBrowserServiceCompat");
+
+    // The maximum time to wait for an operation.
+    private static final long TIME_OUT_MS = 3000L;
+
+    private MediaBrowserCompat mMediaBrowser;
+    private StubConnectionCallback mConnectionCallback;
+    private Bundle mRootHints;
+
+    @Before
+    public void setUp() {
+        mConnectionCallback = new StubConnectionCallback();
+        mRootHints = new Bundle();
+
+        getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mMediaBrowser = new MediaBrowserCompat(getInstrumentation().getTargetContext(),
+                        TEST_BROWSER_SERVICE, mConnectionCallback, mRootHints);
+            }
+        });
+    }
+
+    @After
+    public void tearDown() {
+        if (mMediaBrowser != null && mMediaBrowser.isConnected()) {
+            mMediaBrowser.disconnect();
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testConnectAndDisconnect() throws Exception {
+        assertFalse(mMediaBrowser.isConnected());
+        connectToMediaBrowserService();
+
+        assertEquals(1, mConnectionCallback.mConnectedCount);
+        assertEquals(TEST_BROWSER_SERVICE, mMediaBrowser.getServiceComponent());
+        assertEquals(MEDIA_ID_ROOT, mMediaBrowser.getRoot());
+        assertEquals(EXTRAS_VALUE, mMediaBrowser.getExtras().getString(EXTRAS_KEY));
+
+        mMediaBrowser.disconnect();
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return !mMediaBrowser.isConnected();
+            }
+        }.run();
+    }
+
+    private void connectToMediaBrowserService() throws Exception {
+        synchronized (mConnectionCallback.mWaitLock) {
+            mMediaBrowser.connect();
+            mConnectionCallback.mWaitLock.wait(TIME_OUT_MS);
+            if (!mMediaBrowser.isConnected()) {
+                fail("Browser failed to connect!");
+            }
+        }
+    }
+
+    private class StubConnectionCallback extends MediaBrowserCompat.ConnectionCallback {
+        Object mWaitLock = new Object();
+        volatile int mConnectedCount;
+
+        @Override
+        public void onConnected() {
+            synchronized (mWaitLock) {
+                mConnectedCount++;
+                mWaitLock.notify();
+            }
+        }
+    }
+}
diff --git a/media-compat-test-service/build.gradle b/media-compat-test-service/build.gradle
index 6d54c89..c959ac0 100644
--- a/media-compat-test-service/build.gradle
+++ b/media-compat-test-service/build.gradle
@@ -16,9 +16,13 @@
 apply plugin: android.support.SupportLibraryPlugin
 
 dependencies {
-    api project(':support-annotations')
-    api project(':support-media-compat')
-    api project(':support-media-compat-test-lib')
+    androidTestImplementation project(':support-annotations')
+    androidTestImplementation project(':support-media-compat')
+    androidTestImplementation project(':support-media-compat-test-lib')
+
+    androidTestImplementation(libs.test_runner) {
+        exclude module: 'support-annotations'
+    }
 }
 
 android {
diff --git a/media-compat/api/26.1.0-SNAPSHOT.txt b/media-compat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from media-compat/api/26.1.0-SNAPSHOT.txt
rename to media-compat/api/27.0.0-SNAPSHOT.txt
diff --git a/percent/api/26.1.0-SNAPSHOT.txt b/percent/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from percent/api/26.1.0-SNAPSHOT.txt
rename to percent/api/27.0.0-SNAPSHOT.txt
diff --git a/recommendation/api/26.1.0-SNAPSHOT.txt b/recommendation/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from recommendation/api/26.1.0-SNAPSHOT.txt
rename to recommendation/api/27.0.0-SNAPSHOT.txt
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" +
diff --git a/transition/api/26.1.0-SNAPSHOT.txt b/transition/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from transition/api/26.1.0-SNAPSHOT.txt
rename to transition/api/27.0.0-SNAPSHOT.txt
diff --git a/tv-provider/api/26.1.0-SNAPSHOT.txt b/tv-provider/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from tv-provider/api/26.1.0-SNAPSHOT.txt
rename to tv-provider/api/27.0.0-SNAPSHOT.txt
diff --git a/v13/Android.mk b/v13/Android.mk
index 3ad5472..1a95b75 100644
--- a/v13/Android.mk
+++ b/v13/Android.mk
@@ -38,5 +38,6 @@
         android-support-annotations
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
+LOCAL_JAR_EXCLUDE_FILES := none
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
diff --git a/v13/api/26.1.0-SNAPSHOT.txt b/v13/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v13/api/26.1.0-SNAPSHOT.txt
rename to v13/api/27.0.0-SNAPSHOT.txt
diff --git a/v14/preference/api/26.1.0-SNAPSHOT.txt b/v14/preference/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v14/preference/api/26.1.0-SNAPSHOT.txt
rename to v14/preference/api/27.0.0-SNAPSHOT.txt
diff --git a/v17/leanback/api/26.1.0-SNAPSHOT.txt b/v17/leanback/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v17/leanback/api/26.1.0-SNAPSHOT.txt
rename to v17/leanback/api/27.0.0-SNAPSHOT.txt
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
index 6d627b3..18f608e 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
@@ -214,6 +214,8 @@
                 if (DEBUG) Log.v(TAG, "EditText.onFocusChange " + hasFocus);
                 if (hasFocus) {
                     showNativeKeyboard();
+                } else {
+                    hideNativeKeyboard();
                 }
                 updateUi(hasFocus);
             }
diff --git a/v17/preference-leanback/api/26.1.0-SNAPSHOT.txt b/v17/preference-leanback/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v17/preference-leanback/api/26.1.0-SNAPSHOT.txt
rename to v17/preference-leanback/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/appcompat/api/26.1.0-SNAPSHOT.txt b/v7/appcompat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/appcompat/api/26.1.0-SNAPSHOT.txt
rename to v7/appcompat/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/appcompat/res-public/values/public_styles.xml b/v7/appcompat/res-public/values/public_styles.xml
index a9956ad..38efc46 100644
--- a/v7/appcompat/res-public/values/public_styles.xml
+++ b/v7/appcompat/res-public/values/public_styles.xml
@@ -36,12 +36,6 @@
     <public type="style" name="TextAppearance.AppCompat.Medium"/>
     <public type="style" name="TextAppearance.AppCompat.Medium.Inverse"/>
     <public type="style" name="TextAppearance.AppCompat.Menu"/>
-    <public type="style" name="TextAppearance.AppCompat.Notification"/>
-    <public type="style" name="TextAppearance.AppCompat.Notification.Info"/>
-    <public type="style" name="TextAppearance.AppCompat.Notification.Line2"/>
-    <public type="style" name="TextAppearance.AppCompat.Notification.Media"/>
-    <public type="style" name="TextAppearance.AppCompat.Notification.Time"/>
-    <public type="style" name="TextAppearance.AppCompat.Notification.Title"/>
     <public type="style" name="TextAppearance.AppCompat.SearchResult.Subtitle"/>
     <public type="style" name="TextAppearance.AppCompat.SearchResult.Title"/>
     <public type="style" name="TextAppearance.AppCompat.Small"/>
diff --git a/v7/appcompat/res/values-v21/styles.xml b/v7/appcompat/res/values-v21/styles.xml
deleted file mode 100644
index 48d0366..0000000
--- a/v7/appcompat/res/values-v21/styles.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-  ~ Copyright (C) 2016 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<resources>
-
-    <!-- Use platform styles -->
-    <style name="TextAppearance.AppCompat.Notification.Info"
-           parent="@android:style/TextAppearance.Material.Notification.Info"/>
-
-    <style name="TextAppearance.AppCompat.Notification.Time"
-           parent="@android:style/TextAppearance.Material.Notification.Time"/>
-
-    <style name="TextAppearance.AppCompat.Notification.Title"
-           parent="@android:style/TextAppearance.Material.Notification.Title"/>
-
-    <style name="TextAppearance.AppCompat.Notification"
-           parent="@android:style/TextAppearance.Material.Notification"/>
-
-    <style name="TextAppearance.AppCompat.Notification.Media" >
-        <item name="android:textColor">@color/secondary_text_default_material_dark</item>
-    </style>
-
-    <style name="TextAppearance.AppCompat.Notification.Title.Media" >
-        <item name="android:textColor">@color/primary_text_default_material_dark</item>
-    </style>
-
-    <style name="TextAppearance.AppCompat.Notification.Info.Media">
-        <item name="android:textColor">@color/secondary_text_default_material_dark</item>
-    </style>
-
-    <style name="TextAppearance.AppCompat.Notification.Time.Media">
-        <item name="android:textColor">@color/secondary_text_default_material_dark</item>
-    </style>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/res/values-v24/styles.xml b/v7/appcompat/res/values-v24/styles.xml
deleted file mode 100644
index 4cd8461..0000000
--- a/v7/appcompat/res/values-v24/styles.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  ~ Copyright (C) 2016 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<resources>
-    <!-- Use platform styles, Media is dark again -->
-    <style name="TextAppearance.AppCompat.Notification.Media" />
-
-    <style name="TextAppearance.AppCompat.Notification.Info.Media" />
-
-    <style name="TextAppearance.AppCompat.Notification.Time.Media" />
-
-    <style name="TextAppearance.AppCompat.Notification.Title.Media" />
-</resources>
diff --git a/v7/appcompat/res/values/styles.xml b/v7/appcompat/res/values/styles.xml
index ce74a89..247ca4c 100644
--- a/v7/appcompat/res/values/styles.xml
+++ b/v7/appcompat/res/values/styles.xml
@@ -329,25 +329,4 @@
     <style name="TextAppearance.AppCompat.Light.Widget.PopupMenu.Large" parent="TextAppearance.AppCompat.Widget.PopupMenu.Large" />
     <style name="TextAppearance.AppCompat.Light.Widget.PopupMenu.Small" parent="TextAppearance.AppCompat.Widget.PopupMenu.Small" />
 
-    <!-- These styles have moved to support-compat and should be removed when
-         android.support.v7.app.NotificationCompat is removed -->
-    <style name="TextAppearance.AppCompat.Notification" parent="@android:style/TextAppearance.StatusBar.EventContent" />
-    <style name="TextAppearance.AppCompat.Notification.Title" parent="@android:style/TextAppearance.StatusBar.EventContent.Title" />
-    <style name="TextAppearance.AppCompat.Notification.Info">
-        <item name="android:textSize">12sp</item>
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
-    </style>
-    <style name="TextAppearance.AppCompat.Notification.Time">
-        <item name="android:textSize">12sp</item>
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
-    </style>
-    <style name="TextAppearance.AppCompat.Notification.Line2" parent="TextAppearance.AppCompat.Notification.Info" />
-
-    <!-- These styles have moved to media-compat and should be removed when
-         android.support.v7.app.NotificationCompat is removed -->
-    <style name="TextAppearance.AppCompat.Notification.Title.Media" />
-    <style name="TextAppearance.AppCompat.Notification.Media" />
-    <style name="TextAppearance.AppCompat.Notification.Info.Media" />
-    <style name="TextAppearance.AppCompat.Notification.Time.Media" />
-    <style name="TextAppearance.AppCompat.Notification.Line2.Media" parent="TextAppearance.AppCompat.Notification.Info.Media" />
 </resources>
diff --git a/v7/appcompat/src/android/support/v7/app/NotificationCompat.java b/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
index b1c3e95..6e10d9c 100644
--- a/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
+++ b/v7/appcompat/src/android/support/v7/app/NotificationCompat.java
@@ -260,8 +260,8 @@
      * </pre>
      *
      * <p>If you are using this style, consider using the corresponding styles like
-     * {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification} or
-     * {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification_Title} in
+     * {@link android.support.compat.R.style#TextAppearance_Compat_Notification} or
+     * {@link android.support.compat.R.style#TextAppearance_Compat_Notification_Title} in
      * your custom views in order to get the correct styling on each platform version.
      *
      * @deprecated Use {@link android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle}
@@ -308,9 +308,9 @@
      * </pre>
      *
      * <p>If you are using this style, consider using the corresponding styles like
-     * {@link android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification_Media} or
+     * {@link android.support.mediacompat.R.style#TextAppearance_Compat_Notification_Media} or
      * {@link
-     * android.support.v7.appcompat.R.style#TextAppearance_AppCompat_Notification_Title_Media} in
+     * android.support.mediacompat.R.style#TextAppearance_Compat_Notification_Title_Media} in
      * your custom views in order to get the correct styling on each platform version.
      *
      * @see android.support.v4.app.NotificationCompat.DecoratedCustomViewStyle
diff --git a/v7/cardview/api/26.1.0-SNAPSHOT.txt b/v7/cardview/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/cardview/api/26.1.0-SNAPSHOT.txt
rename to v7/cardview/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/gridlayout/api/26.1.0-SNAPSHOT.txt b/v7/gridlayout/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/gridlayout/api/26.1.0-SNAPSHOT.txt
rename to v7/gridlayout/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/mediarouter/api/26.1.0-SNAPSHOT.txt b/v7/mediarouter/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/mediarouter/api/26.1.0-SNAPSHOT.txt
rename to v7/mediarouter/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/palette/api/26.1.0-SNAPSHOT.txt b/v7/palette/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/palette/api/26.1.0-SNAPSHOT.txt
rename to v7/palette/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/preference/api/26.1.0-SNAPSHOT.txt b/v7/preference/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/preference/api/26.1.0-SNAPSHOT.txt
rename to v7/preference/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/recyclerview/api/26.1.0-SNAPSHOT.txt b/v7/recyclerview/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/recyclerview/api/26.1.0-SNAPSHOT.txt
rename to v7/recyclerview/api/27.0.0-SNAPSHOT.txt
diff --git a/wear/api/26.1.0-SNAPSHOT.txt b/wear/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from wear/api/26.1.0-SNAPSHOT.txt
rename to wear/api/27.0.0-SNAPSHOT.txt
