Merge changes from topic "am-e096a0ca-b1ac-4765-aef7-f3b506db9275"

* changes:
  [automerger] Support RawQuery in paging data source am: cab865bed3
  Support RawQuery in paging data source
diff --git a/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt b/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt
index 31e2026..72564cc 100644
--- a/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt
+++ b/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt
@@ -137,28 +137,6 @@
     return File(apiDir, "current.txt")
 }
 
-private fun createVerifyUpdateApiAllowedTask(project: Project) =
-        project.tasks.createWithConfig("verifyUpdateApiAllowed") {
-            // This could be moved to doFirst inside updateApi, but using it as a
-            // dependency with no inputs forces it to run even when updateApi is a
-            // no-op.
-            doLast {
-                val rootFolder = project.projectDir
-                val version = Version(project.version as String)
-
-                if (version.isPatch()) {
-                    throw GradleException("Public APIs may not be modified in patch releases.")
-                } else if (!version.isFinalApi() && getApiFile(rootFolder,
-                        version,
-                        true).exists()) {
-                    throw GradleException("Inconsistent version. Public API file already exists.")
-                } else if (version.isFinalApi() && getApiFile(rootFolder, version).exists()
-                        && !project.hasProperty("force")) {
-                    throw GradleException("Public APIs may not be modified in finalized releases.")
-                }
-            }
-        }
-
 // Generates API files
 private fun createGenerateApiTask(project: Project, docletpathParam: Collection<File>) =
         project.tasks.createWithConfig("generateApi", DoclavaTask::class.java) {
@@ -232,8 +210,12 @@
             oldApiFile = getApiFile(project.projectDir, project.version())
             whitelistErrors = checkApiRelease.whitelistErrors
             whitelistErrorsFile = checkApiRelease.whitelistErrorsFile
-
             doFirst {
+                val version = project.version()
+                if (!version.isFinalApi() &&
+                        getApiFile(project.projectDir, version, true).exists()) {
+                    throw GradleException("Inconsistent version. Public API file already exists.")
+                }
                 // Replace the expected whitelist with the detected whitelist.
                 whitelistErrors = checkApiRelease.detectedWhitelistErrors
             }
@@ -450,7 +432,6 @@
     val docletClasspath = doclavaConfiguration.resolve()
     val generateApi = createGenerateApiTask(project, docletClasspath)
     generateApi.dependsOn(doclavaConfiguration)
-    val verifyUpdateTask = createVerifyUpdateApiAllowedTask(project)
 
     // Make sure the API surface has not broken since the last release.
     val lastReleasedApiFile = getLastReleasedApiFile(workingDir, version)
@@ -489,7 +470,7 @@
     checkApi.description = "Verify the API surface."
 
     val updateApiTask = createUpdateApiTask(project, checkApiRelease)
-    updateApiTask.dependsOn(checkApiRelease, verifyUpdateTask)
+    updateApiTask.dependsOn(checkApiRelease)
     val newApiTask = createNewApiXmlTask(project, generateApi, doclavaConfiguration)
     val oldApiTask = createOldApiXml(project, doclavaConfiguration)
 
@@ -578,9 +559,6 @@
 private fun sdkApiFile(project: Project) = File(project.docsDir(), "release/sdk_current.txt")
 private fun removedSdkApiFile(project: Project) = File(project.docsDir(), "release/sdk_removed.txt")
 
-private fun TaskContainer.createWithConfig(name: String, config: Task.() -> Unit) =
-        create(name) { task -> task.config() }
-
 private fun <T : Task> TaskContainer.createWithConfig(
         name: String, taskClass: Class<T>,
         config: T.() -> Unit) =
diff --git a/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt b/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt
index 170462d..2f64e5d 100644
--- a/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/android/support/LibraryGroups.kt
@@ -27,6 +27,5 @@
     const val ARCH_CORE = "android.arch.core"
     const val PAGING = "android.arch.paging"
     const val NAVIGATION = "android.arch.navigation"
-    const val SLICES = "androidx.app.slice"
     const val JETIFIER = "com.android.support.jetifier"
 }
diff --git a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
index ac74c0d..cf5c647 100644
--- a/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/android/support/LibraryVersions.kt
@@ -23,7 +23,7 @@
     /**
      * Version code of the support library components.
      */
-    val SUPPORT_LIBRARY = Version("28.0.0-SNAPSHOT")
+    val SUPPORT_LIBRARY = Version("28.0.0-alpha1")
 
     /**
      * Version code for Room
diff --git a/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
index 69419d4..14e4669 100644
--- a/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/android/support/SupportAndroidLibraryPlugin.kt
@@ -120,7 +120,7 @@
 
         project.afterEvaluate {
             setUpLint(library.lintOptions, SupportConfig.getLintBaseline(project),
-                    (supportLibraryExtension.mavenVersion?.isSnapshot()) ?: true)
+                    (supportLibraryExtension.mavenVersion?.isFinalApi()) ?: false)
         }
 
         project.tasks.getByName("uploadArchives").dependsOn("lintRelease")
@@ -139,7 +139,7 @@
     }
 }
 
-private fun setUpLint(lintOptions: LintOptions, baseline: File, snapshotVersion: Boolean) {
+private fun setUpLint(lintOptions: LintOptions, baseline: File, verifyTranslations: Boolean) {
     // Always lint check NewApi as fatal.
     lintOptions.isAbortOnError = true
     lintOptions.isIgnoreWarnings = true
@@ -159,11 +159,10 @@
 
     lintOptions.fatal("NewApi")
 
-    if (snapshotVersion) {
-        // Do not run missing translations checks on snapshot versions of the library.
-        lintOptions.disable("MissingTranslation")
-    } else {
+    if (verifyTranslations) {
         lintOptions.fatal("MissingTranslation")
+    } else {
+        lintOptions.disable("MissingTranslation")
     }
 
     // Set baseline file for all legacy lint warnings.
diff --git a/buildSrc/src/main/kotlin/android/support/checkapi/UpdateApiTask.kt b/buildSrc/src/main/kotlin/android/support/checkapi/UpdateApiTask.kt
index e1c0d3f..16c625a 100644
--- a/buildSrc/src/main/kotlin/android/support/checkapi/UpdateApiTask.kt
+++ b/buildSrc/src/main/kotlin/android/support/checkapi/UpdateApiTask.kt
@@ -16,8 +16,10 @@
 
 package android.support.checkapi
 
+import android.support.Version
 import com.google.common.io.Files
 import org.gradle.api.DefaultTask
+import org.gradle.api.GradleException
 import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.InputFile
 import org.gradle.api.tasks.Optional
@@ -52,6 +54,18 @@
      */
     @TaskAction
     fun doUpdate() {
+        if (oldApiFile.exists() && newApiFile.readText() == oldApiFile.readText()) {
+            // whatever nothing changed
+            return
+        }
+
+        val version = Version(project.version as String)
+        if (version.isPatch()) {
+            throw GradleException("Public APIs may not be modified in patch releases.")
+        } else if (version.isFinalApi() && oldApiFile.exists() && !project.hasProperty("force")) {
+            throw GradleException("Public APIs may not be modified in finalized releases.")
+        }
+
         Files.copy(newApiFile, oldApiFile)
 
         if (oldRemovedApiFile != null) {
diff --git a/car/res/values/attrs.xml b/car/res/values/attrs.xml
index 8b32b24..0559218 100644
--- a/car/res/values/attrs.xml
+++ b/car/res/values/attrs.xml
@@ -54,7 +54,9 @@
              within this value. If this value is not explicitly set, the scrollbar centers itself
              within the car_margin value. -->
         <attr name="scrollBarContainerWidth" format="dimension" />
-        <!-- Whether or not to show a diving line between each item of the list. -->
+        <!-- Whether or not to show a vertical diving line between each item of the list. Divider
+             after the last item (LinearLayoutManager) or row (GridLayoutManager) will not be shown
+             but there will be an offset for divider space. -->
         <attr name="showPagedListViewDivider" format="boolean" />
         <!-- An optional id that specifies a child View whose starting edge will be used to
              determine the start position of the dividing line. -->
@@ -68,7 +70,8 @@
         <!-- The width of the margin on the right side of the list.
              Deprecated: use gutter instead. If gutter is specified, this value is ignored.-->
         <attr name="listEndMargin" format="dimension" />
-        <!-- An optional spacing between items in the list -->
+        <!-- An optional vertical spacing between items in the list. In GridLayoutManager items in
+             the last row would still have spacing at bottom. -->
         <attr name="itemSpacing" format="dimension" />
         <!-- The icon to be used for the up button of the scroll bar. -->
         <attr name="upButtonIcon" format="reference" />
diff --git a/car/src/androidTest/java/androidx/car/widget/DividerVisibilityManagerTest.java b/car/src/androidTest/java/androidx/car/widget/DividerVisibilityManagerTest.java
index ad8c200..99747a3 100644
--- a/car/src/androidTest/java/androidx/car/widget/DividerVisibilityManagerTest.java
+++ b/car/src/androidTest/java/androidx/car/widget/DividerVisibilityManagerTest.java
@@ -16,7 +16,7 @@
 
 package androidx.car.widget;
 
-import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.closeTo;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.core.IsNull.notNullValue;
@@ -116,8 +116,8 @@
             }
         });
         for (int i = 0; i < itemCount - 1; i++) {
-            assertThat(views[i + 1].getTop() - views[i].getBottom(),
-                    is(equalTo(2 * (dividerHeight / 2))));
+            assertThat((double) views[i + 1].getTop() - views[i].getBottom(),
+                    is(closeTo(2 * (dividerHeight / 2), 1.0f)));
         }
 
 
@@ -138,7 +138,7 @@
             if (dvm.shouldHideDivider(i)) {
                 assertEquals(distance, 0);
             } else {
-                assertEquals(distance, 2 * (dividerHeight / 2));
+                assertThat((double) distance, is(closeTo(2 * (dividerHeight / 2), 1.0f)));
             }
         }
     }
diff --git a/car/src/main/java/androidx/car/utils/ColumnCalculator.java b/car/src/main/java/androidx/car/utils/ColumnCalculator.java
index 35b1a91..39f5b28 100644
--- a/car/src/main/java/androidx/car/utils/ColumnCalculator.java
+++ b/car/src/main/java/androidx/car/utils/ColumnCalculator.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.support.annotation.Px;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.WindowManager;
@@ -105,6 +106,7 @@
      *
      * @return The width of a single column in pixels.
      */
+    @Px
     public int getColumnWidth() {
         return mColumnWidth;
     }
@@ -124,6 +126,7 @@
      *
      * @return The size of a single gutter in pixels.
      */
+    @Px
     public int getGutterSize() {
         return mGutterSize;
     }
@@ -135,6 +138,7 @@
      *
      * @return The size in pixels for a given column span.
      */
+    @Px
     public int getSizeForColumnSpan(int columnSpan) {
         int gutterSpan = columnSpan - 1;
         return columnSpan * mColumnWidth + gutterSpan * mGutterSize;
diff --git a/car/src/main/java/androidx/car/widget/GridLayoutManagerUtils.java b/car/src/main/java/androidx/car/widget/GridLayoutManagerUtils.java
index 75c194d..27c1f17 100644
--- a/car/src/main/java/androidx/car/widget/GridLayoutManagerUtils.java
+++ b/car/src/main/java/androidx/car/widget/GridLayoutManagerUtils.java
@@ -18,6 +18,7 @@
 
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.RecyclerView;
+import android.view.View;
 
 /**
  * Utility class that helps navigating in GridLayoutManager.
@@ -48,4 +49,47 @@
         // the first row.
         return pos;
     }
+
+    /**
+     * Returns the span index of an item.
+     */
+    public static int getSpanIndex(View item) {
+        GridLayoutManager.LayoutParams layoutParams =
+                ((GridLayoutManager.LayoutParams) item.getLayoutParams());
+        return layoutParams.getSpanIndex();
+    }
+
+    /**
+     * Returns the span size of an item. {@code item} must be already laid out.
+     */
+    public static int getSpanSize(View item) {
+        GridLayoutManager.LayoutParams layoutParams =
+                ((GridLayoutManager.LayoutParams) item.getLayoutParams());
+        return layoutParams.getSpanSize();
+    }
+
+    /**
+     * Returns the index of the last item that is on the same row as {@code index}.
+     *
+     * @param index index of child {@code View} in {@code parent}.
+     * @param parent {@link RecyclerView} that contains the View {@code index} points to.
+     */
+    public static int getLastIndexOnSameRow(int index, RecyclerView parent) {
+        int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount();
+        int spanSum = GridLayoutManagerUtils.getSpanIndex(parent.getChildAt(index));
+        for (int i = index; i < parent.getChildCount(); i++) {
+            spanSum += GridLayoutManagerUtils.getSpanSize(parent.getChildAt(i));
+            if (spanSum > spanCount) {
+                // We have reached next row.
+
+                // Implicit constraint by grid layout manager:
+                // Initial spanSum + spanSize would not exceed spanCount, so it's safe to
+                // subtract 1.
+                return i - 1;
+            }
+        }
+        // Still have not reached row end. Assuming the list only scrolls vertically, we are at
+        // the last row.
+        return parent.getChildCount() - 1;
+    }
 }
diff --git a/car/src/main/java/androidx/car/widget/PagedListView.java b/car/src/main/java/androidx/car/widget/PagedListView.java
index 1f0c195..c8cfd37 100644
--- a/car/src/main/java/androidx/car/widget/PagedListView.java
+++ b/car/src/main/java/androidx/car/widget/PagedListView.java
@@ -169,8 +169,7 @@
      */
     public interface DividerVisibilityManager {
         /**
-         * Given an item position, returns whether the divider coming after that item should be
-         * hidden.
+         * Given an item position, returns whether the divider below that item should be hidden.
          *
          * @param position item position inside the adapter.
          * @return true if divider is to be hidden, false if divider should be shown.
@@ -1068,8 +1067,9 @@
             super.getItemOffsets(outRect, view, parent, state);
             int position = parent.getChildAdapterPosition(view);
 
-            // Skip offset for last item.
-            if (position == state.getItemCount() - 1) {
+            // Skip offset for last item except for GridLayoutManager.
+            if (position == state.getItemCount() - 1
+                    && !(parent.getLayoutManager() instanceof GridLayoutManager)) {
                 return;
             }
 
@@ -1122,7 +1122,7 @@
 
         /** Updates the list divider color which may have changed due to a day night transition. */
         public void updateDividerColor() {
-            mPaint.setColor(mContext.getResources().getColor(R.color.car_list_divider));
+            mPaint.setColor(mContext.getResources().getColor(R.color.car_list_divider, null));
         }
 
         /** Sets {@link DividerVisibilityManager} on the DividerDecoration.*/
@@ -1132,67 +1132,84 @@
 
         @Override
         public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
-            // Draw a divider line between each item. No need to draw the line for the last item.
-            for (int i = 0, childCount = parent.getChildCount(); i < childCount - 1; i++) {
+            boolean usesGridLayoutManager = parent.getLayoutManager() instanceof GridLayoutManager;
+            for (int i = 0; i < parent.getChildCount(); i++) {
                 View container = parent.getChildAt(i);
-
-                // if divider should be hidden for this item, proceeds without drawing it
                 int itemPosition = parent.getChildAdapterPosition(container);
+
                 if (hideDividerForAdapterPosition(itemPosition)) {
                     continue;
                 }
 
-                View nextContainer = parent.getChildAt(i + 1);
-                int spacing = nextContainer.getTop() - container.getBottom();
-
-                View startChild =
-                        mDividerStartId != INVALID_RESOURCE_ID
-                                ? container.findViewById(mDividerStartId)
-                                : container;
-
-                View endChild =
-                        mDividerEndId != INVALID_RESOURCE_ID
-                                ? container.findViewById(mDividerEndId)
-                                : container;
-
-                if (startChild == null || endChild == null) {
+                View nextVerticalContainer;
+                if (usesGridLayoutManager) {
+                    // Find an item in next row to calculate vertical space.
+                    int lastItem = GridLayoutManagerUtils.getLastIndexOnSameRow(i, parent);
+                    nextVerticalContainer = parent.getChildAt(lastItem + 1);
+                } else {
+                    nextVerticalContainer = parent.getChildAt(i + 1);
+                }
+                if (nextVerticalContainer == null) {
+                    // Skip drawing divider for the last row in GridLayoutManager, or the last
+                    // item (presumably in LinearLayoutManager).
                     continue;
                 }
-
-                Rect containerRect = new Rect();
-                container.getGlobalVisibleRect(containerRect);
-
-                Rect startRect = new Rect();
-                startChild.getGlobalVisibleRect(startRect);
-
-                Rect endRect = new Rect();
-                endChild.getGlobalVisibleRect(endRect);
-
-                int left = container.getLeft() + mDividerStartMargin
-                        + (startRect.left - containerRect.left);
-                int right = container.getRight() - (endRect.right - containerRect.right);
-                int bottom = container.getBottom() + spacing / 2 + mDividerHeight / 2;
-                int top = bottom - mDividerHeight;
-
-                c.drawRect(left, top, right, bottom, mPaint);
+                int spacing = nextVerticalContainer.getTop() - container.getBottom();
+                drawDivider(c, container, spacing);
             }
         }
 
+        /**
+         * Draws a divider under {@code container}.
+         *
+         * @param spacing between {@code container} and next view.
+         */
+        private void drawDivider(Canvas c, View container, int spacing) {
+            View startChild =
+                    mDividerStartId != INVALID_RESOURCE_ID
+                            ? container.findViewById(mDividerStartId)
+                            : container;
+
+            View endChild =
+                    mDividerEndId != INVALID_RESOURCE_ID
+                            ? container.findViewById(mDividerEndId)
+                            : container;
+
+            if (startChild == null || endChild == null) {
+                return;
+            }
+
+            Rect containerRect = new Rect();
+            container.getGlobalVisibleRect(containerRect);
+
+            Rect startRect = new Rect();
+            startChild.getGlobalVisibleRect(startRect);
+
+            Rect endRect = new Rect();
+            endChild.getGlobalVisibleRect(endRect);
+
+            int left = container.getLeft() + mDividerStartMargin
+                    + (startRect.left - containerRect.left);
+            int right = container.getRight() - (endRect.right - containerRect.right);
+            int bottom = container.getBottom() + spacing / 2 + mDividerHeight / 2;
+            int top = bottom - mDividerHeight;
+
+            c.drawRect(left, top, right, bottom, mPaint);
+        }
+
         @Override
         public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                 RecyclerView.State state) {
             super.getItemOffsets(outRect, view, parent, state);
             int pos = parent.getChildAdapterPosition(view);
-
-            // Skip top offset when there is no divider above.
-            if (pos > 0 && !hideDividerForAdapterPosition(pos - 1)) {
-                outRect.top = mDividerHeight / 2;
+            if (hideDividerForAdapterPosition(pos)) {
+                return;
             }
-
-            // Skip bottom offset when there is no divider below.
-            if (pos < state.getItemCount() - 1 && !hideDividerForAdapterPosition(pos)) {
-                outRect.bottom = mDividerHeight / 2;
-            }
+            // Add an bottom offset to all items that should have divider, even when divider is not
+            // drawn for the bottom item(s).
+            // With GridLayoutManager it's difficult to tell whether a view is in the last row.
+            // This is to keep expected behavior consistent.
+            outRect.bottom = mDividerHeight;
         }
 
         private boolean hideDividerForAdapterPosition(int position) {
diff --git a/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java b/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
index 91d3fa4..9369e79 100644
--- a/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
+++ b/coordinatorlayout/src/main/java/android/support/design/widget/CoordinatorLayout.java
@@ -32,6 +32,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.SystemClock;
+import android.support.annotation.AttrRes;
 import android.support.annotation.ColorInt;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.FloatRange;
@@ -193,15 +194,16 @@
     private final NestedScrollingParentHelper mNestedScrollingParentHelper =
             new NestedScrollingParentHelper(this);
 
-    public CoordinatorLayout(Context context) {
+    public CoordinatorLayout(@NonNull Context context) {
         this(context, null);
     }
 
-    public CoordinatorLayout(Context context, AttributeSet attrs) {
+    public CoordinatorLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
         this(context, attrs, R.attr.coordinatorLayoutStyle);
     }
 
-    public CoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+    public CoordinatorLayout(@NonNull Context context, @Nullable AttributeSet attrs,
+            @AttrRes int defStyleAttr) {
         super(context, attrs, defStyleAttr);
 
         final TypedArray a = (defStyleAttr == 0)
@@ -499,8 +501,6 @@
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
-        MotionEvent cancelEvent = null;
-
         final int action = ev.getActionMasked();
 
         // Make sure we reset in case we had missed a previous important event.
@@ -510,10 +510,6 @@
 
         final boolean intercepted = performIntercept(ev, TYPE_ON_INTERCEPT);
 
-        if (cancelEvent != null) {
-            cancelEvent.recycle();
-        }
-
         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
             resetTouchBehaviors(true);
         }
@@ -861,7 +857,7 @@
      *                        {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
      *                        {@link ViewCompat#LAYOUT_DIRECTION_RTL}.
      */
-    public void onLayoutChild(View child, int layoutDirection) {
+    public void onLayoutChild(@NonNull View child, int layoutDirection) {
         final LayoutParams lp = (LayoutParams) child.getLayoutParams();
         if (lp.checkAnchorChanged()) {
             throw new IllegalStateException("An anchor may not be changed after CoordinatorLayout"
@@ -1078,8 +1074,6 @@
      * @param layoutDirection ViewCompat constant for layout direction
      */
     private void layoutChildWithAnchor(View child, View anchor, int layoutDirection) {
-        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
         final Rect anchorRect = acquireTempRect();
         final Rect childRect = acquireTempRect();
         try {
@@ -1492,7 +1486,7 @@
      *
      * @param view the View to find dependents of to dispatch the call.
      */
-    public void dispatchDependentViewsChanged(View view) {
+    public void dispatchDependentViewsChanged(@NonNull View view) {
         final List<View> dependents = mChildDag.getIncomingEdges(view);
         if (dependents != null && !dependents.isEmpty()) {
             for (int i = 0; i < dependents.size(); i++) {
@@ -1671,7 +1665,7 @@
      * @param y Y coordinate to test, in the CoordinatorLayout's coordinate system
      * @return true if the point is within the child view's bounds, false otherwise
      */
-    public boolean isPointInChildBounds(View child, int x, int y) {
+    public boolean isPointInChildBounds(@NonNull View child, int x, int y) {
         final Rect r = acquireTempRect();
         getDescendantRect(child, r);
         try {
@@ -1689,7 +1683,7 @@
      * @param second second child view to test
      * @return true if both views are visible and overlap each other
      */
-    public boolean doViewsOverlap(View first, View second) {
+    public boolean doViewsOverlap(@NonNull View first, @NonNull View second) {
         if (first.getVisibility() == VISIBLE && second.getVisibility() == VISIBLE) {
             final Rect firstRect = acquireTempRect();
             getChildRect(first, first.getParent() != this, firstRect);
@@ -2086,7 +2080,8 @@
          * @return true if this Behavior would like to intercept and take over the event stream.
          *         The default always returns false.
          */
-        public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent ev) {
+        public boolean onInterceptTouchEvent(@NonNull CoordinatorLayout parent, @NonNull V child,
+                @NonNull MotionEvent ev) {
             return false;
         }
 
@@ -2109,7 +2104,8 @@
          * @return true if this Behavior handled this touch event and would like to continue
          *         receiving events in this stream. The default always returns false.
          */
-        public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent ev) {
+        public boolean onTouchEvent(@NonNull CoordinatorLayout parent, @NonNull V child,
+                @NonNull MotionEvent ev) {
             return false;
         }
 
@@ -2129,7 +2125,7 @@
          * @see #getScrimOpacity(CoordinatorLayout, View)
          */
         @ColorInt
-        public int getScrimColor(CoordinatorLayout parent, V child) {
+        public int getScrimColor(@NonNull CoordinatorLayout parent, @NonNull V child) {
             return Color.BLACK;
         }
 
@@ -2147,7 +2143,7 @@
          * @return the desired scrim opacity from 0.0f to 1.0f. The default return value is 0.0f.
          */
         @FloatRange(from = 0, to = 1)
-        public float getScrimOpacity(CoordinatorLayout parent, V child) {
+        public float getScrimOpacity(@NonNull CoordinatorLayout parent, @NonNull V child) {
             return 0.f;
         }
 
@@ -2163,7 +2159,7 @@
          * @return true if {@link #getScrimOpacity(CoordinatorLayout, View)} would
          *         return > 0.0f.
          */
-        public boolean blocksInteractionBelow(CoordinatorLayout parent, V child) {
+        public boolean blocksInteractionBelow(@NonNull CoordinatorLayout parent, @NonNull V child) {
             return getScrimOpacity(parent, child) > 0.f;
         }
 
@@ -2189,7 +2185,8 @@
          *
          * @see #onDependentViewChanged(CoordinatorLayout, View, View)
          */
-        public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) {
+        public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull V child,
+                @NonNull View dependency) {
             return false;
         }
 
@@ -2218,7 +2215,8 @@
          * @param dependency the dependent view that changed
          * @return true if the Behavior changed the child view's size or position, false otherwise
          */
-        public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) {
+        public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull V child,
+                @NonNull View dependency) {
             return false;
         }
 
@@ -2236,7 +2234,8 @@
          * @param child the child view to manipulate
          * @param dependency the dependent view that has been removed
          */
-        public void onDependentViewRemoved(CoordinatorLayout parent, V child, View dependency) {
+        public void onDependentViewRemoved(@NonNull CoordinatorLayout parent, @NonNull V child,
+                @NonNull View dependency) {
         }
 
         /**
@@ -2259,7 +2258,7 @@
          * @return true if the Behavior measured the child view, false if the CoordinatorLayout
          *         should perform its default measurement
          */
-        public boolean onMeasureChild(CoordinatorLayout parent, V child,
+        public boolean onMeasureChild(@NonNull CoordinatorLayout parent, @NonNull V child,
                 int parentWidthMeasureSpec, int widthUsed,
                 int parentHeightMeasureSpec, int heightUsed) {
             return false;
@@ -2289,7 +2288,8 @@
          * @return true if the Behavior performed layout of the child view, false to request
          *         default layout behavior
          */
-        public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
+        public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull V child,
+                int layoutDirection) {
             return false;
         }
 
@@ -2302,7 +2302,7 @@
          * @param child child view to set tag with
          * @param tag tag object to set
          */
-        public static void setTag(View child, Object tag) {
+        public static void setTag(@NonNull View child, @Nullable Object tag) {
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
             lp.mBehaviorTag = tag;
         }
@@ -2314,7 +2314,8 @@
          * @param child child view to get tag with
          * @return the previously stored tag object
          */
-        public static Object getTag(View child) {
+        @Nullable
+        public static Object getTag(@NonNull View child) {
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
             return lp.mBehaviorTag;
         }
@@ -2620,8 +2621,8 @@
          * @return The insets supplied, minus any insets that were consumed
          */
         @NonNull
-        public WindowInsetsCompat onApplyWindowInsets(CoordinatorLayout coordinatorLayout,
-                V child, WindowInsetsCompat insets) {
+        public WindowInsetsCompat onApplyWindowInsets(@NonNull CoordinatorLayout coordinatorLayout,
+                @NonNull V child, @NonNull WindowInsetsCompat insets) {
             return insets;
         }
 
@@ -2642,8 +2643,8 @@
          * @return true if the Behavior handled the request
          * @see ViewParent#requestChildRectangleOnScreen(View, Rect, boolean)
          */
-        public boolean onRequestChildRectangleOnScreen(CoordinatorLayout coordinatorLayout,
-                V child, Rect rectangle, boolean immediate) {
+        public boolean onRequestChildRectangleOnScreen(@NonNull CoordinatorLayout coordinatorLayout,
+                @NonNull V child, @NonNull Rect rectangle, boolean immediate) {
             return false;
         }
 
@@ -2659,7 +2660,8 @@
          *
          * @see #onSaveInstanceState()
          */
-        public void onRestoreInstanceState(CoordinatorLayout parent, V child, Parcelable state) {
+        public void onRestoreInstanceState(@NonNull CoordinatorLayout parent, @NonNull V child,
+                @NonNull Parcelable state) {
             // no-op
         }
 
@@ -2681,7 +2683,8 @@
          * @see #onRestoreInstanceState(Parcelable)
          * @see View#onSaveInstanceState()
          */
-        public Parcelable onSaveInstanceState(CoordinatorLayout parent, V child) {
+        @Nullable
+        public Parcelable onSaveInstanceState(@NonNull CoordinatorLayout parent, @NonNull V child) {
             return BaseSavedState.EMPTY_STATE;
         }
 
@@ -2776,7 +2779,7 @@
             super(width, height);
         }
 
-        LayoutParams(Context context, AttributeSet attrs) {
+        LayoutParams(@NonNull Context context, @Nullable AttributeSet attrs) {
             super(context, attrs);
 
             final TypedArray a = context.obtainStyledAttributes(attrs,
diff --git a/customview/src/main/java/android/support/v4/widget/ViewDragHelper.java b/customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
index 09c6f66..d1ca823 100644
--- a/customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
+++ b/customview/src/main/java/android/support/v4/widget/ViewDragHelper.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.Px;
 import android.support.v4.view.ViewCompat;
 import android.util.Log;
 import android.view.MotionEvent;
@@ -169,8 +170,8 @@
          * @param dx Change in X position from the last call
          * @param dy Change in Y position from the last call
          */
-        public void onViewPositionChanged(@NonNull View changedView, int left, int top, int dx,
-                int dy) {
+        public void onViewPositionChanged(@NonNull View changedView, int left, int top, @Px int dx,
+                @Px int dy) {
         }
 
         /**
@@ -452,6 +453,7 @@
      * @return The size of an edge in pixels
      * @see #setEdgeTrackingEnabled(int)
      */
+    @Px
     public int getEdgeSize() {
         return mEdgeSize;
     }
@@ -495,6 +497,7 @@
     /**
      * @return The minimum distance in pixels that the user must travel to initiate a drag
      */
+    @Px
     public int getTouchSlop() {
         return mTouchSlop;
     }
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
index 1f0b901..7bf3ba0 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/Processor.kt
@@ -24,6 +24,7 @@
 import android.support.tools.jetifier.core.transform.Transformer
 import android.support.tools.jetifier.core.transform.bytecode.ByteCodeTransformer
 import android.support.tools.jetifier.core.transform.metainf.MetaInfTransformer
+import android.support.tools.jetifier.core.transform.pom.PomDependency
 import android.support.tools.jetifier.core.transform.pom.PomDocument
 import android.support.tools.jetifier.core.transform.pom.PomScanner
 import android.support.tools.jetifier.core.transform.proguard.ProGuardTransformer
@@ -91,7 +92,7 @@
                     restrictToPackagePrefixes = listOf(REVERSE_RESTRICT_TO_PACKAGE),
                     rewriteRules = config.rewriteRules,
                     slRules = config.slRules,
-                    pomRewriteRules = emptyList(), // TODO: This will need a new set of rules
+                    pomRewriteRules = emptySet(), // TODO: This will need a new set of rules
                     typesMap = config.typesMap.reverseMapOrDie(),
                     proGuardMap = config.proGuardMap.reverseMapOrDie(),
                     packageMap = config.packageMap.reverse()
@@ -124,7 +125,7 @@
      * of a single file, only one library can be given as input.
      * @param copyUnmodifiedLibsAlso Whether archives that were not modified should be also copied
      * to the given [outputPath]
-     * @return List of files (existing and generated) that should replace the given [inputLibraries]
+     * @return list of files (existing and generated) that should replace the given [inputLibraries]
      */
     fun transform(inputLibraries: Set<File>,
             outputPath: Path,
@@ -183,6 +184,30 @@
         return inputLibraries.minus(filesToRemove).plus(generatedLibraries)
     }
 
+    /**
+     * Maps the given dependency (in form of groupId:artifactId:version) to a new set of
+     * dependencies. Used for mapping of old support library artifacts to jetpack ones.
+     *
+     * @return set of new dependencies. Can be empty which means the given dependency should be
+     * removed without replacement. Returns null in case a mapping was not found which means that
+     * the given artifact was unknown.
+     */
+    fun mapDependency(depNotation: String): Set<String>? {
+        val parts = depNotation.split(":")
+        val inputDependency = PomDependency(
+            groupId = parts[0],
+            artifactId = parts[1],
+            version = parts[2])
+
+        // TODO: We ignore version check for now
+        val resultRule = context.config.pomRewriteRules
+            .firstOrNull { it.matches(inputDependency) } ?: return null
+
+        return resultRule.to
+            .map { it.toStringNotation() }
+            .toSet()
+    }
+
     private fun loadLibraries(inputLibraries: Iterable<File>): List<Archive> {
         val libraries = mutableListOf<Archive>()
         for (library in inputLibraries) {
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt
index 007130d..dc2f861 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/config/Config.kt
@@ -36,13 +36,25 @@
  * rewrite.
  */
 data class Config(
-        val restrictToPackagePrefixes: List<String>,
-        val rewriteRules: List<RewriteRule>,
-        val slRules: List<RewriteRule>,
-        val pomRewriteRules: List<PomRewriteRule>,
-        val typesMap: TypesMap,
-        val proGuardMap: ProGuardTypesMap,
-        val packageMap: PackageMap = PackageMap(PackageMap.DEFAULT_RULES)) {
+    val restrictToPackagePrefixes: List<String>,
+    val rewriteRules: List<RewriteRule>,
+    val slRules: List<RewriteRule>,
+    val pomRewriteRules: Set<PomRewriteRule>,
+    val typesMap: TypesMap,
+    val proGuardMap: ProGuardTypesMap,
+    val packageMap: PackageMap = PackageMap(PackageMap.DEFAULT_RULES)
+) {
+
+    init {
+        // Verify pom rules
+        val testSet = mutableSetOf<String>()
+        pomRewriteRules.forEach {
+            val raw = "${it.from.groupId}:${it.from.artifactId}"
+            if (!testSet.add(raw)) {
+                throw IllegalArgumentException("Artifact '$raw' is defined twice in pom rules!")
+            }
+        }
+    }
 
     companion object {
         /** Path to the default config file located within the jar file. */
@@ -86,15 +98,16 @@
             val mappings: TypesMap.JsonData? = null,
 
             @SerializedName("proGuardMap")
-            val proGuardMap: ProGuardTypesMap.JsonData? = null) {
-
+            val proGuardMap: ProGuardTypesMap.JsonData? = null
+    ) {
         /** Creates instance of [Config] */
         fun toConfig(): Config {
+
             return Config(
                 restrictToPackagePrefixes = restrictToPackages.filterNotNull(),
                 rewriteRules = rules.filterNotNull().map { it.toRule() },
                 slRules = slRules?.filterNotNull()?.map { it.toRule() } ?: listOf(),
-                pomRewriteRules = pomRules.filterNotNull().map { it.toRule() },
+                pomRewriteRules = pomRules.filterNotNull().map { it.toRule() }.toSet(),
                 typesMap = mappings?.toMappings() ?: TypesMap.EMPTY,
                 proGuardMap = proGuardMap?.toMappings() ?: ProGuardTypesMap.EMPTY
             )
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDependency.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDependency.kt
index 1622fd7..8e480d0 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDependency.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDependency.kt
@@ -27,10 +27,10 @@
  */
 data class PomDependency(
         @SerializedName("groupId")
-        val groupId: String? = null,
+        val groupId: String?,
 
         @SerializedName("artifactId")
-        val artifactId: String? = null,
+        val artifactId: String?,
 
         @SerializedName("version")
         var version: String? = null,
@@ -55,15 +55,15 @@
         /**
          * Creates a new [PomDependency] from the given XML [Element].
          */
-        fun fromXmlElement(node: Element, properties: Map<String, String>) : PomDependency {
-            var groupId : String? = null
-            var artifactId : String? = null
-            var version : String? = null
-            var classifier : String? = null
-            var type : String? = null
-            var scope : String? = null
-            var systemPath : String? = null
-            var optional : String? = null
+        fun fromXmlElement(node: Element, properties: Map<String, String>): PomDependency {
+            var groupId: String? = null
+            var artifactId: String? = null
+            var version: String? = null
+            var classifier: String? = null
+            var type: String? = null
+            var scope: String? = null
+            var systemPath: String? = null
+            var optional: String? = null
 
             for (childNode in node.children) {
                 when (childNode.name) {
@@ -88,7 +88,6 @@
                     systemPath = systemPath,
                     optional = optional)
         }
-
     }
 
     init {
@@ -100,7 +99,7 @@
     /**
      * Whether this dependency should be skipped from the rewriting process
      */
-    fun shouldSkipRewrite() : Boolean {
+    fun shouldSkipRewrite(): Boolean {
         return scope != null && scope.toLowerCase() == "test"
     }
 
@@ -108,7 +107,7 @@
      * Returns a new dependency created by taking all the items from the [input] dependency and then
      * overwriting these with all of its non-null items.
      */
-    fun rewrite(input: PomDependency) : PomDependency {
+    fun rewrite(input: PomDependency): PomDependency {
         return PomDependency(
             groupId = groupId ?: input.groupId,
             artifactId = artifactId ?: input.artifactId,
@@ -124,7 +123,7 @@
     /**
      * Transforms the current data into XML '<dependency>' node.
      */
-    fun toXmlElement(document: Document) : Element {
+    fun toXmlElement(document: Document): Element {
         val node = Element("dependency")
         node.namespace = document.rootElement.namespace
 
@@ -139,4 +138,11 @@
 
         return node
     }
+
+    /**
+     * Returns the dependency in format "groupId:artifactId:version".
+     */
+    fun toStringNotation(): String {
+        return "$groupId:$artifactId:$version"
+    }
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
index 7dcd826..bdde62e 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocument.kt
@@ -64,7 +64,7 @@
      * Currently it checks that all the dependencies that are going to be rewritten by the given
      * rules satisfy the minimal version requirements defined by the rules.
      */
-    fun validate(rules: List<PomRewriteRule>): Boolean {
+    fun validate(rules: Set<PomRewriteRule>): Boolean {
         if (dependenciesGroup == null) {
             // Nothing to validate as this file has no dependencies section
             return true
@@ -78,7 +78,7 @@
      *
      * Changes are not saved back until requested.
      */
-    fun applyRules(rules: List<PomRewriteRule>) {
+    fun applyRules(rules: Set<PomRewriteRule>) {
         if (dependenciesGroup == null) {
             // Nothing to transform as this file has no dependencies section
             return
diff --git a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRule.kt b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRule.kt
index 070a640..2ae6449 100644
--- a/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRule.kt
+++ b/jetifier/jetifier/core/src/main/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRule.kt
@@ -25,16 +25,35 @@
  * Any dependency that is matched against [from] should be rewritten to list of the dependencies
  * defined in [to].
  */
-data class PomRewriteRule(val from: PomDependency, val to: List<PomDependency>) {
+data class PomRewriteRule(val from: PomDependency, val to: Set<PomDependency>) {
+
+    init {
+        validate(from, checkVersion = false)
+        to.forEach { validate(it, checkVersion = true) }
+    }
 
     companion object {
-        val TAG : String = "PomRule"
+        val TAG: String = "PomRule"
+
+        private fun validate(dep: PomDependency, checkVersion: Boolean) {
+            if (dep.groupId == null || dep.groupId.isEmpty()) {
+                throw IllegalArgumentException("GroupId is missing in the POM rule!")
+            }
+
+            if (dep.artifactId == null || dep.artifactId.isEmpty()) {
+                throw IllegalArgumentException("ArtifactId is missing in the POM rule!")
+            }
+
+            if (checkVersion && (dep.version == null || dep.version!!.isEmpty())) {
+                throw IllegalArgumentException("Version is missing in the POM rule!")
+            }
+        }
     }
 
     /**
      * Validates that the given [input] dependency has a valid version.
      */
-    fun validateVersion(input: PomDependency, document: PomDocument? = null) : Boolean {
+    fun validateVersion(input: PomDependency, document: PomDocument? = null): Boolean {
         if (from.version == null || input.version == null) {
             return true
         }
@@ -59,7 +78,7 @@
      * Version entry can be actually quite complicated, see the full documentation at:
      * https://maven.apache.org/pom.html#Dependencies
      */
-    private fun areVersionsMatching(ourVersion: String, version: String) : Boolean {
+    private fun areVersionsMatching(ourVersion: String, version: String): Boolean {
         if (version == "latest" || version == "release") {
             return true
         }
@@ -75,29 +94,28 @@
         return ourVersion == version
     }
 
-    fun matches(input: PomDependency) : Boolean {
+    fun matches(input: PomDependency): Boolean {
         return input.artifactId == from.artifactId && input.groupId == from.groupId
     }
 
     /** Returns JSON data model of this class */
-    fun toJson() : PomRewriteRule.JsonData {
+    fun toJson(): PomRewriteRule.JsonData {
         return PomRewriteRule.JsonData(from, to)
     }
 
-
     /**
      * JSON data model for [PomRewriteRule].
      */
     data class JsonData(
-            @SerializedName("from")
-            val from: PomDependency,
-            @SerializedName("to")
-            val to: List<PomDependency>)  {
+        @SerializedName("from")
+        val from: PomDependency,
+        @SerializedName("to")
+        val to: Set<PomDependency>
+    ) {
 
         /** Creates instance of [PomRewriteRule] */
-        fun toRule() : PomRewriteRule {
-            return PomRewriteRule(from, to.filterNotNull())
+        fun toRule(): PomRewriteRule {
+            return PomRewriteRule(from, to.filterNotNull().toSet())
         }
     }
-
 }
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
index 1eeabdc..1e77bcb 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/ChangeDetectionTest.kt
@@ -41,7 +41,7 @@
         restrictToPackagePrefixes = emptyList(),
         rewriteRules = emptyList(),
         slRules = emptyList(),
-        pomRewriteRules = emptyList(),
+        pomRewriteRules = emptySet(),
         typesMap = TypesMap.EMPTY,
         proGuardMap = ProGuardTypesMap.EMPTY,
         packageMap = PackageMap.EMPTY
@@ -55,11 +55,11 @@
             RewriteRule(from = "(.*)/R(.*)", to = "ignore")
         ),
         slRules = emptyList(),
-        pomRewriteRules = listOf(
+        pomRewriteRules = setOf(
             PomRewriteRule(
                 PomDependency(
                     groupId = "supportGroup", artifactId = "supportArtifact", version = "4.0"),
-                listOf(
+                setOf(
                     PomDependency(
                         groupId = "testGroup", artifactId = "testArtifact", version = "1.0")
                 )
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt
index 97cfc2f..49ef6f8 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/config/ConfigParserTest.kt
@@ -23,34 +23,34 @@
 
     @Test fun parseConfig_validInput() {
         val confStr =
-                "{\n" +
-                "    restrictToPackagePrefixes: [\"android/support/\"],\n" +
-                "    # Sample comment \n" +
-                "    rules: [\n" +
-                "        {\n" +
-                "            from: \"android/support/v14/preferences/(.*)\",\n" +
-                "            to: \"android/jetpack/prefs/main/{0}\"\n" +
-                "        },\n" +
-                "        {\n" +
-                "            from: \"android/support/v14/preferences/(.*)\",\n" +
-                "            to: \"android/jetpack/prefs/main/{0}\",\n" +
-                "            fieldSelectors: [\"dialog_(.*)\"]\n" +
-                "        }\n" +
-                "    ],\n" +
-                "    pomRules: [\n" +
-                "        {\n" +
-                "            from: {groupId: \"g\", artifactId: \"a\", version: \"1.0\"},\n" +
-                "            to: [\n" +
-                "                {groupId: \"g\", artifactId: \"a\", version: \"2.0\"} \n" +
-                "            ]\n" +
-                "        }\n" +
-                "    ],\n" +
-                "   proGuardMap: {\n" +
-                "       rules: {\n" +
-                "           \"android/support/**\": \"androidx/**\"\n" +
-                "       }\n" +
-                "    }" +
-                "}"
+            "{\n" +
+            "    restrictToPackagePrefixes: [\"android/support/\"],\n" +
+            "    # Sample comment \n" +
+            "    rules: [\n" +
+            "        {\n" +
+            "            from: \"android/support/v14/preferences/(.*)\",\n" +
+            "            to: \"android/jetpack/prefs/main/{0}\"\n" +
+            "        },\n" +
+            "        {\n" +
+            "            from: \"android/support/v14/preferences/(.*)\",\n" +
+            "            to: \"android/jetpack/prefs/main/{0}\",\n" +
+            "            fieldSelectors: [\"dialog_(.*)\"]\n" +
+            "        }\n" +
+            "    ],\n" +
+            "    pomRules: [\n" +
+            "        {\n" +
+            "            from: {groupId: \"g\", artifactId: \"a\", version: \"1.0\"},\n" +
+            "            to: [\n" +
+            "                {groupId: \"g\", artifactId: \"a\", version: \"2.0\"} \n" +
+            "            ]\n" +
+            "        }\n" +
+            "    ],\n" +
+            "   proGuardMap: {\n" +
+            "       rules: {\n" +
+            "           \"android/support/**\": \"androidx/**\"\n" +
+            "       }\n" +
+            "    }" +
+            "}"
 
         val config = ConfigParser.parseFromString(confStr)
 
@@ -59,5 +59,76 @@
         Truth.assertThat(config.rewriteRules.size).isEqualTo(2)
         Truth.assertThat(config.proGuardMap.rules.size).isEqualTo(1)
     }
-}
 
+    @Test(expected = IllegalArgumentException::class)
+    fun parseConfig_pomMissingGroup_shouldFail() {
+        val confStr =
+            "{\n" +
+            "    restrictToPackagePrefixes: [\"android/support/\"],\n" +
+            "    rules: [\n" +
+            "    ],\n" +
+            "    pomRules: [\n" +
+            "        {\n" +
+            "            from: {artifactId: \"a\", version: \"1.0\"},\n" +
+            "            to: []\n" +
+            "        }\n" +
+            "    ]\n" +
+            "}"
+        ConfigParser.parseFromString(confStr)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun parseConfig_pomMissingArtifact_shouldFail() {
+        val confStr =
+            "{\n" +
+            "    restrictToPackagePrefixes: [\"android/support/\"],\n" +
+            "    rules: [\n" +
+            "    ],\n" +
+            "    pomRules: [\n" +
+            "        {\n" +
+            "            from: {groupId: \"g\", version: \"1.0\"},\n" +
+            "            to: []\n" +
+            "        }\n" +
+            "    ]\n" +
+            "}"
+        ConfigParser.parseFromString(confStr)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun parseConfig_pomMissingVersion_shouldFail() {
+        val confStr =
+            "{\n" +
+            "    restrictToPackagePrefixes: [\"android/support/\"],\n" +
+            "    rules: [\n" +
+            "    ],\n" +
+            "    pomRules: [\n" +
+            "        {\n" +
+            "            from: {artifactId: \"a\", groupId: \"g\"},\n" +
+            "            to: [{artifactId: \"a\", groupId: \"g\"}]\n" +
+            "        }\n" +
+            "    ]\n" +
+            "}"
+        ConfigParser.parseFromString(confStr)
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun parseConfig_duplicity_shouldFail() {
+        val confStr =
+            "{\n" +
+                "    restrictToPackagePrefixes: [\"android/support/\"],\n" +
+                "    rules: [\n" +
+                "    ],\n" +
+                "    pomRules: [\n" +
+                "        {\n" +
+                "            from: {artifactId: \"a\", groupId: \"g\", version: \"1.0\"},\n" +
+                "            to: []\n" +
+                "        },\n" +
+                "        {\n" +
+                "            from: {artifactId: \"a\", groupId: \"g\", version: \"2.0\"},\n" +
+                "            to: []\n" +
+                "        }\n" +
+                "    ]\n" +
+                "}"
+        ConfigParser.parseFromString(confStr)
+    }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt
index 6f4eb59..9f56676 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/map/MapGenerationTest.kt
@@ -162,7 +162,7 @@
                         restrictToPackagePrefixes = prefixes,
                         rewriteRules = rules,
                         slRules = emptyList(),
-                        pomRewriteRules = emptyList(),
+                        pomRewriteRules = emptySet(),
                         typesMap = TypesMap.EMPTY,
                         proGuardMap = ProGuardTypesMap.EMPTY)
                     val scanner = MapGeneratorRemapper(config)
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/DependencyMappingTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/DependencyMappingTest.kt
new file mode 100644
index 0000000..3499fef
--- /dev/null
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/DependencyMappingTest.kt
@@ -0,0 +1,102 @@
+package android.support.tools.jetifier.core.transform
+
+import android.support.tools.jetifier.core.Processor
+import android.support.tools.jetifier.core.config.Config
+import android.support.tools.jetifier.core.map.TypesMap
+import android.support.tools.jetifier.core.transform.pom.PomDependency
+import android.support.tools.jetifier.core.transform.pom.PomRewriteRule
+import android.support.tools.jetifier.core.transform.proguard.ProGuardTypesMap
+import com.google.common.truth.Truth
+import org.junit.Test
+
+class DependencyMappingTest {
+
+    @Test
+    fun mapTest_oneToOne_shouldMap() {
+        MappingTester
+            .testRewrite(
+                from = "hello:world:1.0.0",
+                to = setOf("hi:all:2.0.0"),
+                rules = setOf(
+                    PomRewriteRule(
+                        from = PomDependency(groupId = "hello", artifactId = "world"),
+                        to = setOf(
+                            PomDependency(groupId = "hi", artifactId = "all", version = "2.0.0")
+                        )
+                    ))
+            )
+    }
+
+    @Test
+    fun mapTest_oneToTwo_shouldMap() {
+        MappingTester
+            .testRewrite(
+                from = "hello:world:1.0.0",
+                to = setOf("hi:all:2.0.0", "hey:all:3.0.0"),
+                rules = setOf(
+                    PomRewriteRule(
+                        from = PomDependency(groupId = "hello", artifactId = "world"),
+                        to = setOf(
+                            PomDependency(groupId = "hi", artifactId = "all", version = "2.0.0"),
+                            PomDependency(groupId = "hey", artifactId = "all", version = "3.0.0")
+                        )
+                    ))
+            )
+    }
+
+    @Test
+    fun mapTest_oneToNone_shouldMapToEmpty() {
+        MappingTester
+            .testRewrite(
+                from = "hello:world:1.0.0",
+                to = setOf(),
+                rules = setOf(
+                    PomRewriteRule(
+                        from = PomDependency(groupId = "hello", artifactId = "world"),
+                        to = setOf()
+                    ))
+            )
+    }
+
+    @Test
+    fun mapTest_oneToNull_ruleNotFound_returnNull() {
+        MappingTester
+            .testRewrite(
+                from = "hello:world:1.0.0",
+                to = null,
+                rules = setOf(
+                    PomRewriteRule(
+                        from = PomDependency(groupId = "hello", artifactId = "me", version = "1.0"),
+                        to = setOf()
+                    ))
+            )
+    }
+
+    object MappingTester {
+
+        fun testRewrite(
+            from: String,
+            to: Set<String>?,
+            rules: Set<PomRewriteRule>
+        ) {
+            val config = Config(
+                restrictToPackagePrefixes = emptyList(),
+                rewriteRules = emptyList(),
+                slRules = emptyList(),
+                pomRewriteRules = rules,
+                typesMap = TypesMap.EMPTY,
+                proGuardMap = ProGuardTypesMap.EMPTY,
+                packageMap = PackageMap.EMPTY
+            )
+
+            val processor = Processor.createProcessor(config)
+            val result = processor.mapDependency(from)
+
+            if (to == null) {
+                Truth.assertThat(result).isNull()
+            } else {
+                Truth.assertThat(result).containsExactlyElementsIn(to)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
index 6876976..0d08b02 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/bytecode/ClassFilesMoveTest.kt
@@ -47,7 +47,7 @@
                 RewriteRule("android/support/v7/preference/R(.*)", "ignore"),
                 RewriteRule("android/support/v4/(.*)", "ignore")
             ),
-            pomRewriteRules = emptyList(),
+            pomRewriteRules = emptySet(),
             typesMap = TypesMap(mapOf(
                 "android/support/v7/preference/Preference"
                     to "androidx/support/preference/Preference",
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt
index db6cd21..c88c08d 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/metainf/MetaInfTransformerTest.kt
@@ -103,7 +103,7 @@
             restrictToPackagePrefixes = emptyList(),
             rewriteRules = emptyList(),
             slRules = emptyList(),
-            pomRewriteRules = emptyList(),
+            pomRewriteRules = emptySet(),
             packageMap = PackageMap.EMPTY,
             typesMap = TypesMap.EMPTY,
             proGuardMap = ProGuardTypesMap.EMPTY
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocumentTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocumentTest.kt
index d55687f..2913ede 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocumentTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomDocumentTest.kt
@@ -37,7 +37,7 @@
             "      <optional>true</optional>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf()
+            rules = emptySet()
         )
     }
 
@@ -65,12 +65,12 @@
             "      <systemPath>test/test</systemPath>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0")
@@ -91,12 +91,12 @@
             "      <scope>test</scope>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0")
@@ -116,12 +116,12 @@
             "      <version>4.0</version>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact2",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0")
@@ -163,12 +163,12 @@
             "      <type>compile</type>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0")
@@ -201,12 +201,12 @@
             "      <version>2.0</version>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0"),
@@ -246,12 +246,12 @@
             "      <version>2.0</version>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0"),
@@ -264,7 +264,7 @@
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact2",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0"),
@@ -304,12 +304,12 @@
             "      <optional>true</optional>\n" +
             "    </dependency>\n" +
             "  </dependencies>",
-            rules = listOf(
+            rules = setOf(
                 PomRewriteRule(
                     PomDependency(
                         groupId = "supportGroup", artifactId = "supportArtifact",
                         version =  "4.0"),
-                    listOf(
+                    setOf(
                         PomDependency(
                             groupId = "testGroup", artifactId = "testArtifact",
                             version = "1.0")
@@ -357,11 +357,11 @@
     }
 
 
-    private fun testRewriteToTheSame(givenAndExpectedXml: String, rules: List<PomRewriteRule>) {
+    private fun testRewriteToTheSame(givenAndExpectedXml: String, rules: Set<PomRewriteRule>) {
         testRewrite(givenAndExpectedXml, givenAndExpectedXml, rules)
     }
 
-    private fun testRewrite(givenXml: String, expectedXml : String, rules: List<PomRewriteRule>) {
+    private fun testRewrite(givenXml: String, expectedXml : String, rules: Set<PomRewriteRule>) {
         val given =
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
             "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" " +
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRuleTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRuleTest.kt
index 34ebd04..94ed6e3 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRuleTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/pom/PomRewriteRuleTest.kt
@@ -21,7 +21,8 @@
 
 class PomRewriteRuleTest {
 
-    @Test fun versions_nullInRule_match() {
+    @Test(expected = IllegalArgumentException::class)
+    fun versions_nullInRule_match() {
         testVersionsMatch(
             ruleVersion = null,
             pomVersion = "27.0.0"
@@ -35,7 +36,8 @@
         )
     }
 
-    @Test fun versions_nullBoth_match() {
+    @Test(expected = IllegalArgumentException::class)
+    fun versions_nullBoth_match() {
         testVersionsMatch(
             ruleVersion = null,
             pomVersion = null
@@ -120,19 +122,19 @@
     }
 
     private fun testVersionsMatch(ruleVersion: String?, pomVersion: String?) {
-        val from = PomDependency(version = ruleVersion)
-        val pom = PomDependency(version = pomVersion)
+        val from = PomDependency(groupId = "g", artifactId = "a", version = ruleVersion)
+        val pom = PomDependency(groupId = "g", artifactId = "a", version = pomVersion)
 
-        val rule = PomRewriteRule(from, listOf(from))
+        val rule = PomRewriteRule(from, setOf(from))
 
         Truth.assertThat(rule.validateVersion(pom)).isTrue()
     }
 
     private fun testVersionsDoNotMatch(ruleVersion: String?, pomVersion: String?) {
-        val from = PomDependency(version = ruleVersion)
-        val pom = PomDependency(version = pomVersion)
+        val from = PomDependency(groupId = "g", artifactId = "a", version = ruleVersion)
+        val pom = PomDependency(groupId = "g", artifactId = "a", version = pomVersion)
 
-        val rule = PomRewriteRule(from, listOf(from))
+        val rule = PomRewriteRule(from, setOf(from))
 
         Truth.assertThat(rule.validateVersion(pom)).isFalse()
     }
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt
index 37075d3..d4acfb6 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/proguard/ProGuardTester.kt
@@ -75,7 +75,7 @@
             restrictToPackagePrefixes = prefixes,
             rewriteRules = rewriteRules.map { RewriteRule(it.first, it.second) },
             slRules = emptyList(),
-            pomRewriteRules = emptyList(),
+            pomRewriteRules = emptySet(),
             typesMap = TypesMap(
                 types = javaTypes.map { JavaType(it.first) to JavaType(it.second) }.toMap()
             ),
diff --git a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt
index 4aaaae0..44f2ba4 100644
--- a/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt
+++ b/jetifier/jetifier/core/src/test/kotlin/android/support/tools/jetifier/core/transform/resource/XmlResourcesTransformerTest.kt
@@ -325,7 +325,7 @@
             restrictToPackagePrefixes = prefixes,
             rewriteRules = emptyList(),
             slRules = emptyList(),
-            pomRewriteRules = emptyList(),
+            pomRewriteRules = emptySet(),
             typesMap = typeMap,
             proGuardMap = ProGuardTypesMap.EMPTY,
             packageMap = packageMap
diff --git a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java
index 836cfff..d5ba9df 100644
--- a/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java
+++ b/lifecycle/integration-tests/testapp/src/androidTest/java/android/arch/lifecycle/LiveDataOnSaveInstanceStateTest.java
@@ -116,8 +116,8 @@
         mActivityTestRule.runOnUiThread(() -> mutableLiveData.setValue(0));
 
         TestUtils.waitTillResumed(lifecycleOwner, mActivityTestRule);
-
-        mutableLiveData.observe(lifecycleOwner, atomicInteger::set);
+        mActivityTestRule.runOnUiThread(() ->
+                mutableLiveData.observe(lifecycleOwner, atomicInteger::set));
 
         final FragmentActivity dialogActivity = launchDialog();
 
@@ -143,7 +143,8 @@
 
         TestUtils.waitTillResumed(lifecycleOwner, mActivityTestRule);
 
-        mutableLiveData.observe(lifecycleOwner, atomicInteger::set);
+        mActivityTestRule.runOnUiThread(() ->
+                mutableLiveData.observe(lifecycleOwner, atomicInteger::set));
 
         // Launch the NavigationDialogActivity, partially obscuring the activity, and wait for the
         // lifecycleOwner to hit onPause (or enter the STARTED state).  On API 24 and above, this
diff --git a/lifecycle/livedata-core/src/main/java/android/arch/lifecycle/LiveData.java b/lifecycle/livedata-core/src/main/java/android/arch/lifecycle/LiveData.java
index 3a753a1..fc8fb31 100644
--- a/lifecycle/livedata-core/src/main/java/android/arch/lifecycle/LiveData.java
+++ b/lifecycle/livedata-core/src/main/java/android/arch/lifecycle/LiveData.java
@@ -163,6 +163,7 @@
      */
     @MainThread
     public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
+        assertMainThread("observe");
         if (owner.getLifecycle().getCurrentState() == DESTROYED) {
             // ignore
             return;
@@ -195,6 +196,7 @@
      */
     @MainThread
     public void observeForever(@NonNull Observer<T> observer) {
+        assertMainThread("observeForever");
         AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
         ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
         if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
diff --git a/lifecycle/livedata/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java b/lifecycle/livedata/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java
index d0ff1b2..9130b25 100644
--- a/lifecycle/livedata/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java
+++ b/lifecycle/livedata/src/test/java/android/arch/lifecycle/ComputableLiveDataTest.java
@@ -98,9 +98,14 @@
             };
             final ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
             //noinspection unchecked
-            Observer<Integer> observer = mock(Observer.class);
-            computable.getLiveData().observeForever(observer);
-            verify(observer, never()).onChanged(anyInt());
+            final Observer<Integer> observer = mock(Observer.class);
+            executor.postToMainThread(new Runnable() {
+                @Override
+                public void run() {
+                    computable.getLiveData().observeForever(observer);
+                    verify(observer, never()).onChanged(anyInt());
+                }
+            });
             // wait for first compute call
             assertThat(computeCounter.tryAcquire(1, 2, TimeUnit.SECONDS), is(true));
             // re-invalidate while in compute
diff --git a/lifecycle/livedata/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java b/lifecycle/livedata/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java
index e2eadbe..9dbeb44 100644
--- a/lifecycle/livedata/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java
+++ b/lifecycle/livedata/src/test/java/android/arch/lifecycle/MediatorLiveDataTest.java
@@ -26,10 +26,12 @@
 import static org.mockito.Mockito.when;
 
 import android.arch.core.executor.ArchTaskExecutor;
+import android.arch.core.executor.testing.InstantTaskExecutorRule;
 import android.arch.lifecycle.util.InstantTaskExecutor;
 import android.support.annotation.Nullable;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,6 +40,9 @@
 @RunWith(JUnit4.class)
 public class MediatorLiveDataTest {
 
+    @Rule
+    public InstantTaskExecutorRule mInstantTaskExecutorRule = new InstantTaskExecutorRule();
+
     private LifecycleOwner mOwner;
     private LifecycleRegistry mRegistry;
     private MediatorLiveData<String> mMediator;
diff --git a/loader/Android.mk b/loader/Android.mk
deleted file mode 100644
index 089be12..0000000
--- a/loader/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2011 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.
-
-LOCAL_PATH := $(call my-dir)
-
-# Here is the final static library that apps can link against.
-# Applications that use this library must specify
-#
-#   LOCAL_STATIC_ANDROID_LIBRARIES := \
-#       android-support-loader
-#
-# in their makefiles to include the resources and their dependencies in their package.
-include $(CLEAR_VARS)
-LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-loader
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-LOCAL_SRC_FILES := \
-    $(call all-java-files-under, src/main/java)
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_JAVA_LIBRARIES := \
-    android-support-annotations \
-    android-support-compat
-LOCAL_STATIC_ANDROID_LIBRARIES := \
-    android-arch-lifecycle-livedata-core \
-    android-arch-lifecycle-viewmodel
-LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
diff --git a/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java b/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java
index c622f65..2401e6e 100644
--- a/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java
+++ b/paging/common/src/main/java/android/arch/paging/ContiguousPagedList.java
@@ -53,7 +53,12 @@
             if (resultType == PageResult.INIT) {
                 mStorage.init(pageResult.leadingNulls, page, pageResult.trailingNulls,
                         pageResult.positionOffset, ContiguousPagedList.this);
-                mLastLoad = pageResult.leadingNulls + pageResult.positionOffset + page.size() / 2;
+                if (mLastLoad == LAST_LOAD_UNSPECIFIED) {
+                    // Because the ContiguousPagedList wasn't initialized with a last load position,
+                    // initialize it to the middle of the initial load
+                    mLastLoad =
+                            pageResult.leadingNulls + pageResult.positionOffset + page.size() / 2;
+                }
             } else if (resultType == PageResult.APPEND) {
                 mStorage.appendPage(page, ContiguousPagedList.this);
             } else if (resultType == PageResult.PREPEND) {
@@ -76,16 +81,20 @@
         }
     };
 
+    static final int LAST_LOAD_UNSPECIFIED = -1;
+
     ContiguousPagedList(
             @NonNull ContiguousDataSource<K, V> dataSource,
             @NonNull Executor mainThreadExecutor,
             @NonNull Executor backgroundThreadExecutor,
             @Nullable BoundaryCallback<V> boundaryCallback,
             @NonNull Config config,
-            final @Nullable K key) {
+            final @Nullable K key,
+            int lastLoad) {
         super(new PagedStorage<V>(), mainThreadExecutor, backgroundThreadExecutor,
                 boundaryCallback, config);
         mDataSource = dataSource;
+        mLastLoad = lastLoad;
 
         if (mDataSource.isInvalid()) {
             detach();
diff --git a/paging/common/src/main/java/android/arch/paging/PagedList.java b/paging/common/src/main/java/android/arch/paging/PagedList.java
index c6de5c5..6c15fb6 100644
--- a/paging/common/src/main/java/android/arch/paging/PagedList.java
+++ b/paging/common/src/main/java/android/arch/paging/PagedList.java
@@ -160,10 +160,14 @@
             @NonNull Config config,
             @Nullable K key) {
         if (dataSource.isContiguous() || !config.enablePlaceholders) {
+            int lastLoad = ContiguousPagedList.LAST_LOAD_UNSPECIFIED;
             if (!dataSource.isContiguous()) {
                 //noinspection unchecked
                 dataSource = (DataSource<K, T>) ((PositionalDataSource<T>) dataSource)
                         .wrapAsContiguousWithoutPlaceholders();
+                if (key != null) {
+                    lastLoad = (int) key;
+                }
             }
             ContiguousDataSource<K, T> contigDataSource = (ContiguousDataSource<K, T>) dataSource;
             return new ContiguousPagedList<>(contigDataSource,
@@ -171,7 +175,8 @@
                     backgroundThreadExecutor,
                     boundaryCallback,
                     config,
-                    key);
+                    key,
+                    lastLoad);
         } else {
             return new TiledPagedList<>((PositionalDataSource<T>) dataSource,
                     mainThreadExecutor,
diff --git a/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt b/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt
index c2c17e0..de4e3d8 100644
--- a/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt
+++ b/paging/common/src/test/java/android/arch/paging/ContiguousPagedListTest.kt
@@ -138,7 +138,8 @@
             initLoadSize: Int = 40,
             prefetchDistance: Int = 20,
             listData: List<Item> = ITEMS,
-            boundaryCallback: PagedList.BoundaryCallback<Item>? = null
+            boundaryCallback: PagedList.BoundaryCallback<Item>? = null,
+            lastLoad: Int = ContiguousPagedList.LAST_LOAD_UNSPECIFIED
     ): ContiguousPagedList<Int, Item> {
         return ContiguousPagedList(
                 TestSource(listData), mMainThread, mBackgroundThread, boundaryCallback,
@@ -147,7 +148,8 @@
                         .setPageSize(pageSize)
                         .setPrefetchDistance(prefetchDistance)
                         .build(),
-                initialPosition)
+                initialPosition,
+                lastLoad)
     }
 
     @Test
@@ -309,13 +311,36 @@
     }
 
     @Test
+    fun initialLoad_lastLoad() {
+        val pagedList = createCountedPagedList(
+                initialPosition = 0,
+                initLoadSize = 20,
+                lastLoad = 4)
+        // last load is param passed
+        assertEquals(4, pagedList.mLastLoad)
+        verifyRange(0, 20, pagedList)
+    }
+
+    @Test
+    fun initialLoad_lastLoadComputed() {
+        val pagedList = createCountedPagedList(
+                initialPosition = 0,
+                initLoadSize = 20,
+                lastLoad = ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
+        // last load is middle of initial load
+        assertEquals(10, pagedList.mLastLoad)
+        verifyRange(0, 20, pagedList)
+    }
+
+    @Test
     fun initialLoadAsync() {
         // Note: ignores Parameterized param
         val asyncDataSource = AsyncListDataSource(ITEMS)
         val dataSource = asyncDataSource.wrapAsContiguousWithoutPlaceholders()
         val pagedList = ContiguousPagedList(
                 dataSource, mMainThread, mBackgroundThread, null,
-                PagedList.Config.Builder().setPageSize(10).build(), null)
+                PagedList.Config.Builder().setPageSize(10).build(), null,
+                ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
         val callback = mock(PagedList.Callback::class.java)
         pagedList.addWeakCallback(null, callback)
 
@@ -343,7 +368,8 @@
         val dataSource = asyncDataSource.wrapAsContiguousWithoutPlaceholders()
         val pagedList = ContiguousPagedList(
                 dataSource, mMainThread, mBackgroundThread, null,
-                PagedList.Config.Builder().setPageSize(10).build(), null)
+                PagedList.Config.Builder().setPageSize(10).build(), null,
+                ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
         val callback = mock(PagedList.Callback::class.java)
 
         // capture empty snapshot
diff --git a/paging/common/src/test/java/android/arch/paging/ItemKeyedDataSourceTest.kt b/paging/common/src/test/java/android/arch/paging/ItemKeyedDataSourceTest.kt
index 4998d06..7633333 100644
--- a/paging/common/src/test/java/android/arch/paging/ItemKeyedDataSourceTest.kt
+++ b/paging/common/src/test/java/android/arch/paging/ItemKeyedDataSourceTest.kt
@@ -288,7 +288,8 @@
                 PagedList.Config.Builder()
                         .setPageSize(10)
                         .build(),
-                "")
+                "",
+                ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
     }
 
     @Test
diff --git a/paging/common/src/test/java/android/arch/paging/PageKeyedDataSourceTest.kt b/paging/common/src/test/java/android/arch/paging/PageKeyedDataSourceTest.kt
index d4bbbb5..6a894a2 100644
--- a/paging/common/src/test/java/android/arch/paging/PageKeyedDataSourceTest.kt
+++ b/paging/common/src/test/java/android/arch/paging/PageKeyedDataSourceTest.kt
@@ -59,7 +59,8 @@
         // validate paging entire ItemDataSource results in full, correctly ordered data
         val pagedList = ContiguousPagedList<String, Item>(ItemDataSource(),
                 mMainThread, mBackgroundThread,
-                null, PagedList.Config.Builder().setPageSize(100).build(), null)
+                null, PagedList.Config.Builder().setPageSize(100).build(), null,
+                ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
 
         // validate initial load
         assertEquals(PAGE_MAP[INIT_KEY]!!.data, pagedList)
@@ -107,7 +108,8 @@
                 PagedList.Config.Builder()
                         .setPageSize(10)
                         .build(),
-                "")
+                "",
+                ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
     }
 
     @Test
diff --git a/paging/common/src/test/java/android/arch/paging/PositionalDataSourceTest.kt b/paging/common/src/test/java/android/arch/paging/PositionalDataSourceTest.kt
index 854f3a2..80b9c00 100644
--- a/paging/common/src/test/java/android/arch/paging/PositionalDataSourceTest.kt
+++ b/paging/common/src/test/java/android/arch/paging/PositionalDataSourceTest.kt
@@ -90,7 +90,8 @@
         val dataSource: PositionalDataSource<Int> = ListDataSource((0..99).toList())
         val testExecutor = TestExecutor()
         val pagedList = ContiguousPagedList(dataSource.wrapAsContiguousWithoutPlaceholders(),
-                testExecutor, testExecutor, null, config, 15)
+                testExecutor, testExecutor, null, config, 15,
+                ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
 
         assertEquals((10..19).toList(), pagedList)
 
@@ -135,7 +136,8 @@
             TiledPagedList(dataSource, FailExecutor(), FailExecutor(), null, config, 0)
         } else {
             ContiguousPagedList(dataSource.wrapAsContiguousWithoutPlaceholders(),
-                    FailExecutor(), FailExecutor(), null, config, null)
+                    FailExecutor(), FailExecutor(), null, config, null,
+                    ContiguousPagedList.LAST_LOAD_UNSPECIFIED)
         }
     }
 
diff --git a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DatabaseWriter.kt b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DatabaseWriter.kt
index e96112d..18d87b3 100644
--- a/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DatabaseWriter.kt
+++ b/room/compiler/src/main/kotlin/android/arch/persistence/room/writer/DatabaseWriter.kt
@@ -19,6 +19,7 @@
 import android.arch.persistence.room.ext.L
 import android.arch.persistence.room.ext.N
 import android.arch.persistence.room.ext.RoomTypeNames
+import android.arch.persistence.room.ext.S
 import android.arch.persistence.room.ext.SupportDbTypeNames
 import android.arch.persistence.room.ext.T
 import android.arch.persistence.room.solver.CodeGenScope
@@ -28,6 +29,7 @@
 import com.squareup.javapoet.FieldSpec
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.ParameterSpec
+import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
 import stripNonJava
 import javax.lang.model.element.Modifier
@@ -47,11 +49,38 @@
             superclass(database.typeName)
             addMethod(createCreateOpenHelper())
             addMethod(createCreateInvalidationTracker())
+            addMethod(createClearAllTables())
         }
         addDaoImpls(builder)
         return builder
     }
 
+    private fun createClearAllTables(): MethodSpec {
+        val scope = CodeGenScope(this)
+        return MethodSpec.methodBuilder("clearAllTables").apply {
+            val dbVar = scope.getTmpVar("_db")
+            addStatement("final $T $L = super.getOpenHelper().getWritableDatabase()",
+                    SupportDbTypeNames.DB, dbVar)
+            addAnnotation(Override::class.java)
+            addModifiers(PUBLIC)
+            returns(TypeName.VOID)
+            beginControlFlow("try").apply {
+                addStatement("super.beginTransaction()")
+                if (database.enableForeignKeys) {
+                    addStatement("$L.execSQL($S)", dbVar, "PRAGMA defer_foreign_keys = TRUE")
+                }
+                database.entities.forEach {
+                    addStatement("$L.execSQL($S)", dbVar, "DELETE FROM `${it.tableName}`")
+                }
+                addStatement("super.setTransactionSuccessful()")
+            }
+            nextControlFlow("finally").apply {
+                addStatement("super.endTransaction()")
+            }
+            endControlFlow()
+        }.build()
+    }
+
     private fun createCreateInvalidationTracker(): MethodSpec {
         return MethodSpec.methodBuilder("createInvalidationTracker").apply {
             addAnnotation(Override::class.java)
diff --git a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
index 522cd2d..17592a6 100644
--- a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
+++ b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
@@ -92,6 +92,18 @@
     }
 
     @Override
+    public void clearAllTables() {
+        final SupportSQLiteDatabase _db = super.getOpenHelper().getWritableDatabase();
+        try {
+            super.beginTransaction();
+            _db.execSQL("DELETE FROM `User`");
+            super.setTransactionSuccessful();
+        } finally {
+            super.endTransaction();
+        }
+    }
+
+    @Override
     ComplexDao getComplexDao() {
         if (_complexDao != null) {
             return _complexDao;
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ClearAllTablesTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ClearAllTablesTest.java
new file mode 100644
index 0000000..70b33c4
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/ClearAllTablesTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.junit.Assert.assertThat;
+
+import android.arch.persistence.room.Dao;
+import android.arch.persistence.room.Database;
+import android.arch.persistence.room.Entity;
+import android.arch.persistence.room.ForeignKey;
+import android.arch.persistence.room.Insert;
+import android.arch.persistence.room.InvalidationTracker;
+import android.arch.persistence.room.PrimaryKey;
+import android.arch.persistence.room.Query;
+import android.arch.persistence.room.Room;
+import android.arch.persistence.room.RoomDatabase;
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+
+@SuppressWarnings("WeakerAccess")
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ClearAllTablesTest {
+
+    @Database(version = 1, entities = {Parent.class, Child.class}, exportSchema = false)
+    public abstract static class ClearAllTablesDatabase extends RoomDatabase {
+        abstract ClearAllTablesDao dao();
+    }
+
+    @Entity
+    public static class Parent {
+        @PrimaryKey
+        public long id;
+        public String name;
+
+        public Parent(long id, String name) {
+            this.id = id;
+            this.name = name;
+        }
+    }
+
+    @Entity(foreignKeys = {
+            @ForeignKey(entity = Parent.class, parentColumns = "id", childColumns = "parentId")})
+    public static class Child {
+        @PrimaryKey
+        public long id;
+        public String name;
+        public long parentId;
+
+        public Child(long id, String name, long parentId) {
+            this.id = id;
+            this.name = name;
+            this.parentId = parentId;
+        }
+    }
+
+    @Dao
+    public interface ClearAllTablesDao {
+        @Insert
+        void insertParent(Parent parent);
+
+        @Insert
+        void insertChild(Child child);
+
+        @Query("SELECT COUNT(*) FROM Parent")
+        int countParent();
+
+        @Query("SELECT COUNT(*) FROM Child")
+        int countChild();
+    }
+
+    private ClearAllTablesDatabase mDatabase;
+    private ClearAllTablesDao mDao;
+
+    @Before
+    public void setUp() {
+        final Context context = InstrumentationRegistry.getTargetContext();
+        mDatabase = Room.inMemoryDatabaseBuilder(context, ClearAllTablesDatabase.class).build();
+        mDao = mDatabase.dao();
+    }
+
+    @After
+    public void closeDatabase() {
+        mDatabase.close();
+    }
+
+    @Test
+    public void simple() {
+        mDao.insertParent(new Parent(1, "A"));
+        assertThat(mDao.countParent(), is(1));
+        mDatabase.clearAllTables();
+        assertThat(mDao.countParent(), is(0));
+    }
+
+    @Test
+    public void foreignKey() {
+        mDao.insertParent(new Parent(1, "A"));
+        mDao.insertChild(new Child(1, "a", 1));
+        assertThat(mDao.countParent(), is(1));
+        assertThat(mDao.countChild(), is(1));
+        mDatabase.clearAllTables();
+        assertThat(mDao.countParent(), is(0));
+        assertThat(mDao.countChild(), is(0));
+    }
+
+    @Test
+    public void observer() throws InterruptedException {
+        mDao.insertParent(new Parent(1, "A"));
+        assertThat(mDao.countParent(), is(1));
+        final CountDownLatch latch = new CountDownLatch(1);
+        mDatabase.getInvalidationTracker().addObserver(new InvalidationTracker.Observer("Parent") {
+            @Override
+            public void onInvalidated(@NonNull Set<String> tables) {
+                assertThat(tables, hasSize(1));
+                assertThat(tables, hasItem("Parent"));
+                assertThat(mDao.countParent(), is(0));
+                latch.countDown();
+            }
+        });
+        mDatabase.clearAllTables();
+        assertThat(latch.await(3000, TimeUnit.MILLISECONDS), is(true));
+    }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java
index f4fca7f..dcefa41 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/FunnyNamedDaoTest.java
@@ -22,9 +22,8 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import android.arch.core.executor.testing.CountingTaskExecutorRule;
-import android.arch.lifecycle.Observer;
 import android.arch.persistence.room.integration.testapp.vo.FunnyNamedEntity;
-import android.support.annotation.Nullable;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -71,12 +70,9 @@
     @Test
     public void observe() throws TimeoutException, InterruptedException {
         final FunnyNamedEntity[] item = new FunnyNamedEntity[1];
-        mFunnyNamedDao.observableOne(2).observeForever(new Observer<FunnyNamedEntity>() {
-            @Override
-            public void onChanged(@Nullable FunnyNamedEntity funnyNamedEntity) {
-                item[0] = funnyNamedEntity;
-            }
-        });
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                () -> mFunnyNamedDao.observableOne(2).observeForever(
+                        funnyNamedEntity -> item[0] = funnyNamedEntity));
 
         FunnyNamedEntity entity = new FunnyNamedEntity(1, "a");
         mFunnyNamedDao.insert(entity);
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RawQueryTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RawQueryTest.java
index 4aae4ea..d2cf37b 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RawQueryTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/RawQueryTest.java
@@ -29,6 +29,7 @@
 import android.arch.persistence.room.integration.testapp.vo.User;
 import android.arch.persistence.room.integration.testapp.vo.UserAndAllPets;
 import android.arch.persistence.room.integration.testapp.vo.UserAndPet;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -71,9 +72,10 @@
 
     @Test
     public void entity_liveData() throws TimeoutException, InterruptedException {
-        LiveData<User> liveData = mRawDao.getUserLiveData("SELECT * FROM User WHERE mId = 3");
-        liveData.observeForever(user -> {
-        });
+        final LiveData<User> liveData = mRawDao.getUserLiveData("SELECT * FROM User WHERE mId = 3");
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(
+                () -> liveData.observeForever(user -> { }));
+
         drain();
         assertThat(liveData.getValue(), is(nullValue()));
         User user = TestUtil.createUser(3);
diff --git a/room/runtime/api/current.txt b/room/runtime/api/current.txt
index 8d1114a..17948ee 100644
--- a/room/runtime/api/current.txt
+++ b/room/runtime/api/current.txt
@@ -34,6 +34,7 @@
   public abstract class RoomDatabase {
     ctor public RoomDatabase();
     method public void beginTransaction();
+    method public abstract void clearAllTables();
     method public void close();
     method public android.arch.persistence.db.SupportSQLiteStatement compileStatement(java.lang.String);
     method protected abstract android.arch.persistence.room.InvalidationTracker createInvalidationTracker();
diff --git a/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java b/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
index 8a3cc01..b2a9f0e 100644
--- a/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
+++ b/room/runtime/src/main/java/android/arch/persistence/room/RoomDatabase.java
@@ -34,6 +34,7 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
 import android.support.annotation.RestrictTo;
+import android.support.annotation.WorkerThread;
 import android.support.v4.app.ActivityManagerCompat;
 import android.support.v4.util.SparseArrayCompat;
 import android.util.Log;
@@ -149,6 +150,15 @@
     protected abstract InvalidationTracker createInvalidationTracker();
 
     /**
+     * Deletes all rows from all the tables that are registered to this database as
+     * {@link Database#entities()}.
+     * <p>
+     * This does NOT reset the auto-increment value generated by {@link PrimaryKey#autoGenerate()}.
+     */
+    @WorkerThread
+    public abstract void clearAllTables();
+
+    /**
      * Returns true if database connection is open and initialized.
      *
      * @return true if the database connection is open, false otherwise.
diff --git a/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest_TestDatabase_Impl.java b/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest_TestDatabase_Impl.java
index d261454..8e310e2 100644
--- a/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest_TestDatabase_Impl.java
+++ b/room/runtime/src/test/java/android/arch/persistence/room/BuilderTest_TestDatabase_Impl.java
@@ -35,4 +35,8 @@
     protected InvalidationTracker createInvalidationTracker() {
         return null;
     }
+
+    @Override
+    public void clearAllTables() {
+    }
 }
diff --git a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
index de764a1..d845b72 100644
--- a/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
+++ b/samples/SupportSliceDemos/src/main/java/com/example/androidx/slice/demos/SampleSliceProvider.java
@@ -58,7 +58,7 @@
 
     public static final String[] URI_PATHS = {"message", "wifi", "note", "ride", "toggle",
             "toggle2", "contact", "gallery", "weather", "reservation", "loadlist", "loadlist2",
-            "loadgrid", "loadgrid2", "inputrange", "range"};
+            "loadgrid", "loadgrid2", "inputrange", "range", "contact2"};
 
     /**
      * @return Uri with the provided path
@@ -101,6 +101,8 @@
                 return createTwoCustomToggleSlices(sliceUri);
             case "/contact":
                 return createContact(sliceUri);
+            case "/contact2":
+                return createContact2(sliceUri);
             case "/gallery":
                 return createGallery(sliceUri);
             case "/weather":
@@ -130,23 +132,28 @@
         return new ListBuilder(getContext(), sliceUri).addGrid(gb -> gb
                 .setPrimaryAction(primaryAction)
                 .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_1),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("MON")
                         .addTitleText("69\u00B0"))
                 .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_2))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_2),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("TUE")
                         .addTitleText("71\u00B0"))
                 .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_3))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_3),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("WED")
                         .addTitleText("76\u00B0"))
                 .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_4))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_4),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("THU")
                         .addTitleText("72\u00B0"))
                 .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_1),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("FRI")
                         .addTitleText("68\u00B0")))
                 .build();
@@ -168,13 +175,60 @@
                         "Share photo album"))
                 .addGrid(b -> b
                     .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_1)))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_1),
+                            GridBuilder.LARGE_IMAGE))
                     .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_2)))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_2),
+                                GridBuilder.LARGE_IMAGE))
                     .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_3)))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_3),
+                                GridBuilder.LARGE_IMAGE))
                     .addCell(cb -> cb
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_4))))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_4),
+                                GridBuilder.LARGE_IMAGE))
+                    .addCell(cb -> cb
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_2),
+                                GridBuilder.LARGE_IMAGE))
+                    .addCell(cb -> cb
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_3),
+                                GridBuilder.LARGE_IMAGE))
+                    .addCell(cb -> cb
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.slices_4),
+                                GridBuilder.LARGE_IMAGE)))
+                .build();
+    }
+
+
+    private Slice createContact2(Uri sliceUri) {
+        ListBuilder b = new ListBuilder(getContext(), sliceUri);
+        ListBuilder.RowBuilder rb = new ListBuilder.RowBuilder(b);
+        GridBuilder gb = new GridBuilder(b);
+        return b.setColor(0xff3949ab)
+                .addRow(rb
+                        .setTitle("Mady Pitza")
+                        .setSubtitle("Frequently contacted contact")
+                        .addEndItem(Icon.createWithResource(getContext(), R.drawable.mady)))
+                .addGrid(gb
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                                .addImage(Icon.createWithResource(getContext(), R.drawable.ic_call),
+                                        GridBuilder.ICON_IMAGE)
+                                .addText("Call")
+                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "call")))
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                                .addImage(Icon.createWithResource(getContext(), R.drawable.ic_text),
+                                        GridBuilder.ICON_IMAGE)
+                                .addText("Text")
+                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "text")))
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                                .addImage(Icon.createWithResource(getContext(),
+                                        R.drawable.ic_video), GridBuilder.ICON_IMAGE)
+                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "video"))
+                                .addText("Video"))
+                        .addCell(new GridBuilder.CellBuilder(gb)
+                                .addImage(Icon.createWithResource(getContext(),
+                                        R.drawable.ic_email), GridBuilder.ICON_IMAGE)
+                                .addText("Email")
+                                .setContentIntent(getBroadcastIntent(ACTION_TOAST, "email"))))
                 .build();
     }
 
@@ -264,8 +318,8 @@
                         "Contact host"))
                 .addGrid(b -> b
                     .addCell(cb -> cb
-                        .addLargeImage(
-                                Icon.createWithResource(getContext(), R.drawable.reservation))))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.reservation),
+                            GridBuilder.LARGE_IMAGE)))
                 .addGrid(b -> b
                     .addCell(cb -> cb
                         .addTitleText("Check In")
@@ -479,7 +533,8 @@
 
     private GridBuilder.CellBuilder createCell(GridBuilder.CellBuilder cb, String text1,
             String text2, Icon icon, boolean isLoading) {
-        return cb.addText(text1, isLoading).addText(text2, isLoading).addImage(icon, isLoading);
+        return cb.addText(text1, isLoading).addText(text2, isLoading).addImage(icon,
+                GridBuilder.SMALL_IMAGE, isLoading);
     }
 
     private PendingIntent getIntent(String action) {
diff --git a/slices/builders/api/current.txt b/slices/builders/api/current.txt
index 15b248b..ccfc07f 100644
--- a/slices/builders/api/current.txt
+++ b/slices/builders/api/current.txt
@@ -8,15 +8,20 @@
     method public androidx.app.slice.builders.GridBuilder addSeeMoreCell(androidx.app.slice.builders.GridBuilder.CellBuilder);
     method public androidx.app.slice.builders.GridBuilder addSeeMoreCell(java.util.function.Consumer<androidx.app.slice.builders.GridBuilder.CellBuilder>);
     method public androidx.app.slice.builders.GridBuilder setPrimaryAction(androidx.app.slice.builders.SliceAction);
+    field public static final int ICON_IMAGE = 0; // 0x0
+    field public static final int LARGE_IMAGE = 2; // 0x2
+    field public static final int SMALL_IMAGE = 1; // 0x1
   }
 
   public static final class GridBuilder.CellBuilder extends androidx.app.slice.builders.TemplateSliceBuilder {
     ctor public GridBuilder.CellBuilder(androidx.app.slice.builders.GridBuilder);
     ctor public GridBuilder.CellBuilder(androidx.app.slice.builders.GridBuilder, android.net.Uri);
-    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon);
-    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon, boolean);
-    method public androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon);
-    method public androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon, boolean);
+    method public deprecated androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon);
+    method public deprecated androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon, boolean);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon, int);
+    method public androidx.app.slice.builders.GridBuilder.CellBuilder addImage(android.graphics.drawable.Icon, int, boolean);
+    method public deprecated androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon);
+    method public deprecated androidx.app.slice.builders.GridBuilder.CellBuilder addLargeImage(android.graphics.drawable.Icon, boolean);
     method public androidx.app.slice.builders.GridBuilder.CellBuilder addText(java.lang.CharSequence);
     method public androidx.app.slice.builders.GridBuilder.CellBuilder addText(java.lang.CharSequence, boolean);
     method public androidx.app.slice.builders.GridBuilder.CellBuilder addTitleText(java.lang.CharSequence);
diff --git a/slices/builders/build.gradle b/slices/builders/build.gradle
index ae7407b..491617a 100644
--- a/slices/builders/build.gradle
+++ b/slices/builders/build.gradle
@@ -31,7 +31,7 @@
     name = "Slice builders"
     publish = true
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
-    mavenGroup = LibraryGroups.SLICES
+    mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "A set of builders to create templates using SliceProvider APIs"
     minSdkVersion = 24
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java
index 07089bf..8d34f57 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/GridBuilder.java
@@ -22,6 +22,7 @@
 import android.graphics.drawable.Icon;
 import android.net.Uri;
 import android.os.Build;
+import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresApi;
@@ -45,6 +46,28 @@
     private boolean mHasSeeMore;
 
     /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @IntDef({
+            LARGE_IMAGE, SMALL_IMAGE, ICON_IMAGE
+    })
+    public @interface ImageMode{}
+
+    /**
+     * Indicates that an image presented in the grid is a icon and it can be tinted.
+     */
+    public static final int ICON_IMAGE = 0;
+    /**
+     * Indicates that an image presented in the grid should be displayed in a small format.
+     */
+    public static final int SMALL_IMAGE = 1;
+    /**
+     * Indicates that an image presented in the grid should be displayed in a large format.
+     */
+    public static final int LARGE_IMAGE = 2;
+
+    /**
      * Create a builder which will construct a slice displayed in a grid format.
      * @param parent The builder constructing the parent slice.
      */
@@ -263,8 +286,9 @@
          * @param image the image to display in the cell.
          */
         @NonNull
+        @Deprecated
         public CellBuilder addLargeImage(@NonNull Icon image) {
-            return addLargeImage(image, false /* isLoading */);
+            return addImage(image, LARGE_IMAGE, false /* isLoading */);
         }
 
         /**
@@ -278,9 +302,9 @@
          *                  background or not.
          */
         @NonNull
+        @Deprecated
         public CellBuilder addLargeImage(@Nullable Icon image, boolean isLoading) {
-            mImpl.addLargeImage(image, isLoading);
-            return this;
+            return addImage(image, LARGE_IMAGE, isLoading);
         }
 
         /**
@@ -290,8 +314,9 @@
          * @param image the image to display in the cell.
          */
         @NonNull
+        @Deprecated
         public CellBuilder addImage(@NonNull Icon image) {
-            return addImage(image, false /* isLoading */);
+            return addImage(image, SMALL_IMAGE, false /* isLoading */);
         }
 
         /**
@@ -305,8 +330,47 @@
          *                  background or not.
          */
         @NonNull
+        @Deprecated
         public CellBuilder addImage(@Nullable Icon image, boolean isLoading) {
-            mImpl.addImage(image, isLoading);
+            return addImage(image, SMALL_IMAGE, isLoading);
+        }
+
+        /**
+         * Adds an image to the cell. There can be at most one image, the first one added will be
+         * used, others will be ignored.
+         *
+         * @param image the image to display in the cell.
+         * @param imageMode the mode that image should be displayed in.
+         *
+         * @see #ICON_IMAGE
+         * @see #SMALL_IMAGE
+         * @see #LARGE_IMAGE
+         */
+        @NonNull
+        public CellBuilder addImage(@NonNull Icon image, @ImageMode int imageMode) {
+            return addImage(image, imageMode, false /* isLoading */);
+        }
+
+        /**
+         * Adds an image to the cell. There can be at most one image, the first one added will be
+         * used, others will be ignored.
+         * <p>
+         * Use this method to specify content that will appear in the template once it's been
+         * loaded.
+         * </p>
+         * @param image the image to display in the cell.
+         * @param imageMode the mode that image should be displayed in.
+         * @param isLoading indicates whether the app is doing work to load the added content in the
+         *                  background or not.
+         *
+         * @see #ICON_IMAGE
+         * @see #SMALL_IMAGE
+         * @see #LARGE_IMAGE
+         */
+        @NonNull
+        public CellBuilder addImage(@Nullable Icon image, @ImageMode int imageMode,
+                boolean isLoading) {
+            mImpl.addImage(image, imageMode, isLoading);
             return this;
         }
 
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java
index 066304c..dfca415 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilder.java
@@ -116,33 +116,14 @@
         void addTitleText(@Nullable CharSequence text, boolean isLoading);
 
         /**
-         * Adds an image to the cell that should be displayed as large as the cell allows.
-         * There can be at most one image, the first one added will be used, others will be ignored.
-         *
-         * @param image the image to display in the cell.
-         */
-        @NonNull
-        void addLargeImage(@NonNull Icon image);
-
-        /**
-         * Adds an image to the cell that should be displayed as large as the cell allows.
-         * There can be at most one image, the first one added will be used, others will be ignored.
-         * <p>
-         * When set to true, the parameter {@code isLoading} indicates that the app is doing work
-         * to load this content in the background, in this case the template displays a placeholder
-         * until updated.
-         */
-        @NonNull
-        void addLargeImage(@Nullable Icon image, boolean isLoading);
-
-        /**
          * Adds an image to the cell. There can be at most one image, the first one added
          * will be used, others will be ignored.
          *
          * @param image the image to display in the cell.
+         * @param imageMode the mode that image should be displayed in.
          */
         @NonNull
-        void addImage(@NonNull Icon image);
+        void addImage(@NonNull Icon image, int imageMode);
 
         /**
          * Adds an image to the cell. There can be at most one image, the first one added
@@ -153,7 +134,7 @@
          * until updated.l.
          */
         @NonNull
-        void addImage(@NonNull Icon image, boolean isLoading);
+        void addImage(@NonNull Icon image, int imageMode, boolean isLoading);
 
         /**
          * Sets the action to be invoked if the user taps on this cell in the row.
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java
index f0cb570..1b49050 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderBasicImpl.java
@@ -135,28 +135,14 @@
          */
         @NonNull
         @Override
-        public void addLargeImage(@NonNull Icon image) {
+        public void addImage(@NonNull Icon image, int imageMode) {
         }
 
         /**
          */
         @NonNull
         @Override
-        public void addLargeImage(@Nullable Icon image, boolean isLoading) {
-        }
-
-        /**
-         */
-        @NonNull
-        @Override
-        public void addImage(@NonNull Icon image) {
-        }
-
-        /**
-         */
-        @NonNull
-        @Override
-        public void addImage(@Nullable Icon image, boolean isLoading) {
+        public void addImage(@Nullable Icon image, int imageMode, boolean isLoading) {
         }
 
         /**
diff --git a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java
index 2856b9f..e116e08 100644
--- a/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java
+++ b/slices/builders/src/main/java/androidx/app/slice/builders/impl/GridBuilderListV1Impl.java
@@ -19,12 +19,16 @@
 import static android.app.slice.Slice.HINT_HORIZONTAL;
 import static android.app.slice.Slice.HINT_LARGE;
 import static android.app.slice.Slice.HINT_LIST_ITEM;
+import static android.app.slice.Slice.HINT_NO_TINT;
 import static android.app.slice.Slice.HINT_PARTIAL;
 import static android.app.slice.Slice.HINT_SEE_MORE;
 import static android.app.slice.Slice.HINT_SHORTCUT;
 import static android.app.slice.Slice.HINT_TITLE;
 import static android.support.annotation.RestrictTo.Scope.LIBRARY;
 
+import static androidx.app.slice.builders.GridBuilder.ICON_IMAGE;
+import static androidx.app.slice.builders.GridBuilder.LARGE_IMAGE;
+
 import android.app.PendingIntent;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
@@ -32,6 +36,8 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 
+import java.util.ArrayList;
+
 import androidx.app.slice.Slice;
 import androidx.app.slice.builders.SliceAction;
 
@@ -179,37 +185,25 @@
          */
         @NonNull
         @Override
-        public void addLargeImage(@NonNull Icon image) {
-            addLargeImage(image, false /* isLoading */);
+        public void addImage(@NonNull Icon image, int imageMode) {
+            addImage(image, imageMode, false /* isLoading */);
         }
 
         /**
          */
         @NonNull
         @Override
-        public void addLargeImage(@Nullable Icon image, boolean isLoading) {
-            @Slice.SliceHint String[] hints = isLoading
-                    ? new String[] {HINT_PARTIAL, HINT_LARGE}
-                    : new String[] {HINT_LARGE};
-            getBuilder().addIcon(image, null, hints);
-        }
-
-        /**
-         */
-        @NonNull
-        @Override
-        public void addImage(@NonNull Icon image) {
-            addImage(image, false /* isLoading */);
-        }
-
-        /**
-         */
-        @NonNull
-        @Override
-        public void addImage(@Nullable Icon image, boolean isLoading) {
-            @Slice.SliceHint String[] hints = isLoading
-                    ? new String[] {HINT_PARTIAL}
-                    : new String[0];
+        public void addImage(@Nullable Icon image, int imageMode, boolean isLoading) {
+            ArrayList<String> hints = new ArrayList<>();
+            if (imageMode != ICON_IMAGE) {
+                hints.add(HINT_NO_TINT);
+            }
+            if (imageMode == LARGE_IMAGE) {
+                hints.add(HINT_LARGE);
+            }
+            if (isLoading) {
+                hints.add(HINT_PARTIAL);
+            }
             getBuilder().addIcon(image, null, hints);
         }
 
diff --git a/slices/core/build.gradle b/slices/core/build.gradle
index 879b409..8087ab4 100644
--- a/slices/core/build.gradle
+++ b/slices/core/build.gradle
@@ -36,7 +36,7 @@
     name = "Common utilities for slices"
     publish = true
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
-    mavenGroup = LibraryGroups.SLICES
+    mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "The slices core library provides utilities for the slices view and provider libraries"
     minSdkVersion = 24
diff --git a/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java b/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java
index d1a8e65..be3b88b 100644
--- a/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java
+++ b/slices/core/src/main/java/androidx/app/slice/compat/SliceProviderCompat.java
@@ -18,7 +18,6 @@
 import static android.app.slice.Slice.HINT_LIST_ITEM;
 import static android.app.slice.SliceProvider.SLICE_TYPE;
 
-import android.Manifest.permission;
 import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.content.ContentProvider;
@@ -44,6 +43,7 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.RestrictTo.Scope;
+import android.support.v4.util.Preconditions;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -54,6 +54,7 @@
 import androidx.app.slice.SliceProvider;
 import androidx.app.slice.SliceSpec;
 import androidx.app.slice.core.R;
+import androidx.app.slice.core.SliceHints;
 
 /**
  * @hide
@@ -69,6 +70,7 @@
     public static final String METHOD_PIN = "pin_slice";
     public static final String METHOD_UNPIN = "unpin_slice";
     public static final String METHOD_GET_PINNED_SPECS = "get_specs";
+    public static final String METHOD_MAP_ONLY_INTENT = "map_only";
 
     public static final String EXTRA_INTENT = "slice_intent";
     public static final String EXTRA_SLICE = "slice";
@@ -156,8 +158,8 @@
         if (method.equals(METHOD_SLICE)) {
             Uri uri = extras.getParcelable(EXTRA_BIND_URI);
             if (Binder.getCallingUid() != Process.myUid()) {
-                getContext().enforceUriPermission(uri, permission.BIND_SLICE,
-                        permission.BIND_SLICE, Binder.getCallingPid(), Binder.getCallingUid(),
+                getContext().enforceUriPermission(uri, Binder.getCallingPid(),
+                        Binder.getCallingUid(),
                         Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
                         "Slice binding requires the permission BIND_SLICE");
             }
@@ -168,10 +170,6 @@
             b.putParcelable(EXTRA_SLICE, s.toBundle());
             return b;
         } else if (method.equals(METHOD_MAP_INTENT)) {
-            if (Binder.getCallingUid() != Process.myUid()) {
-                getContext().enforceCallingPermission(permission.BIND_SLICE,
-                        "Slice binding requires the permission BIND_SLICE");
-            }
             Intent intent = extras.getParcelable(EXTRA_INTENT);
             Uri uri = mSliceProvider.onMapIntentToUri(intent);
             Bundle b = new Bundle();
@@ -183,6 +181,12 @@
                 b.putParcelable(EXTRA_SLICE, null);
             }
             return b;
+        } else if (method.equals(METHOD_MAP_INTENT)) {
+            Intent intent = extras.getParcelable(EXTRA_INTENT);
+            Uri uri = mSliceProvider.onMapIntentToUri(intent);
+            Bundle b = new Bundle();
+            b.putParcelable(EXTRA_SLICE, uri);
+            return b;
         } else if (method.equals(METHOD_PIN)) {
             Uri uri = extras.getParcelable(EXTRA_BIND_URI);
             List<SliceSpec> specs = getSpecs(extras);
@@ -524,4 +528,54 @@
             provider.close();
         }
     }
+
+    /**
+     * Compat version of {@link android.app.slice.SliceManager#mapIntentToUri}.
+     */
+    public static Uri mapIntentToUri(Context context, Intent intent) {
+        Preconditions.checkNotNull(intent, "intent");
+        Preconditions.checkArgument(intent.getComponent() != null || intent.getPackage() != null,
+                String.format("Slice intent must be explicit %s", intent));
+        ContentResolver resolver = context.getContentResolver();
+
+        // Check if the intent has data for the slice uri on it and use that
+        final Uri intentData = intent.getData();
+        if (intentData != null && SLICE_TYPE.equals(resolver.getType(intentData))) {
+            return intentData;
+        }
+        // Otherwise ask the app
+        List<ResolveInfo> providers =
+                context.getPackageManager().queryIntentContentProviders(intent, 0);
+        if (providers == null || providers.isEmpty()) {
+            // There are no providers, see if this activity has a direct link.
+            ResolveInfo resolve = context.getPackageManager().resolveActivity(intent,
+                    PackageManager.GET_META_DATA);
+            if (resolve != null && resolve.activityInfo != null
+                    && resolve.activityInfo.metaData != null
+                    && resolve.activityInfo.metaData.containsKey(SliceHints.SLICE_METADATA_KEY)) {
+                return Uri.parse(
+                        resolve.activityInfo.metaData.getString(SliceHints.SLICE_METADATA_KEY));
+            }
+            return null;
+        }
+        String authority = providers.get(0).providerInfo.authority;
+        Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(authority).build();
+        try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) {
+            if (provider == null) {
+                throw new IllegalArgumentException("Unknown URI " + uri);
+            }
+            Bundle extras = new Bundle();
+            extras.putParcelable(EXTRA_INTENT, intent);
+            final Bundle res = provider.call(METHOD_MAP_ONLY_INTENT, null, extras);
+            if (res == null) {
+                return null;
+            }
+            return res.getParcelable(EXTRA_SLICE);
+        } catch (RemoteException e) {
+            // Arbitrary and not worth documenting, as Activity
+            // Manager will kill this process shortly anyway.
+            return null;
+        }
+    }
 }
diff --git a/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java b/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java
index e566825..09f9540 100644
--- a/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java
+++ b/slices/core/src/main/java/androidx/app/slice/core/SliceHints.java
@@ -45,4 +45,13 @@
      * Key to retrieve an extra added to an intent when the value of an input range has changed.
      */
     public static final String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
+
+    /**
+     * The meta-data key that allows an activity to easily be linked directly to a slice.
+     * <p>
+     * An activity can be statically linked to a slice uri by including a meta-data item
+     * for this key that contains a valid slice uri for the same application declaring
+     * the activity.
+     */
+    public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
 }
diff --git a/slices/view/api/current.txt b/slices/view/api/current.txt
index 6c93db0..f201238 100644
--- a/slices/view/api/current.txt
+++ b/slices/view/api/current.txt
@@ -4,6 +4,7 @@
     method public abstract androidx.app.slice.Slice bindSlice(android.net.Uri);
     method public abstract androidx.app.slice.Slice bindSlice(android.content.Intent);
     method public static androidx.app.slice.SliceManager getInstance(android.content.Context);
+    method public abstract android.net.Uri mapIntentToUri(android.content.Intent);
     method public abstract void pinSlice(android.net.Uri);
     method public abstract void registerSliceCallback(android.net.Uri, androidx.app.slice.SliceManager.SliceCallback);
     method public abstract void registerSliceCallback(android.net.Uri, java.util.concurrent.Executor, androidx.app.slice.SliceManager.SliceCallback);
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
index 93e9fc5..0d9d277 100644
--- a/slices/view/build.gradle
+++ b/slices/view/build.gradle
@@ -41,7 +41,7 @@
     name = "Slice views"
     publish = true
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
-    mavenGroup = LibraryGroups.SLICES
+    mavenGroup = LibraryGroups.SUPPORT
     inceptionYear = "2017"
     description = "A library that handles rendering of slice content into supported templates"
     minSdkVersion = 24
diff --git a/slices/view/src/androidTest/AndroidManifest.xml b/slices/view/src/androidTest/AndroidManifest.xml
index ec64cc1..e98f69d 100644
--- a/slices/view/src/androidTest/AndroidManifest.xml
+++ b/slices/view/src/androidTest/AndroidManifest.xml
@@ -31,6 +31,8 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
+            <meta-data android:name="android.metadata.SLICE_URI"
+                       android:value="content://androidx.app.slice.view.test/render" />
         </activity>
     </application>
 </manifest>
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java b/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java
index a20a5cc..3ad623f 100644
--- a/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java
+++ b/slices/view/src/androidTest/java/androidx/app/slice/SliceManagerTest.java
@@ -46,6 +46,7 @@
 import java.util.List;
 import java.util.concurrent.Executor;
 
+import androidx.app.slice.render.SliceRenderActivity;
 import androidx.app.slice.widget.SliceLiveData;
 
 @RunWith(AndroidJUnit4.class)
@@ -148,6 +149,15 @@
         assertEquals(SliceLiveData.SUPPORTED_SPECS, mManager.getPinnedSpecs(uri));
     }
 
+    @Test
+    public void testMapIntentToUri() {
+        Uri expected = Uri.parse("content://androidx.app.slice.view.test/render");
+        Slice s = new Slice.Builder(expected).build();
+        when(mSliceProvider.onBindSlice(eq(expected))).thenReturn(s);
+        Uri uri = mManager.mapIntentToUri(new Intent(mContext, SliceRenderActivity.class));
+        assertEquals(expected, uri);
+    }
+
     public static class TestSliceProvider extends SliceProvider {
 
         public static SliceProvider sSliceProviderReceiver;
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java
index a252b7f..546f1e3 100644
--- a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java
+++ b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceCreator.java
@@ -105,23 +105,28 @@
         GridBuilder gb = new GridBuilder(b);
         gb.setPrimaryAction(primaryAction);
         gb.addCell(new GridBuilder.CellBuilder(gb)
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_1),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("MON")
                         .addTitleText("69\u00B0"))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_2))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_2),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("TUE")
                         .addTitleText("71\u00B0"))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_3))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_3),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("WED")
                         .addTitleText("76\u00B0"))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_4))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_4),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("THU")
                         .addTitleText("72\u00B0"))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                        .addLargeImage(Icon.createWithResource(getContext(), R.drawable.weather_1))
+                        .addImage(Icon.createWithResource(getContext(), R.drawable.weather_1),
+                                GridBuilder.SMALL_IMAGE)
                         .addText("FRI")
                         .addTitleText("68\u00B0"));
         return b.addGrid(gb).build();
@@ -131,13 +136,17 @@
         ListBuilder b = new ListBuilder(getContext(), sliceUri);
         GridBuilder gb = new GridBuilder(b);
         return gb.addCell(new GridBuilder.CellBuilder(gb)
-                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_1)))
+                    .addImage(Icon.createWithResource(getContext(), R.drawable.slices_1),
+                            GridBuilder.LARGE_IMAGE))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_2)))
+                    .addImage(Icon.createWithResource(getContext(), R.drawable.slices_2),
+                            GridBuilder.LARGE_IMAGE))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_3)))
+                    .addImage(Icon.createWithResource(getContext(), R.drawable.slices_3),
+                            GridBuilder.LARGE_IMAGE))
                 .addCell(new GridBuilder.CellBuilder(gb)
-                    .addLargeImage(Icon.createWithResource(getContext(), R.drawable.slices_4)))
+                    .addImage(Icon.createWithResource(getContext(), R.drawable.slices_4),
+                            GridBuilder.LARGE_IMAGE))
                 .build();
     }
 
@@ -152,19 +161,23 @@
                         .addEndItem(Icon.createWithResource(getContext(), R.drawable.mady)))
                 .addGrid(gb
                         .addCell(new GridBuilder.CellBuilder(gb)
-                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_call))
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_call),
+                                    GridBuilder.ICON_IMAGE)
                             .addText("Call")
                             .setContentIntent(getBroadcastIntent(ACTION_TOAST, "call")))
                         .addCell(new GridBuilder.CellBuilder(gb)
-                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_text))
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_text),
+                                    GridBuilder.ICON_IMAGE)
                             .addText("Text")
                             .setContentIntent(getBroadcastIntent(ACTION_TOAST, "text")))
                         .addCell(new GridBuilder.CellBuilder(gb)
-                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_video))
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_video),
+                                    GridBuilder.ICON_IMAGE)
                             .setContentIntent(getBroadcastIntent(ACTION_TOAST, "video"))
                             .addText("Video"))
                         .addCell(new GridBuilder.CellBuilder(gb)
-                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_email))
+                            .addImage(Icon.createWithResource(getContext(), R.drawable.ic_email),
+                                    GridBuilder.ICON_IMAGE)
                             .addText("Email")
                             .setContentIntent(getBroadcastIntent(ACTION_TOAST, "email"))))
                 .build();
diff --git a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java
index 056af32..dc9196e 100644
--- a/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java
+++ b/slices/view/src/androidTest/java/androidx/app/slice/render/SliceRenderer.java
@@ -65,7 +65,7 @@
             protected void onLayout(boolean changed, int l, int t, int r, int b) {
                 int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 900,
                         mContext.getResources().getDisplayMetrics());
-                int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200,
+                int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300,
                         mContext.getResources().getDisplayMetrics());
                 mLayout.measure(makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
                         makeMeasureSpec(height, View.MeasureSpec.EXACTLY));
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceManager.java b/slices/view/src/main/java/androidx/app/slice/SliceManager.java
index ba8c376..6d44319 100644
--- a/slices/view/src/main/java/androidx/app/slice/SliceManager.java
+++ b/slices/view/src/main/java/androidx/app/slice/SliceManager.java
@@ -150,6 +150,19 @@
     public abstract @Nullable Slice bindSlice(@NonNull Intent intent);
 
     /**
+     * Turns a slice intent into a slice uri. Expects an explicit intent. If there is no
+     * {@link android.content.ContentProvider} associated with the given intent this will throw
+     * {@link IllegalArgumentException}.
+     *
+     * @param intent The intent associated with a slice.
+     * @return The Slice Uri provided by the app or null if none is given.
+     * @see Slice
+     * @see SliceProvider#onMapIntentToUri(Intent)
+     * @see Intent
+     */
+    public abstract @Nullable Uri mapIntentToUri(@NonNull Intent intent);
+
+    /**
      * Class that listens to changes in {@link Slice}s.
      */
     public interface SliceCallback {
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java b/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java
index 1f301b7..433afd5 100644
--- a/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java
+++ b/slices/view/src/main/java/androidx/app/slice/SliceManagerCompat.java
@@ -67,4 +67,10 @@
     public Slice bindSlice(@NonNull Intent intent) {
         return SliceProviderCompat.bindSlice(mContext, intent, SUPPORTED_SPECS);
     }
+
+    @Nullable
+    @Override
+    public Uri mapIntentToUri(@NonNull Intent intent) {
+        return SliceProviderCompat.mapIntentToUri(mContext, intent);
+    }
 }
diff --git a/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java b/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java
index a60f418..76c6a4a 100644
--- a/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java
+++ b/slices/view/src/main/java/androidx/app/slice/SliceManagerWrapper.java
@@ -69,13 +69,21 @@
     @Override
     public androidx.app.slice.Slice bindSlice(@NonNull Uri uri) {
         return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
-                mContext.getContentResolver(), uri, unwrap(SUPPORTED_SPECS)));
+                mContext.getContentResolver(), uri, mSpecs));
     }
 
     @Nullable
     @Override
     public androidx.app.slice.Slice bindSlice(@NonNull Intent intent) {
         return SliceConvert.wrap(android.app.slice.Slice.bindSlice(
-                mContext, intent, unwrap(SUPPORTED_SPECS)));
+                mContext, intent, mSpecs));
+    }
+
+    @Nullable
+    @Override
+    public Uri mapIntentToUri(@NonNull Intent intent) {
+        // TODO: Switch over to mapIntentToUri once it lands in prebuilt.
+        Slice slice = bindSlice(intent);
+        return slice != null ? slice.getUri() : null;
     }
 }
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java b/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
index 41a9640..10a30ac 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridContent.java
@@ -27,6 +27,9 @@
 import static android.app.slice.SliceItem.FORMAT_TEXT;
 import static android.app.slice.SliceItem.FORMAT_TIMESTAMP;
 
+import android.app.slice.Slice;
+import android.content.Context;
+import android.content.res.Resources;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
@@ -35,7 +38,9 @@
 import java.util.List;
 
 import androidx.app.slice.SliceItem;
+import androidx.app.slice.builders.GridBuilder;
 import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
 
 /**
  * Extracts information required to present content in a grid format from a slice.
@@ -50,9 +55,25 @@
     private ArrayList<CellContent> mGridContent = new ArrayList<>();
     private int mMaxCellLineCount;
     private boolean mHasImage;
+    private @GridBuilder.ImageMode int mLargestImageMode;
 
-    public GridContent(SliceItem gridItem) {
+    private int mBigPicMinHeight;
+    private int mBigPicMaxHeight;
+    private int mAllImagesHeight;
+    private int mImageTextHeight;
+    private int mMaxHeight;
+    private int mMinHeight;
+
+    public GridContent(Context context, SliceItem gridItem) {
         populate(gridItem);
+
+        Resources res = context.getResources();
+        mBigPicMinHeight = res.getDimensionPixelSize(R.dimen.abc_slice_big_pic_min_height);
+        mBigPicMaxHeight = res.getDimensionPixelSize(R.dimen.abc_slice_big_pic_max_height);
+        mAllImagesHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_image_only_height);
+        mImageTextHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_image_text_height);
+        mMinHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_min_height);
+        mMaxHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_max_height);
     }
 
     private void reset() {
@@ -60,12 +81,13 @@
         mMaxCellLineCount = 0;
         mHasImage = false;
         mGridContent.clear();
+        mLargestImageMode = 0;
     }
 
     /**
      * @return whether this grid has content that is valid to display.
      */
-    public boolean populate(SliceItem gridItem) {
+    private boolean populate(SliceItem gridItem) {
         reset();
         mColorItem = SliceQuery.findSubtype(gridItem, FORMAT_INT, SUBTYPE_COLOR);
         String[] hints = new String[] {HINT_SHORTCUT, HINT_TITLE};
@@ -99,6 +121,7 @@
             }
             mMaxCellLineCount = Math.max(mMaxCellLineCount, cc.getTextCount());
             mHasImage |= cc.hasImage();
+            mLargestImageMode = Math.max(mLargestImageMode, cc.getImageMode());
         }
     }
 
@@ -166,6 +189,37 @@
     }
 
     /**
+     * @return the height to display a grid row at when it is used as a small template.
+     */
+    public int getSmallHeight() {
+        return getHeight(true /* isSmall */);
+    }
+
+    /**
+     * @return the height the content in this template requires to be displayed.
+     */
+    public int getActualHeight() {
+        return getHeight(false /* isSmall */);
+    }
+
+    private int getHeight(boolean isSmall) {
+        if (!isValid()) {
+            return 0;
+        }
+        if (mAllImages) {
+            return mGridContent.size() == 1
+                    ? isSmall ? mBigPicMinHeight : mBigPicMaxHeight
+                    : mLargestImageMode == GridBuilder.ICON_IMAGE ? mMinHeight : mAllImagesHeight;
+        } else {
+            boolean twoLines = getMaxCellLineCount() > 1;
+            boolean hasImage = hasImage();
+            return (twoLines && !isSmall)
+                    ? hasImage ? mMaxHeight : mMinHeight
+                    : mLargestImageMode == GridBuilder.ICON_IMAGE ? mMinHeight : mImageTextHeight;
+        }
+    }
+
+    /**
      * Extracts information required to present content in a cell.
      * @hide
      */
@@ -175,6 +229,7 @@
         private ArrayList<SliceItem> mCellItems = new ArrayList<>();
         private int mTextCount;
         private boolean mHasImage;
+        private int mImageMode = -1;
 
         public CellContent(SliceItem cellItem) {
             populate(cellItem);
@@ -207,6 +262,13 @@
                         mTextCount++;
                         mCellItems.add(item);
                     } else if (imageCount < 1 && FORMAT_IMAGE.equals(item.getFormat())) {
+                        if (item.hasHint(Slice.HINT_NO_TINT)) {
+                            mImageMode = item.hasHint(Slice.HINT_LARGE)
+                                    ? GridBuilder.LARGE_IMAGE
+                                    : GridBuilder.SMALL_IMAGE;
+                        } else {
+                            mImageMode = GridBuilder.ICON_IMAGE;
+                        }
                         imageCount++;
                         mHasImage = true;
                         mCellItems.add(item);
@@ -269,5 +331,12 @@
         public boolean hasImage() {
             return mHasImage;
         }
+
+        /**
+         * @return the mode of the image.
+         */
+        public int getImageMode() {
+            return mImageMode;
+        }
     }
 }
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
index f267bdb..148730c 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/GridRowView.java
@@ -26,6 +26,8 @@
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 
+import static androidx.app.slice.widget.SliceView.MODE_SMALL;
+
 import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -67,15 +69,11 @@
 
     private static final String TAG = "GridView";
 
-    // TODO -- Should add notion to the builder so that apps could define the "see more" intent
-    private static final boolean ALLOW_SEE_MORE = false;
-
     private static final int TITLE_TEXT_LAYOUT = R.layout.abc_slice_title;
     private static final int TEXT_LAYOUT = R.layout.abc_slice_secondary_text;
-    // Max number of *just* images that can be shown in a row
-    private static final int MAX_IMAGES = 3;
+
     // Max number of normal cell items that can be shown in a row
-    private static final int MAX_ALL = 5;
+    private static final int MAX_CELLS = 5;
 
     // Max number of text items that can show in a cell
     private static final int MAX_CELL_TEXT = 2;
@@ -85,12 +83,10 @@
     private static final int MAX_CELL_IMAGES = 1;
 
     private int mRowIndex;
-    private boolean mIsAllImages;
-
+    private int mSmallImageSize;
     private int mIconSize;
-    private int mLargeIconSize;
-    private int mBigPictureHeight;
-    private int mAllImagesHeight;
+    private int mGutter;
+
     private GridContent mGridContent;
     private LinearLayout mViewContainer;
 
@@ -101,26 +97,31 @@
     public GridRowView(Context context, AttributeSet attrs) {
         super(context, attrs);
         final Resources res = getContext().getResources();
-        mIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_icon_size);
-        mLargeIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_large_icon_size);
-        mBigPictureHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_big_picture_height);
-        mAllImagesHeight = res.getDimensionPixelSize(R.dimen.abc_slice_grid_image_only_height);
         mViewContainer = new LinearLayout(getContext());
         mViewContainer.setOrientation(LinearLayout.HORIZONTAL);
         addView(mViewContainer, new LayoutParams(MATCH_PARENT, MATCH_PARENT));
+        mViewContainer.setGravity(Gravity.CENTER_VERTICAL);
+        mIconSize = res.getDimensionPixelSize(R.dimen.abc_slice_icon_size);
+        mSmallImageSize = res.getDimensionPixelSize(R.dimen.abc_slice_small_image_size);
+        mGutter = res.getDimensionPixelSize(R.dimen.abc_slice_grid_gutter);
+    }
+
+    @Override
+    public int getSmallHeight() {
+        // GridRow is small if its the first element in a list without a header presented in small
+        return mGridContent != null ? mGridContent.getSmallHeight() : 0;
+    }
+
+    @Override
+    public int getActualHeight() {
+        return mGridContent != null ? mGridContent.getActualHeight() : 0;
     }
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        if (mIsAllImages) {
-            int count = getChildCount();
-            int height = (count == 1) ? mBigPictureHeight : mAllImagesHeight;
-            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-            getLayoutParams().height = height;
-            for (int i = 0; i < count; i++) {
-                getChildAt(i).getLayoutParams().height = height;
-            }
-        }
+        int height = getMode() == MODE_SMALL ? getSmallHeight() : getActualHeight();
+        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+        mViewContainer.getLayoutParams().height = height;
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     }
 
@@ -128,20 +129,21 @@
     public void setTint(@ColorInt int tintColor) {
         super.setTint(tintColor);
         if (mGridContent != null) {
+            GridContent gc = mGridContent;
             // TODO -- could be smarter about this
             resetView();
-            populateViews(mGridContent);
+            populateViews(gc);
         }
     }
 
     /**
-     * This is called when GridView is the parent template.
+     * This is called when GridView is presented in small format.
      */
     @Override
     public void setSlice(Slice slice) {
         resetView();
         mRowIndex = 0;
-        mGridContent = new GridContent(slice.getItems().get(0));
+        mGridContent = new GridContent(getContext(), slice.getItems().get(0));
         populateViews(mGridContent);
     }
 
@@ -154,7 +156,7 @@
         resetView();
         setSliceActionListener(observer);
         mRowIndex = index;
-        mGridContent = new GridContent(slice);
+        mGridContent = new GridContent(getContext(), slice);
         populateViews(mGridContent);
     }
 
@@ -166,17 +168,13 @@
             mViewContainer.setTag(tagItem);
             makeClickable(mViewContainer);
         }
-        mIsAllImages = gc.isAllImages();
         ArrayList<GridContent.CellContent> cells = gc.getGridContent();
-        final int max = mIsAllImages ? MAX_IMAGES : MAX_ALL;
         for (int i = 0; i < cells.size(); i++) {
-            if (isFull()) {
+            if (mViewContainer.getChildCount() >= MAX_CELLS) {
+                // TODO -- use item if it exists
                 break;
             }
-            addCell(cells.get(i), i, Math.min(cells.size(), max));
-        }
-        if (ALLOW_SEE_MORE && mIsAllImages && cells.size() > getChildCount()) {
-            addSeeMoreCount(cells.size() - getChildCount());
+            addCell(cells.get(i), i, Math.min(cells.size(), MAX_CELLS));
         }
     }
 
@@ -199,15 +197,11 @@
         mViewContainer.addView(frame);
     }
 
-    private boolean isFull() {
-        return getChildCount() >= (mIsAllImages ? MAX_IMAGES : MAX_ALL);
-    }
-
     /**
      * Adds a cell to the grid view based on the provided {@link SliceItem}.
      */
     private void addCell(GridContent.CellContent cell, int index, int total) {
-        final int maxCellText = getMode() == SliceView.MODE_SMALL
+        final int maxCellText = getMode() == MODE_SMALL
                 ? MAX_CELL_TEXT_SMALL
                 : MAX_CELL_TEXT;
         LinearLayout cellContainer = new LinearLayout(getContext());
@@ -223,7 +217,7 @@
         boolean singleItem = cellItems.size() == 1;
         List<SliceItem> textItems = null;
         // In small format we display one text item and prefer titles
-        if (!singleItem && getMode() == SliceView.MODE_SMALL) {
+        if (!singleItem && getMode() == MODE_SMALL) {
             // Get all our text items
             textItems = cellItems.stream().filter(new Predicate<SliceItem>() {
                 @Override
@@ -262,6 +256,12 @@
         if (added) {
             mViewContainer.addView(cellContainer,
                     new LinearLayout.LayoutParams(0, WRAP_CONTENT, 1));
+            if (index != total - 1) {
+                // If we're not the last or only element add space between items
+                MarginLayoutParams lp =
+                        (LinearLayout.MarginLayoutParams) cellContainer.getLayoutParams();
+                lp.setMarginEnd(mGutter);
+            }
             if (contentIntentItem != null) {
                 EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_BUTTON,
                         EventInfo.ROW_TYPE_GRID, mRowIndex);
@@ -295,15 +295,20 @@
         } else if (FORMAT_IMAGE.equals(format)) {
             ImageView iv = new ImageView(getContext());
             iv.setImageIcon(item.getIcon());
-            if (color != -1 && !item.hasHint(HINT_NO_TINT) && !item.hasHint(HINT_LARGE)) {
-                iv.setColorFilter(color);
-            }
-            int size = mIconSize;
+            LinearLayout.LayoutParams lp;
             if (item.hasHint(HINT_LARGE)) {
                 iv.setScaleType(ScaleType.CENTER_CROP);
-                size = singleItem ? MATCH_PARENT : mLargeIconSize;
+                lp = new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT);
+            } else {
+                boolean isIcon = !item.hasHint(HINT_NO_TINT);
+                int size = isIcon ? mIconSize : mSmallImageSize;
+                iv.setScaleType(isIcon ? ScaleType.CENTER_INSIDE : ScaleType.CENTER_CROP);
+                lp = new LinearLayout.LayoutParams(size, size);
             }
-            container.addView(iv, new LayoutParams(size, size));
+            if (color != -1 && !item.hasHint(HINT_NO_TINT)) {
+                iv.setColorFilter(color);
+            }
+            container.addView(iv, lp);
             addedView = iv;
         }
         return addedView != null;
@@ -334,7 +339,6 @@
 
     @Override
     public void resetView() {
-        mIsAllImages = true;
         mViewContainer.removeAllViews();
     }
 }
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java b/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java
index 7aace75..bdd1ac5 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/LargeTemplateView.java
@@ -16,9 +16,6 @@
 
 package androidx.app.slice.widget;
 
-import static android.app.slice.Slice.HINT_PARTIAL;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
-
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.support.annotation.RestrictTo;
@@ -30,8 +27,6 @@
 
 import androidx.app.slice.Slice;
 import androidx.app.slice.SliceItem;
-import androidx.app.slice.core.SliceQuery;
-import androidx.app.slice.view.R;
 
 /**
  * @hide
@@ -42,7 +37,6 @@
 
     private final LargeSliceAdapter mAdapter;
     private final RecyclerView mRecyclerView;
-    private final int mDefaultHeight;
     private Slice mSlice;
     private boolean mIsScrollable;
     private ListContent mListContent;
@@ -54,7 +48,11 @@
         mAdapter = new LargeSliceAdapter(context);
         mRecyclerView.setAdapter(mAdapter);
         addView(mRecyclerView);
-        mDefaultHeight = getResources().getDimensionPixelSize(R.dimen.abc_slice_large_height);
+    }
+
+    @Override
+    public int getActualHeight() {
+        return mListContent != null ? mListContent.getListHeight() : 0;
     }
 
     @Override
@@ -82,20 +80,6 @@
     }
 
     @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        mRecyclerView.getLayoutParams().height = WRAP_CONTENT;
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        int width = MeasureSpec.getSize(widthMeasureSpec);
-        if (mRecyclerView.getMeasuredHeight() > width
-                || (mSlice != null && SliceQuery.hasHints(mSlice, HINT_PARTIAL))) {
-            mRecyclerView.getLayoutParams().height = width;
-        } else {
-            mRecyclerView.getLayoutParams().height = mRecyclerView.getMeasuredHeight();
-        }
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-    }
-
-    @Override
     public void setSlice(Slice slice) {
         mSlice = slice;
         populate();
@@ -111,7 +95,7 @@
         if (mSlice == null) {
             return;
         }
-        mListContent = new ListContent(mSlice);
+        mListContent = new ListContent(getContext(), mSlice);
         mAdapter.setSliceItems(mListContent.getRowItems(), mTintColor);
     }
 
@@ -128,6 +112,5 @@
         mSlice = null;
         mAdapter.setSliceItems(null, -1);
         mListContent = null;
-        mAdapter.setSliceItems(null, -1);
     }
 }
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java b/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java
index 79bfa39..246ef0b 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/ListContent.java
@@ -17,6 +17,7 @@
 package androidx.app.slice.widget;
 
 import static android.app.slice.Slice.HINT_ACTIONS;
+import static android.app.slice.Slice.HINT_HORIZONTAL;
 import static android.app.slice.Slice.HINT_LIST_ITEM;
 import static android.app.slice.Slice.HINT_SHORTCUT;
 import static android.app.slice.Slice.SUBTYPE_COLOR;
@@ -25,6 +26,7 @@
 import static android.app.slice.SliceItem.FORMAT_SLICE;
 import static android.app.slice.SliceItem.FORMAT_TEXT;
 
+import android.content.Context;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
@@ -48,8 +50,10 @@
     private SliceItem mColorItem;
     private ArrayList<SliceItem> mRowItems = new ArrayList<>();
     private List<SliceItem> mSliceActions;
+    private Context mContext;
 
-    public ListContent(Slice slice) {
+    public ListContent(Context context, Slice slice) {
+        mContext = context;
         populate(slice);
     }
 
@@ -65,7 +69,7 @@
     /**
      * @return whether this row has content that is valid to display.
      */
-    public boolean populate(Slice slice) {
+    private boolean populate(Slice slice) {
         reset();
         mColorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
         // Find slice actions
@@ -98,6 +102,24 @@
     }
 
     /**
+     * @return the total height of all the rows contained in this list.
+     */
+    public int getListHeight() {
+        int height = 0;
+        for (int i = 0; i < mRowItems.size(); i++) {
+            SliceItem item = mRowItems.get(i);
+            if (item.hasHint(HINT_HORIZONTAL)) {
+                GridContent gc = new GridContent(mContext, item);
+                height += gc.getActualHeight();
+            } else {
+                RowContent rc = new RowContent(mContext, item, i == 0 /* isHeader */);
+                height += rc.getActualHeight();
+            }
+        }
+        return height;
+    }
+
+    /**
      * @return whether this list has content that is valid to display.
      */
     public boolean isValid() {
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java b/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java
index 920dc52..a22a37d 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/RowContent.java
@@ -30,8 +30,10 @@
 
 import static androidx.app.slice.core.SliceHints.SUBTYPE_RANGE;
 
+import android.content.Context;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
+import android.text.TextUtils;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -39,6 +41,7 @@
 
 import androidx.app.slice.SliceItem;
 import androidx.app.slice.core.SliceQuery;
+import androidx.app.slice.view.R;
 
 /**
  * Extracts information required to present content in a row format from a slice.
@@ -57,9 +60,14 @@
     private boolean mEndItemsContainAction;
     private SliceItem mRange;
     private boolean mIsHeader;
+    private int mLineCount = 0;
+    private int mMaxHeight;
+    private int mMinHeight;
 
-    public RowContent(SliceItem rowSlice, boolean isHeader) {
+    public RowContent(Context context, SliceItem rowSlice, boolean isHeader) {
         populate(rowSlice, isHeader);
+        mMaxHeight = context.getResources().getDimensionPixelSize(R.dimen.abc_slice_row_max_height);
+        mMinHeight = context.getResources().getDimensionPixelSize(R.dimen.abc_slice_row_min_height);
     }
 
     /**
@@ -72,12 +80,13 @@
         mSubtitleItem = null;
         mEndItems.clear();
         mIsHeader = false;
+        mLineCount = 0;
     }
 
     /**
      * @return whether this row has content that is valid to display.
      */
-    public boolean populate(SliceItem rowSlice, boolean isHeader) {
+    private boolean populate(SliceItem rowSlice, boolean isHeader) {
         reset();
         mIsHeader = isHeader;
         if (!isValidRow(rowSlice)) {
@@ -131,6 +140,12 @@
                     endItems.add(item);
                 }
             }
+            if (hasText(mTitleItem)) {
+                mLineCount++;
+            }
+            if (hasText(mSubtitleItem)) {
+                mLineCount++;
+            }
             // Special rules for end items: only one timestamp, can't be mixture of icons / actions
             boolean hasTimestamp = mStartItem != null
                     && FORMAT_TIMESTAMP.equals(mStartItem.getFormat());
@@ -212,6 +227,33 @@
     }
 
     /**
+     * @return the number of lines of text contained in this row.
+     */
+    public int getLineCount() {
+        return mLineCount;
+    }
+
+    /**
+     * @return the height to display a row at when it is used as a small template.
+     */
+    public int getSmallHeight() {
+        return mMaxHeight;
+    }
+
+    /**
+     * @return the height the content in this template requires to be displayed.
+     */
+    public int getActualHeight() {
+        return isValid()
+                ? (getLineCount() > 1 || mIsHeader) ? mMaxHeight : mMinHeight
+                : 0;
+    }
+
+    private static boolean hasText(SliceItem textSlice) {
+        return textSlice != null && !TextUtils.isEmpty(textSlice.getText());
+    }
+
+    /**
      * @return whether this is a valid item to use to populate a row of content.
      */
     private static boolean isValidRow(SliceItem rowSlice) {
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/RowView.java b/slices/view/src/main/java/androidx/app/slice/widget/RowView.java
index 5b3e74c..bcd4f61 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/RowView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/RowView.java
@@ -109,6 +109,19 @@
         mSeekBar = (SeekBar) findViewById(R.id.seek_bar);
         mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
     }
+
+
+    @Override
+    public int getSmallHeight() {
+        // RowView is in small format when it is the header of a list and displays at max height.
+        return mRowContent != null && mRowContent.isValid() ? mRowContent.getSmallHeight() : 0;
+    }
+
+    @Override
+    public int getActualHeight() {
+        return mRowContent != null && mRowContent.isValid() ? mRowContent.getActualHeight() : 0;
+    }
+
     @Override
     public void setTint(@ColorInt int tintColor) {
         super.setTint(tintColor);
@@ -126,6 +139,13 @@
         }
     }
 
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int height = getMode() == MODE_SMALL ? getSmallHeight() : getActualHeight();
+        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+
     /**
      * This is called when RowView is being used as a component in a large template.
      */
@@ -136,7 +156,7 @@
         mRowIndex = index;
         mIsHeader = isHeader;
         mHeaderActions = null;
-        mRowContent = new RowContent(slice, mIsHeader);
+        mRowContent = new RowContent(getContext(), slice, mIsHeader);
         populateViews();
     }
 
@@ -148,8 +168,8 @@
         mRowIndex = 0;
         mIsHeader = true;
         mHeaderActions = null;
-        ListContent lc = new ListContent(slice);
-        mRowContent = new RowContent(lc.getHeaderItem(), true /* isHeader */);
+        ListContent lc = new ListContent(getContext(), slice);
+        mRowContent = new RowContent(getContext(), lc.getHeaderItem(), true /* isHeader */);
         populateViews();
     }
 
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
index 9a5279f..9768894 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceChildView.java
@@ -75,6 +75,20 @@
     }
 
     /**
+     * @return the height of this view when displayed in {@link SliceView#MODE_SMALL}.
+     */
+    public int getSmallHeight() {
+        return 0;
+    }
+
+    /**
+     * @return the height of this view if it displayed all of its contents.
+     */
+    public int getActualHeight() {
+        return 0;
+    }
+
+    /**
      * @param slice the slice to show in this view.
      */
     public abstract void setSlice(Slice slice);
diff --git a/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java b/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java
index 3648234..6e1f0c0 100644
--- a/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java
+++ b/slices/view/src/main/java/androidx/app/slice/widget/SliceView.java
@@ -114,13 +114,7 @@
      */
     public static final int MODE_SHORTCUT    = 3;
 
-    /**
-     * Will select the type of slice binding based on size of the View. TODO: Put in some info about
-     * that selection.
-     */
-    private static final int MODE_AUTO = 0;
-
-    private int mMode = MODE_AUTO;
+    private int mMode = MODE_LARGE;
     private Slice mCurrentSlice;
     private SliceChildView mCurrentView;
     private List<SliceItem> mActions;
@@ -130,6 +124,8 @@
     private boolean mIsScrollable = true;
 
     private final int mShortcutSize;
+    private final int mMinLargeHeight;
+
     private AttributeSet mAttrs;
     private int mThemeTintColor = -1;
 
@@ -161,44 +157,73 @@
         mActionRow = new ActionRow(getContext(), true);
         mActionRow.setBackground(new ColorDrawable(0xffeeeeee));
         mCurrentView = new LargeTemplateView(getContext());
+        mCurrentView.setMode(getMode());
         addView(mCurrentView.getView(), getChildLp(mCurrentView.getView()));
         addView(mActionRow, getChildLp(mActionRow));
         mShortcutSize = getContext().getResources()
                 .getDimensionPixelSize(R.dimen.abc_slice_shortcut_size);
+        mMinLargeHeight = getResources().getDimensionPixelSize(R.dimen.abc_slice_large_height);
+    }
+
+    private int getHeightForMode() {
+        int mode = getMode();
+        if (mode == MODE_SHORTCUT) {
+            return mShortcutSize;
+        }
+        return mode == MODE_LARGE
+                ? mCurrentView.getActualHeight()
+                : mCurrentView.getSmallHeight();
     }
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int width = MeasureSpec.getSize(widthMeasureSpec);
         int childWidth = MeasureSpec.getSize(widthMeasureSpec);
-        int childHeight = MeasureSpec.getSize(heightMeasureSpec);
         if (MODE_SHORTCUT == mMode) {
-            // TODO: consider scaling the shortcut to fit
+            // TODO: consider scaling the shortcut to fit if too small
             childWidth = mShortcutSize;
             width = mShortcutSize;
         }
+
+        final int actionHeight = mActionRow.getVisibility() != View.GONE
+                ? mActionRow.getMeasuredHeight()
+                : 0;
+        final int sliceHeight = getHeightForMode() + actionHeight;
+        final int heightAvailable = MeasureSpec.getSize(heightMeasureSpec);
+        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        int height = heightAvailable;
+        if (heightAvailable >= sliceHeight) {
+            // Available space is larger than the slice
+            if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) {
+                height = sliceHeight;
+            }
+        } else {
+            // Not enough space available for slice in current mode
+            if (getMode() == MODE_LARGE && heightAvailable >= mMinLargeHeight + actionHeight) {
+                // It's just a slice with scrolling content; cap it to height available.
+                height = heightAvailable;
+            } else if (getMode() == MODE_SHORTCUT) {
+                // TODO: consider scaling the shortcut to fit if too small
+                height = mShortcutSize;
+            }
+        }
+        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+
+        // Measure the children without the padding
         final int left = getPaddingLeft();
         final int top = getPaddingTop();
         final int right = getPaddingRight();
         final int bot = getPaddingBottom();
-
-        // Measure the children without the padding
+        int childHeight = MeasureSpec.getSize(heightMeasureSpec);
         childWidth -= left + right;
         childHeight -= top + bot;
         int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY);
         int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY);
         measureChildren(childWidthMeasureSpec, childHeightMeasureSpec);
 
-        // Figure out parent height
-        int actionHeight = mActionRow.getVisibility() != View.GONE
-                ? mActionRow.getMeasuredHeight()
-                : 0;
-        int currViewHeight = mCurrentView.getView().getMeasuredHeight() + top + bot;
-        int newHeightSpec = MeasureSpec.makeMeasureSpec(currViewHeight + actionHeight,
-                MeasureSpec.EXACTLY);
         // Figure out parent width
         width += left + right;
-        setMeasuredDimension(width, newHeightSpec);
+        setMeasuredDimension(width, heightMeasureSpec);
     }
 
     @Override
@@ -334,9 +359,6 @@
      * @return the mode this view is presenting in.
      */
     public @SliceMode int getMode() {
-        if (mMode == MODE_AUTO) {
-            return MODE_LARGE;
-        }
         return mMode;
     }
 
@@ -375,7 +397,7 @@
             mCurrentView.resetView();
             return;
         }
-        ListContent lc = new ListContent(mCurrentSlice);
+        ListContent lc = new ListContent(getContext(), mCurrentSlice);
         if (!lc.isValid()) {
             mCurrentView.resetView();
             mCurrentView.setVisibility(View.GONE);
@@ -397,7 +419,7 @@
             }
             addView(mCurrentView.getView(), getChildLp(mCurrentView.getView()));
             addView(mActionRow, getChildLp(mActionRow));
-            mCurrentView.setMode(mMode);
+            mCurrentView.setMode(mode);
         }
         // Scrolling
         if (mode == MODE_LARGE && (mCurrentView instanceof LargeTemplateView)) {
@@ -451,7 +473,8 @@
         if (child instanceof ShortcutView) {
             return new LayoutParams(mShortcutSize, mShortcutSize);
         } else {
-            return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+            return new LayoutParams(LayoutParams.MATCH_PARENT,
+                    LayoutParams.MATCH_PARENT);
         }
     }
 
@@ -462,8 +485,6 @@
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static String modeToString(@SliceMode int mode) {
         switch(mode) {
-            case MODE_AUTO:
-                return "MODE AUTO";
             case MODE_SHORTCUT:
                 return "MODE SHORTCUT";
             case MODE_SMALL:
diff --git a/slices/view/src/main/res/layout-v21/abc_slice_small_template.xml b/slices/view/src/main/res/layout-v21/abc_slice_small_template.xml
deleted file mode 100644
index 7707dae..0000000
--- a/slices/view/src/main/res/layout-v21/abc_slice_small_template.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright 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.
-  -->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/abc_slice_row_min_height"
-    android:maxHeight="@dimen/abc_slice_row_max_height"
-    android:gravity="center_vertical"
-    android:background="?android:attr/activatedBackgroundIndicator"
-    android:clipToPadding="false">
-
-    <LinearLayout
-        android:id="@+id/icon_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="start|center_vertical"
-        android:orientation="horizontal"
-        android:paddingEnd="12dp"
-        android:paddingTop="4dp"
-        android:paddingBottom="4dp"/>
-
-    <LinearLayout
-        android:id="@android:id/content"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:gravity="center_vertical"
-        android:orientation="vertical">
-
-        <TextView android:id="@android:id/title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:maxLines="2"
-            android:textAppearance="?android:attr/textAppearanceListItem" />
-
-        <TextView android:id="@android:id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignStart="@android:id/title"
-            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-            android:textColor="?android:attr/textColorSecondary"
-            android:maxLines="10" />
-
-        <SeekBar
-            android:id="@+id/seek_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:visibility="gone" />
-
-        <ProgressBar
-            android:id="@+id/progress_bar"
-            style="?android:attr/progressBarStyleHorizontal"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:visibility="gone" />
-
-    </LinearLayout>
-
-    <View
-        android:id="@+id/divider"
-        android:layout_width="1dp"
-        android:layout_height="match_parent"
-        android:layout_marginTop="8dp"
-        android:layout_marginBottom="8dp"
-        android:background="?android:attr/listDivider"
-        android:visibility="gone"/>
-
-    <LinearLayout android:id="@android:id/widget_frame"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="end|center_vertical"
-        android:orientation="horizontal" />
-
-</LinearLayout>
diff --git a/slices/view/src/main/res/layout/abc_slice_grid.xml b/slices/view/src/main/res/layout/abc_slice_grid.xml
index 890f77d..e4cf7c5 100644
--- a/slices/view/src/main/res/layout/abc_slice_grid.xml
+++ b/slices/view/src/main/res/layout/abc_slice_grid.xml
@@ -17,8 +17,7 @@
 <androidx.app.slice.widget.GridRowView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/abc_slice_grid_image_only_height"
+    android:layout_height="match_parent"
     android:gravity="center_vertical"
     android:background="?android:attr/activatedBackgroundIndicator"
     android:clipToPadding="false">
diff --git a/slices/view/src/main/res/layout/abc_slice_secondary_text.xml b/slices/view/src/main/res/layout/abc_slice_secondary_text.xml
index b446ddd..0870465 100644
--- a/slices/view/src/main/res/layout/abc_slice_secondary_text.xml
+++ b/slices/view/src/main/res/layout/abc_slice_secondary_text.xml
@@ -23,4 +23,6 @@
         android:gravity="center"
         android:layout_height="wrap_content"
         android:padding="4dp"
-        android:layout_width="match_parent" />
+        android:layout_width="match_parent"
+        android:maxLines="1"
+        android:ellipsize="end"/>
diff --git a/slices/view/src/main/res/layout/abc_slice_small_template.xml b/slices/view/src/main/res/layout/abc_slice_small_template.xml
index 2d5e913..4a47c06 100644
--- a/slices/view/src/main/res/layout/abc_slice_small_template.xml
+++ b/slices/view/src/main/res/layout/abc_slice_small_template.xml
@@ -17,11 +17,11 @@
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="@dimen/abc_slice_row_min_height"
-    android:maxHeight="@dimen/abc_slice_row_max_height"
+    android:layout_height="match_parent"
     android:gravity="center_vertical"
+    android:layout_gravity="center_vertical"
     android:background="?android:attr/activatedBackgroundIndicator"
+    android:orientation="horizontal"
     android:clipToPadding="false">
 
     <LinearLayout
@@ -34,8 +34,8 @@
 
     <LinearLayout
         android:id="@android:id/content"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
         android:layout_weight="1"
         android:gravity="center_vertical"
         android:orientation="vertical">
@@ -43,13 +43,13 @@
         <TextView android:id="@android:id/title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:maxLines="2"/>
+            android:maxLines="1"/>
 
         <TextView android:id="@android:id/summary"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignStart="@android:id/title"
-            android:maxLines="10" />
+            android:maxLines="1" />
 
         <SeekBar
             android:id="@+id/seek_bar"
diff --git a/slices/view/src/main/res/layout/abc_slice_title.xml b/slices/view/src/main/res/layout/abc_slice_title.xml
index e1bdf03..70a1400 100644
--- a/slices/view/src/main/res/layout/abc_slice_title.xml
+++ b/slices/view/src/main/res/layout/abc_slice_title.xml
@@ -23,4 +23,6 @@
         android:gravity="center"
         android:layout_height="wrap_content"
         android:padding="4dp"
-        android:layout_width="match_parent" />
+        android:layout_width="match_parent"
+        android:maxLines="1"
+        android:ellipsize="end"/>
diff --git a/slices/view/src/main/res/values/dimens.xml b/slices/view/src/main/res/values/dimens.xml
index ff2fb97..04d74f3 100644
--- a/slices/view/src/main/res/values/dimens.xml
+++ b/slices/view/src/main/res/values/dimens.xml
@@ -17,17 +17,18 @@
 
 <resources>
     <!-- General -->
-    <!-- Size of normal icons / images in a slice -->
+    <!-- Size of icons in a slice -->
     <dimen name="abc_slice_icon_size">24dp</dimen>
-    <!-- Size of large icons / images in a slice -->
-    <dimen name="abc_slice_large_icon_size">48dp</dimen>
+    <!-- Size of small images in a slice -->
+    <dimen name="abc_slice_small_image_size">48dp</dimen>
     <!-- Standard padding used in a slice -->
     <dimen name="abc_slice_padding">16dp</dimen>
 
     <!-- Size of a slice shortcut view -->
     <dimen name="abc_slice_shortcut_size">56dp</dimen>
-
-    <!-- Height of a large template -->
+    <!-- Minimum height of a small template -->
+    <dimen name="abc_slice_small_height">48dp</dimen>
+    <!-- Minimum height of a large template -->
     <dimen name="abc_slice_large_height">240dp</dimen>
 
     <!-- Row view sizes-->
@@ -39,10 +40,22 @@
     <dimen name="abc_slice_row_active_input_height">120dp</dimen>
 
     <!-- Grid view sizes-->
-    <!-- Height of a grid row displaying only images -->
+    <!-- Height of a grid row displaying only text or only small images (but not both) -->
+    <dimen name="abc_slice_grid_min_height">60dp</dimen>
+    <!-- Height of a grid row displaying only large images -->
     <dimen name="abc_slice_grid_image_only_height">86dp</dimen>
-    <!-- Height of a grid row showing text and images -->
-    <dimen name="abc_slice_grid_height">120dp</dimen>
-    <!-- Height of expanded grid row if showing a single large image -->
-    <dimen name="abc_slice_grid_big_picture_height">180dp</dimen>
+    <!-- Height of a grid row showing one text item along with a large image -->
+    <dimen name="abc_slice_grid_image_text_height">120dp</dimen>
+    <!-- Height of a grid row showing two text items along with a large image -->
+    <dimen name="abc_slice_grid_max_height">140dp</dimen>
+    <!-- Height of a grid row showing 1-2 text items along with a small image -->
+    <dimen name="abc_slice_grid_small_image_text_height">120dp</dimen>
+    <!-- Gutter between cells in a grid row-->
+    <dimen name="abc_slice_grid_gutter">4dp</dimen>
+
+    <!-- Big picture -->
+    <!-- Min height of row showing a single large image -->
+    <dimen name="abc_slice_big_pic_min_height">120dp</dimen>
+    <!-- Max height of row showing a single large image -->
+    <dimen name="abc_slice_big_pic_max_height">140dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java b/slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
index 5676ccf..4074ca3 100644
--- a/slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
+++ b/slidingpanelayout/src/main/java/android/support/v4/widget/SlidingPaneLayout.java
@@ -32,6 +32,7 @@
 import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.Px;
 import android.support.annotation.RequiresApi;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.view.AbsSavedState;
@@ -277,7 +278,7 @@
      *
      * @param parallaxBy Distance to parallax by in pixels
      */
-    public void setParallaxDistance(int parallaxBy) {
+    public void setParallaxDistance(@Px int parallaxBy) {
         mParallaxBy = parallaxBy;
         requestLayout();
     }
@@ -287,6 +288,7 @@
      *
      * @see #setParallaxDistance(int)
      */
+    @Px
     public int getParallaxDistance() {
         return mParallaxBy;
     }
diff --git a/textclassifier/api/current.txt b/textclassifier/api/current.txt
index 6dad352..95ff935 100644
--- a/textclassifier/api/current.txt
+++ b/textclassifier/api/current.txt
@@ -35,6 +35,7 @@
   public static final class TextClassification.Options implements android.os.Parcelable {
     ctor public TextClassification.Options();
     method public int describeContents();
+    method public java.lang.String getCallingPackageName();
     method public android.support.v4.os.LocaleListCompat getDefaultLocales();
     method public java.util.Calendar getReferenceTime();
     method public androidx.view.textclassifier.TextClassification.Options setDefaultLocales(android.support.v4.os.LocaleListCompat);
@@ -78,6 +79,7 @@
     ctor public TextLinks.Options();
     method public int describeContents();
     method public int getApplyStrategy();
+    method public java.lang.String getCallingPackageName();
     method public android.support.v4.os.LocaleListCompat getDefaultLocales();
     method public androidx.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
     method public androidx.view.textclassifier.TextLinks.SpanFactory getSpanFactory();
@@ -128,6 +130,7 @@
   public static final class TextSelection.Options implements android.os.Parcelable {
     ctor public TextSelection.Options();
     method public int describeContents();
+    method public java.lang.String getCallingPackageName();
     method public android.support.v4.os.LocaleListCompat getDefaultLocales();
     method public androidx.view.textclassifier.TextSelection.Options setDefaultLocales(android.support.v4.os.LocaleListCompat);
     method public void writeToParcel(android.os.Parcel, int);
diff --git a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java
index 8ae65ac..8c8cb25 100644
--- a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java
+++ b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextClassificationTest.java
@@ -140,11 +140,13 @@
 
     @Test
     public void testParcelOptions() {
+        final String callingPackageName = "packageName";
         Calendar referenceTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
         referenceTime.setTimeInMillis(946684800000L);  // 2000-01-01 00:00:00
-        TextClassification.Options reference = new TextClassification.Options();
-        reference.setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"));
-        reference.setReferenceTime(referenceTime);
+        TextClassification.Options reference = new TextClassification.Options()
+                .setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"))
+                .setReferenceTime(referenceTime)
+                .setCallingPackageName(callingPackageName);
 
         // Parcel and unparcel.
         final Parcel parcel = Parcel.obtain();
@@ -155,5 +157,6 @@
 
         assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
         assertEquals(referenceTime, result.getReferenceTime());
+        assertEquals(callingPackageName, result.getCallingPackageName());
     }
 }
diff --git a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java
index dadc214..d42f2e7 100644
--- a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java
+++ b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextLinksTest.java
@@ -129,11 +129,13 @@
                 TextClassifier.ENTITY_PRESET_NONE);
         entityConfig.includeEntities("a", "b", "c");
         entityConfig.excludeEntities("b");
-        TextLinks.Options reference = new TextLinks.Options();
-        reference.setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"));
-        reference.setEntityConfig(entityConfig);
-        reference.setApplyStrategy(TextLinks.APPLY_STRATEGY_REPLACE);
-        reference.setSpanFactory(new CustomSpanFactory());
+        final String callingPackageName = "packageName";
+        TextLinks.Options reference = new TextLinks.Options()
+                .setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"))
+                .setEntityConfig(entityConfig)
+                .setApplyStrategy(TextLinks.APPLY_STRATEGY_REPLACE)
+                .setSpanFactory(new CustomSpanFactory())
+                .setCallingPackageName(callingPackageName);
 
         final Parcel parcel = Parcel.obtain();
         reference.writeToParcel(parcel, reference.describeContents());
@@ -144,6 +146,7 @@
         assertEquals(Arrays.asList("a", "c"), result.getEntityConfig().getEntities(mClassifier));
         assertEquals(TextLinks.APPLY_STRATEGY_REPLACE, result.getApplyStrategy());
         assertEquals(null, result.getSpanFactory());
+        assertEquals(callingPackageName, result.getCallingPackageName());
     }
 
     @Test
diff --git a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java
index 33a227b..d121ce6 100644
--- a/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java
+++ b/textclassifier/src/androidTest/java/androidx/view/textclassifier/TextSelectionTest.java
@@ -62,8 +62,10 @@
 
     @Test
     public void testParcelOptions() {
-        TextSelection.Options reference = new TextSelection.Options();
-        reference.setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"));
+        final String callingPackageName = "packageName";
+        TextSelection.Options reference = new TextSelection.Options()
+                .setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE"))
+                .setCallingPackageName(callingPackageName);
 
         // Parcel and unparcel.
         final Parcel parcel = Parcel.obtain();
@@ -73,5 +75,6 @@
                 parcel);
 
         assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
+        assertEquals(callingPackageName, result.getCallingPackageName());
     }
 }
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java
index 799618a..aa72a55 100644
--- a/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextClassification.java
@@ -536,6 +536,7 @@
 
         private @Nullable LocaleListCompat mDefaultLocales;
         private @Nullable Calendar mReferenceTime;
+        private @Nullable String mCallingPackageName;
 
         public Options() {}
 
@@ -560,6 +561,17 @@
         }
 
         /**
+         * @param packageName name of the package from which the call was made.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public Options setCallingPackageName(@Nullable String packageName) {
+            mCallingPackageName = packageName;
+            return this;
+        }
+
+        /**
          * @return ordered list of locale preferences that can be used to disambiguate
          *      the provided text.
          */
@@ -577,6 +589,14 @@
             return mReferenceTime;
         }
 
+        /**
+         * @return name of the package from which the call was made.
+         */
+        @Nullable
+        public String getCallingPackageName() {
+            return mCallingPackageName;
+        }
+
         @Override
         public int describeContents() {
             return 0;
@@ -592,6 +612,7 @@
             if (mReferenceTime != null) {
                 dest.writeSerializable(mReferenceTime);
             }
+            dest.writeString(mCallingPackageName);
         }
 
         public static final Parcelable.Creator<Options> CREATOR =
@@ -614,6 +635,7 @@
             if (in.readInt() > 0) {
                 mReferenceTime = (Calendar) in.readSerializable();
             }
+            mCallingPackageName = in.readString();
         }
     }
 }
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java
index 79810f5..70096c3 100644
--- a/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextLinks.java
@@ -285,6 +285,7 @@
         private TextClassifier.EntityConfig mEntityConfig;
         private @ApplyStrategy int mApplyStrategy;
         private @Nullable SpanFactory mSpanFactory;
+        private @Nullable String mCallingPackageName;
 
         public Options() {}
 
@@ -334,6 +335,17 @@
         }
 
         /**
+         * @param packageName name of the package from which the call was made.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public Options setCallingPackageName(@Nullable String packageName) {
+            mCallingPackageName = packageName;
+            return this;
+        }
+
+        /**
          * @return ordered list of locale preferences that can be used to disambiguate
          *      the provided text.
          */
@@ -374,6 +386,14 @@
             return mSpanFactory;
         }
 
+        /**
+         * @return name of the package from which the call was made.
+         */
+        @Nullable
+        public String getCallingPackageName() {
+            return mCallingPackageName;
+        }
+
         @Override
         public int describeContents() {
             return 0;
@@ -391,6 +411,7 @@
             }
             dest.writeInt(mApplyStrategy);
             // mSpanFactory is not parcelable
+            dest.writeString(mCallingPackageName);
         }
 
         public static final Parcelable.Creator<Options> CREATOR =
@@ -415,6 +436,7 @@
             }
             mApplyStrategy = in.readInt();
             // mSpanFactory is not parcelable
+            mCallingPackageName = in.readString();
         }
     }
 
diff --git a/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java b/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java
index dbc7ecf..5c54de8 100644
--- a/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java
+++ b/textclassifier/src/main/java/androidx/view/textclassifier/TextSelection.java
@@ -22,6 +22,7 @@
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.RestrictTo;
 import android.support.v4.os.LocaleListCompat;
 import android.support.v4.util.ArrayMap;
 import android.support.v4.util.Preconditions;
@@ -208,6 +209,7 @@
     public static final class Options implements Parcelable {
 
         private @Nullable LocaleListCompat mDefaultLocales;
+        private @Nullable String mCallingPackageName;
 
         public Options() {}
 
@@ -222,6 +224,17 @@
         }
 
         /**
+         * @param packageName name of the package from which the call was made.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        public Options setCallingPackageName(@Nullable String packageName) {
+            mCallingPackageName = packageName;
+            return this;
+        }
+
+        /**
          * @return ordered list of locale preferences that can be used to disambiguate
          *      the provided text.
          */
@@ -230,6 +243,14 @@
             return mDefaultLocales;
         }
 
+        /**
+         * @return name of the package from which the call was made.
+         */
+        @Nullable
+        public String getCallingPackageName() {
+            return mCallingPackageName;
+        }
+
         @Override
         public int describeContents() {
             return 0;
@@ -241,6 +262,7 @@
             if (mDefaultLocales != null) {
                 dest.writeString(mDefaultLocales.toLanguageTags());
             }
+            dest.writeString(mCallingPackageName);
         }
 
         public static final Parcelable.Creator<Options> CREATOR =
@@ -260,6 +282,7 @@
             if (in.readInt() > 0) {
                 mDefaultLocales = LocaleListCompat.forLanguageTags(in.readString());
             }
+            mCallingPackageName = in.readString();
         }
     }
 }
diff --git a/transition/src/androidTest/java/android/support/transition/ExplodeTest.java b/transition/src/androidTest/java/android/support/transition/ExplodeTest.java
index b421537..f5578e9 100644
--- a/transition/src/androidTest/java/android/support/transition/ExplodeTest.java
+++ b/transition/src/androidTest/java/android/support/transition/ExplodeTest.java
@@ -16,8 +16,11 @@
 
 package android.support.transition;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -70,8 +73,8 @@
         verifyTranslation(greenSquare, false, true);
         verifyTranslation(blueSquare, false, false);
         verifyTranslation(yellowSquare, true, false);
-        assertTrue(redStartX > redSquare.getTranslationX()); // moving left
-        assertTrue(redStartY > redSquare.getTranslationY()); // moving up
+        assertThat(redStartX, is(greaterThan(redSquare.getTranslationX()))); // moving left
+        assertThat(redStartY, is(greaterThan(redSquare.getTranslationY()))); // moving up
         waitForEnd();
 
         verifyNoTranslation(redSquare);
@@ -127,8 +130,8 @@
         verifyTranslation(greenSquare, false, true);
         verifyTranslation(blueSquare, false, false);
         verifyTranslation(yellowSquare, true, false);
-        assertTrue(redStartX < redSquare.getTranslationX()); // moving right
-        assertTrue(redStartY < redSquare.getTranslationY()); // moving down
+        assertThat(redStartX, is(lessThan(redSquare.getTranslationX()))); // moving right
+        assertThat(redStartY, is(lessThan(redSquare.getTranslationY()))); // moving down
         waitForEnd();
 
         verifyNoTranslation(redSquare);
@@ -146,15 +149,15 @@
         float translationY = view.getTranslationY();
 
         if (goLeft) {
-            assertTrue(translationX < 0);
+            assertThat(translationX, is(lessThan(0.f)));
         } else {
-            assertTrue(translationX > 0);
+            assertThat(translationX, is(greaterThan(0.f)));
         }
 
         if (goUp) {
-            assertTrue(translationY < 0);
+            assertThat(translationY, is(lessThan(0.f)));
         } else {
-            assertTrue(translationY > 0);
+            assertThat(translationY, is(greaterThan(0.f)));
         }
     }
 
diff --git a/transition/src/androidTest/java/android/support/transition/FadeTest.java b/transition/src/androidTest/java/android/support/transition/FadeTest.java
index 3b171e2..80d1547 100644
--- a/transition/src/androidTest/java/android/support/transition/FadeTest.java
+++ b/transition/src/androidTest/java/android/support/transition/FadeTest.java
@@ -138,7 +138,7 @@
         verify(listenerOut, timeout(3000)).onTransitionPause(any(Transition.class));
         verify(listenerIn, timeout(3000)).onTransitionStart(any(Transition.class));
         assertThat(valuesOut[1], allOf(greaterThan(0f), lessThan(1f)));
-        if (Build.VERSION.SDK_INT >= 19) {
+        if (Build.VERSION.SDK_INT >= 19 && fadeOut.mInitialAlpha >= 0) {
             // These won't match on API levels 18 and below due to lack of Animator pause.
             assertEquals(valuesOut[1], valuesIn[0], 0.01f);
         }
@@ -174,7 +174,7 @@
         verify(listenerIn, timeout(3000)).onTransitionPause(any(Transition.class));
         verify(listenerOut, timeout(3000)).onTransitionStart(any(Transition.class));
         assertThat(valuesIn[1], allOf(greaterThan(0f), lessThan(1f)));
-        if (Build.VERSION.SDK_INT >= 19) {
+        if (Build.VERSION.SDK_INT >= 19 && fadeIn.mInitialAlpha >= 0) {
             // These won't match on API levels 18 and below due to lack of Animator pause.
             assertEquals(valuesIn[1], valuesOut[0], 0.01f);
         }
diff --git a/tv-provider/src/main/java/android/support/media/tv/BasePreviewProgram.java b/tv-provider/src/main/java/android/support/media/tv/BasePreviewProgram.java
index 816b1a1..479471e 100644
--- a/tv-provider/src/main/java/android/support/media/tv/BasePreviewProgram.java
+++ b/tv-provider/src/main/java/android/support/media/tv/BasePreviewProgram.java
@@ -143,7 +143,7 @@
 
     /**
      * @return The internal provider ID for the program.
-     * @see PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
      */
     public String getInternalProviderId() {
         return mValues.getAsString(PreviewPrograms.COLUMN_INTERNAL_PROVIDER_ID);
@@ -151,7 +151,7 @@
 
     /**
      * @return The preview video URI for the program.
-     * @see PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
      */
     public Uri getPreviewVideoUri() {
         String uri = mValues.getAsString(PreviewPrograms.COLUMN_PREVIEW_VIDEO_URI);
@@ -160,7 +160,8 @@
 
     /**
      * @return The last playback position of the program in millis.
-     * @see PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
+     * @see android.support.media.tv.TvContractCompat
+     * .PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
      */
     public int getLastPlaybackPositionMillis() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS);
@@ -169,7 +170,7 @@
 
     /**
      * @return The duration of the program in millis.
-     * @see PreviewPrograms#COLUMN_DURATION_MILLIS
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_DURATION_MILLIS
      */
     public int getDurationMillis() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_DURATION_MILLIS);
@@ -178,7 +179,7 @@
 
     /**
      * @return The intent URI which is launched when the program is selected.
-     * @see PreviewPrograms#COLUMN_INTENT_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTENT_URI
      */
     public Uri getIntentUri() {
         String uri = mValues.getAsString(PreviewPrograms.COLUMN_INTENT_URI);
@@ -187,7 +188,7 @@
 
     /**
      * @return The intent which is launched when the program is selected.
-     * @see PreviewPrograms#COLUMN_INTENT_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTENT_URI
      */
     public Intent getIntent() throws URISyntaxException {
         String uri = mValues.getAsString(PreviewPrograms.COLUMN_INTENT_URI);
@@ -196,7 +197,7 @@
 
     /**
      * @return Whether the program is transient or not.
-     * @see PreviewPrograms#COLUMN_TRANSIENT
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_TRANSIENT
      */
     public boolean isTransient() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_TRANSIENT);
@@ -205,7 +206,7 @@
 
     /**
      * @return The type of the program.
-     * @see PreviewPrograms#COLUMN_TYPE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_TYPE
      */
     public @Type int getType() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_TYPE);
@@ -214,8 +215,8 @@
 
     /**
      * @return The poster art aspect ratio for the program.
-     * @see PreviewPrograms#COLUMN_POSTER_ART_ASPECT_RATIO
-     * @see PreviewPrograms#COLUMN_POSTER_ART_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_POSTER_ART_ASPECT_RATIO
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_POSTER_ART_URI
      */
     public @AspectRatio int getPosterArtAspectRatio() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_POSTER_ART_ASPECT_RATIO);
@@ -224,8 +225,8 @@
 
     /**
      * @return The thumbnail aspect ratio for the program.
-     * @see PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
-     * @see PreviewPrograms#COLUMN_THUMBNAIL_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_THUMBNAIL_URI
      */
     public @AspectRatio int getThumbnailAspectRatio() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_THUMBNAIL_ASPECT_RATIO);
@@ -234,7 +235,7 @@
 
     /**
      * @return The logo URI for the program.
-     * @see PreviewPrograms#COLUMN_LOGO_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_LOGO_URI
      */
     public Uri getLogoUri() {
         String uri = mValues.getAsString(PreviewPrograms.COLUMN_LOGO_URI);
@@ -243,7 +244,7 @@
 
     /**
      * @return The availability of the program.
-     * @see PreviewPrograms#COLUMN_AVAILABILITY
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_AVAILABILITY
      */
     public @Availability int getAvailability() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_AVAILABILITY);
@@ -252,7 +253,7 @@
 
     /**
      * @return The starting price of the program.
-     * @see PreviewPrograms#COLUMN_STARTING_PRICE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_STARTING_PRICE
      */
     public String getStartingPrice() {
         return mValues.getAsString(PreviewPrograms.COLUMN_STARTING_PRICE);
@@ -260,7 +261,7 @@
 
     /**
      * @return The offer price of the program.
-     * @see PreviewPrograms#COLUMN_OFFER_PRICE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_OFFER_PRICE
      */
     public String getOfferPrice() {
         return mValues.getAsString(PreviewPrograms.COLUMN_OFFER_PRICE);
@@ -268,7 +269,7 @@
 
     /**
      * @return The release date of the program.
-     * @see PreviewPrograms#COLUMN_RELEASE_DATE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_RELEASE_DATE
      */
     public String getReleaseDate() {
         return mValues.getAsString(PreviewPrograms.COLUMN_RELEASE_DATE);
@@ -276,7 +277,7 @@
 
     /**
      * @return The item count for the program.
-     * @see PreviewPrograms#COLUMN_ITEM_COUNT
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_ITEM_COUNT
      */
     public int getItemCount() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_ITEM_COUNT);
@@ -285,7 +286,7 @@
 
     /**
      * @return Whether the program is live or not.
-     * @see PreviewPrograms#COLUMN_LIVE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_LIVE
      */
     public boolean isLive() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_LIVE);
@@ -294,7 +295,7 @@
 
     /**
      * @return The interaction type for the program.
-     * @see PreviewPrograms#COLUMN_INTERACTION_TYPE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTERACTION_TYPE
      */
     public @InteractionType int getInteractionType() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_INTERACTION_TYPE);
@@ -303,7 +304,7 @@
 
     /**
      * @return The interaction count for the program.
-     * @see PreviewPrograms#COLUMN_INTERACTION_COUNT
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTERACTION_COUNT
      */
     public long getInteractionCount() {
         Long l = mValues.getAsLong(PreviewPrograms.COLUMN_INTERACTION_COUNT);
@@ -312,7 +313,7 @@
 
     /**
      * @return The author for the program.
-     * @see PreviewPrograms#COLUMN_AUTHOR
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_AUTHOR
      */
     public String getAuthor() {
         return mValues.getAsString(PreviewPrograms.COLUMN_AUTHOR);
@@ -320,7 +321,7 @@
 
     /**
      * @return Whether the program is browsable or not.
-     * @see PreviewPrograms#COLUMN_BROWSABLE;
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_BROWSABLE
      */
     public boolean isBrowsable() {
         Integer i = mValues.getAsInteger(PreviewPrograms.COLUMN_BROWSABLE);
@@ -329,7 +330,7 @@
 
     /**
      * @return The content ID for the program.
-     * @see PreviewPrograms#COLUMN_CONTENT_ID
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_CONTENT_ID
      */
     public String getContentId() {
         return mValues.getAsString(PreviewPrograms.COLUMN_CONTENT_ID);
@@ -337,8 +338,9 @@
 
     /**
      * @return The logo content description for the program.
-     * @see PreviewPrograms#COLUMN_LOGO_CONTENT_DESCRIPTION
-     * @see PreviewPrograms#COLUMN_LOGO_URI
+     * @see android.support.media.tv.TvContractCompat
+     * .PreviewPrograms#COLUMN_LOGO_CONTENT_DESCRIPTION
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_LOGO_URI
      */
     public String getLogoContentDescription() {
         return mValues.getAsString(PreviewPrograms.COLUMN_LOGO_CONTENT_DESCRIPTION);
@@ -346,7 +348,7 @@
 
     /**
      * @return The genre for the program.
-     * @see PreviewPrograms#COLUMN_GENRE
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_GENRE
      */
     public String getGenre() {
         return mValues.getAsString(PreviewPrograms.COLUMN_GENRE);
@@ -354,7 +356,7 @@
 
     /**
      * @return The start time for the program.
-     * @see PreviewPrograms#COLUMN_START_TIME_UTC_MILLIS
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_START_TIME_UTC_MILLIS
      */
     public long getStartTimeUtcMillis() {
         Long l = mValues.getAsLong(PreviewPrograms.COLUMN_START_TIME_UTC_MILLIS);
@@ -363,7 +365,7 @@
 
     /**
      * @return The end time for the program.
-     * @see PreviewPrograms#COLUMN_END_TIME_UTC_MILLIS
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_END_TIME_UTC_MILLIS
      */
     public long getEndTimeUtcMillis() {
         Long l = mValues.getAsLong(PreviewPrograms.COLUMN_END_TIME_UTC_MILLIS);
@@ -372,7 +374,7 @@
 
     /**
      * @return The preview audio URI for the program.
-     * @see PreviewPrograms#COLUMN_PREVIEW_AUDIO_URI
+     * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_PREVIEW_AUDIO_URI
      */
     public Uri getPreviewAudioUri() {
         String uri = mValues.getAsString(PreviewPrograms.COLUMN_PREVIEW_AUDIO_URI);
@@ -628,7 +630,8 @@
          *
          * @param externalId The internal provider ID for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
+         * @see android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#COLUMN_INTERNAL_PROVIDER_ID
          */
         public T setInternalProviderId(String externalId) {
             mValues.put(PreviewPrograms.COLUMN_INTERNAL_PROVIDER_ID, externalId);
@@ -640,7 +643,7 @@
          *
          * @param previewVideoUri The preview video URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_PREVIEW_VIDEO_URI
          */
         public T setPreviewVideoUri(Uri previewVideoUri) {
             mValues.put(PreviewPrograms.COLUMN_PREVIEW_VIDEO_URI,
@@ -653,7 +656,8 @@
          *
          * @param position The last playback posirion for the program in millis.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
+         * @see android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#COLUMN_LAST_PLAYBACK_POSITION_MILLIS
          */
         public T setLastPlaybackPositionMillis(int position) {
             mValues.put(PreviewPrograms.COLUMN_LAST_PLAYBACK_POSITION_MILLIS, position);
@@ -665,7 +669,7 @@
          *
          * @param duration The duration the program in millis.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_DURATION_MILLIS
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_DURATION_MILLIS
          */
         public T setDurationMillis(int duration) {
             mValues.put(PreviewPrograms.COLUMN_DURATION_MILLIS, duration);
@@ -677,7 +681,7 @@
          *
          * @param intentUri The intent URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_INTENT_URI
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTENT_URI
          */
         public T setIntentUri(Uri intentUri) {
             mValues.put(PreviewPrograms.COLUMN_INTENT_URI,
@@ -700,7 +704,7 @@
          *
          * @param transientValue Whether the program is transient or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_TRANSIENT
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_TRANSIENT
          */
         public T setTransient(boolean transientValue) {
             mValues.put(PreviewPrograms.COLUMN_TRANSIENT, transientValue ? IS_TRANSIENT : 0);
@@ -711,23 +715,23 @@
          * Sets the type of this program content.
          *
          * <p>The value should match one of the followings:
-         * {@link PreviewPrograms#TYPE_MOVIE},
-         * {@link PreviewPrograms#TYPE_TV_SERIES},
-         * {@link PreviewPrograms#TYPE_TV_SEASON},
-         * {@link PreviewPrograms#TYPE_TV_EPISODE},
-         * {@link PreviewPrograms#TYPE_CLIP},
-         * {@link PreviewPrograms#TYPE_EVENT},
-         * {@link PreviewPrograms#TYPE_CHANNEL},
-         * {@link PreviewPrograms#TYPE_TRACK},
-         * {@link PreviewPrograms#TYPE_ALBUM},
-         * {@link PreviewPrograms#TYPE_ARTIST},
-         * {@link PreviewPrograms#TYPE_PLAYLIST},
-         * {@link PreviewPrograms#TYPE_STATION}, and
-         * {@link PreviewPrograms#TYPE_GAME}.
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_MOVIE},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_TV_SERIES},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_TV_SEASON},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_TV_EPISODE},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_CLIP},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_EVENT},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_CHANNEL},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_TRACK},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_ALBUM},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_ARTIST},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_PLAYLIST},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_STATION}, and
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#TYPE_GAME}.
          *
          * @param type The type of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_TYPE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_TYPE
          */
         public T setType(@Type int type) {
             mValues.put(PreviewPrograms.COLUMN_TYPE, type);
@@ -738,17 +742,19 @@
          * Sets the aspect ratio of the poster art for this TV program.
          *
          * <p>The value should match one of the followings:
-         * {@link PreviewPrograms#ASPECT_RATIO_16_9},
-         * {@link PreviewPrograms#ASPECT_RATIO_3_2},
-         * {@link PreviewPrograms#ASPECT_RATIO_4_3},
-         * {@link PreviewPrograms#ASPECT_RATIO_1_1},
-         * {@link PreviewPrograms#ASPECT_RATIO_2_3}, and
-         * {@link PreviewPrograms#ASPECT_RATIO_MOVIE_POSTER}.
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_16_9},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_3_2},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_4_3},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_1_1},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_2_3}, and
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#ASPECT_RATIO_MOVIE_POSTER}.
          *
          * @param ratio The poster art aspect ratio for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_POSTER_ART_ASPECT_RATIO
-         * @see PreviewPrograms#COLUMN_POSTER_ART_URI
+         * @see android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#COLUMN_POSTER_ART_ASPECT_RATIO
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_POSTER_ART_URI
          */
         public T setPosterArtAspectRatio(@AspectRatio int ratio) {
             mValues.put(PreviewPrograms.COLUMN_POSTER_ART_ASPECT_RATIO, ratio);
@@ -759,16 +765,18 @@
          * Sets the aspect ratio of the thumbnail for this TV program.
          *
          * <p>The value should match one of the followings:
-         * {@link PreviewPrograms#ASPECT_RATIO_16_9},
-         * {@link PreviewPrograms#ASPECT_RATIO_3_2},
-         * {@link PreviewPrograms#ASPECT_RATIO_4_3},
-         * {@link PreviewPrograms#ASPECT_RATIO_1_1},
-         * {@link PreviewPrograms#ASPECT_RATIO_2_3}, and
-         * {@link PreviewPrograms#ASPECT_RATIO_MOVIE_POSTER}.
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_16_9},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_3_2},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_4_3},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_1_1},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#ASPECT_RATIO_2_3}, and
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#ASPECT_RATIO_MOVIE_POSTER}.
          *
          * @param ratio The thumbnail aspect ratio of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
+         * @see android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#COLUMN_THUMBNAIL_ASPECT_RATIO
          */
         public T setThumbnailAspectRatio(@AspectRatio int ratio) {
             mValues.put(PreviewPrograms.COLUMN_THUMBNAIL_ASPECT_RATIO, ratio);
@@ -780,7 +788,7 @@
          *
          * @param logoUri The logo URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_LOGO_URI
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_LOGO_URI
          */
         public T setLogoUri(Uri logoUri) {
             mValues.put(PreviewPrograms.COLUMN_LOGO_URI,
@@ -792,15 +800,20 @@
          * Sets the availability of this TV program.
          *
          * <p>The value should match one of the followings:
-         * {@link PreviewPrograms#AVAILABILITY_AVAILABLE},
-         * {@link PreviewPrograms#AVAILABILITY_FREE_WITH_SUBSCRIPTION},
-         * {@link PreviewPrograms#AVAILABILITY_PAID_CONTENT},
-         * {@link PreviewPrograms#AVAILABILITY_PURCHASED}, and
-         * {@link PreviewPrograms#AVAILABILITY_FREE}.
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#AVAILABILITY_AVAILABLE},
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#AVAILABILITY_FREE_WITH_SUBSCRIPTION},
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#AVAILABILITY_PAID_CONTENT},
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#AVAILABILITY_PURCHASED}, and
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#AVAILABILITY_FREE}.
          *
          * @param availability The availability of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_AVAILABILITY
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_AVAILABILITY
          */
         public T setAvailability(@Availability int availability) {
             mValues.put(PreviewPrograms.COLUMN_AVAILABILITY, availability);
@@ -812,7 +825,7 @@
          *
          * @param price The starting price of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_STARTING_PRICE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_STARTING_PRICE
          */
         public T setStartingPrice(String price) {
             mValues.put(PreviewPrograms.COLUMN_STARTING_PRICE, price);
@@ -824,7 +837,7 @@
          *
          * @param price The offer price of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_OFFER_PRICE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_OFFER_PRICE
          */
         public T setOfferPrice(String price) {
             mValues.put(PreviewPrograms.COLUMN_OFFER_PRICE, price);
@@ -839,7 +852,7 @@
          *
          * @param releaseDate The release date of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_RELEASE_DATE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_RELEASE_DATE
          */
         public T setReleaseDate(String releaseDate) {
             mValues.put(PreviewPrograms.COLUMN_RELEASE_DATE, releaseDate);
@@ -851,7 +864,7 @@
          *
          * @param releaseDate The release date of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_RELEASE_DATE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_RELEASE_DATE
          */
         public T setReleaseDate(Date releaseDate) {
             mValues.put(PreviewPrograms.COLUMN_RELEASE_DATE, sFormat.format(releaseDate));
@@ -863,7 +876,7 @@
          *
          * @param itemCount The item count for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_ITEM_COUNT
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_ITEM_COUNT
          */
         public T setItemCount(int itemCount) {
             mValues.put(PreviewPrograms.COLUMN_ITEM_COUNT, itemCount);
@@ -875,7 +888,7 @@
          *
          * @param live Whether the program is live or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_LIVE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_LIVE
          */
         public T setLive(boolean live) {
             mValues.put(PreviewPrograms.COLUMN_LIVE, live ? IS_LIVE : 0);
@@ -886,17 +899,22 @@
          * Sets the type of interaction for this TV program.
          *
          * <p> The value should match one of the followings:
-         * {@link PreviewPrograms#INTERACTION_TYPE_LISTENS},
-         * {@link PreviewPrograms#INTERACTION_TYPE_FOLLOWERS},
-         * {@link PreviewPrograms#INTERACTION_TYPE_FANS},
-         * {@link PreviewPrograms#INTERACTION_TYPE_LIKES},
-         * {@link PreviewPrograms#INTERACTION_TYPE_THUMBS},
-         * {@link PreviewPrograms#INTERACTION_TYPE_VIEWS}, and
-         * {@link PreviewPrograms#INTERACTION_TYPE_VIEWERS}.
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#INTERACTION_TYPE_LISTENS},
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#INTERACTION_TYPE_FOLLOWERS},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#INTERACTION_TYPE_FANS},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#INTERACTION_TYPE_LIKES},
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#INTERACTION_TYPE_THUMBS},
+         * {@link android.support.media.tv.TvContractCompat.PreviewPrograms#INTERACTION_TYPE_VIEWS},
+         * and
+         * {@link android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#INTERACTION_TYPE_VIEWERS}.
          *
          * @param interactionType The interaction type of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_INTERACTION_TYPE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTERACTION_TYPE
          */
         public T setInteractionType(@InteractionType int interactionType) {
             mValues.put(PreviewPrograms.COLUMN_INTERACTION_TYPE, interactionType);
@@ -908,7 +926,7 @@
          *
          * @param interactionCount The interaction count for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_INTERACTION_COUNT
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_INTERACTION_COUNT
          */
         public T setInteractionCount(long interactionCount) {
             mValues.put(PreviewPrograms.COLUMN_INTERACTION_COUNT, interactionCount);
@@ -920,7 +938,7 @@
          *
          * @param author The author of the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_AUTHOR
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_AUTHOR
          */
         public T setAuthor(String author) {
             mValues.put(PreviewPrograms.COLUMN_AUTHOR, author);
@@ -932,7 +950,7 @@
          *
          * @param browsable Whether the program is browsable or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_BROWSABLE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_BROWSABLE
          * @hide
          */
         @RestrictTo(LIBRARY_GROUP)
@@ -946,7 +964,7 @@
          *
          * @param contentId The content ID for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_CONTENT_ID
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_CONTENT_ID
          */
         public T setContentId(String contentId) {
             mValues.put(PreviewPrograms.COLUMN_CONTENT_ID, contentId);
@@ -959,8 +977,9 @@
          * @param logoContentDescription The content description for the logo displayed in the
          *                               program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_LOGO_CONTENT_DESCRIPTION
-         * @see PreviewPrograms#COLUMN_LOGO_URI
+         * @see android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#COLUMN_LOGO_CONTENT_DESCRIPTION
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_LOGO_URI
          */
         public T setLogoContentDescription(String logoContentDescription) {
             mValues.put(PreviewPrograms.COLUMN_LOGO_CONTENT_DESCRIPTION, logoContentDescription);
@@ -972,7 +991,7 @@
          *
          * @param genre The genre for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_GENRE
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_GENRE
          */
         public T setGenre(String genre) {
             mValues.put(PreviewPrograms.COLUMN_GENRE, genre);
@@ -984,7 +1003,8 @@
          *
          * @param startTime The start time for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_START_TIME_UTC_MILLIS
+         * @see android.support.media.tv.TvContractCompat
+         * .PreviewPrograms#COLUMN_START_TIME_UTC_MILLIS
          */
         public T setStartTimeUtcMillis(long startTime) {
             mValues.put(PreviewPrograms.COLUMN_START_TIME_UTC_MILLIS, startTime);
@@ -996,7 +1016,7 @@
          *
          * @param endTime The end time for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_END_TIME_UTC_MILLIS
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_END_TIME_UTC_MILLIS
          */
         public T setEndTimeUtcMillis(long endTime) {
             mValues.put(PreviewPrograms.COLUMN_END_TIME_UTC_MILLIS, endTime);
@@ -1008,7 +1028,7 @@
          *
          * @param previewAudioUri The preview audio URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see PreviewPrograms#COLUMN_PREVIEW_AUDIO_URI
+         * @see android.support.media.tv.TvContractCompat.PreviewPrograms#COLUMN_PREVIEW_AUDIO_URI
          */
         public T setPreviewAudioUri(Uri previewAudioUri) {
             mValues.put(PreviewPrograms.COLUMN_PREVIEW_AUDIO_URI,
diff --git a/tv-provider/src/main/java/android/support/media/tv/BaseProgram.java b/tv-provider/src/main/java/android/support/media/tv/BaseProgram.java
index 4c7882d..13425ac 100644
--- a/tv-provider/src/main/java/android/support/media/tv/BaseProgram.java
+++ b/tv-provider/src/main/java/android/support/media/tv/BaseProgram.java
@@ -77,7 +77,7 @@
 
     /**
      * @return The ID for the program.
-     * @see BaseTvColumns#_ID
+     * @see android.support.media.tv.TvContractCompat.BaseTvColumns#_ID
      */
     public long getId() {
         Long l = mValues.getAsLong(BaseTvColumns._ID);
@@ -86,7 +86,7 @@
 
     /**
      * @return The package name for the program.
-     * @see BaseTvColumns#COLUMN_PACKAGE_NAME
+     * @see android.support.media.tv.TvContractCompat.BaseTvColumns#COLUMN_PACKAGE_NAME
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP)
@@ -96,7 +96,7 @@
 
     /**
      * @return The title for the program.
-     * @see Programs#COLUMN_TITLE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_TITLE
      */
     public String getTitle() {
         return mValues.getAsString(Programs.COLUMN_TITLE);
@@ -104,7 +104,7 @@
 
     /**
      * @return The episode title for the program.
-     * @see Programs#COLUMN_EPISODE_TITLE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_TITLE
      */
     public String getEpisodeTitle() {
         return mValues.getAsString(Programs.COLUMN_EPISODE_TITLE);
@@ -112,7 +112,7 @@
 
     /**
      * @return The season display number for the program.
-     * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_DISPLAY_NUMBER
      */
     public String getSeasonNumber() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -124,7 +124,7 @@
 
     /**
      * @return The episode display number for the program.
-     * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_DISPLAY_NUMBER
      */
     public String getEpisodeNumber() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -136,7 +136,7 @@
 
     /**
      * @return The short description for the program.
-     * @see Programs#COLUMN_SHORT_DESCRIPTION
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SHORT_DESCRIPTION
      */
     public String getDescription() {
         return mValues.getAsString(Programs.COLUMN_SHORT_DESCRIPTION);
@@ -144,7 +144,7 @@
 
     /**
      * @return The long description for the program.
-     * @see Programs#COLUMN_LONG_DESCRIPTION
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_LONG_DESCRIPTION
      */
     public String getLongDescription() {
         return mValues.getAsString(Programs.COLUMN_LONG_DESCRIPTION);
@@ -152,7 +152,7 @@
 
     /**
      * @return The video width for the program.
-     * @see Programs#COLUMN_VIDEO_WIDTH
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_VIDEO_WIDTH
      */
     public int getVideoWidth() {
         Integer i = mValues.getAsInteger(Programs.COLUMN_VIDEO_WIDTH);
@@ -161,7 +161,7 @@
 
     /**
      * @return The video height for the program.
-     * @see Programs#COLUMN_VIDEO_HEIGHT
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_VIDEO_HEIGHT
      */
     public int getVideoHeight() {
         Integer i = mValues.getAsInteger(Programs.COLUMN_VIDEO_HEIGHT);
@@ -170,7 +170,7 @@
 
     /**
      * @return The canonical genre for the program.
-     * @see Programs#COLUMN_CANONICAL_GENRE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_CANONICAL_GENRE
      */
     public @Genre String[] getCanonicalGenres() {
         return Programs.Genres.decode(mValues.getAsString(Programs.COLUMN_CANONICAL_GENRE));
@@ -178,7 +178,7 @@
 
     /**
      * @return The content rating for the program.
-     * @see Programs#COLUMN_CONTENT_RATING
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_CONTENT_RATING
      */
     public TvContentRating[] getContentRatings() {
         return TvContractUtils.stringToContentRatings(mValues.getAsString(
@@ -187,7 +187,7 @@
 
     /**
      * @return The poster art URI for the program.
-     * @see Programs#COLUMN_POSTER_ART_URI
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_POSTER_ART_URI
      */
     public Uri getPosterArtUri() {
         String uri = mValues.getAsString(Programs.COLUMN_POSTER_ART_URI);
@@ -196,7 +196,7 @@
 
     /**
      * @return The thumbnail URI for the program.
-     * @see Programs#COLUMN_THUMBNAIL_URI
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_THUMBNAIL_URI
      */
     public Uri getThumbnailUri() {
         String uri = mValues.getAsString(Programs.COLUMN_POSTER_ART_URI);
@@ -205,7 +205,7 @@
 
     /**
      * @return The internal provider data for the program.
-     * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_DATA
      */
     public byte[] getInternalProviderDataByteArray() {
         return mValues.getAsByteArray(Programs.COLUMN_INTERNAL_PROVIDER_DATA);
@@ -213,7 +213,7 @@
 
     /**
      * @return The audio languages for the program.
-     * @see Programs#COLUMN_AUDIO_LANGUAGE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_AUDIO_LANGUAGE
      */
     public String[] getAudioLanguages() {
         return TvContractUtils.stringToAudioLanguages(mValues.getAsString(
@@ -222,7 +222,7 @@
 
     /**
      * @return Whether the program is searchable or not.
-     * @see Programs#COLUMN_SEARCHABLE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEARCHABLE
      */
     public boolean isSearchable() {
         Integer i = mValues.getAsInteger(Programs.COLUMN_SEARCHABLE);
@@ -231,7 +231,7 @@
 
     /**
      * @return The first internal provider flag for the program.
-     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
      */
     public Long getInternalProviderFlag1() {
         return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG1);
@@ -239,7 +239,7 @@
 
     /**
      * @return The second internal provider flag for the program.
-     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
      */
     public Long getInternalProviderFlag2() {
         return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG2);
@@ -247,7 +247,7 @@
 
     /**
      * @return The third internal provider flag for the program.
-     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
      */
     public Long getInternalProviderFlag3() {
         return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG3);
@@ -255,7 +255,7 @@
 
     /**
      * @return The forth internal provider flag for the program.
-     * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
      */
     public Long getInternalProviderFlag4() {
         return mValues.getAsLong(Programs.COLUMN_INTERNAL_PROVIDER_FLAG4);
@@ -263,7 +263,7 @@
 
     /**
      * @return The season title for the program.
-     * @see Programs#COLUMN_SEASON_TITLE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_TITLE
      */
     public String getSeasonTitle() {
         return mValues.getAsString(Programs.COLUMN_SEASON_TITLE);
@@ -271,7 +271,7 @@
 
     /**
      * @return The review rating style for the program.
-     * @see Programs#COLUMN_REVIEW_RATING_STYLE
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_REVIEW_RATING_STYLE
      */
     public @ReviewRatingStyle int getReviewRatingStyle() {
         Integer i = mValues.getAsInteger(Programs.COLUMN_REVIEW_RATING_STYLE);
@@ -280,7 +280,7 @@
 
     /**
      * @return The review rating for the program.
-     * @see Programs#COLUMN_REVIEW_RATING
+     * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_REVIEW_RATING
      */
     public String getReviewRating() {
         return mValues.getAsString(Programs.COLUMN_REVIEW_RATING);
@@ -542,7 +542,7 @@
          *
          * @param programId The ID for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see BaseTvColumns#_ID
+         * @see android.support.media.tv.TvContractCompat.BaseTvColumns#_ID
          */
         public T setId(long programId) {
             mValues.put(BaseTvColumns._ID, programId);
@@ -554,7 +554,7 @@
          *
          * @param packageName The package name for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see BaseTvColumns#COLUMN_PACKAGE_NAME
+         * @see android.support.media.tv.TvContractCompat.BaseTvColumns#COLUMN_PACKAGE_NAME
          * @hide
          */
         @RestrictTo(LIBRARY_GROUP)
@@ -568,7 +568,7 @@
          *
          * @param title The title for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_TITLE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_TITLE
          */
         public T setTitle(String title) {
             mValues.put(Programs.COLUMN_TITLE, title);
@@ -580,7 +580,7 @@
          *
          * @param episodeTitle The episode title for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_EPISODE_TITLE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_TITLE
          */
         public T setEpisodeTitle(String episodeTitle) {
             mValues.put(Programs.COLUMN_EPISODE_TITLE, episodeTitle);
@@ -592,7 +592,7 @@
          *
          * @param seasonNumber The season display number for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_DISPLAY_NUMBER
          */
         public T setSeasonNumber(int seasonNumber) {
             setSeasonNumber(String.valueOf(seasonNumber), seasonNumber);
@@ -603,11 +603,12 @@
          * Sets the season number for this episode for a series.
          *
          * @param seasonNumber The season display number for the program.
-         * @param numericalSeasonNumber An integer value for {@link Programs#COLUMN_SEASON_NUMBER}
-         *                              which will be used for API Level 23 and below.
+         * @param numericalSeasonNumber An integer value for
+         * {@link android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_NUMBER}
+         * which will be used for API Level 23 and below.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_SEASON_DISPLAY_NUMBER
-         * @see Programs#COLUMN_SEASON_NUMBER
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_DISPLAY_NUMBER
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_NUMBER
          */
         public T setSeasonNumber(String seasonNumber, int numericalSeasonNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -623,7 +624,7 @@
          *
          * @param episodeNumber The value of episode display number for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_DISPLAY_NUMBER
          */
         public T setEpisodeNumber(int episodeNumber) {
             setEpisodeNumber(String.valueOf(episodeNumber), episodeNumber);
@@ -634,11 +635,12 @@
          * Sets the episode number in a season for this episode for a series.
          *
          * @param episodeNumber The value of episode display number for the program.
-         * @param numericalEpisodeNumber An integer value for {@link Programs#COLUMN_EPISODE_NUMBER}
-         *                               which will be used for API Level 23 and below.
+         * @param numericalEpisodeNumber An integer value for
+         * {@link android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_NUMBER}
+         * which will be used for API Level 23 and below.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_EPISODE_DISPLAY_NUMBER
-         * @see Programs#COLUMN_EPISODE_NUMBER
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_DISPLAY_NUMBER
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_EPISODE_NUMBER
          */
         public T setEpisodeNumber(String episodeNumber, int numericalEpisodeNumber) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -655,7 +657,7 @@
          *
          * @param description The short description for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_SHORT_DESCRIPTION
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SHORT_DESCRIPTION
          */
         public T setDescription(String description) {
             mValues.put(Programs.COLUMN_SHORT_DESCRIPTION, description);
@@ -667,7 +669,7 @@
          *
          * @param longDescription The long description for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_LONG_DESCRIPTION
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_LONG_DESCRIPTION
          */
         public T setLongDescription(String longDescription) {
             mValues.put(Programs.COLUMN_LONG_DESCRIPTION, longDescription);
@@ -679,7 +681,7 @@
          *
          * @param width The video width for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_VIDEO_WIDTH
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_VIDEO_WIDTH
          */
         public T setVideoWidth(int width) {
             mValues.put(Programs.COLUMN_VIDEO_WIDTH, width);
@@ -691,7 +693,7 @@
          *
          * @param height The video height for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_VIDEO_HEIGHT
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_VIDEO_HEIGHT
          */
         public T setVideoHeight(int height) {
             mValues.put(Programs.COLUMN_VIDEO_HEIGHT, height);
@@ -701,10 +703,11 @@
         /**
          * Sets the content ratings for this program.
          *
-         * @param contentRatings An array of {@link TvContentRating} that apply to this program
-         *                       which will be flattened to a String to store in a database.
+         * @param contentRatings An array of {@link android.media.tv.TvContentRating} that apply to
+         *                       this program  which will be flattened to a String to store in
+         *                       a database.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_CONTENT_RATING
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_CONTENT_RATING
          */
         public T setContentRatings(TvContentRating[] contentRatings) {
             mValues.put(Programs.COLUMN_CONTENT_RATING,
@@ -717,7 +720,7 @@
          *
          * @param posterArtUri The poster art URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_POSTER_ART_URI
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_POSTER_ART_URI
          */
         public T setPosterArtUri(Uri posterArtUri) {
             mValues.put(Programs.COLUMN_POSTER_ART_URI,
@@ -730,7 +733,7 @@
          *
          * @param thumbnailUri The thumbnail URI for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_THUMBNAIL_URI
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_THUMBNAIL_URI
          */
         public T setThumbnailUri(Uri thumbnailUri) {
             mValues.put(Programs.COLUMN_THUMBNAIL_URI,
@@ -741,10 +744,11 @@
         /**
          * Sets the genres of the program.
          *
-         * @param genres An array of {@link Programs.Genres} that apply to the program which will be
-         *               flattened to a String to store in a database.
+         * @param genres An array of
+         * {@link android.support.media.tv.TvContractCompat.Programs.Genres}
+         * that apply to the program which will be flattened to a String to store in a database.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_CANONICAL_GENRE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_CANONICAL_GENRE
          */
         public T setCanonicalGenres(@Genre String[] genres) {
             mValues.put(Programs.COLUMN_CANONICAL_GENRE, Programs.Genres.encode(genres));
@@ -756,7 +760,7 @@
          *
          * @param data The internal provider data for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_DATA
          */
         public T setInternalProviderData(byte[] data) {
             mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_DATA, data);
@@ -781,7 +785,7 @@
          *
          * @param searchable Whether the program is searchable or not.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_SEARCHABLE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEARCHABLE
          */
         public T setSearchable(boolean searchable) {
             mValues.put(Programs.COLUMN_SEARCHABLE, searchable ? IS_SEARCHABLE : 0);
@@ -793,7 +797,7 @@
          *
          * @param flag The first internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
          */
         public T setInternalProviderFlag1(long flag) {
             mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG1, flag);
@@ -805,7 +809,7 @@
          *
          * @param flag The second internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
          */
         public T setInternalProviderFlag2(long flag) {
             mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG2, flag);
@@ -817,7 +821,7 @@
          *
          * @param flag The third internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
          */
         public T setInternalProviderFlag3(long flag) {
             mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG3, flag);
@@ -829,7 +833,7 @@
          *
          * @param flag The forth internal provider flag for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
          */
         public T setInternalProviderFlag4(long flag) {
             mValues.put(ProgramColumns.COLUMN_INTERNAL_PROVIDER_FLAG4, flag);
@@ -842,10 +846,11 @@
          * @param reviewRatingStyle The reviewing rating style for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
          *
-         * @see Programs#COLUMN_REVIEW_RATING_STYLE
-         * @see Programs#REVIEW_RATING_STYLE_STARS
-         * @see Programs#REVIEW_RATING_STYLE_THUMBS_UP_DOWN
-         * @see Programs#REVIEW_RATING_STYLE_PERCENTAGE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_REVIEW_RATING_STYLE
+         * @see android.support.media.tv.TvContractCompat.Programs#REVIEW_RATING_STYLE_STARS
+         * @see android.support.media.tv.TvContractCompat
+         * .Programs#REVIEW_RATING_STYLE_THUMBS_UP_DOWN
+         * @see android.support.media.tv.TvContractCompat.Programs#REVIEW_RATING_STYLE_PERCENTAGE
          */
         public T setReviewRatingStyle(@ReviewRatingStyle int reviewRatingStyle) {
             mValues.put(ProgramColumns.COLUMN_REVIEW_RATING_STYLE, reviewRatingStyle);
@@ -865,11 +870,12 @@
          * @param reviewRating The value of the review rating for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
          *
-         * @see Programs#COLUMN_REVIEW_RATING
-         * @see Programs#COLUMN_REVIEW_RATING_STYLE
-         * @see Programs#REVIEW_RATING_STYLE_STARS
-         * @see Programs#REVIEW_RATING_STYLE_THUMBS_UP_DOWN
-         * @see Programs#REVIEW_RATING_STYLE_PERCENTAGE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_REVIEW_RATING
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_REVIEW_RATING_STYLE
+         * @see android.support.media.tv.TvContractCompat.Programs#REVIEW_RATING_STYLE_STARS
+         * @see android.support.media.tv.TvContractCompat
+         * .Programs#REVIEW_RATING_STYLE_THUMBS_UP_DOWN
+         * @see android.support.media.tv.TvContractCompat.Programs#REVIEW_RATING_STYLE_PERCENTAGE
          */
         public T setReviewRating(String reviewRating) {
             mValues.put(ProgramColumns.COLUMN_REVIEW_RATING, reviewRating);
@@ -881,7 +887,7 @@
          *
          * @param seasonTitle The season title for the program.
          * @return This Builder object to allow for chaining of calls to builder methods.
-         * @see Programs#COLUMN_SEASON_TITLE
+         * @see android.support.media.tv.TvContractCompat.Programs#COLUMN_SEASON_TITLE
          */
         public T setSeasonTitle(String seasonTitle) {
             mValues.put(ProgramColumns.COLUMN_SEASON_TITLE, seasonTitle);
diff --git a/tv-provider/src/main/java/android/support/media/tv/PreviewProgram.java b/tv-provider/src/main/java/android/support/media/tv/PreviewProgram.java
index 6d2fbaf..2536f75 100644
--- a/tv-provider/src/main/java/android/support/media/tv/PreviewProgram.java
+++ b/tv-provider/src/main/java/android/support/media/tv/PreviewProgram.java
@@ -19,12 +19,9 @@
 
 import android.content.ContentValues;
 import android.database.Cursor;
-import android.media.tv.TvContentRating;  // For javadoc gen of super class
 import android.os.Build;
 import android.support.annotation.RestrictTo;
 import android.support.media.tv.TvContractCompat.PreviewPrograms;
-import android.support.media.tv.TvContractCompat.Programs;  // For javadoc gen of super class
-import android.support.media.tv.TvContractCompat.Programs.Genres;  // For javadoc gen of super class
 
 /**
  * A convenience class to access {@link PreviewPrograms} entries in the system content
diff --git a/tv-provider/src/main/java/android/support/media/tv/Program.java b/tv-provider/src/main/java/android/support/media/tv/Program.java
index 882916d..d4de834 100644
--- a/tv-provider/src/main/java/android/support/media/tv/Program.java
+++ b/tv-provider/src/main/java/android/support/media/tv/Program.java
@@ -19,7 +19,6 @@
 
 import android.content.ContentValues;
 import android.database.Cursor;
-import android.media.tv.TvContentRating;  // For javadoc gen of super class
 import android.os.Build;
 import android.support.annotation.NonNull;
 import android.support.annotation.RestrictTo;
diff --git a/tv-provider/src/main/java/android/support/media/tv/WatchNextProgram.java b/tv-provider/src/main/java/android/support/media/tv/WatchNextProgram.java
index 61082aa..e5d12b2 100644
--- a/tv-provider/src/main/java/android/support/media/tv/WatchNextProgram.java
+++ b/tv-provider/src/main/java/android/support/media/tv/WatchNextProgram.java
@@ -19,13 +19,9 @@
 
 import android.content.ContentValues;
 import android.database.Cursor;
-import android.media.tv.TvContentRating;  // For javadoc gen of super class
 import android.os.Build;
 import android.support.annotation.IntDef;
 import android.support.annotation.RestrictTo;
-import android.support.media.tv.TvContractCompat.PreviewPrograms;  // For javadoc gen of super class
-import android.support.media.tv.TvContractCompat.Programs;  // For javadoc gen of super class
-import android.support.media.tv.TvContractCompat.Programs.Genres;  // For javadoc gen of super class
 import android.support.media.tv.TvContractCompat.WatchNextPrograms;
 
 import java.lang.annotation.Retention;
diff --git a/v7/cardview/src/main/java/android/support/v7/widget/CardView.java b/v7/cardview/src/main/java/android/support/v7/widget/CardView.java
index a45ee98..d8511e9 100644
--- a/v7/cardview/src/main/java/android/support/v7/widget/CardView.java
+++ b/v7/cardview/src/main/java/android/support/v7/widget/CardView.java
@@ -26,6 +26,7 @@
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.Px;
 import android.support.v7.cardview.R;
 import android.util.AttributeSet;
 import android.view.View;
@@ -220,7 +221,7 @@
      * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingRight
      * @attr ref android.support.v7.cardview.R.styleable#CardView_contentPaddingBottom
      */
-    public void setContentPadding(int left, int top, int right, int bottom) {
+    public void setContentPadding(@Px int left, @Px int top, @Px int right, @Px int bottom) {
         mContentPadding.set(left, top, right, bottom);
         IMPL.updatePadding(mCardViewDelegate);
     }
@@ -306,6 +307,7 @@
      *
      * @return the inner padding after the Card's left edge
      */
+    @Px
     public int getContentPaddingLeft() {
         return mContentPadding.left;
     }
@@ -315,6 +317,7 @@
      *
      * @return the inner padding before the Card's right edge
      */
+    @Px
     public int getContentPaddingRight() {
         return mContentPadding.right;
     }
@@ -324,6 +327,7 @@
      *
      * @return the inner padding after the Card's top edge
      */
+    @Px
     public int getContentPaddingTop() {
         return mContentPadding.top;
     }
@@ -333,6 +337,7 @@
      *
      * @return the inner padding before the Card's bottom edge
      */
+    @Px
     public int getContentPaddingBottom() {
         return mContentPadding.bottom;
     }
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
index e716fb5..6e816bf 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
@@ -23,6 +23,7 @@
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.Px;
 import android.support.v4.graphics.ColorUtils;
 import android.support.v4.util.ArrayMap;
 import android.util.Log;
@@ -731,7 +732,7 @@
          * @param bottom The bottom of the rectangle used for the region.
          */
         @NonNull
-        public Builder setRegion(int left, int top, int right, int bottom) {
+        public Builder setRegion(@Px int left, @Px int top, @Px int right, @Px int bottom) {
             if (mBitmap != null) {
                 if (mRegion == null) mRegion = new Rect();
                 // Set the Rect to be initially the whole Bitmap
diff --git a/viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java b/viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
deleted file mode 100644
index 5f9ce85..0000000
--- a/viewpager/src/androidTest/java/android/support/v4/BaseInstrumentationTestCase.java
+++ /dev/null
@@ -1,33 +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.
- */
-
-package android.support.v4;
-
-import android.app.Activity;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Rule;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public abstract class BaseInstrumentationTestCase<A extends Activity> {
-    @Rule
-    public final ActivityTestRule<A> mActivityTestRule;
-
-    protected BaseInstrumentationTestCase(Class<A> activityClass) {
-        mActivityTestRule = new ActivityTestRule<A>(activityClass);
-    }
-}
diff --git a/viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java b/viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java
deleted file mode 100755
index e0682ce..0000000
--- a/viewpager/src/androidTest/java/android/support/v4/BaseTestActivity.java
+++ /dev/null
@@ -1,39 +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.
- */
-
-package android.support.v4;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.WindowManager;
-
-public abstract class BaseTestActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        final int contentView = getContentViewLayoutResId();
-        if (contentView > 0) {
-            setContentView(contentView);
-        }
-        onContentViewSet();
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-    }
-
-    protected abstract int getContentViewLayoutResId();
-
-    protected void onContentViewSet() {}
-}
diff --git a/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java b/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
index 7803ea2..7af8029 100644
--- a/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
+++ b/viewpager/src/androidTest/java/android/support/v4/view/BaseViewPagerTest.java
@@ -61,14 +61,14 @@
 
 import android.app.Activity;
 import android.graphics.Color;
-import android.support.viewpager.test.R;
 import android.support.test.espresso.ViewAction;
 import android.support.test.espresso.action.EspressoKey;
 import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
-import android.support.v4.BaseInstrumentationTestCase;
+import android.support.test.rule.ActivityTestRule;
 import android.support.v4.testutils.TestUtilsMatchers;
+import android.support.viewpager.test.R;
 import android.text.TextUtils;
 import android.util.Pair;
 import android.view.KeyEvent;
@@ -81,6 +81,7 @@
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
@@ -95,7 +96,10 @@
  * Testing logic that does depend on the specific pager title implementation is pushed into the
  * extending classes in <code>assertStripInteraction()</code> method.
  */
-public abstract class BaseViewPagerTest<T extends Activity> extends BaseInstrumentationTestCase<T> {
+public abstract class BaseViewPagerTest<T extends Activity> {
+    @Rule
+    public final ActivityTestRule<T> mActivityTestRule;
+
     private static final int DIRECTION_LEFT = -1;
     private static final int DIRECTION_RIGHT = 1;
     protected ViewPager mViewPager;
@@ -247,7 +251,7 @@
     }
 
     public BaseViewPagerTest(Class<T> activityClass) {
-        super(activityClass);
+        mActivityTestRule = new ActivityTestRule<T>(activityClass);
     }
 
     @Before
diff --git a/viewpager/src/main/java/android/support/v4/view/ViewPager.java b/viewpager/src/main/java/android/support/v4/view/ViewPager.java
index 350fe95..b0d469e 100644
--- a/viewpager/src/main/java/android/support/v4/view/ViewPager.java
+++ b/viewpager/src/main/java/android/support/v4/view/ViewPager.java
@@ -31,6 +31,7 @@
 import android.support.annotation.DrawableRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.Px;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.view.accessibility.AccessibilityEventCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
@@ -284,7 +285,7 @@
          * @param positionOffset Value from [0, 1) indicating the offset from the page at position.
          * @param positionOffsetPixels Value in pixels indicating the offset from position.
          */
-        void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
+        void onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels);
 
         /**
          * This method will be invoked when a new page becomes selected. Animation is not
diff --git a/wear/res/values-af/strings.xml b/wear/res/values-af/strings.xml
new file mode 100644
index 0000000..6bc9a46
--- /dev/null
+++ b/wear/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigasielaai"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Handelinglaai"</string>
+</resources>
diff --git a/wear/res/values-am/strings.xml b/wear/res/values-am/strings.xml
new file mode 100644
index 0000000..3918be4
--- /dev/null
+++ b/wear/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"የአሰሳ መሳቢያ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"የእርምጃ መሳቢያ"</string>
+</resources>
diff --git a/wear/res/values-ar/strings.xml b/wear/res/values-ar/strings.xml
new file mode 100644
index 0000000..89f8f10
--- /dev/null
+++ b/wear/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"لائحة التنقل"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"دُرج الإجراءات"</string>
+</resources>
diff --git a/wear/res/values-az/strings.xml b/wear/res/values-az/strings.xml
new file mode 100644
index 0000000..25d3c3b
--- /dev/null
+++ b/wear/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Naviqasiya qutusu"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Əməliyyat qutusu"</string>
+</resources>
diff --git a/wear/res/values-b+sr+Latn/strings.xml b/wear/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..b3c2c22
--- /dev/null
+++ b/wear/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Fioka za navigaciju"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Fioka za radnju"</string>
+</resources>
diff --git a/wear/res/values-be/strings.xml b/wear/res/values-be/strings.xml
new file mode 100644
index 0000000..ee3c17c
--- /dev/null
+++ b/wear/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Высоўнае меню навігацыі"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Высоўнае меню дзеянняў"</string>
+</resources>
diff --git a/wear/res/values-bg/strings.xml b/wear/res/values-bg/strings.xml
new file mode 100644
index 0000000..0ed041b
--- /dev/null
+++ b/wear/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Слой за навигация"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Слой за действия"</string>
+</resources>
diff --git a/wear/res/values-bn/strings.xml b/wear/res/values-bn/strings.xml
new file mode 100644
index 0000000..48bea20
--- /dev/null
+++ b/wear/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"নেভিগেশন ড্রয়ার"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"অ্যাকশন ড্রয়ার"</string>
+</resources>
diff --git a/wear/res/values-bs/strings.xml b/wear/res/values-bs/strings.xml
new file mode 100644
index 0000000..82c990c
--- /dev/null
+++ b/wear/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panel za navigaciju"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panel za radnju"</string>
+</resources>
diff --git a/wear/res/values-ca/strings.xml b/wear/res/values-ca/strings.xml
new file mode 100644
index 0000000..e11bd6f
--- /dev/null
+++ b/wear/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Tauler de navegació"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Tauler d\'accions"</string>
+</resources>
diff --git a/wear/res/values-cs/strings.xml b/wear/res/values-cs/strings.xml
new file mode 100644
index 0000000..01a6c72
--- /dev/null
+++ b/wear/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Vysouvací panel navigace"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Vysouvací panel akcí"</string>
+</resources>
diff --git a/wear/res/values-da/strings.xml b/wear/res/values-da/strings.xml
new file mode 100644
index 0000000..ddafa9e
--- /dev/null
+++ b/wear/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Sidemenu"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Handlingsmenu"</string>
+</resources>
diff --git a/wear/res/values-de/strings.xml b/wear/res/values-de/strings.xml
new file mode 100644
index 0000000..cd463f1
--- /dev/null
+++ b/wear/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigationsleiste"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Aktionsleiste"</string>
+</resources>
diff --git a/wear/res/values-el/strings.xml b/wear/res/values-el/strings.xml
new file mode 100644
index 0000000..e1ae01b
--- /dev/null
+++ b/wear/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Συρτάρι πλοήγησης"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Συρτάρι ενεργειών"</string>
+</resources>
diff --git a/wear/res/values-en-rAU/strings.xml b/wear/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..ad16473
--- /dev/null
+++ b/wear/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigation drawer"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Action drawer"</string>
+</resources>
diff --git a/wear/res/values-en-rCA/strings.xml b/wear/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..ad16473
--- /dev/null
+++ b/wear/res/values-en-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigation drawer"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Action drawer"</string>
+</resources>
diff --git a/wear/res/values-en-rGB/strings.xml b/wear/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..ad16473
--- /dev/null
+++ b/wear/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigation drawer"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Action drawer"</string>
+</resources>
diff --git a/wear/res/values-en-rIN/strings.xml b/wear/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..ad16473
--- /dev/null
+++ b/wear/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigation drawer"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Action drawer"</string>
+</resources>
diff --git a/wear/res/values-en-rXC/strings.xml b/wear/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..b1f533e
--- /dev/null
+++ b/wear/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎Navigation drawer‎‏‎‎‏‎"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‎‎‏‎‎‏‎Action drawer‎‏‎‎‏‎"</string>
+</resources>
diff --git a/wear/res/values-es-rUS/strings.xml b/wear/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..7f5141d
--- /dev/null
+++ b/wear/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panel lateral de navegación"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panel lateral de acciones"</string>
+</resources>
diff --git a/wear/res/values-es/strings.xml b/wear/res/values-es/strings.xml
new file mode 100644
index 0000000..178fc8b
--- /dev/null
+++ b/wear/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panel de navegación"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panel de acciones"</string>
+</resources>
diff --git a/wear/res/values-et/strings.xml b/wear/res/values-et/strings.xml
new file mode 100644
index 0000000..a7d04f0
--- /dev/null
+++ b/wear/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigeerimissahtel"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Toimingusahtel"</string>
+</resources>
diff --git a/wear/res/values-eu/strings.xml b/wear/res/values-eu/strings.xml
new file mode 100644
index 0000000..353d3c6
--- /dev/null
+++ b/wear/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Nabigazio-panel lerrakorra"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Ekintza-panel lerrakorra"</string>
+</resources>
diff --git a/wear/res/values-fa/strings.xml b/wear/res/values-fa/strings.xml
new file mode 100644
index 0000000..62b8e1a
--- /dev/null
+++ b/wear/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"کشوی پیمایش"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"کشوی فعالیت"</string>
+</resources>
diff --git a/wear/res/values-fi/strings.xml b/wear/res/values-fi/strings.xml
new file mode 100644
index 0000000..bc96258
--- /dev/null
+++ b/wear/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigoinnin vetopaneeli"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Toimintojen vetopaneeli"</string>
+</resources>
diff --git a/wear/res/values-fr-rCA/strings.xml b/wear/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..5a284c2
--- /dev/null
+++ b/wear/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panneau de navigation"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panneau d\'actions"</string>
+</resources>
diff --git a/wear/res/values-fr/strings.xml b/wear/res/values-fr/strings.xml
new file mode 100644
index 0000000..2762885
--- /dev/null
+++ b/wear/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panneau de navigation"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panneau de commandes"</string>
+</resources>
diff --git a/wear/res/values-gl/strings.xml b/wear/res/values-gl/strings.xml
new file mode 100644
index 0000000..3c80d82
--- /dev/null
+++ b/wear/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panel de navegación"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panel de accións"</string>
+</resources>
diff --git a/wear/res/values-gu/strings.xml b/wear/res/values-gu/strings.xml
new file mode 100644
index 0000000..18704b9
--- /dev/null
+++ b/wear/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"નૅવિગેશન ડ્રોઅર"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ઍક્શન ડ્રોઅર"</string>
+</resources>
diff --git a/wear/res/values-hi/strings.xml b/wear/res/values-hi/strings.xml
new file mode 100644
index 0000000..931dd5b
--- /dev/null
+++ b/wear/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"नेविगेशन पैनल"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"कार्रवाई पैनल"</string>
+</resources>
diff --git a/wear/res/values-hr/strings.xml b/wear/res/values-hr/strings.xml
new file mode 100644
index 0000000..cf30702
--- /dev/null
+++ b/wear/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Ladica za navigaciju"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Ladica za radnju"</string>
+</resources>
diff --git a/wear/res/values-hu/strings.xml b/wear/res/values-hu/strings.xml
new file mode 100644
index 0000000..7956166
--- /dev/null
+++ b/wear/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigációs fiók"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Műveleti fiók"</string>
+</resources>
diff --git a/wear/res/values-hy/strings.xml b/wear/res/values-hy/strings.xml
new file mode 100644
index 0000000..2ed20e3
--- /dev/null
+++ b/wear/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Նավարկման դարակ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Գործողությունների դարակ"</string>
+</resources>
diff --git a/wear/res/values-in/strings.xml b/wear/res/values-in/strings.xml
new file mode 100644
index 0000000..a4014a6
--- /dev/null
+++ b/wear/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panel navigasi"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panel samping tindakan"</string>
+</resources>
diff --git a/wear/res/values-is/strings.xml b/wear/res/values-is/strings.xml
new file mode 100644
index 0000000..5100ca2
--- /dev/null
+++ b/wear/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Yfirlitsskúffa"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Aðgerðaskúffa"</string>
+</resources>
diff --git a/wear/res/values-it/strings.xml b/wear/res/values-it/strings.xml
new file mode 100644
index 0000000..680267d
--- /dev/null
+++ b/wear/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Riquadro di navigazione a scomparsa"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Riquadro a scomparsa delle azioni"</string>
+</resources>
diff --git a/wear/res/values-iw/strings.xml b/wear/res/values-iw/strings.xml
new file mode 100644
index 0000000..bf45234
--- /dev/null
+++ b/wear/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"חלונית הזזה לניווט"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"חלונית הזזה לפעולות"</string>
+</resources>
diff --git a/wear/res/values-ja/strings.xml b/wear/res/values-ja/strings.xml
new file mode 100644
index 0000000..cd96bad
--- /dev/null
+++ b/wear/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ナビゲーション ドロワー"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"アクション ドロワー"</string>
+</resources>
diff --git a/wear/res/values-ka/strings.xml b/wear/res/values-ka/strings.xml
new file mode 100644
index 0000000..ba15c3b
--- /dev/null
+++ b/wear/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ნავიგაციის უჯრა"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ქმედების უჯრა"</string>
+</resources>
diff --git a/wear/res/values-kk/strings.xml b/wear/res/values-kk/strings.xml
new file mode 100644
index 0000000..a4e3343
--- /dev/null
+++ b/wear/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Навигация тартпасы"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Әрекеттер тартпасы"</string>
+</resources>
diff --git a/wear/res/values-km/strings.xml b/wear/res/values-km/strings.xml
new file mode 100644
index 0000000..db04750
--- /dev/null
+++ b/wear/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ថត​រុករក"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ថត​សកម្មភាព"</string>
+</resources>
diff --git a/wear/res/values-kn/strings.xml b/wear/res/values-kn/strings.xml
new file mode 100644
index 0000000..b2edb49
--- /dev/null
+++ b/wear/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ನ್ಯಾವಿಗೇಶನ್ ಡ್ರಾಯರ್"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ಕ್ರಿಯೆ ಡ್ರಾಯರ್"</string>
+</resources>
diff --git a/wear/res/values-ko/strings.xml b/wear/res/values-ko/strings.xml
new file mode 100644
index 0000000..1c4c58e
--- /dev/null
+++ b/wear/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"탐색 창"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"작업 창"</string>
+</resources>
diff --git a/wear/res/values-ky/strings.xml b/wear/res/values-ky/strings.xml
new file mode 100644
index 0000000..821cb35
--- /dev/null
+++ b/wear/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Чабыттоо суурмасы"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Аракет суурмасы"</string>
+</resources>
diff --git a/wear/res/values-lo/strings.xml b/wear/res/values-lo/strings.xml
new file mode 100644
index 0000000..82b3403
--- /dev/null
+++ b/wear/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ແຖບການນຳທາງ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ແຖບຄຳສັ່ງ"</string>
+</resources>
diff --git a/wear/res/values-lt/strings.xml b/wear/res/values-lt/strings.xml
new file mode 100644
index 0000000..c08f1be
--- /dev/null
+++ b/wear/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Naršymo skydelis"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Veiksmo skydelis"</string>
+</resources>
diff --git a/wear/res/values-lv/strings.xml b/wear/res/values-lv/strings.xml
new file mode 100644
index 0000000..233b9de
--- /dev/null
+++ b/wear/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigācijas atvilktne"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Darbību atvilktne"</string>
+</resources>
diff --git a/wear/res/values-mk/strings.xml b/wear/res/values-mk/strings.xml
new file mode 100644
index 0000000..3ba4480
--- /dev/null
+++ b/wear/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Фиока за навигација"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Фиока за дејство"</string>
+</resources>
diff --git a/wear/res/values-ml/strings.xml b/wear/res/values-ml/strings.xml
new file mode 100644
index 0000000..45527cd
--- /dev/null
+++ b/wear/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"നാവിഗേഷൻ ഡ്രോയർ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ആക്ഷൻ ഡ്രോയർ"</string>
+</resources>
diff --git a/wear/res/values-mn/strings.xml b/wear/res/values-mn/strings.xml
new file mode 100644
index 0000000..53c4dec
--- /dev/null
+++ b/wear/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Навигацийн шургуулга"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Үйлдлийн татуурга"</string>
+</resources>
diff --git a/wear/res/values-mr/strings.xml b/wear/res/values-mr/strings.xml
new file mode 100644
index 0000000..20b5072
--- /dev/null
+++ b/wear/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"नेव्हिगेशन ड्रॉवर"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"क्रिया ड्रॉवर"</string>
+</resources>
diff --git a/wear/res/values-ms/strings.xml b/wear/res/values-ms/strings.xml
new file mode 100644
index 0000000..e0ab113
--- /dev/null
+++ b/wear/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Laci navigasi"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Laci tindakan"</string>
+</resources>
diff --git a/wear/res/values-my/strings.xml b/wear/res/values-my/strings.xml
new file mode 100644
index 0000000..1d7c401
--- /dev/null
+++ b/wear/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"လမ်းကြောင်းပြ အံဆွဲ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"လုပ်ဆောင်ချက် အံဆွဲ"</string>
+</resources>
diff --git a/wear/res/values-nb/strings.xml b/wear/res/values-nb/strings.xml
new file mode 100644
index 0000000..fdd65d5
--- /dev/null
+++ b/wear/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Uttrekksmeny"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Uttrekksmeny for handlinger"</string>
+</resources>
diff --git a/wear/res/values-ne/strings.xml b/wear/res/values-ne/strings.xml
new file mode 100644
index 0000000..b524cf5
--- /dev/null
+++ b/wear/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"नेभिगेसन ड्रअर"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"कारबाहीसम्बन्धी ड्रअर"</string>
+</resources>
diff --git a/wear/res/values-nl/strings.xml b/wear/res/values-nl/strings.xml
new file mode 100644
index 0000000..d7d7fdf
--- /dev/null
+++ b/wear/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Zijmenu"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Actiemenu"</string>
+</resources>
diff --git a/wear/res/values-pa/strings.xml b/wear/res/values-pa/strings.xml
new file mode 100644
index 0000000..afb5599
--- /dev/null
+++ b/wear/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਡ੍ਰਾਅਰ"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ਕਾਰਵਾਈ ਡ੍ਰਾਅਰ"</string>
+</resources>
diff --git a/wear/res/values-pl/strings.xml b/wear/res/values-pl/strings.xml
new file mode 100644
index 0000000..de964e7
--- /dev/null
+++ b/wear/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panel nawigacji"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panel działań"</string>
+</resources>
diff --git a/wear/res/values-pt-rBR/strings.xml b/wear/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..6347156
--- /dev/null
+++ b/wear/res/values-pt-rBR/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Gaveta de navegação"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Gaveta de ações"</string>
+</resources>
diff --git a/wear/res/values-pt-rPT/strings.xml b/wear/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..6347156
--- /dev/null
+++ b/wear/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Gaveta de navegação"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Gaveta de ações"</string>
+</resources>
diff --git a/wear/res/values-pt/strings.xml b/wear/res/values-pt/strings.xml
new file mode 100644
index 0000000..6347156
--- /dev/null
+++ b/wear/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Gaveta de navegação"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Gaveta de ações"</string>
+</resources>
diff --git a/wear/res/values-ro/strings.xml b/wear/res/values-ro/strings.xml
new file mode 100644
index 0000000..6f6aa10
--- /dev/null
+++ b/wear/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Panou de navigare"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Panou de acțiune"</string>
+</resources>
diff --git a/wear/res/values-ru/strings.xml b/wear/res/values-ru/strings.xml
new file mode 100644
index 0000000..7d3a266
--- /dev/null
+++ b/wear/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Панель навигации"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Панель действий"</string>
+</resources>
diff --git a/wear/res/values-si/strings.xml b/wear/res/values-si/strings.xml
new file mode 100644
index 0000000..4ae2f63
--- /dev/null
+++ b/wear/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"සංචාලන ලාච්චුව"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ක්‍රියාමාර්ග ලාච්චුව"</string>
+</resources>
diff --git a/wear/res/values-sk/strings.xml b/wear/res/values-sk/strings.xml
new file mode 100644
index 0000000..cbb2c6a
--- /dev/null
+++ b/wear/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigačný vysúvací panel"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Vysúvací panel akcií"</string>
+</resources>
diff --git a/wear/res/values-sl/strings.xml b/wear/res/values-sl/strings.xml
new file mode 100644
index 0000000..e7aa38c
--- /dev/null
+++ b/wear/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Predal za krmarjenje"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Predal z dejanji"</string>
+</resources>
diff --git a/wear/res/values-sq/strings.xml b/wear/res/values-sq/strings.xml
new file mode 100644
index 0000000..1b18aba
--- /dev/null
+++ b/wear/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Sirtari i navigimit"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Sirtari i veprimit"</string>
+</resources>
diff --git a/wear/res/values-sr/strings.xml b/wear/res/values-sr/strings.xml
new file mode 100644
index 0000000..c2a6ff7
--- /dev/null
+++ b/wear/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Фиока за навигацију"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Фиока за радњу"</string>
+</resources>
diff --git a/wear/res/values-sv/strings.xml b/wear/res/values-sv/strings.xml
new file mode 100644
index 0000000..c5c07a6
--- /dev/null
+++ b/wear/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigeringspanel"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Åtgärdspanel"</string>
+</resources>
diff --git a/wear/res/values-sw/strings.xml b/wear/res/values-sw/strings.xml
new file mode 100644
index 0000000..2f4bcc0
--- /dev/null
+++ b/wear/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Droo ya kusogeza"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Droo ya vitendo"</string>
+</resources>
diff --git a/wear/res/values-ta/strings.xml b/wear/res/values-ta/strings.xml
new file mode 100644
index 0000000..ccfed38
--- /dev/null
+++ b/wear/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"வழிசெலுத்தல் டிராயர்"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"செயல் டிராயர்"</string>
+</resources>
diff --git a/wear/res/values-te/strings.xml b/wear/res/values-te/strings.xml
new file mode 100644
index 0000000..c3db02c
--- /dev/null
+++ b/wear/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"నావిగేషన్ డ్రాయర్"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"చర్య డ్రాయర్"</string>
+</resources>
diff --git a/wear/res/values-th/strings.xml b/wear/res/values-th/strings.xml
new file mode 100644
index 0000000..f5b0521
--- /dev/null
+++ b/wear/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"ลิ้นชักการนำทาง"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"ลิ้นชักการดำเนินการ"</string>
+</resources>
diff --git a/wear/res/values-tl/strings.xml b/wear/res/values-tl/strings.xml
new file mode 100644
index 0000000..ad16473
--- /dev/null
+++ b/wear/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigation drawer"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Action drawer"</string>
+</resources>
diff --git a/wear/res/values-tr/strings.xml b/wear/res/values-tr/strings.xml
new file mode 100644
index 0000000..32aff20
--- /dev/null
+++ b/wear/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Gezinme çekmecesi"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"İşlem çekmecesi"</string>
+</resources>
diff --git a/wear/res/values-uk/strings.xml b/wear/res/values-uk/strings.xml
new file mode 100644
index 0000000..93d9432
--- /dev/null
+++ b/wear/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Панель навігації"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Висувна панель команд"</string>
+</resources>
diff --git a/wear/res/values-ur/strings.xml b/wear/res/values-ur/strings.xml
new file mode 100644
index 0000000..53b133e
--- /dev/null
+++ b/wear/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"نیویگیشن دراز"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"کارروائی دراز"</string>
+</resources>
diff --git a/wear/res/values-uz/strings.xml b/wear/res/values-uz/strings.xml
new file mode 100644
index 0000000..a09fef7
--- /dev/null
+++ b/wear/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Navigatsiya paneli"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Buyruqlar paneli"</string>
+</resources>
diff --git a/wear/res/values-vi/strings.xml b/wear/res/values-vi/strings.xml
new file mode 100644
index 0000000..d42c495
--- /dev/null
+++ b/wear/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Ngăn điều hướng"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Ngăn tác vụ"</string>
+</resources>
diff --git a/wear/res/values-zh-rCN/strings.xml b/wear/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..1fbb17e
--- /dev/null
+++ b/wear/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"抽屉式导航栏"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"操作抽屉式导航栏"</string>
+</resources>
diff --git a/wear/res/values-zh-rHK/strings.xml b/wear/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..7e96db7
--- /dev/null
+++ b/wear/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"導覽列"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"操作導覽列"</string>
+</resources>
diff --git a/wear/res/values-zh-rTW/strings.xml b/wear/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..b2ca4a2
--- /dev/null
+++ b/wear/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"導覽匣"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"動作導覽匣"</string>
+</resources>
diff --git a/wear/res/values-zu/strings.xml b/wear/res/values-zu/strings.xml
new file mode 100644
index 0000000..609f735
--- /dev/null
+++ b/wear/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="ws_navigation_drawer_content_description" msgid="7216697245762194759">"Ikhabethe lokuzulazula"</string>
+    <string name="ws_action_drawer_content_description" msgid="1837365417701148489">"Ikhabethe lesenzo"</string>
+</resources>