Merge "Move to AGP 3.0.0 alpha 9" into oc-support-26.0-dev am: cc2b541630
am: 5885cc9b7f

Change-Id: I40a411adee401de4f0056b23367d80aeec63e585
diff --git a/api/26.0.0-SNAPSHOT.txt b/api/26.0.0-SNAPSHOT.txt
index fe0c575..13c52ca 100644
--- a/api/26.0.0-SNAPSHOT.txt
+++ b/api/26.0.0-SNAPSHOT.txt
@@ -233,6 +233,60 @@
 
 }
 
+package android.support.content {
+
+  public class ContentPager {
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+    method public static android.os.Bundle createArgs(int, int);
+    method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+    method public void reset();
+    field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+    field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+    field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+    field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+    field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+    field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+    field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+    field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+    field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+    field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+  }
+
+  public static abstract interface ContentPager.ContentCallback {
+    method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+  }
+
+  public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface ContentPager.QueryRunner {
+    method public abstract void cancel(android.support.content.Query);
+    method public abstract boolean isRunning(android.support.content.Query);
+    method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public static abstract interface ContentPager.QueryRunner.Callback {
+    method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+    method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+  }
+
+  public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+    ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+    method public void cancel(android.support.content.Query);
+    method public boolean isRunning(android.support.content.Query);
+    method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public final class Query {
+    method public int getId();
+    method public int getLimit();
+    method public int getOffset();
+    method public android.net.Uri getUri();
+  }
+
+}
+
 package android.support.customtabs {
 
   public class CustomTabsCallback {
@@ -12189,6 +12243,7 @@
     method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
     method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
     method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
     method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
     method public int getMaxFlingVelocity();
     method public int getMinFlingVelocity();
@@ -12212,6 +12267,7 @@
     method public void onScrollStateChanged(int);
     method public void onScrolled(int, int);
     method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
     method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
     method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
     method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
diff --git a/api/26.1.0-SNAPSHOT.txt b/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from api/26.1.0-SNAPSHOT.txt
rename to api/27.0.0-SNAPSHOT.txt
index c0b0862..a6d52b1 100644
--- a/api/26.1.0-SNAPSHOT.txt
+++ b/api/27.0.0-SNAPSHOT.txt
@@ -233,6 +233,60 @@
 
 }
 
+package android.support.content {
+
+  public class ContentPager {
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+    method public static android.os.Bundle createArgs(int, int);
+    method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+    method public void reset();
+    field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+    field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+    field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+    field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+    field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+    field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+    field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+    field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+    field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+    field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+  }
+
+  public static abstract interface ContentPager.ContentCallback {
+    method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+  }
+
+  public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface ContentPager.QueryRunner {
+    method public abstract void cancel(android.support.content.Query);
+    method public abstract boolean isRunning(android.support.content.Query);
+    method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public static abstract interface ContentPager.QueryRunner.Callback {
+    method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+    method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+  }
+
+  public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+    ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+    method public void cancel(android.support.content.Query);
+    method public boolean isRunning(android.support.content.Query);
+    method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public final class Query {
+    method public int getId();
+    method public int getLimit();
+    method public int getOffset();
+    method public android.net.Uri getUri();
+  }
+
+}
+
 package android.support.customtabs {
 
   public class CustomTabsCallback {
@@ -5609,8 +5663,7 @@
     method public final int getPickerItemLayoutId();
     method public final int getPickerItemTextViewId();
     method public int getSelectedColumn();
-    method public final deprecated java.lang.CharSequence getSeparator();
-    method public final java.util.List<java.lang.CharSequence> getSeparators();
+    method public final java.lang.CharSequence getSeparator();
     method public float getVisibleItemCount();
     method public void onColumnValueChanged(int, int);
     method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
@@ -5621,7 +5674,6 @@
     method public final void setPickerItemTextViewId(int);
     method public void setSelectedColumn(int);
     method public final void setSeparator(java.lang.CharSequence);
-    method public final void setSeparators(java.util.List<java.lang.CharSequence>);
     method public void setVisibleItemCount(float);
   }
 
@@ -6965,10 +7017,6 @@
     method public static java.lang.String[] matchesMany(java.lang.String[], java.lang.String);
   }
 
-  public final deprecated class ParallelExecutorCompat {
-    method public static deprecated java.util.concurrent.Executor getParallelExecutor();
-  }
-
   public final class PermissionChecker {
     method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
     method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
@@ -7037,9 +7085,6 @@
 
   public final class ConfigurationHelper {
     method public static int getDensityDpi(android.content.res.Resources);
-    method public static deprecated int getScreenHeightDp(android.content.res.Resources);
-    method public static deprecated int getScreenWidthDp(android.content.res.Resources);
-    method public static deprecated int getSmallestScreenWidthDp(android.content.res.Resources);
   }
 
   public final class ResourcesCompat {
@@ -8133,7 +8178,6 @@
   public final class TextUtilsCompat {
     method public static int getLayoutDirectionFromLocale(java.util.Locale);
     method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final deprecated java.util.Locale ROOT;
   }
 
 }
@@ -12191,6 +12235,7 @@
     method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
     method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
     method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
     method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
     method public int getMaxFlingVelocity();
     method public int getMinFlingVelocity();
@@ -12214,6 +12259,7 @@
     method public void onScrollStateChanged(int);
     method public void onScrolled(int, int);
     method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
     method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
     method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
     method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
diff --git a/app-toolkit/core-testing/src/main/AndroidManifest.xml b/app-toolkit/core-testing/src/main/AndroidManifest.xml
index 83e0d83..2d55b39 100644
--- a/app-toolkit/core-testing/src/main/AndroidManifest.xml
+++ b/app-toolkit/core-testing/src/main/AndroidManifest.xml
@@ -14,5 +14,10 @@
   ~ limitations under the License.
   -->
 
-<manifest package="android.arch.core.testing">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.arch.core.testing">
+    <application>
+        <meta-data android:name="android.arch.core.testing.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/app-toolkit/dependencies.gradle b/app-toolkit/dependencies.gradle
index 07acc6b..c9e3dea 100644
--- a/app-toolkit/dependencies.gradle
+++ b/app-toolkit/dependencies.gradle
@@ -84,5 +84,4 @@
 ext.tools.current_sdk = gradle.ext.currentSdk
 ext.tools.build_tools_version = rootProject.ext.buildToolsVersion
 ext.flatfoot = [:]
-ext.flatfoot.release_version = "1.0.0-alpha8"
 ext.flatfoot.min_sdk = 14
diff --git a/app-toolkit/init.gradle b/app-toolkit/init.gradle
index fab8e17..fe32308 100644
--- a/app-toolkit/init.gradle
+++ b/app-toolkit/init.gradle
@@ -13,6 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+import android.support.LibraryVersions
 import org.gradle.internal.os.OperatingSystem
 
 def root = ext.supportRootFolder
@@ -20,7 +22,6 @@
 
 if (ext.inAppToolkitProject) {
     apply from: "${ext.supportRootFolder}/buildSrc/init.gradle"
-    init.loadDefaultVersions()
     init.setSdkInLocalPropertiesFile()
 }
 
@@ -91,7 +92,7 @@
 def zipFlatfootDocsTask = rootProject.tasks.create(name : "createFlatfootDocsArchive", type : Zip) {
     from rootProject.docsDir
     destinationDir distDir
-    baseName = String.format("flatfoot-docs-%s", rootProject.ext.flatfoot.release_version)
+    baseName = String.format("flatfoot-docs-%s", LibraryVersions.FLATFOOT.toString())
 }
 
 buildServerAnchorTask.dependsOn zipFlatfootDocsTask
@@ -125,7 +126,7 @@
     }
     project.group = finalGroup
     if (!project.version) {
-        project.version = flatfoot.release_version
+        project.version = LibraryVersions.FLATFOOT.toString()
     }
 
     if (project.getPath().contains("integration-tests")) {
@@ -182,6 +183,10 @@
             project.artifacts {
                 archives sourcesTask
             }
+            project.android.defaultConfig {
+                // Update the version meta-data in each Manifest.
+                addManifestPlaceholders(["version" : project.version])
+            }
         } else if(isJavaLibrary && project.name == "common") {
             // it is a shared lib, enable sources.
             def sourcesTask = project.tasks.create(name: "sourcesJar", type : Jar) {
diff --git a/app-toolkit/runtime/src/main/AndroidManifest.xml b/app-toolkit/runtime/src/main/AndroidManifest.xml
index 3f40068..a5660ce 100644
--- a/app-toolkit/runtime/src/main/AndroidManifest.xml
+++ b/app-toolkit/runtime/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.core">
+    <application>
+        <meta-data android:name="android.arch.core.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/build.gradle b/build.gradle
index 360ec02..8c32175 100644
--- a/build.gradle
+++ b/build.gradle
@@ -19,7 +19,6 @@
     apply from: 'buildSrc/repos.gradle'
 
     apply from: 'buildSrc/init.gradle'
-    init.loadDefaultVersions()
     init.setSdkInLocalPropertiesFile()
     repos.addMavenRepositories(repositories)
 
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 64dc797..4946de2 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -20,11 +20,11 @@
 libs.mockito_core = 'org.mockito:mockito-core:2.7.6'
 libs.dexmaker_mockito = 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'
 libs.junit = 'junit:junit:4.12'
-libs.test_runner = 'com.android.support.test:runner:0.6-alpha'
-libs.espresso_core = 'com.android.support.test.espresso:espresso-core:2.3-alpha'
-libs.espresso_contrib = 'com.android.support.test.espresso:espresso-contrib:2.3-alpha'
+libs.test_runner = 'com.android.support.test:runner:1.0.0'
+libs.test_rules = 'com.android.support.test:rules:1.0.0'
+libs.espresso_core = 'com.android.support.test.espresso:espresso-core:3.0.0'
+libs.espresso_contrib = 'com.android.support.test.espresso:espresso-contrib:3.0.0'
 libs.jacoco = 'org.jacoco:org.jacoco.core:0.7.8'
-libs.test_rules = 'com.android.support.test:rules:0.6-alpha'
 
 def androidPluginVersionOverride = System.getenv("GRADLE_PLUGIN_VERSION")
 
diff --git a/buildSrc/diff_and_docs.gradle b/buildSrc/diff_and_docs.gradle
index 3011092..2c94849 100644
--- a/buildSrc/diff_and_docs.gradle
+++ b/buildSrc/diff_and_docs.gradle
@@ -14,20 +14,15 @@
  * limitations under the License.
  */
 
+import android.support.LibraryVersions
+import android.support.Version
 import android.support.checkapi.ApiXmlConversionTask
 import android.support.checkapi.CheckApiTask
 import android.support.checkapi.UpdateApiTask
 import android.support.doclava.DoclavaTask
 import android.support.jdiff.JDiffTask
-import android.support.Version
-
-import org.gradle.api.InvalidUserDataException
-
 import groovy.io.FileType
-import groovy.transform.Field;
-
-import java.util.regex.Matcher
-import java.util.regex.Pattern
+import groovy.transform.Field
 
 // Set up platform API files for federation.
 if (project.androidApiTxt != null) {
@@ -490,7 +485,7 @@
 }
 
 if (hasApiFolder(rootProject)) {
-    rootProject.version = rootProject.supportVersion
+    rootProject.version = LibraryVersions.SUPPORT_LIBRARY.toString();
     initializeApiChecksForProject(rootProject)
 }
 
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index 486a078..014e3dc 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+import android.support.LibraryVersions
 import com.android.build.gradle.internal.coverage.JacocoPlugin
 import com.android.build.gradle.internal.coverage.JacocoReportTask
 import com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask
@@ -38,10 +39,6 @@
         dataname: "SUPPORT_DATA"
 ]
 
-def loadDefaultVersions() {
-    apply from: "${supportRootFolder}/buildSrc/versions.gradle"
-}
-
 def enableDoclavaAndJDiff(p) {
     p.configurations {
         doclava
@@ -91,9 +88,11 @@
 }
 
 def setupRepoOutAndBuildNumber() {
+    // common support repo folder which works well for prebuilts.
     ext.supportRepoOut = ''
+    // files in artifactoryRepoOut can be safely copied into a real artifactory.
+    ext.artifactoryRepoOut = ''
     ext.buildNumber = "0"
-
     /*
      * With the build server you are given two env variables.
      * The OUT_DIR is a temporary directory you can use to put things during the build.
@@ -121,6 +120,7 @@
         project.buildDir = new File("$project.parent.buildDir/../$project.name/build")
     }
     ext.supportRepoOut = new File(buildDir, 'support_repo')
+    ext.artifactoryRepoOut =  new File(buildDir, 'artifactory_repo')
     ext.testApkDistOut = ext.distDir
     ext.testResultsDistDir = new File(distDir, "host-test-reports")
     ext.docsDir = new File(buildDir, 'javadoc')
@@ -167,7 +167,7 @@
         project.ext.currentSdk = gradle.ext.currentSdk
         apply plugin: 'maven'
 
-        version = rootProject.ext.supportVersion
+        version = LibraryVersions.SUPPORT_LIBRARY.toString();
         group = 'com.android.support'
 
         project.plugins.whenPluginAdded { plugin ->
@@ -236,6 +236,7 @@
                 project.afterEvaluate {
                     Upload uploadTask = (Upload) project.tasks.uploadArchives;
                     uploadTask.repositories.mavenDeployer {
+
                         // Disable unique names for SNAPSHOTS so they can be updated in place.
                         setUniqueVersion(false)
                     }
@@ -255,11 +256,26 @@
                         }
                     }
 
+                    // create a release task that produces artifactory friends artifacts
+                    // a.k.a. unique versions for snapshots with their maven-metadata files.
+                    task artifactoryRelease(type : Upload) {
+                        configuration = uploadTask.configuration
+                        repositories {
+                            mavenDeployer {
+                                repository(url: uri("$rootProject.ext.artifactoryRepoOut"))
+                                setUniqueVersion(true)
+                            }
+                        }
+                    }
+
                     // Before the upload, make sure the repo is ready.
                     uploadTask.dependsOn rootProject.tasks.prepareRepo
 
+                    artifactoryRelease.dependsOn uploadTask
+
                     // Make the mainupload depend on this one.
                     mainUpload.dependsOn uploadTask
+                    mainUpload.dependsOn artifactoryRelease
                 }
             }
         }
@@ -348,6 +364,5 @@
 ext.init.setSdkInLocalPropertiesFile = this.&setSdkInLocalPropertiesFile
 ext.init.setupRepoOutAndBuildNumber = this.&setupRepoOutAndBuildNumber
 ext.init.setupRelease = this.&setupRelease
-ext.init.loadDefaultVersions = this.&loadDefaultVersions
 ext.init.configureSubProjects = this.&configureSubProjects
 ext.init.configureBuildOnServer = this.&configureBuildOnServer
diff --git a/buildSrc/release.gradle b/buildSrc/release.gradle
index 5033454..d9a0266 100644
--- a/buildSrc/release.gradle
+++ b/buildSrc/release.gradle
@@ -20,7 +20,7 @@
 task createArchive(type : Zip) {
     description "Creates a maven repository that includes just the libraries compiled in this" +
             " project, without any history from prebuilts."
-    from rootProject.ext.supportRepoOut
+    from rootProject.ext.artifactoryRepoOut
     destinationDir rootProject.ext.distDir
     into 'm2repository'
     baseName = String.format("top-of-tree-m2repository-%s", project.ext.buildNumber)
@@ -34,5 +34,7 @@
     doFirst {
         rootProject.ext.supportRepoOut.deleteDir()
         rootProject.ext.supportRepoOut.mkdirs()
+        rootProject.ext.artifactoryRepoOut.deleteDir()
+        rootProject.ext.artifactoryRepoOut.mkdirs()
     }
 }
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
index 20376b2..7ebef19 100644
--- a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
@@ -52,7 +52,7 @@
 
         library.defaultConfig {
             // Update the version meta-data in each Manifest.
-            addManifestPlaceholders(["support-version": project.rootProject.supportVersion,
+            addManifestPlaceholders(["support-version": LibraryVersions.SUPPORT_LIBRARY.toString(),
                                      "target-sdk-version": project.currentSdk])
 
             // Set test related options.
@@ -102,11 +102,17 @@
 
             // TODO(aurimas): figure out the issue with missing translation check
             disable 'MissingTranslation'
-
-            // Set baseline file for all legacy lint warnings.
-            baseline new File(project.projectDir, "/lint-baseline.xml")
         }
 
+        // Set baseline file for all legacy lint warnings.
+        if (System.getenv("GRADLE_PLUGIN_VERSION") != null) {
+            library.lintOptions.check 'NewApi'
+        } else {
+            library.lintOptions.baseline new File(project.projectDir, "/lint-baseline.xml")
+
+        }
+
+
         // Java 8 is only fully supported on API 24+ and not all Java 8 features are binary
         // compatible with API < 24, so use Java 7 for both source AND target.
         library.compileOptions {
diff --git a/buildSrc/src/main/java/android/support/LibraryVersions.java b/buildSrc/src/main/java/android/support/LibraryVersions.java
new file mode 100644
index 0000000..a99363e
--- /dev/null
+++ b/buildSrc/src/main/java/android/support/LibraryVersions.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support;
+
+/**
+ * The list of versions codes of all the libraries in this project.
+ */
+public class LibraryVersions {
+    /**
+     * Version code of the support library components.
+     */
+    public static final Version SUPPORT_LIBRARY = new Version("27.0.0-SNAPSHOT");
+
+    /**
+     * Version code of the flatfoot libraries.
+     */
+    public static final Version FLATFOOT = new Version("1.0.0-alpha8");
+
+    /**
+     * Version code of the lifecycles library.
+     */
+    public static final Version LIFECYCLES = new Version("1.0.0-SNAPSHOT");
+}
diff --git a/buildSrc/src/main/java/android/support/Version.java b/buildSrc/src/main/java/android/support/Version.java
index 1338a1d..b88d8cf 100644
--- a/buildSrc/src/main/java/android/support/Version.java
+++ b/buildSrc/src/main/java/android/support/Version.java
@@ -68,4 +68,9 @@
     public String getExtra() {
         return mExtra;
     }
+
+    @Override
+    public String toString() {
+        return mMajor + "." + mMinor + "." + mPatch + (mExtra != null ? mExtra : "");
+    }
 }
diff --git a/compat/AndroidManifest.xml b/compat/AndroidManifest.xml
index 09383ee..cba2f24 100644
--- a/compat/AndroidManifest.xml
+++ b/compat/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.compat">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.compat"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.compat.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/compat/api/26.1.0-SNAPSHOT.txt b/compat/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from compat/api/26.1.0-SNAPSHOT.txt
rename to compat/api/27.0.0-SNAPSHOT.txt
index b3b5173..a975912 100644
--- a/compat/api/26.1.0-SNAPSHOT.txt
+++ b/compat/api/27.0.0-SNAPSHOT.txt
@@ -655,10 +655,6 @@
     field public static final deprecated int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
   }
 
-  public final deprecated class ParallelExecutorCompat {
-    method public static deprecated java.util.concurrent.Executor getParallelExecutor();
-  }
-
   public final class SharedPreferencesCompat {
   }
 
@@ -711,9 +707,6 @@
 
   public final class ConfigurationHelper {
     method public static int getDensityDpi(android.content.res.Resources);
-    method public static deprecated int getScreenHeightDp(android.content.res.Resources);
-    method public static deprecated int getScreenWidthDp(android.content.res.Resources);
-    method public static deprecated int getSmallestScreenWidthDp(android.content.res.Resources);
   }
 
   public final class ResourcesCompat {
@@ -1042,7 +1035,6 @@
   public final class TextUtilsCompat {
     method public static int getLayoutDirectionFromLocale(java.util.Locale);
     method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final deprecated java.util.Locale ROOT;
   }
 
 }
diff --git a/compat/build.gradle b/compat/build.gradle
index 7e9468b..289543a 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -3,14 +3,10 @@
 dependencies {
     api project(':support-annotations')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation project(':support-testutils')
 }
 
diff --git a/compat/ics/android/support/v4/graphics/PaintCompatApi14.java b/compat/ics/android/support/v4/graphics/PaintCompatApi14.java
deleted file mode 100644
index 7a7de7c..0000000
--- a/compat/ics/android/support/v4/graphics/PaintCompatApi14.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.graphics;
-
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v4.util.Pair;
-
-class PaintCompatApi14 {
-    // U+DFFFD which is very end of unassigned plane.
-    private static final String TOFU_STRING = "\uDB3F\uDFFD";
-    private static final String EM_STRING = "m";
-
-    private static final ThreadLocal<Pair<Rect, Rect>> sRectThreadLocal = new ThreadLocal<>();
-
-    static boolean hasGlyph(@NonNull Paint paint, @NonNull String string) {
-        final int length = string.length();
-
-        if (length == 1 && Character.isWhitespace(string.charAt(0))) {
-            // measureText + getTextBounds skips whitespace so we need to special case it here
-            return true;
-        }
-
-        final float missingGlyphWidth = paint.measureText(TOFU_STRING);
-        final float emGlyphWidth = paint.measureText(EM_STRING);
-
-        final float width = paint.measureText(string);
-
-        if (width == 0f) {
-            // If the string width is 0, it can't be rendered
-            return false;
-        }
-
-        if (string.codePointCount(0, string.length()) > 1) {
-            // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences
-            // Return false if string is rendered too widely
-            if (width > 2 * emGlyphWidth) {
-                return false;
-            }
-
-            // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences (2).
-            // If width is greater than or equal to the sum of width of each code point, it is very
-            // likely that the system is using fallback fonts to draw {@code string} in two or more
-            // glyphs instead of a single ligature glyph. (hasGlyph returns false in this case.)
-            // False detections are possible (the ligature glyph may happen to have the same width
-            // as the sum width), but there are no good way to avoid them.
-            // NOTE: This heuristic does not work with proportional glyphs.
-            // NOTE: This heuristic does not work when a ZWJ sequence is partially combined.
-            // E.g. If system has a glyph for "A ZWJ B" and not for "A ZWJ B ZWJ C", this heuristic
-            // returns true for "A ZWJ B ZWJ C".
-            float sumWidth = 0;
-            int i = 0;
-            while (i < length) {
-                int charCount = Character.charCount(string.codePointAt(i));
-                sumWidth += paint.measureText(string, i, i + charCount);
-                i += charCount;
-            }
-            if (width >= sumWidth) {
-                return false;
-            }
-        }
-
-        if (width != missingGlyphWidth) {
-            // If the widths are different then its not tofu
-            return true;
-        }
-
-        // If the widths are the same, lets check the bounds. The chance of them being
-        // different chars with the same bounds is extremely small
-        final Pair<Rect, Rect> rects = obtainEmptyRects();
-        paint.getTextBounds(TOFU_STRING, 0, TOFU_STRING.length(), rects.first);
-        paint.getTextBounds(string, 0, length, rects.second);
-        return !rects.first.equals(rects.second);
-    }
-
-    private static Pair<Rect, Rect> obtainEmptyRects() {
-        Pair<Rect, Rect> rects = sRectThreadLocal.get();
-        if (rects == null) {
-            rects = new Pair<>(new Rect(), new Rect());
-            sRectThreadLocal.set(rects);
-        } else {
-            rects.first.setEmpty();
-            rects.second.setEmpty();
-        }
-        return rects;
-    }
-}
diff --git a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
index 3c17fda..f810253 100644
--- a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
+++ b/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -21,58 +21,12 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.Build;
-import android.support.annotation.RequiresApi;
 import android.view.View;
 
 /**
  * Helper for accessing features in {@link android.accessibilityservice.AccessibilityService}.
  */
 public final class AccessibilityServiceInfoCompat {
-
-    static class AccessibilityServiceInfoBaseImpl {
-        public int getCapabilities(AccessibilityServiceInfo info) {
-            if (getCanRetrieveWindowContent(info)) {
-                return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
-            }
-            return 0;
-        }
-
-        public String loadDescription(AccessibilityServiceInfo info, PackageManager pm) {
-            return null;
-        }
-    }
-
-    @RequiresApi(16)
-    static class AccessibilityServiceInfoApi16Impl extends AccessibilityServiceInfoBaseImpl {
-        @Override
-        public String loadDescription(AccessibilityServiceInfo info, PackageManager pm) {
-            return info.loadDescription(pm);
-        }
-    }
-
-    @RequiresApi(18)
-    static class AccessibilityServiceInfoApi18Impl
-            extends AccessibilityServiceInfoApi16Impl {
-        @Override
-        public int getCapabilities(AccessibilityServiceInfo info) {
-            return info.getCapabilities();
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
-            IMPL = new AccessibilityServiceInfoApi18Impl();
-        } else if (Build.VERSION.SDK_INT >= 16) { // JB
-            IMPL = new AccessibilityServiceInfoApi16Impl();
-        } else {
-            IMPL = new AccessibilityServiceInfoBaseImpl();
-        }
-    }
-
-    // Capabilities
-
-    private static final AccessibilityServiceInfoBaseImpl IMPL;
-
     /**
      * Capability: This accessibility service can retrieve the active window content.
      */
@@ -330,7 +284,12 @@
      */
     public static String loadDescription(
             AccessibilityServiceInfo info, PackageManager packageManager) {
-        return IMPL.loadDescription(info, packageManager);
+        if (Build.VERSION.SDK_INT >= 16) {
+            return info.loadDescription(packageManager);
+        } else {
+            //noinspection deprecation
+            return info.getDescription();
+        }
     }
 
     /**
@@ -412,7 +371,15 @@
      * @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
      */
     public static int getCapabilities(AccessibilityServiceInfo info) {
-        return IMPL.getCapabilities(info);
+        if (Build.VERSION.SDK_INT >= 18) {
+            return info.getCapabilities();
+        } else {
+            //noinspection deprecation
+            if (info.getCanRetrieveWindowContent()) {
+                return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
+            }
+            return 0;
+        }
     }
 
     /**
diff --git a/compat/java/android/support/v4/content/ParallelExecutorCompat.java b/compat/java/android/support/v4/content/ParallelExecutorCompat.java
deleted file mode 100644
index 4dc4168..0000000
--- a/compat/java/android/support/v4/content/ParallelExecutorCompat.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2015 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.content;
-
-import android.os.AsyncTask;
-
-import java.util.concurrent.Executor;
-
-/**
- * Helper for accessing a shared parallel Executor instance.
- *
- * @deprecated Use {@link AsyncTask} directly.
- */
-@Deprecated
-public final class ParallelExecutorCompat {
-
-    /**
-     * @deprecated Use {@link AsyncTask#THREAD_POOL_EXECUTOR} directly.
-     */
-    @Deprecated
-    public static Executor getParallelExecutor() {
-        return AsyncTask.THREAD_POOL_EXECUTOR;
-    }
-
-    private ParallelExecutorCompat() {}
-}
diff --git a/compat/java/android/support/v4/content/res/ConfigurationHelper.java b/compat/java/android/support/v4/content/res/ConfigurationHelper.java
index a337671..39b0e4a 100644
--- a/compat/java/android/support/v4/content/res/ConfigurationHelper.java
+++ b/compat/java/android/support/v4/content/res/ConfigurationHelper.java
@@ -31,45 +31,6 @@
     }
 
     /**
-     * Returns the current height of the available screen space, in dp units.
-     *
-     * <p>Uses {@code Configuration.screenHeightDp} when available, otherwise an approximation
-     * is computed and returned.</p>
-     *
-     * @deprecated Use {@link Configuration#screenHeightDp} directly.
-     */
-    @Deprecated
-    public static int getScreenHeightDp(@NonNull Resources resources) {
-        return resources.getConfiguration().screenHeightDp;
-    }
-
-    /**
-     * Returns the current width of the available screen space, in dp units.
-     *
-     * <p>Uses {@code Configuration.screenWidthDp} when available, otherwise an approximation
-     * is computed and returned.</p>
-     *
-     * @deprecated Use {@link Configuration#screenWidthDp} directly.
-     */
-    @Deprecated
-    public static int getScreenWidthDp(@NonNull Resources resources) {
-        return resources.getConfiguration().screenWidthDp;
-    }
-
-    /**
-     * Returns The smallest screen size an application will see in normal operation, in dp units.
-     *
-     * <p>Uses {@code Configuration.smallestScreenWidthDp} when available, otherwise an
-     * approximation is computed and returned.</p>
-     *
-     * @deprecated Use {@link Configuration#smallestScreenWidthDp} directly.
-     */
-    @Deprecated
-    public static int getSmallestScreenWidthDp(@NonNull Resources resources) {
-        return resources.getConfiguration().smallestScreenWidthDp;
-    }
-
-    /**
      * Returns the target screen density being rendered to.
      *
      * <p>Uses {@code Configuration.densityDpi} when available, otherwise an approximation
diff --git a/compat/java/android/support/v4/graphics/PaintCompat.java b/compat/java/android/support/v4/graphics/PaintCompat.java
index 95eee0c..b651fe6 100644
--- a/compat/java/android/support/v4/graphics/PaintCompat.java
+++ b/compat/java/android/support/v4/graphics/PaintCompat.java
@@ -17,13 +17,20 @@
 package android.support.v4.graphics;
 
 import android.graphics.Paint;
+import android.graphics.Rect;
 import android.os.Build;
 import android.support.annotation.NonNull;
+import android.support.v4.util.Pair;
 
 /**
  * Helper for accessing features in {@link Paint}.
  */
 public final class PaintCompat {
+    // U+DFFFD which is very end of unassigned plane.
+    private static final String TOFU_STRING = "\uDB3F\uDFFD";
+    private static final String EM_STRING = "m";
+
+    private static final ThreadLocal<Pair<Rect, Rect>> sRectThreadLocal = new ThreadLocal<>();
 
     /**
      * Determine whether the typeface set on the paint has a glyph supporting the
@@ -37,7 +44,75 @@
         if (Build.VERSION.SDK_INT >= 23) {
             return paint.hasGlyph(string);
         }
-        return PaintCompatApi14.hasGlyph(paint, string);
+        final int length = string.length();
+
+        if (length == 1 && Character.isWhitespace(string.charAt(0))) {
+            // measureText + getTextBounds skips whitespace so we need to special case it here
+            return true;
+        }
+
+        final float missingGlyphWidth = paint.measureText(TOFU_STRING);
+        final float emGlyphWidth = paint.measureText(EM_STRING);
+
+        final float width = paint.measureText(string);
+
+        if (width == 0f) {
+            // If the string width is 0, it can't be rendered
+            return false;
+        }
+
+        if (string.codePointCount(0, string.length()) > 1) {
+            // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences
+            // Return false if string is rendered too widely
+            if (width > 2 * emGlyphWidth) {
+                return false;
+            }
+
+            // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences (2).
+            // If width is greater than or equal to the sum of width of each code point, it is very
+            // likely that the system is using fallback fonts to draw {@code string} in two or more
+            // glyphs instead of a single ligature glyph. (hasGlyph returns false in this case.)
+            // False detections are possible (the ligature glyph may happen to have the same width
+            // as the sum width), but there are no good way to avoid them.
+            // NOTE: This heuristic does not work with proportional glyphs.
+            // NOTE: This heuristic does not work when a ZWJ sequence is partially combined.
+            // E.g. If system has a glyph for "A ZWJ B" and not for "A ZWJ B ZWJ C", this heuristic
+            // returns true for "A ZWJ B ZWJ C".
+            float sumWidth = 0;
+            int i = 0;
+            while (i < length) {
+                int charCount = Character.charCount(string.codePointAt(i));
+                sumWidth += paint.measureText(string, i, i + charCount);
+                i += charCount;
+            }
+            if (width >= sumWidth) {
+                return false;
+            }
+        }
+
+        if (width != missingGlyphWidth) {
+            // If the widths are different then its not tofu
+            return true;
+        }
+
+        // If the widths are the same, lets check the bounds. The chance of them being
+        // different chars with the same bounds is extremely small
+        final Pair<Rect, Rect> rects = obtainEmptyRects();
+        paint.getTextBounds(TOFU_STRING, 0, TOFU_STRING.length(), rects.first);
+        paint.getTextBounds(string, 0, length, rects.second);
+        return !rects.first.equals(rects.second);
+    }
+
+    private static Pair<Rect, Rect> obtainEmptyRects() {
+        Pair<Rect, Rect> rects = sRectThreadLocal.get();
+        if (rects == null) {
+            rects = new Pair<>(new Rect(), new Rect());
+            sRectThreadLocal.set(rects);
+        } else {
+            rects.first.setEmpty();
+            rects.second.setEmpty();
+        }
+        return rects;
     }
 
     private PaintCompat() {}
diff --git a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java b/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
index 5a39586..cdddb68 100644
--- a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
+++ b/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
@@ -32,7 +32,6 @@
 import android.net.NetworkInfo;
 import android.os.Build;
 import android.support.annotation.IntDef;
-import android.support.annotation.RequiresApi;
 import android.support.annotation.RequiresPermission;
 import android.support.annotation.RestrictTo;
 
@@ -43,14 +42,6 @@
  * Helper for accessing features in {@link ConnectivityManager}.
  */
 public final class ConnectivityManagerCompat {
-
-    interface ConnectivityManagerCompatImpl {
-        boolean isActiveNetworkMetered(ConnectivityManager cm);
-
-        @RestrictBackgroundStatus
-        int getRestrictBackgroundStatus(ConnectivityManager cm);
-    }
-
     /** @hide */
     @RestrictTo(LIBRARY_GROUP)
     @Retention(RetentionPolicy.SOURCE)
@@ -85,10 +76,25 @@
      */
     public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3;
 
-    static class ConnectivityManagerCompatBaseImpl implements ConnectivityManagerCompatImpl {
-        @SuppressWarnings("deprecation")
-        @Override
-        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
+    /**
+     * Returns if the currently active data network is metered. A network is
+     * classified as metered when the user is sensitive to heavy data usage on
+     * that connection due to monetary costs, data limitations or
+     * battery/performance issues. You should check this before doing large
+     * data transfers, and warn the user or delay the operation until another
+     * network is available.
+     * <p>This method requires the caller to hold the permission
+     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
+     *
+     * @return {@code true} if large transfers should be avoided, otherwise
+     *        {@code false}.
+     */
+    @SuppressWarnings("deprecation")
+    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+    public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
+        if (Build.VERSION.SDK_INT >= 16) {
+            return cm.isActiveNetworkMetered();
+        } else {
             final NetworkInfo info = cm.getActiveNetworkInfo();
             if (info == null) {
                 // err on side of caution
@@ -113,58 +119,6 @@
                     return true;
             }
         }
-
-        @Override
-        public int getRestrictBackgroundStatus(ConnectivityManager cm) {
-            return RESTRICT_BACKGROUND_STATUS_ENABLED;
-        }
-    }
-
-    @RequiresApi(16)
-    static class ConnectivityManagerCompatApi16Impl extends ConnectivityManagerCompatBaseImpl {
-        @Override
-        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
-            return cm.isActiveNetworkMetered();
-        }
-    }
-
-    @RequiresApi(24)
-    static class ConnectivityManagerCompatApi24Impl extends ConnectivityManagerCompatApi16Impl {
-        @Override
-        public int getRestrictBackgroundStatus(ConnectivityManager cm) {
-            //noinspection ResourceType
-            return cm.getRestrictBackgroundStatus();
-        }
-    }
-
-    private static final ConnectivityManagerCompatImpl IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 24) {
-            IMPL = new ConnectivityManagerCompatApi24Impl();
-        } else if (Build.VERSION.SDK_INT >= 16) {
-            IMPL = new ConnectivityManagerCompatApi16Impl();
-        } else {
-            IMPL = new ConnectivityManagerCompatBaseImpl();
-        }
-    }
-
-    /**
-     * Returns if the currently active data network is metered. A network is
-     * classified as metered when the user is sensitive to heavy data usage on
-     * that connection due to monetary costs, data limitations or
-     * battery/performance issues. You should check this before doing large
-     * data transfers, and warn the user or delay the operation until another
-     * network is available.
-     * <p>This method requires the caller to hold the permission
-     * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
-     *
-     * @return {@code true} if large transfers should be avoided, otherwise
-     *        {@code false}.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
-    public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
-        return IMPL.isActiveNetworkMetered(cm);
     }
 
     /**
@@ -174,6 +128,7 @@
      * potentially-stale value from
      * {@link ConnectivityManager#EXTRA_NETWORK_INFO}. May be {@code null}.
      */
+    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
     public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) {
         final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
         if (info != null) {
@@ -193,7 +148,11 @@
      */
     @RestrictBackgroundStatus
     public static int getRestrictBackgroundStatus(ConnectivityManager cm) {
-        return IMPL.getRestrictBackgroundStatus(cm);
+        if (Build.VERSION.SDK_INT >= 24) {
+            return cm.getRestrictBackgroundStatus();
+        } else {
+            return RESTRICT_BACKGROUND_STATUS_ENABLED;
+        }
     }
 
     private ConnectivityManagerCompat() {}
diff --git a/compat/java/android/support/v4/text/TextUtilsCompat.java b/compat/java/android/support/v4/text/TextUtilsCompat.java
index 2a77e7e..ee58ab0 100644
--- a/compat/java/android/support/v4/text/TextUtilsCompat.java
+++ b/compat/java/android/support/v4/text/TextUtilsCompat.java
@@ -29,13 +29,7 @@
  * Backwards compatible version of {@link TextUtils}.
  */
 public final class TextUtilsCompat {
-    /**
-     * @deprecated This was never meant to be public. You can create your own empty {@code Locale}
-     * by calling the constructor with empty strings.
-     */
-    @Deprecated
-    public static final Locale ROOT = new Locale("", "");
-
+    private static final Locale ROOT = new Locale("", "");
     private static final String ARAB_SCRIPT_SUBTAG = "Arab";
     private static final String HEBR_SCRIPT_SUBTAG = "Hebr";
 
@@ -132,6 +126,5 @@
         }
     }
 
-
     private TextUtilsCompat() {}
 }
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
index 924b482..cb77fd5 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
@@ -17,7 +17,6 @@
 package android.support.v4.view.accessibility;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityRecord;
 
@@ -25,79 +24,6 @@
  * Helper for accessing features in {@link AccessibilityEvent}.
  */
 public final class AccessibilityEventCompat {
-
-    static class AccessibilityEventCompatBaseImpl {
-        public void setContentChangeTypes(AccessibilityEvent event, int types) {
-        }
-
-        public int getContentChangeTypes(AccessibilityEvent event) {
-            return 0;
-        }
-
-        public void setMovementGranularity(AccessibilityEvent event, int granularity) {
-        }
-
-        public int getMovementGranularity(AccessibilityEvent event) {
-            return 0;
-        }
-
-        public void setAction(AccessibilityEvent event, int action) {
-        }
-
-        public int getAction(AccessibilityEvent event) {
-            return 0;
-        }
-    }
-
-    @RequiresApi(16)
-    static class AccessibilityEventCompatApi16Impl extends AccessibilityEventCompatBaseImpl {
-        @Override
-        public void setMovementGranularity(AccessibilityEvent event, int granularity) {
-            event.setMovementGranularity(granularity);
-        }
-
-        @Override
-        public int getMovementGranularity(AccessibilityEvent event) {
-            return event.getMovementGranularity();
-        }
-
-        @Override
-        public void setAction(AccessibilityEvent event, int action) {
-            event.setAction(action);
-        }
-
-        @Override
-        public int getAction(AccessibilityEvent event) {
-            return event.getAction();
-        }
-    }
-
-    @RequiresApi(19)
-    static class AccessibilityEventCompatApi19Impl extends AccessibilityEventCompatApi16Impl {
-
-        @Override
-        public void setContentChangeTypes(AccessibilityEvent event, int types) {
-            event.setContentChangeTypes(types);
-        }
-
-        @Override
-        public int getContentChangeTypes(AccessibilityEvent event) {
-            return event.getContentChangeTypes();
-        }
-    }
-
-    private static final AccessibilityEventCompatBaseImpl IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 19) { // KitKat
-            IMPL = new AccessibilityEventCompatApi19Impl();
-        } else if (Build.VERSION.SDK_INT >= 16) { // Jellybean
-            IMPL = new AccessibilityEventCompatApi16Impl();
-        } else {
-            IMPL = new AccessibilityEventCompatBaseImpl();
-        }
-    }
-
     /**
      * Represents the event of a hover enter over a {@link android.view.View}.
      * @deprecated Use {@link  AccessibilityEvent#TYPE_VIEW_HOVER_ENTER} directly.
@@ -335,7 +261,9 @@
      * @see #getContentChangeTypes(AccessibilityEvent)
      */
     public static void setContentChangeTypes(AccessibilityEvent event, int changeTypes) {
-        IMPL.setContentChangeTypes(event, changeTypes);
+        if (Build.VERSION.SDK_INT >= 19) {
+            event.setContentChangeTypes(changeTypes);
+        }
     }
 
     /**
@@ -352,7 +280,11 @@
      *         </ul>
      */
     public static int getContentChangeTypes(AccessibilityEvent event) {
-        return IMPL.getContentChangeTypes(event);
+        if (Build.VERSION.SDK_INT >= 19) {
+            return event.getContentChangeTypes();
+        } else {
+            return 0;
+        }
     }
 
     /**
@@ -363,7 +295,9 @@
      * @throws IllegalStateException If called from an AccessibilityService.
      */
     public void setMovementGranularity(AccessibilityEvent event, int granularity) {
-        IMPL.setMovementGranularity(event, granularity);
+        if (Build.VERSION.SDK_INT >= 16) {
+            event.setMovementGranularity(granularity);
+        }
     }
 
     /**
@@ -372,7 +306,11 @@
      * @return The granularity.
      */
     public int getMovementGranularity(AccessibilityEvent event) {
-        return IMPL.getMovementGranularity(event);
+        if (Build.VERSION.SDK_INT >= 16) {
+            return event.getMovementGranularity();
+        } else {
+            return 0;
+        }
     }
 
     /**
@@ -393,7 +331,9 @@
      * @see AccessibilityNodeInfoCompat#performAction(int)
      */
     public void setAction(AccessibilityEvent event, int action) {
-        IMPL.setAction(event, action);
+        if (Build.VERSION.SDK_INT >= 16) {
+            event.setAction(action);
+        }
     }
 
     /**
@@ -402,6 +342,10 @@
      * @return The action.
      */
     public int getAction(AccessibilityEvent event) {
-        return IMPL.getAction(event);
+        if (Build.VERSION.SDK_INT >= 16) {
+            return event.getAction();
+        } else {
+            return 0;
+        }
     }
 }
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
index 395af49..ce5d024 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
@@ -19,7 +19,6 @@
 import android.os.Build;
 import android.os.Parcelable;
 import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityRecord;
@@ -30,69 +29,6 @@
  * Helper for accessing {@link AccessibilityRecord}.
  */
 public class AccessibilityRecordCompat {
-
-    static class AccessibilityRecordCompatBaseImpl {
-        public int getMaxScrollX(AccessibilityRecord record) {
-            return 0;
-        }
-
-        public int getMaxScrollY(AccessibilityRecord record) {
-            return 0;
-        }
-
-        public void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {
-        }
-
-        public void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {
-        }
-
-        public void setSource(AccessibilityRecord record, View root, int virtualDescendantId) {
-        }
-    }
-
-    @RequiresApi(15)
-    static class AccessibilityRecordCompatApi15Impl extends AccessibilityRecordCompatBaseImpl {
-        @Override
-        public int getMaxScrollX(AccessibilityRecord record) {
-            return record.getMaxScrollX();
-        }
-
-        @Override
-        public int getMaxScrollY(AccessibilityRecord record) {
-            return record.getMaxScrollY();
-        }
-
-        @Override
-        public void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {
-            record.setMaxScrollX(maxScrollX);
-        }
-
-        @Override
-        public void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {
-            record.setMaxScrollY(maxScrollY);
-        }
-    }
-
-    @RequiresApi(16)
-    static class AccessibilityRecordCompatApi16Impl extends AccessibilityRecordCompatApi15Impl {
-        @Override
-        public void setSource(AccessibilityRecord record, View root, int virtualDescendantId) {
-            record.setSource(root, virtualDescendantId);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 16) { // JellyBean
-            IMPL = new AccessibilityRecordCompatApi16Impl();
-        } else if (Build.VERSION.SDK_INT >= 15) {  // ICS MR1
-            IMPL = new AccessibilityRecordCompatApi15Impl();
-        } else {
-            IMPL = new AccessibilityRecordCompatBaseImpl();
-        }
-    }
-
-    private static final AccessibilityRecordCompatBaseImpl IMPL;
-
     private final AccessibilityRecord mRecord;
 
     /**
@@ -197,7 +133,9 @@
      */
     public static void setSource(@NonNull AccessibilityRecord record, View root,
             int virtualDescendantId) {
-        IMPL.setSource(record, root, virtualDescendantId);
+        if (Build.VERSION.SDK_INT >= 16) {
+            record.setSource(root, virtualDescendantId);
+        }
     }
 
     /**
@@ -538,7 +476,11 @@
      * @return The max scroll.
      */
     public static int getMaxScrollX(AccessibilityRecord record) {
-        return IMPL.getMaxScrollX(record);
+        if (Build.VERSION.SDK_INT >= 15) {
+            return record.getMaxScrollX();
+        } else {
+            return 0;
+        }
     }
 
     /**
@@ -560,7 +502,9 @@
      * @param maxScrollX The max scroll.
      */
     public static void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {
-        IMPL.setMaxScrollX(record, maxScrollX);
+        if (Build.VERSION.SDK_INT >= 15) {
+            record.setMaxScrollX(maxScrollX);
+        }
     }
 
     /**
@@ -582,7 +526,11 @@
      * @return The max scroll.
      */
     public static int getMaxScrollY(AccessibilityRecord record) {
-        return IMPL.getMaxScrollY(record);
+        if (Build.VERSION.SDK_INT >= 15) {
+            return record.getMaxScrollY();
+        } else {
+            return 0;
+        }
     }
 
     /**
@@ -604,7 +552,9 @@
      * @param maxScrollY The max scroll.
      */
     public static void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {
-        IMPL.setMaxScrollY(record, maxScrollY);
+        if (Build.VERSION.SDK_INT >= 15) {
+            record.setMaxScrollY(maxScrollY);
+        }
     }
 
     /**
diff --git a/compat/java/android/support/v4/widget/TextViewCompat.java b/compat/java/android/support/v4/widget/TextViewCompat.java
index d7ca21e..5654c3e 100644
--- a/compat/java/android/support/v4/widget/TextViewCompat.java
+++ b/compat/java/android/support/v4/widget/TextViewCompat.java
@@ -44,13 +44,13 @@
     /**
      * The TextView does not auto-size text (default).
      */
-    public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0;
+    public static final int AUTO_SIZE_TEXT_TYPE_NONE = TextView.AUTO_SIZE_TEXT_TYPE_NONE;
 
     /**
      * The TextView scales text size both horizontally and vertically to fit within the
      * container.
      */
-    public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1;
+    public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM;
 
     /** @hide */
     @RestrictTo(LIBRARY_GROUP)
diff --git a/compat/lint-baseline.xml b/compat/lint-baseline.xml
index 3919eba..e961253 100644
--- a/compat/lint-baseline.xml
+++ b/compat/lint-baseline.xml
@@ -1,37 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="4" by="lint 3.0.0-alpha7">
 
-    <issue
-        id="MissingPermission"
-        message="Missing permissions required by ConnectivityManager.getActiveNetworkInfo: android.permission.ACCESS_NETWORK_STATE"
-        errorLine1="            final NetworkInfo info = cm.getActiveNetworkInfo();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="java/android/support/v4/net/ConnectivityManagerCompat.java"
-            line="92"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="MissingPermission"
-        message="Missing permissions required by ConnectivityManager.isActiveNetworkMetered: android.permission.ACCESS_NETWORK_STATE"
-        errorLine1="            return cm.isActiveNetworkMetered();"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="java/android/support/v4/net/ConnectivityManagerCompat.java"
-            line="127"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="MissingPermission"
-        message="Missing permissions required by ConnectivityManager.getNetworkInfo: android.permission.ACCESS_NETWORK_STATE"
-        errorLine1="            return cm.getNetworkInfo(info.getType());"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="java/android/support/v4/net/ConnectivityManagerCompat.java"
-            line="180"
-            column="20"/>
-    </issue>
-
 </issues>
diff --git a/content/Android.mk b/content/Android.mk
new file mode 100644
index 0000000..eff8215
--- /dev/null
+++ b/content/Android.mk
@@ -0,0 +1,29 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-content
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_SHARED_ANDROID_LIBRARIES := \
+    android-support-compat \
+    android-support-annotations
+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/content/AndroidManifest.xml b/content/AndroidManifest.xml
new file mode 100644
index 0000000..8304504
--- /dev/null
+++ b/content/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="android.support.content">
+    <uses-sdk android:minSdkVersion="14" />
+    <application>
+        <meta-data android:name="android.support.content.VERSION"
+                   android:value="${support-version}" />
+    </application>
+</manifest>
diff --git a/content/api/0.0.0.txt b/content/api/0.0.0.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/content/api/0.0.0.txt
diff --git a/content/api/27.0.0-SNAPSHOT.txt b/content/api/27.0.0-SNAPSHOT.txt
new file mode 100644
index 0000000..e0b4fa3
--- /dev/null
+++ b/content/api/27.0.0-SNAPSHOT.txt
@@ -0,0 +1,54 @@
+package android.support.content {
+
+  public class ContentPager {
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+    ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+    method public static android.os.Bundle createArgs(int, int);
+    method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+    method public void reset();
+    field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+    field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+    field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+    field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+    field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+    field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+    field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+    field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+    field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+    field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+  }
+
+  public static abstract interface ContentPager.ContentCallback {
+    method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+  }
+
+  public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface ContentPager.QueryRunner {
+    method public abstract void cancel(android.support.content.Query);
+    method public abstract boolean isRunning(android.support.content.Query);
+    method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public static abstract interface ContentPager.QueryRunner.Callback {
+    method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+    method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+  }
+
+  public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+    ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+    method public void cancel(android.support.content.Query);
+    method public boolean isRunning(android.support.content.Query);
+    method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+  }
+
+  public final class Query {
+    method public int getId();
+    method public int getLimit();
+    method public int getOffset();
+    method public android.net.Uri getUri();
+  }
+
+}
+
diff --git a/content/api/removed.txt b/content/api/removed.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/content/api/removed.txt
diff --git a/content/build.gradle b/content/build.gradle
new file mode 100644
index 0000000..93ef5f8
--- /dev/null
+++ b/content/build.gradle
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+apply plugin: android.support.SupportLibraryPlugin
+
+dependencies {
+    api project(':support-annotations')
+    api project(':support-compat')
+
+    androidTestImplementation libs.junit
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+}
+
+android {
+    defaultConfig {
+        minSdkVersion 14
+    }
+
+    sourceSets {
+        main.java.srcDirs = ['src']
+        main.res.srcDir 'res'
+    }
+}
+
+supportLibrary {
+    name 'Android Support Content'
+    inceptionYear '2017'
+    description 'Library providing support for paging across content exposed via a ContentProvider. Use of this library allows a client to avoid expensive interprocess "cursor window swaps" on the UI thread.'
+}
diff --git a/content/lint-baseline.xml b/content/lint-baseline.xml
new file mode 100644
index 0000000..e961253
--- /dev/null
+++ b/content/lint-baseline.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="4" by="lint 3.0.0-alpha7">
+
+</issues>
diff --git a/content/src/android/support/content/ContentPager.java b/content/src/android/support/content/ContentPager.java
new file mode 100644
index 0000000..71cb832
--- /dev/null
+++ b/content/src/android/support/content/ContentPager.java
@@ -0,0 +1,707 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+import static android.support.v4.util.Preconditions.checkState;
+
+import android.content.ContentResolver;
+import android.database.CrossProcessCursor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.CursorWrapper;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.OperationCanceledException;
+import android.support.annotation.GuardedBy;
+import android.support.annotation.IntDef;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresPermission;
+import android.support.annotation.VisibleForTesting;
+import android.support.annotation.WorkerThread;
+import android.support.v4.util.LruCache;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * {@link ContentPager} provides support for loading "paged" data on a background thread
+ * using the {@link ContentResolver} framework. This provides an effective compatibility
+ * layer for the ContentResolver "paging" support added in Android O. Those Android O changes,
+ * like this class, help reduce or eliminate the occurrence of expensive inter-process
+ * shared memory operations (aka "CursorWindow swaps") happening on the UI thread when
+ * working with remote providers.
+ *
+ * <p>The list of terms used in this document:
+ *
+ * <ol>"The provider" is a {@link android.content.ContentProvider} supplying data identified
+ * by a specific content {@link Uri}. A provider is the source of data, and for the sake of
+ * this documents, the provider resides in a remote process.
+
+ * <ol>"supports paging" A provider supports paging when it returns a pre-paged {@link Cursor}
+ * that honors the paging contract. See @link ContentResolver#QUERY_ARG_OFFSET} and
+ * {@link ContentResolver#QUERY_ARG_LIMIT} for details on the contract.
+
+ * <ol>"CursorWindow swaps" The process by which new data is loaded into a shared memory
+ * via a CursorWindow instance. This is a prominent contributor to UI jank in applications
+ * that use Cursor as backing data for UI elements like {@code RecyclerView}.
+ *
+ * <p><b>Details</b>
+ *
+ * <p>Data will be loaded from a content uri in one of two ways, depending on the runtime
+ * environment and if the provider supports paging.
+ *
+ * <li>If the system is Android O and greater and the provider supports paging, the Cursor
+ * will be returned, effectively unmodified, to a {@link ContentCallback} supplied by
+ * your application.
+ *
+ * <li>If the system is less than Android O or the provider does not support paging, the
+ * loader will fetch an unpaged Cursor from the provider. The unpaged Cursor will be held
+ * by the ContentPager, and data will be copied into a new cursor in a background thread.
+ * The new cursor will be returned to a {@link ContentCallback} supplied by your application.
+ *
+ * <p>In either cases, when an application employs this library it can generally assume
+ * that there will be no CursorWindow swap. But picking the right limit for records can
+ * help reduce or even eliminate some heavy lifting done to guard against swaps.
+ *
+ * <p>How do we avoid that entirely?
+ *
+ * <p><b>Picking a reasonable item limit</b>
+ *
+ * <p>Authors are encouraged to experiment with limits using real data and the widest column
+ * projection they'll use in their app. The total number of records that will fit into shared
+ * memory varies depending on multiple factors.
+ *
+ * <li>The number of columns being requested in the cursor projection. Limit the number
+ * of columns, to reduce the size of each row.
+ * <li>The size of the data in each column.
+ * <li>the Cursor type.
+ *
+ * <p>If the cursor is running in-process, there may be no need for paging. Depending on
+ * the Cursor implementation chosen there may be no shared memory/CursorWindow in use.
+ * NOTE: If the provider is running in your process, you should implement paging support
+ * inorder to make your app run fast and to consume the fewest resources possible.
+ *
+ * <p>In common cases where there is a low volume (in the hundreds) of records in the dataset
+ * being queried, all of the data should easily fit in shared memory. A debugger can be handy
+ * to understand with greater accuracy how many results can fit in shared memory. Inspect
+ * the Cursor object returned from a call to
+ * {@link ContentResolver#query(Uri, String[], String, String[], String)}. If the underlying
+ * type is a {@link android.database.CrossProcessCursor} or
+ * {@link android.database.AbstractWindowedCursor} it'll have a {@link CursorWindow} field.
+ * Check {@link CursorWindow#getNumRows()}. If getNumRows returns less than
+ * {@link Cursor#getCount}, then you've found something close to the max rows that'll
+ * fit in a page. If the data in row is expected to be relatively stable in size, reduce
+ * row count by 15-20% to get a reasonable max page size.
+ *
+ * <p><b>What if the limit I guessed was wrong?</b>
+
+ * <p>The library includes safeguards that protect against situations where an author
+ * specifies a record limit that exceeds the number of rows accessible without a CursorWindow swap.
+ * In such a circumstance, the Cursor will be adapted to report a count ({Cursor#getCount})
+ * that reflects only records available without CursorWindow swap. But this involves
+ * extra work that can be eliminated with a correct limit.
+ *
+ * <p>In addition to adjusted coujnt, {@link #EXTRA_SUGGESTED_LIMIT} will be included
+ * in cursor extras. When EXTRA_SUGGESTED_LIMIT is present in extras, the client should
+ * strongly consider using this value as the limit for subsequent queries as doing so should
+ * help avoid the ned to wrap pre-paged cursors.
+ *
+ * <p><b>Lifecycle and cleanup</b>
+ *
+ * <p>Cursors resulting from queries are owned by the requesting client. So they must be closed
+ * by the client at the appropriate time.
+ *
+ * <p>However, the library retains an internal cache of content that needs to be cleaned up.
+ * In order to cleanup, call {@link #reset()}.
+ *
+ * <p><b>Projections</b>
+ *
+ * <p>Note that projection is ignored when determining the identity of a query. When
+ * adding or removing projection, clients should call {@link #reset()} to clear
+ * cached data.
+ */
+public class ContentPager {
+
+    @VisibleForTesting
+    static final String CURSOR_DISPOSITION = "android.support.v7.widget.CURSOR_DISPOSITION";
+
+    @IntDef(value = {
+            ContentPager.CURSOR_DISPOSITION_COPIED,
+            ContentPager.CURSOR_DISPOSITION_PAGED,
+            ContentPager.CURSOR_DISPOSITION_REPAGED,
+            ContentPager.CURSOR_DISPOSITION_WRAPPED
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface CursorDisposition {}
+
+    /** The cursor size exceeded page size. A new cursor with with page data was created. */
+    public static final int CURSOR_DISPOSITION_COPIED = 1;
+
+    /**
+     * The cursor was provider paged.
+     */
+    public static final int CURSOR_DISPOSITION_PAGED = 2;
+
+    /** The cursor was pre-paged, but total size was larger than CursorWindow size. */
+    public static final int CURSOR_DISPOSITION_REPAGED = 3;
+
+    /**
+     * The cursor was not pre-paged, but total size was smaller than page size.
+     * Cursor wrapped to supply data in extras only.
+     */
+    public static final int CURSOR_DISPOSITION_WRAPPED = 4;
+
+    /** @see ContentResolver#EXTRA_HONORED_ARGS */
+    public static final String EXTRA_HONORED_ARGS = ContentResolver.EXTRA_HONORED_ARGS;
+
+    /** @see ContentResolver#EXTRA_TOTAL_COUNT */
+    public static final String EXTRA_TOTAL_COUNT = ContentResolver.EXTRA_TOTAL_COUNT;
+
+    /** @see ContentResolver#QUERY_ARG_OFFSET */
+    public static final String QUERY_ARG_OFFSET = ContentResolver.QUERY_ARG_OFFSET;
+
+    /** @see ContentResolver#QUERY_ARG_LIMIT */
+    public static final String QUERY_ARG_LIMIT = ContentResolver.QUERY_ARG_LIMIT;
+
+    /** Denotes the requested limit, if the limit was not-honored. */
+    public static final String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+
+    /** Specifies a limit likely to fit in CursorWindow limit. */
+    public static final String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+
+    private static final boolean DEBUG = false;
+    private static final String TAG = "ContentPager";
+    private static final int DEFAULT_CURSOR_CACHE_SIZE = 1;
+
+    private final QueryRunner mQueryRunner;
+    private final QueryRunner.Callback mQueryCallback;
+    private final ContentResolver mResolver;
+    private final Object mContentLock = new Object();
+    private final @GuardedBy("mContentLock") Set<Query> mActiveQueries = new HashSet<>();
+    private final @GuardedBy("mContentLock") CursorCache mCursorCache;
+
+    private final Stats mStats = new Stats();
+
+    /**
+     * Creates a new ContentPager with a default cursor cache size of 1.
+     */
+    public ContentPager(ContentResolver resolver, QueryRunner queryRunner) {
+        this(resolver, queryRunner, DEFAULT_CURSOR_CACHE_SIZE);
+    }
+
+    /**
+     * Creates a new ContentPager.
+     *
+     * @param cursorCacheSize Specifies the size of the unpaged cursor cache. If you will
+     *     only be querying a single content Uri, 1 is sufficient. If you wish to use
+     *     a single ContentPager for queries against several independent Uris this number
+     *     should be increased to reflect that. Remember that adding or modifying a
+     *     query argument creates a new Uri.
+     * @param resolver The content resolver to use when performing queries.
+     * @param queryRunner The query running to use. This provides a means of executing
+     *         queries on a background thread.
+     */
+    public ContentPager(
+            @NonNull ContentResolver resolver,
+            @NonNull QueryRunner queryRunner,
+            int cursorCacheSize) {
+
+        checkArgument(resolver != null, "'resolver' argument cannot be null.");
+        checkArgument(queryRunner != null, "'queryRunner' argument cannot be null.");
+        checkArgument(cursorCacheSize > 0, "'cursorCacheSize' argument must be greater than 0.");
+
+        mResolver = resolver;
+        mQueryRunner = queryRunner;
+        mQueryCallback = new QueryRunner.Callback() {
+
+            @WorkerThread
+            @Override
+            public @Nullable Cursor runQueryInBackground(Query query) {
+                return loadContentInBackground(query);
+            }
+
+            @MainThread
+            @Override
+            public void onQueryFinished(Query query, Cursor cursor) {
+                ContentPager.this.onCursorReady(query, cursor);
+            }
+        };
+
+        mCursorCache = new CursorCache(cursorCacheSize);
+    }
+
+    /**
+     * Initiates loading of content.
+     * For details on all params but callback, see
+     * {@link ContentResolver#query(Uri, String[], Bundle, CancellationSignal)}.
+     *
+     * @param uri The URI, using the content:// scheme, for the content to retrieve.
+     * @param projection A list of which columns to return. Passing null will return
+     *         the default project as determined by the provider. This can be inefficient,
+     *         so it is best to supply a projection.
+     * @param queryArgs A Bundle containing any arguments to the query.
+     * @param cancellationSignal A signal to cancel the operation in progress, or null if none.
+     * If the operation is canceled, then {@link OperationCanceledException} will be thrown
+     * when the query is executed.
+     * @param callback The callback that will receive the query results.
+     *
+     * @return A Query object describing the query.
+     */
+    @MainThread
+    public @NonNull Query query(
+            @NonNull @RequiresPermission.Read Uri uri,
+            @Nullable String[] projection,
+            @NonNull Bundle queryArgs,
+            @Nullable CancellationSignal cancellationSignal,
+            @NonNull ContentCallback callback) {
+
+        checkArgument(uri != null, "'uri' argument cannot be null.");
+        checkArgument(queryArgs != null, "'queryArgs' argument cannot be null.");
+        checkArgument(callback != null, "'callback' argument cannot be null.");
+
+        Query query = new Query(uri, projection, queryArgs, cancellationSignal, callback);
+
+        if (DEBUG) Log.d(TAG, "Handling query: " + query);
+
+        if (!mQueryRunner.isRunning(query)) {
+            synchronized (mContentLock) {
+                mActiveQueries.add(query);
+            }
+            mQueryRunner.query(query, mQueryCallback);
+        }
+
+        return query;
+    }
+
+    /**
+     * Clears any cached data. This method must be called in order to cleanup runtime state
+     * (like cursors).
+     */
+    @MainThread
+    public void reset() {
+        synchronized (mContentLock) {
+            if (DEBUG) Log.d(TAG, "Clearing un-paged cursor cache.");
+            mCursorCache.evictAll();
+
+            for (Query query : mActiveQueries) {
+                if (DEBUG) Log.d(TAG, "Canceling running query: " + query);
+                mQueryRunner.cancel(query);
+                query.cancel();
+            }
+
+            mActiveQueries.clear();
+        }
+    }
+
+    @WorkerThread
+    private Cursor loadContentInBackground(Query query) {
+        if (DEBUG) Log.v(TAG, "Loading cursor for query: " + query);
+        mStats.increment(Stats.EXTRA_TOTAL_QUERIES);
+
+        synchronized (mContentLock) {
+            // We have a existing unpaged-cursor for this query. Instead of running a new query
+            // via ContentResolver, we'll just copy results from that.
+            // This is the "compat" behavior.
+            if (mCursorCache.hasEntry(query.getUri())) {
+                if (DEBUG) Log.d(TAG, "Found unpaged results in cache for: " + query);
+                return createPagedCursor(query);
+            }
+        }
+
+        // We don't have an unpaged query, so we run the query using ContentResolver.
+        // It may be that no query for this URI has ever been run, so no unpaged
+        // results have been saved. Or, it may be the the provider supports paging
+        // directly, and is returning a pre-paged result set...so no unpaged
+        // cursor will ever be set.
+        Cursor cursor = query.run(mResolver);
+        mStats.increment(Stats.EXTRA_RESOLVED_QUERIES);
+
+        //       for the window. If so, communicate the overflow back to the client.
+        if (cursor == null) {
+            Log.e(TAG, "Query resulted in null cursor. " + query);
+            return null;
+        }
+
+        if (isProviderPaged(cursor)) {
+            return processProviderPagedCursor(query, cursor);
+        }
+
+        // Cache the unpaged results so we can generate pages from them on subsequent queries.
+        synchronized (mContentLock) {
+            mCursorCache.put(query.getUri(), cursor);
+            return createPagedCursor(query);
+        }
+    }
+
+    @WorkerThread
+    @GuardedBy("mContentLock")
+    private Cursor createPagedCursor(Query query) {
+        Cursor unpaged = mCursorCache.get(query.getUri());
+        checkState(unpaged != null, "No un-paged cursor in cache, or can't retrieve it.");
+
+        mStats.increment(Stats.EXTRA_COMPAT_PAGED);
+
+        if (DEBUG) Log.d(TAG, "Synthesizing cursor for page: " + query);
+        int count = Math.min(query.getLimit(), unpaged.getCount());
+
+        // don't wander off the end of the cursor.
+        if (query.getOffset() + query.getLimit() > unpaged.getCount()) {
+            count = unpaged.getCount() % query.getLimit();
+        }
+
+        if (DEBUG) Log.d(TAG, "Cursor count: " + count);
+
+        Cursor result = null;
+        // If the cursor isn't advertising support for paging, but is in-fact smaller
+        // than the page size requested, we just decorate the cursor with paging data,
+        // and wrap it without copy.
+        if (query.getOffset() == 0 && unpaged.getCount() < query.getLimit()) {
+            result = new CursorView(
+                    unpaged, unpaged.getCount(), CURSOR_DISPOSITION_WRAPPED);
+        } else {
+            // This creates an in-memory copy of the data that fits the requested page.
+            // ContentObservers registered on InMemoryCursor are directly registered
+            // on the unpaged cursor.
+            result = new InMemoryCursor(
+                    unpaged, query.getOffset(), count, CURSOR_DISPOSITION_COPIED);
+        }
+
+        mStats.includeStats(result.getExtras());
+        return result;
+    }
+
+    @WorkerThread
+    private @Nullable Cursor processProviderPagedCursor(Query query, Cursor cursor) {
+
+        CursorWindow window = getWindow(cursor);
+        int windowSize = cursor.getCount();
+        if (window != null) {
+            if (DEBUG) Log.d(TAG, "Returning provider-paged cursor.");
+            windowSize = window.getNumRows();
+        }
+
+        // Android O paging APIs are *all* about avoiding CursorWindow swaps,
+        // because the swaps need to happen on the UI thread in jank-inducing ways.
+        // But, the APIs don't *guarantee* that no window-swapping will happen
+        // when traversing a cursor.
+        //
+        // Here in the support lib, we can guarantee there is no window swapping
+        // by detecting mismatches between requested sizes and window sizes.
+        // When a mismatch is detected we can return a cursor that reports
+        // a size bounded by its CursorWindow size, and includes a suggested
+        // size to use for subsequent queries.
+
+        if (DEBUG) Log.d(TAG, "Cursor window overflow detected. Returning re-paged cursor.");
+
+        int disposition = (cursor.getCount() <= windowSize)
+                ? CURSOR_DISPOSITION_PAGED
+                : CURSOR_DISPOSITION_REPAGED;
+
+        Cursor result = new CursorView(cursor, windowSize, disposition);
+        Bundle extras = result.getExtras();
+
+        // If the orig cursor reports a size larger than the window, suggest a better limit.
+        if (cursor.getCount() > windowSize) {
+            extras.putInt(EXTRA_REQUESTED_LIMIT, query.getLimit());
+            extras.putInt(EXTRA_SUGGESTED_LIMIT, (int) (windowSize * .85));
+        }
+
+        mStats.increment(Stats.EXTRA_PROVIDER_PAGED);
+        mStats.includeStats(extras);
+        return result;
+    }
+
+    private CursorWindow getWindow(Cursor cursor) {
+        if (cursor instanceof CursorWrapper) {
+            return getWindow(((CursorWrapper) cursor).getWrappedCursor());
+        }
+        if (cursor instanceof CrossProcessCursor) {
+            return ((CrossProcessCursor) cursor).getWindow();
+        }
+        // TODO: Any other ways we can find/access windows?
+        return null;
+    }
+
+    // Called in the foreground when the cursor is ready for the client.
+    @MainThread
+    private void onCursorReady(Query query, Cursor cursor) {
+        synchronized (mContentLock) {
+            mActiveQueries.remove(query);
+        }
+
+        query.getCallback().onCursorReady(query, cursor);
+    }
+
+    /**
+     * @return true if the cursor extras contains all of the signs of being paged.
+     *     Technically we could also check SDK version since facilities for paging
+     *     were added in SDK 26, but if it looks like a duck and talks like a duck
+     *     itsa duck (especially if it helps with testing).
+     */
+    @WorkerThread
+    private boolean isProviderPaged(Cursor cursor) {
+        Bundle extras = cursor.getExtras();
+        extras = extras != null ? extras : Bundle.EMPTY;
+        String[] honoredArgs = extras.getStringArray(EXTRA_HONORED_ARGS);
+
+        return (extras.containsKey(EXTRA_TOTAL_COUNT)
+                && honoredArgs != null
+                && contains(honoredArgs, QUERY_ARG_OFFSET)
+                && contains(honoredArgs, QUERY_ARG_LIMIT));
+    }
+
+    private static <T> boolean contains(T[] array, T value) {
+        for (T element : array) {
+            if (value.equals(element)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @return Bundle populated with existing extras (if any) as well as
+     * all usefule paging related extras.
+     */
+    static Bundle buildExtras(
+            @Nullable Bundle extras, int recordCount, @CursorDisposition int cursorDisposition) {
+
+        if (extras == null || extras == Bundle.EMPTY) {
+            extras = new Bundle();
+        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            extras = extras.deepCopy();
+        }
+        // else we modify cursor extras directly, cuz that's our only choice.
+
+        extras.putInt(CURSOR_DISPOSITION, cursorDisposition);
+        if (!extras.containsKey(EXTRA_TOTAL_COUNT)) {
+            extras.putInt(EXTRA_TOTAL_COUNT, recordCount);
+        }
+
+        if (!extras.containsKey(EXTRA_HONORED_ARGS)) {
+            extras.putStringArray(EXTRA_HONORED_ARGS, new String[]{
+                    ContentPager.QUERY_ARG_OFFSET,
+                    ContentPager.QUERY_ARG_LIMIT
+            });
+        }
+
+        return extras;
+    }
+
+    /**
+     * Builds a Bundle with offset and limit values suitable for with
+     * {@link #query(Uri, String[], Bundle, CancellationSignal, ContentCallback)}.
+     *
+     * @param offset must be greater than or equal to 0.
+     * @param limit can be any value. Only values greater than or equal to 0 are respected.
+     *         If any other value results in no upper limit on results. Note that a well
+     *         behaved client should probably supply a reasonable limit. See class
+     *         documentation on how to select a limit.
+     *
+     * @return Mutable Bundle pre-populated with offset and limits vales.
+     */
+    public static @NonNull Bundle createArgs(int offset, int limit) {
+        checkArgument(offset >= 0);
+        Bundle args = new Bundle();
+        args.putInt(ContentPager.QUERY_ARG_OFFSET, offset);
+        args.putInt(ContentPager.QUERY_ARG_LIMIT, limit);
+        return args;
+    }
+
+    /**
+     * Callback by which a client receives results of a query.
+     */
+    public interface ContentCallback {
+        /**
+         * Called when paged cursor is ready. Null, if query failed.
+         * @param query The query having been executed.
+         * @param cursor the query results. Null if query couldn't be executed.
+         */
+        @MainThread
+        void onCursorReady(@NonNull Query query, @Nullable Cursor cursor);
+    }
+
+    /**
+     * Provides support for adding extras to a cursor. This is necessary
+     * as a cursor returning an extras Bundle that is either Bundle.EMPTY
+     * or null, cannot have information added to the cursor. On SDKs earlier
+     * than M, there is no facility to replace the Bundle.
+     */
+    private static final class CursorView extends CursorWrapper {
+        private final Bundle mExtras;
+        private final int mSize;
+
+        CursorView(Cursor delegate, int size, @CursorDisposition int disposition) {
+            super(delegate);
+            mSize = size;
+
+            mExtras = buildExtras(delegate.getExtras(), delegate.getCount(), disposition);
+        }
+
+        @Override
+        public int getCount() {
+            return mSize;
+        }
+
+        @Override
+        public Bundle getExtras() {
+            return mExtras;
+        }
+    }
+
+    /**
+     * LruCache holding at most {@code maxSize} cursors. Once evicted a cursor
+     * is immediately closed. The only cursor's held in this cache are
+     * unpaged results. For this purpose the cache is keyed by the URI,
+     * not the entire query. Cursors that are pre-paged by the provider
+     * are never cached.
+     */
+    private static final class CursorCache extends LruCache<Uri, Cursor> {
+        CursorCache(int maxSize) {
+            super(maxSize);
+        }
+
+        @WorkerThread
+        @Override
+        protected void entryRemoved(
+                boolean evicted, Uri uri, Cursor oldCursor, Cursor newCursor) {
+            if (!oldCursor.isClosed()) {
+                oldCursor.close();
+            }
+        }
+
+        /** @return true if an entry is present for the Uri. */
+        @WorkerThread
+        @GuardedBy("mContentLock")
+        boolean hasEntry(Uri uri) {
+            return get(uri) != null;
+        }
+    }
+
+    /**
+     * Implementations of this interface provide the mechanism
+     * for execution of queries off the UI thread.
+     */
+    public interface QueryRunner {
+        /**
+         * Execute a query.
+         * @param query The query that will be run. This value should be handed
+         *         back to the callback when ready to run in the background.
+         * @param callback The callback that should be called to both execute
+         *         the query (in the background) and to receive the results
+         *         (in the foreground).
+         */
+        void query(@NonNull Query query, @NonNull Callback callback);
+
+        /**
+         * @param query The query in question.
+         * @return true if the query is already running.
+         */
+        boolean isRunning(@NonNull Query query);
+
+        /**
+         * Attempt to cancel a (presumably) running query.
+         * @param query The query in question.
+         */
+        void cancel(@NonNull Query query);
+
+        /**
+         * Callback that receives a cursor once a query as been executed on the Runner.
+         */
+        interface Callback {
+            /**
+             * Method called on background thread where actual query is executed. This is provided
+             * by ContentPager.
+             * @param query The query to be executed.
+             */
+            @Nullable Cursor runQueryInBackground(@NonNull Query query);
+
+            /**
+             * Called on main thread when query has completed.
+             * @param query The completed query.
+             * @param cursor The results in Cursor form. Null if not successfully completed.
+             */
+            void onQueryFinished(@NonNull Query query, @Nullable Cursor cursor);
+        }
+    }
+
+    static final class Stats {
+
+        /** Identifes the total number of queries handled by ContentPager. */
+        static final String EXTRA_TOTAL_QUERIES = "android-support:extra-total-queries";
+
+        /** Identifes the number of queries handled by content resolver. */
+        static final String EXTRA_RESOLVED_QUERIES = "android-support:extra-resolved-queries";
+
+        /** Identifes the number of pages produced by way of copying. */
+        static final String EXTRA_COMPAT_PAGED = "android-support:extra-compat-paged";
+
+        /** Identifes the number of pages produced directly by a page-supporting provider. */
+        static final String EXTRA_PROVIDER_PAGED = "android-support:extra-provider-paged";
+
+        // simple stats objects tracking paged result handling.
+        private int mTotalQueries;
+        private int mResolvedQueries;
+        private int mCompatPaged;
+        private int mProviderPaged;
+
+        private void increment(String prop) {
+            switch (prop) {
+                case EXTRA_TOTAL_QUERIES:
+                    ++mTotalQueries;
+                    break;
+
+                case EXTRA_RESOLVED_QUERIES:
+                    ++mResolvedQueries;
+                    break;
+
+                case EXTRA_COMPAT_PAGED:
+                    ++mCompatPaged;
+                    break;
+
+                case EXTRA_PROVIDER_PAGED:
+                    ++mProviderPaged;
+                    break;
+
+                default:
+                    throw new IllegalArgumentException("Unknown property: " + prop);
+            }
+        }
+
+        private void reset() {
+            mTotalQueries = 0;
+            mResolvedQueries = 0;
+            mCompatPaged = 0;
+            mProviderPaged = 0;
+        }
+
+        void includeStats(Bundle bundle) {
+            bundle.putInt(EXTRA_TOTAL_QUERIES, mTotalQueries);
+            bundle.putInt(EXTRA_RESOLVED_QUERIES, mResolvedQueries);
+            bundle.putInt(EXTRA_COMPAT_PAGED, mCompatPaged);
+            bundle.putInt(EXTRA_PROVIDER_PAGED, mProviderPaged);
+        }
+    }
+}
diff --git a/content/src/android/support/content/InMemoryCursor.java b/content/src/android/support/content/InMemoryCursor.java
new file mode 100644
index 0000000..097709a
--- /dev/null
+++ b/content/src/android/support/content/InMemoryCursor.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+
+import android.database.AbstractCursor;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.database.CursorIndexOutOfBoundsException;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.RestrictTo;
+
+/**
+ * A {@link Cursor} implementation that stores information in-memory, in a type-safe fashion.
+ * Values are stored, when possible, as primitives to avoid the need for the autoboxing (as is
+ * necessary when working with MatrixCursor).
+ *
+ * <p>Unlike {@link android.database.MatrixCursor}, this cursor is not mutable at runtime.
+ * It exists solely as a destination for data copied by {@link ContentPager} from a source
+ * Cursor when a page is being synthesized. It is not anticipated at this time that this
+ * will be useful outside of this package. As such it is immutable once constructed.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+final class InMemoryCursor extends AbstractCursor {
+
+    private static final int NUM_TYPES = 5;
+
+    private final String[] mColumnNames;
+    private final int mRowCount;
+
+    // This is an index of column, by type. Maps back to position
+    // in native array.
+    // E.g. if we have columns typed like [string, int, int, string, int, int]
+    // the values in this index will be:
+    // mTypedColumnIndex[string][0] == 0
+    // mTypedColumnIndex[int][1] == 0
+    // mTypedColumnIndex[int][2] == 1
+    // mTypedColumnIndex[string][3] == 1
+    // mTypedColumnIndex[int][4] == 2
+    // mTypedColumnIndex[int][4] == 3
+    // This allows us to calculate the number of cells by type in a row
+    // which, in turn, allows us to calculate the size of the primitive storage arrays.
+    // We also use this information to lookup a particular typed value given
+    // the row offset and column offset.
+    private final int[][] mTypedColumnIndex;
+
+    // simple index to column to type.
+    private final int[] mColumnType;
+
+    // count of number of columns by type.
+    private final int[] mColumnTypeCount;
+
+    private final Bundle mExtras;
+
+    private final ObserverRelay mObserverRelay;
+
+    // Row data decomposed by type.
+    private long[] mLongs;
+    private double[] mDoubles;
+    private byte[][] mBlobs;
+    private String[] mStrings;
+
+    /**
+     * @param cursor source of data to copy. Ownership is reserved to the called, meaning
+     *               we won't ever close it.
+     */
+    InMemoryCursor(Cursor cursor, int offset, int length, int disposition) {
+        checkArgument(offset < cursor.getCount());
+
+        // NOTE: The cursor could simply be saved to a field, but we choose to wrap
+        // in a dedicated relay class to avoid hanging directly onto a reference
+        // to the cursor...so future authors are not enticed to think there's
+        // a live link between the delegate cursor and this cursor.
+        mObserverRelay = new ObserverRelay(cursor);
+
+        mColumnNames = cursor.getColumnNames();
+        mRowCount = Math.min(length, cursor.getCount() - offset);
+        int numColumns = cursor.getColumnCount();
+
+        mExtras = ContentPager.buildExtras(cursor.getExtras(), cursor.getCount(), disposition);
+
+        mColumnType = new int[numColumns];
+        mTypedColumnIndex = new int[NUM_TYPES][numColumns];
+        mColumnTypeCount = new int[NUM_TYPES];
+
+        if (!cursor.moveToFirst()) {
+            throw new RuntimeException("Can't position cursor to first row.");
+        }
+
+        for (int col = 0; col < numColumns; col++) {
+            int type = cursor.getType(col);
+            mColumnType[col] = type;
+            mTypedColumnIndex[type][col] = mColumnTypeCount[type]++;
+        }
+
+        mLongs = new long[mRowCount * mColumnTypeCount[FIELD_TYPE_INTEGER]];
+        mDoubles = new double[mRowCount * mColumnTypeCount[FIELD_TYPE_FLOAT]];
+        mBlobs = new byte[mRowCount * mColumnTypeCount[FIELD_TYPE_BLOB]][];
+        mStrings = new String[mRowCount * mColumnTypeCount[FIELD_TYPE_STRING]];
+
+        for (int row = 0; row < mRowCount; row++) {
+            if (!cursor.moveToPosition(offset + row)) {
+                throw new RuntimeException("Unable to position cursor.");
+            }
+
+            // Now copy data from the row into primitive arrays.
+            for (int col = 0; col < mColumnType.length; col++) {
+                int type = mColumnType[col];
+                int position = getCellPosition(row, col, type);
+
+                switch(type) {
+                    case FIELD_TYPE_NULL:
+                        throw new UnsupportedOperationException("Not implemented.");
+                    case FIELD_TYPE_INTEGER:
+                        mLongs[position] = cursor.getLong(col);
+                        break;
+                    case FIELD_TYPE_FLOAT:
+                        mDoubles[position] = cursor.getDouble(col);
+                        break;
+                    case FIELD_TYPE_BLOB:
+                        mBlobs[position] = cursor.getBlob(col);
+                        break;
+                    case FIELD_TYPE_STRING:
+                        mStrings[position] = cursor.getString(col);
+                        break;
+                }
+            }
+        }
+    }
+
+    @Override
+    public Bundle getExtras() {
+        return mExtras;
+    }
+
+    // Returns the "cell" position for a specific row+column+type.
+    private int getCellPosition(int row,  int col, int type) {
+        return (row * mColumnTypeCount[type]) + mTypedColumnIndex[type][col];
+    }
+
+    @Override
+    public int getCount() {
+        return mRowCount;
+    }
+
+    @Override
+    public String[] getColumnNames() {
+        return mColumnNames;
+    }
+
+    @Override
+    public short getShort(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return (short) mLongs[getCellPosition(getPosition(), column, FIELD_TYPE_INTEGER)];
+    }
+
+    @Override
+    public int getInt(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return (int) mLongs[getCellPosition(getPosition(), column, FIELD_TYPE_INTEGER)];
+    }
+
+    @Override
+    public long getLong(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return mLongs[getCellPosition(getPosition(), column, FIELD_TYPE_INTEGER)];
+    }
+
+    @Override
+    public float getFloat(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return (float) mDoubles[getCellPosition(getPosition(), column, FIELD_TYPE_FLOAT)];
+    }
+
+    @Override
+    public double getDouble(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return mDoubles[getCellPosition(getPosition(), column, FIELD_TYPE_FLOAT)];
+    }
+
+    @Override
+    public byte[] getBlob(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return mBlobs[getCellPosition(getPosition(), column, FIELD_TYPE_BLOB)];
+    }
+
+    @Override
+    public String getString(int column) {
+        checkValidColumn(column);
+        checkValidPosition();
+        return mStrings[getCellPosition(getPosition(), column, FIELD_TYPE_STRING)];
+    }
+
+    @Override
+    public int getType(int column) {
+        checkValidColumn(column);
+        return mColumnType[column];
+    }
+
+    @Override
+    public boolean isNull(int column) {
+        checkValidColumn(column);
+        switch (mColumnType[column]) {
+            case FIELD_TYPE_STRING:
+                return getString(column) != null;
+            case FIELD_TYPE_BLOB:
+                return getBlob(column) != null;
+            default:
+                return false;
+        }
+    }
+
+    private void checkValidPosition() {
+        if (getPosition() < 0) {
+            throw new CursorIndexOutOfBoundsException("Before first row.");
+        }
+        if (getPosition() >= mRowCount) {
+            throw new CursorIndexOutOfBoundsException("After last row.");
+        }
+    }
+
+    private void checkValidColumn(int column) {
+        if (column < 0 || column >= mColumnNames.length) {
+            throw new CursorIndexOutOfBoundsException(
+                    "Requested column: " + column + ", # of columns: " + mColumnNames.length);
+        }
+    }
+
+    @Override
+    public void registerContentObserver(ContentObserver observer) {
+        mObserverRelay.registerContentObserver(observer);
+    }
+
+    @Override
+    public void unregisterContentObserver(ContentObserver observer) {
+        mObserverRelay.unregisterContentObserver(observer);
+    }
+
+    private static class ObserverRelay extends ContentObserver {
+        private final Cursor mCursor;
+
+        ObserverRelay(Cursor cursor) {
+            super(new Handler(Looper.getMainLooper()));
+            mCursor = cursor;
+        }
+
+        void registerContentObserver(ContentObserver observer) {
+            mCursor.registerContentObserver(observer);
+        }
+
+        void unregisterContentObserver(ContentObserver observer) {
+            mCursor.unregisterContentObserver(observer);
+        }
+    }
+}
diff --git a/content/src/android/support/content/LoaderQueryRunner.java b/content/src/android/support/content/LoaderQueryRunner.java
new file mode 100644
index 0000000..800307b
--- /dev/null
+++ b/content/src/android/support/content/LoaderQueryRunner.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+
+import android.app.LoaderManager;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
+import android.content.Loader;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+/**
+ * A {@link ContentPager.QueryRunner} that executes queries using a {@link LoaderManager}.
+ * Use this when preparing {@link ContentPager} to run in an Activity or Fragment scope.
+ */
+public final class LoaderQueryRunner implements ContentPager.QueryRunner {
+
+    private static final boolean DEBUG = false;
+    private static final String TAG = "LoaderQueryRunner";
+    private static final String CONTENT_URI_KEY = "contentUri";
+
+    private final Context mContext;
+    private final LoaderManager mLoaderMgr;
+
+    public LoaderQueryRunner(@NonNull Context context, @NonNull LoaderManager loaderMgr) {
+        mContext = context;
+        mLoaderMgr = loaderMgr;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")  // feels spurious. But can't commit line :80 w/o this.
+    public void query(final @NonNull Query query, @NonNull final Callback callback) {
+        if (DEBUG) Log.d(TAG, "Handling query: " + query);
+
+        LoaderCallbacks callbacks = new LoaderCallbacks<Cursor>() {
+            @Override
+            public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
+                if (DEBUG) Log.i(TAG, "Loading results for query: " + query);
+                checkArgument(id == query.getId(), "Id doesn't match query id.");
+
+                return new android.content.CursorLoader(mContext) {
+                    @Override
+                    public Cursor loadInBackground() {
+                        return callback.runQueryInBackground(query);
+                    }
+                };
+            }
+
+            @Override
+            public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+                if (DEBUG) Log.i(TAG, "Finished loading: " + query);
+                mLoaderMgr.destroyLoader(query.getId());
+                callback.onQueryFinished(query, cursor);
+            }
+
+            @Override
+            public void onLoaderReset(Loader<Cursor> loader) {
+                if (DEBUG) Log.w(TAG, "Ignoring loader reset for query: " + query);
+            }
+        };
+
+        mLoaderMgr.restartLoader(query.getId(), null, callbacks);
+    }
+
+    @Override
+    public boolean isRunning(@NonNull Query query) {
+        Loader<Cursor> loader = mLoaderMgr.getLoader(query.getId());
+        return loader != null && loader.isStarted();
+        // Hmm, when exactly would the loader not be started? Does it imply that it will
+        // be starting at some point?
+    }
+
+    @Override
+    public void cancel(@NonNull Query query) {
+        mLoaderMgr.destroyLoader(query.getId());
+    }
+}
diff --git a/content/src/android/support/content/Query.java b/content/src/android/support/content/Query.java
new file mode 100644
index 0000000..a5d1ee5
--- /dev/null
+++ b/content/src/android/support/content/Query.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+
+import java.util.Arrays;
+
+/**
+ * Encapsulates information related to calling {@link ContentResolver#query},
+ * including the logic determining the best query method to call.
+ */
+public final class Query {
+
+    private static final boolean DEBUG = true;
+    private static final String TAG = "Query";
+
+    private final Uri mUri;
+    private final @Nullable String[] mProjection;
+    private final Bundle mQueryArgs;
+
+    private final int mId;
+    private final int mOffset;
+    private final int mLimit;
+
+    private final CancellationSignal mCancellationSignal;
+    private final ContentPager.ContentCallback mCallback;
+
+    @VisibleForTesting
+    Query(
+            @NonNull Uri uri,
+            @Nullable String[] projection,
+            @NonNull Bundle args,
+            @Nullable CancellationSignal cancellationSignal,
+            @NonNull ContentPager.ContentCallback callback) {
+
+        checkArgument(uri != null);
+        checkArgument(args != null);
+        checkArgument(callback != null);
+
+        this.mUri = uri;
+        this.mProjection = projection;
+        this.mQueryArgs = args;
+        this.mCancellationSignal = cancellationSignal;
+        this.mCallback = callback;
+
+        this.mOffset = args.getInt(ContentPager.QUERY_ARG_OFFSET, -1);
+        this.mLimit = args.getInt(ContentPager.QUERY_ARG_LIMIT, -1);
+
+        // NOTE: We omit mProjection and other details from ID. If a client wishes
+        // to request a page with a different mProjection or sorting, they should
+        // wait for first request to finish. Same goes for mCallback.
+        this.mId = uri.hashCode() << 16 | (mOffset | (mLimit << 8));
+
+        checkArgument(mOffset >= 0);  // mOffset must be set, mLimit is optional.
+    }
+
+    /**
+     * @return the id for this query. Derived from Uri as well as paging arguments.
+     */
+    public int getId() {
+        return mId;
+    }
+
+    /**
+     * @return the Uri.
+     */
+    public @NonNull Uri getUri() {
+        return mUri;
+    }
+
+    /**
+     * @return the offset.
+     */
+    public int getOffset() {
+        return mOffset;
+    }
+
+    /**
+     * @return the limit.
+     */
+    public int getLimit() {
+        return mLimit;
+    }
+
+    @NonNull ContentPager.ContentCallback getCallback() {
+        return mCallback;
+    }
+
+    @Nullable Cursor run(@NonNull ContentResolver resolver) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            return resolver.query(
+                    mUri,
+                    mProjection,
+                    mQueryArgs,
+                    mCancellationSignal);
+        }
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+            if (DEBUG) Log.d(TAG, "Falling back to pre-O query method.");
+            return resolver.query(
+                    mUri,
+                    mProjection,
+                    null,
+                    null,
+                    null,
+                    mCancellationSignal);
+        }
+
+        if (DEBUG) Log.d(TAG, "Falling back to pre-jellybean query method.");
+        return resolver.query(
+                mUri,
+                mProjection,
+                null,
+                null,
+                null);
+    }
+
+    void cancel() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+            if (mCancellationSignal != null && !mCancellationSignal.isCanceled()) {
+                if (DEBUG) {
+                    Log.d(TAG, "Attemping to cancel query provider processings: " + this);
+                }
+                mCancellationSignal.cancel();
+            }
+        }
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+
+        if (this == obj) {
+            return true;
+        }
+
+        if (!(obj instanceof Query)) {
+            return false;
+        }
+
+        Query other = (Query) obj;
+
+        return mId == other.mId
+                && mUri.equals(other.mUri)
+                && mOffset == other.mOffset
+                && mLimit == other.mLimit;
+    }
+
+    @Override
+    public int hashCode() {
+        return getId();
+    }
+
+    @Override
+    public String toString() {
+        return "Query{"
+                + "id:" + mId
+                + " uri:" + mUri
+                + " projection:" + Arrays.toString(mProjection)
+                + " offset:" + mOffset
+                + " limit:" + mLimit
+                + " cancellationSignal:" + mCancellationSignal
+                + " callback:" + mCallback
+                + "}";
+    }
+}
diff --git a/content/tests/AndroidManifest.xml b/content/tests/AndroidManifest.xml
new file mode 100644
index 0000000..4a815c4
--- /dev/null
+++ b/content/tests/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?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.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.content.test">
+    <uses-sdk android:minSdkVersion="14" />
+
+    <application android:supportsRtl="true">
+        <activity android:name="android.support.content.TestActivity" />
+
+        <!-- Must be run in-process for some of the test instrumentation to work correctly -->
+        <provider android:name="android.support.content.TestContentProvider"
+                  android:authorities="android.support.content.test.testpagingprovider"
+                  android:multiprocess="false" />
+    </application>
+</manifest>
diff --git a/content/tests/NO_DOCS b/content/tests/NO_DOCS
new file mode 100644
index 0000000..4dad694
--- /dev/null
+++ b/content/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/content/tests/java/android/support/content/ContentPagerTest.java b/content/tests/java/android/support/content/ContentPagerTest.java
new file mode 100644
index 0000000..fd682c6
--- /dev/null
+++ b/content/tests/java/android/support/content/ContentPagerTest.java
@@ -0,0 +1,431 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static android.support.content.ContentPager.createArgs;
+import static android.support.content.TestContentProvider.PAGED_URI;
+import static android.support.content.TestContentProvider.PAGED_WINDOWED_URI;
+import static android.support.content.TestContentProvider.UNPAGED_URI;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertFalse;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.Nullable;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class ContentPagerTest {
+
+    private ContentResolver mResolver;
+    private TestQueryRunner mRunner;
+    private TestContentCallback mCallback;
+    private ContentPager mPager;
+
+    @Rule
+    public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule(TestActivity.class);
+
+    @Before
+    public void setUp() {
+        mRunner = new TestQueryRunner();
+        mResolver = mActivityRule.getActivity().getContentResolver();
+        mCallback = new TestContentCallback();
+        mPager = new ContentPager(mResolver, mRunner);
+    }
+
+    @Test
+    public void testRelaysProviderPagedResults() throws Throwable {
+        int offset = 0;
+        int limit = 10;
+
+        // NOTE: Paging on Android O is accompolished by way of ContentResolver#query that
+        // accepts a Bundle. That means on older platforms we either have to cook up
+        // a special way of paging that doesn't use the bundle (that's what we do here)
+        // or we simply skip testing how we deal with provider paged results.
+        Uri uriWithTestPagingData = TestContentProvider.forcePagingSpec(PAGED_URI, offset, limit);
+
+        Query query = mPager.query(
+                uriWithTestPagingData,
+                null,
+                createArgs(offset, limit),
+                null,
+                mCallback);
+
+        mCallback.assertNumPagesLoaded(1);
+        mCallback.assertPageLoaded(query);
+        Cursor cursor = mCallback.getCursor(query);
+        Bundle extras = cursor.getExtras();
+
+        assertExpectedRecords(cursor, query.getOffset());
+
+        assertEquals(
+                ContentPager.CURSOR_DISPOSITION_PAGED,
+                extras.getInt(ContentPager.CURSOR_DISPOSITION, -1));
+
+        assertEquals(
+                TestContentProvider.DEFAULT_RECORD_COUNT,
+                extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+        assertHasHonoredArgs(
+                extras,
+                ContentResolver.QUERY_ARG_LIMIT,
+                ContentResolver.QUERY_ARG_OFFSET);
+
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_PROVIDER_PAGED));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+    }
+
+    @Test
+    public void testLimitsPagedResultsToWindowSize() throws Throwable {
+        int offset = 0;
+        int limit = 10;
+
+        // NOTE: Paging on Android O is accompolished by way of ContentResolver#query that
+        // accepts a Bundle. That means on older platforms we either have to cook up
+        // a special way of paging that doesn't use the bundle (that's what we do here)
+        // or we simply skip testing how we deal with provider paged results.
+        Uri uriWithTestPagingData = TestContentProvider.forcePagingSpec(
+                PAGED_WINDOWED_URI, offset, limit);
+
+        Query query = mPager.query(
+                uriWithTestPagingData,
+                null,
+                createArgs(offset, limit),
+                null,
+                mCallback);
+
+        mCallback.assertNumPagesLoaded(1);
+        mCallback.assertPageLoaded(query);
+        Cursor cursor = mCallback.getCursor(query);
+        Bundle extras = cursor.getExtras();
+
+        assertExpectedRecords(cursor, query.getOffset());
+
+        assertEquals(
+                ContentPager.CURSOR_DISPOSITION_REPAGED,
+                extras.getInt(ContentPager.CURSOR_DISPOSITION, -1));
+
+        assertEquals(
+                TestContentProvider.DEFAULT_RECORD_COUNT,
+                extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+
+        assertEquals(limit, extras.getInt(ContentPager.EXTRA_REQUESTED_LIMIT));
+
+        assertEquals(7, extras.getInt(ContentPager.EXTRA_SUGGESTED_LIMIT));
+
+        assertHasHonoredArgs(
+                extras,
+                ContentResolver.QUERY_ARG_LIMIT,
+                ContentResolver.QUERY_ARG_OFFSET);
+
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_PROVIDER_PAGED));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+    }
+
+    @Test
+    public void testAdaptsUnpagedToPaged() throws Throwable {
+        Query query = mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(0, 10),
+                null,
+                mCallback);
+
+        mCallback.assertNumPagesLoaded(1);
+        mCallback.assertPageLoaded(query);
+        Cursor cursor = mCallback.getCursor(query);
+        Bundle extras = cursor.getExtras();
+
+        assertExpectedRecords(cursor, query.getOffset());
+
+        assertEquals(
+                ContentPager.CURSOR_DISPOSITION_COPIED,
+                extras.getInt(ContentPager.CURSOR_DISPOSITION));
+
+        assertEquals(
+                TestContentProvider.DEFAULT_RECORD_COUNT,
+                extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+        assertHasHonoredArgs(
+                extras,
+                ContentResolver.QUERY_ARG_LIMIT,
+                ContentResolver.QUERY_ARG_OFFSET);
+
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+    }
+
+    @Test
+    public void testCachesUnpagedCursor() throws Throwable {
+        mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(0, 10),
+                null,
+                mCallback);
+
+        mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(10, 10),
+                null,
+                mCallback);
+
+        // Rerun the same query as the first...extra exercise to ensure we can return
+        // to previously loaded results.
+        Query query = mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(0, 10),
+                null,
+                mCallback);
+
+        mCallback.assertNumPagesLoaded(3);
+        Cursor cursor = mCallback.getCursor(query);
+        Bundle extras = cursor.getExtras();
+
+        assertEquals(
+                3,
+                extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+        assertEquals(
+                3,
+                extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+    }
+
+    @Test
+    public void testWrapsCursorsThatJustHappenToFitInPageRange() throws Throwable {
+
+        // NOTE: Paging on Android O is accompolished by way of ContentResolver#query that
+        // accepts a Bundle. That means on older platforms we either have to cook up
+        // a special way of paging that doesn't use the bundle (that's what we do here)
+        // or we simply skip testing how we deal with provider paged results.
+        Uri uri = TestContentProvider.forceRecordCount(UNPAGED_URI, 22);
+
+        Query query = mPager.query(
+                uri,
+                null,
+                createArgs(0, 44),
+                null,
+                mCallback);
+
+        mCallback.assertNumPagesLoaded(1);
+        // mCallback.assertPageLoaded(pageId);
+        mCallback.assertPageLoaded(query);
+        Cursor cursor = mCallback.getCursor(query);
+        Bundle extras = cursor.getExtras();
+
+        assertExpectedRecords(cursor, query.getOffset());
+
+        assertEquals(
+                ContentPager.CURSOR_DISPOSITION_WRAPPED,
+                extras.getInt(ContentPager.CURSOR_DISPOSITION));
+
+        assertEquals(
+                22,
+                extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+        assertHasHonoredArgs(
+                extras,
+                ContentResolver.QUERY_ARG_LIMIT,
+                ContentResolver.QUERY_ARG_OFFSET);
+
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+    }
+
+    @Test
+    public void testCorrectlyCopiesRecords_EndOfResults() throws Throwable {
+        // finally, check the last page.
+        int limit = 100;
+        // This will be the size of the last page. Should be 67.
+        int leftOvers = TestContentProvider.DEFAULT_RECORD_COUNT % limit;
+        int offset = TestContentProvider.DEFAULT_RECORD_COUNT - leftOvers;
+
+        Query query = mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(offset, limit),
+                null,
+                mCallback);
+
+        mCallback.assertNumPagesLoaded(1);
+        mCallback.assertPageLoaded(query);
+        Cursor cursor = mCallback.getCursor(query);
+        assertEquals(leftOvers, cursor.getCount());
+        Bundle extras = cursor.getExtras();
+
+        assertExpectedRecords(cursor, query.getOffset());
+
+        assertEquals(
+                ContentPager.CURSOR_DISPOSITION_COPIED,
+                extras.getInt(ContentPager.CURSOR_DISPOSITION));
+
+        assertHasHonoredArgs(
+                extras,
+                ContentResolver.QUERY_ARG_LIMIT,
+                ContentResolver.QUERY_ARG_OFFSET);
+
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+        assertEquals(
+                1,
+                extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+    }
+
+    @Test
+    public void testCancelsRunningQueriesOnReset() throws Throwable {
+        mRunner.runQuery = false;
+        Query query = mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(0, 10),
+                null,
+                mCallback);
+
+        assertTrue(mRunner.isRunning(query));
+
+        mPager.reset();
+
+        assertFalse(mRunner.isRunning(query));
+    }
+
+    @Test
+    public void testRelaysContentChangeNotificationsOnPagedCursors() throws Throwable {
+
+        TestContentObserver observer = new TestContentObserver(
+                new Handler(Looper.getMainLooper()));
+        observer.expectNotifications(1);
+
+        Query query = mPager.query(
+                UNPAGED_URI,
+                null,
+                createArgs(10, 99),
+                null,
+                mCallback);
+
+        Cursor cursor = mCallback.getCursor(query);
+        cursor.registerContentObserver(observer);
+
+        mResolver.notifyChange(UNPAGED_URI, null);
+
+        assertTrue(observer.mNotifiedLatch.await(1000, TimeUnit.MILLISECONDS));
+    }
+
+    private void assertExpectedRecords(Cursor cursor, int offset) {
+        for (int row = 0; row < cursor.getCount(); row++) {
+            assertTrue(cursor.moveToPosition(row));
+            int unpagedRow = offset + row;
+            for (int column = 0; column < cursor.getColumnCount(); column++) {
+                TestContentProvider.assertExpectedCellValue(cursor, unpagedRow, column);
+            }
+        }
+    }
+
+    private static void assertHasHonoredArgs(Bundle extras, String... expectedArgs) {
+        List<String> honored = Arrays.asList(
+                extras.getStringArray(ContentResolver.EXTRA_HONORED_ARGS));
+
+        for (String arg : expectedArgs) {
+            assertTrue(honored.contains(arg));
+        }
+    }
+
+    private static final class TestContentCallback implements ContentCallback {
+
+        private int mPagesLoaded;
+        private Map<Query, Cursor> mCursors = new HashMap<>();
+
+        @Override
+        public void onCursorReady(Query query, Cursor cursor) {
+            mPagesLoaded++;
+            mCursors.put(query, cursor);
+        }
+
+        private void assertPageLoaded(Query query) {
+            assertTrue(mCursors.containsKey(query));
+            assertNotNull(mCursors.get(query));
+        }
+
+        private void assertNumPagesLoaded(int expected) {
+            assertEquals(expected, mPagesLoaded);
+        }
+
+        private @Nullable Cursor getCursor(Query query) {
+            return mCursors.get(query);
+        }
+    }
+}
diff --git a/content/tests/java/android/support/content/LoaderQueryRunnerTest.java b/content/tests/java/android/support/content/LoaderQueryRunnerTest.java
new file mode 100644
index 0000000..a0ddd9a
--- /dev/null
+++ b/content/tests/java/android/support/content/LoaderQueryRunnerTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static android.support.content.ContentPager.createArgs;
+import static android.support.content.TestContentProvider.UNPAGED_URI;
+
+import android.app.Activity;
+import android.database.Cursor;
+import android.os.Looper;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.content.ContentPager.QueryRunner;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class LoaderQueryRunnerTest {
+
+    @Rule
+    public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule(TestActivity.class);
+
+    private Activity mActivity;
+    private QueryRunner mRunner;
+    private TestQueryCallback mCallback;
+
+    @Before
+    public void setUp() {
+        mActivity = mActivityRule.getActivity();
+        mRunner = new LoaderQueryRunner(mActivity, mActivity.getLoaderManager());
+        mCallback = new TestQueryCallback();
+    }
+
+    @Test
+    public void testRunsQuery() throws Throwable {
+        int offset = 0;
+        int limit = 10;
+
+        // Note: For some when running this test via tradefed (vs gradle) this
+        // looper setup code doesn't work when run *in setUp*. Works fine in Gradle.
+        // So this test fails when run on treehugger or run via tradefed.
+        // To work around that issue we prepare the looper here.
+        //
+        // "Wait!" you say, why do you need to prepare a looper? We're using
+        // a CursorLoader under the hoods which deep down creates an handler
+        // to listen for content changes. That's not critical to our test
+        // since we're waiting on results w/ latches, but we need to avoid the error.
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+
+        ContentCallback dummyContentCallback = new ContentCallback() {
+            @Override
+            public void onCursorReady(Query query, Cursor cursor) {
+                // Nothing to see here. Move along.
+            }
+        };
+        Query query = new Query(
+                UNPAGED_URI,
+                null,
+                createArgs(offset, limit),
+                null,
+                dummyContentCallback);
+
+        mCallback.reset(1);
+        mRunner.query(query, mCallback);
+
+        mCallback.waitFor(10);
+        mCallback.assertQueried(query.getId());
+        mCallback.assertReceivedContent(UNPAGED_URI, query.getId());
+    }
+}
diff --git a/content/tests/java/android/support/content/QueryTest.java b/content/tests/java/android/support/content/QueryTest.java
new file mode 100644
index 0000000..8943874
--- /dev/null
+++ b/content/tests/java/android/support/content/QueryTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static junit.framework.Assert.assertTrue;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class QueryTest {
+
+    private static final Uri URI_HAMMY = Uri.parse("content://hammy");
+    private static final Uri URI_CHEESY = Uri.parse("content://cheesy");
+
+    private static final ContentCallback sCallback = new ContentCallback() {
+        @Override
+        public void onCursorReady(Query query, Cursor cursor) {
+            // nothing to see here. Move along.
+        }
+    };
+
+    @Test
+    public void testDistinctIdsForDifferentUris() throws Throwable {
+        Query queryA = new Query(
+                URI_HAMMY,
+                null,
+                ContentPager.createArgs(0, 10),
+                null,
+                sCallback);
+
+        Query queryB = new Query(
+                URI_CHEESY,
+                null,
+                ContentPager.createArgs(0, 10),
+                null,
+                sCallback);
+
+        assertDistinctIds(queryA, queryB);
+    }
+
+    @Test
+    public void testDistinctIdsForDifferentPagingArgs() throws Throwable {
+        Query queryA = new Query(
+                URI_HAMMY,
+                null,
+                ContentPager.createArgs(0, 10),
+                null,
+                sCallback);
+
+        Query queryB = new Query(
+                URI_HAMMY,
+                null,
+                ContentPager.createArgs(10, 10),
+                null,
+                sCallback);
+
+        assertDistinctIds(queryA, queryB);
+    }
+
+    private void assertDistinctIds(Query a, Query b) {
+        String msg = String.format(
+                "id A (%d) and id B (%d) are equal, but should not be.",
+                a.getId(),
+                b.getId());
+        assertTrue(msg, a.getId() != b.getId());
+    }
+}
diff --git a/buildSrc/versions.gradle b/content/tests/java/android/support/content/TestActivity.java
similarity index 81%
rename from buildSrc/versions.gradle
rename to content/tests/java/android/support/content/TestActivity.java
index 43caec7..dc85c44 100644
--- a/buildSrc/versions.gradle
+++ b/content/tests/java/android/support/content/TestActivity.java
@@ -14,6 +14,12 @@
  * limitations under the License.
  */
 
-// Version code of the support library components.
-ext.supportVersion = "26.1.0-SNAPSHOT"
+package android.support.content;
 
+import android.app.Activity;
+
+/**
+ * TestActivity.
+ */
+public class TestActivity extends Activity {
+}
diff --git a/content/tests/java/android/support/content/TestContentObserver.java b/content/tests/java/android/support/content/TestContentObserver.java
new file mode 100644
index 0000000..be0004b
--- /dev/null
+++ b/content/tests/java/android/support/content/TestContentObserver.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.support.annotation.VisibleForTesting;
+
+import java.util.concurrent.CountDownLatch;
+
+final class TestContentObserver extends ContentObserver {
+
+    @VisibleForTesting
+    public CountDownLatch mNotifiedLatch;
+
+    TestContentObserver(Handler handler) {
+        super(handler);
+    }
+
+    void expectNotifications(int count) {
+        mNotifiedLatch = new CountDownLatch(count);
+    }
+
+    @Override
+    public void onChange(boolean selfChange) {
+        mNotifiedLatch.countDown();
+    }
+
+    @Override
+    public void onChange(boolean selfChange, Uri uri) {
+        mNotifiedLatch.countDown();
+    }
+}
diff --git a/content/tests/java/android/support/content/TestContentProvider.java b/content/tests/java/android/support/content/TestContentProvider.java
new file mode 100644
index 0000000..e474240
--- /dev/null
+++ b/content/tests/java/android/support/content/TestContentProvider.java
@@ -0,0 +1,396 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.AbstractWindowedCursor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.MatrixCursor;
+import android.database.MatrixCursor.RowBuilder;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+
+/**
+ * A stub data paging provider used for testing of paging support.
+ * Ignores client supplied projections.
+ */
+public final class TestContentProvider extends ContentProvider {
+
+    public static final String AUTHORITY = "android.support.content.test.testpagingprovider";
+
+    public static final String UNPAGED_PATH = "/un-paged";
+    public static final String PAGED_PATH = "/paged";
+    public static final String PAGED_WINDOWED_PATH = PAGED_PATH + "/windowed";
+
+    public static final Uri UNPAGED_URI = new Uri.Builder()
+            .scheme("content")
+            .authority(AUTHORITY)
+            .path(UNPAGED_PATH)
+            .build();
+    public static final Uri PAGED_URI = new Uri.Builder()
+            .scheme("content")
+            .authority(AUTHORITY)
+            .path(PAGED_PATH)
+            .build();
+    public static final Uri PAGED_WINDOWED_URI = new Uri.Builder()
+            .scheme("content")
+            .authority(AUTHORITY)
+            .path(PAGED_WINDOWED_PATH)
+            .build();
+
+    public static final String COLUMN_POS = "ColumnPos";
+    public static final String COLUMN_A = "ColumnA";
+    public static final String COLUMN_B = "ColumnB";
+    public static final String COLUMN_C = "ColumnC";
+    public static final String COLUMN_D = "ColumnD";
+    public static final String[] PROJECTION = {
+            COLUMN_POS,
+            COLUMN_A,
+            COLUMN_B,
+            COLUMN_C,
+            COLUMN_D
+    };
+
+    @VisibleForTesting
+    public static final String RECORD_COUNT = "test-record-count";
+
+    @VisibleForTesting
+    public static final int DEFAULT_RECORD_COUNT = 567;
+
+    private static final String TAG = "TestPagingProvider";
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Cursor query(
+            Uri uri, @Nullable String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        return query(uri, projection, null, null);
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] ignored, Bundle queryArgs,
+            CancellationSignal cancellationSignal) {
+
+        queryArgs = queryArgs != null ? queryArgs : Bundle.EMPTY;
+
+        int recordCount = getIntValue(RECORD_COUNT, queryArgs, uri, DEFAULT_RECORD_COUNT);
+        if (recordCount < 0) {
+            throw new RuntimeException("Recordset size must be >= 0");
+        }
+
+        Cursor cursor = null;
+        switch (uri.getPath()) {
+            case UNPAGED_PATH:
+                cursor = buildUnpagedResults(recordCount);
+                break;
+            case PAGED_PATH:
+                cursor = buildPagedResults(uri, queryArgs, recordCount);
+                break;
+            case PAGED_WINDOWED_PATH:
+                cursor = buildPagedWindowedResults(uri, queryArgs, recordCount);
+                break;
+            default:
+                throw new IllegalArgumentException("Unrecognized path: " + uri.getPath());
+        }
+
+        cursor.setNotificationUri(getContext().getContentResolver(), uri);
+
+        return cursor;
+    }
+
+    /**
+     * Return a int value specified in Bundle key, Uri query arg, or fallback default value.
+     */
+    private static int getIntValue(String key, Bundle queryArgs, Uri uri, int defaultValue) {
+        int value = queryArgs.getInt(key, Integer.MIN_VALUE);
+        if (value != Integer.MIN_VALUE) {
+            return value;
+        }
+
+        @Nullable String argValue = uri.getQueryParameter(key);
+        if (argValue != null) {
+            try {
+                return Integer.parseInt(argValue);
+            } catch (NumberFormatException ignored) {
+            }
+        }
+
+        return defaultValue;
+    }
+
+    private MatrixCursor buildPagedResults(Uri uri, Bundle queryArgs, int recordsetSize) {
+        int offset = getIntValue(ContentResolver.QUERY_ARG_OFFSET, queryArgs, uri, 0);
+        int limit = getIntValue(ContentResolver.QUERY_ARG_LIMIT, queryArgs, uri, recordsetSize);
+
+        MatrixCursor c = createInMemoryCursor();
+        Bundle extras = c.getExtras();
+
+        // Calculate the number of items to include in the cursor.
+        int numItems = constrain(recordsetSize - offset, 0, limit);
+
+        // Build the paged result set.
+        for (int i = offset; i < offset + numItems; i++) {
+            fillRow(c.newRow(), i);
+        }
+
+        extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[] {
+                ContentResolver.QUERY_ARG_OFFSET,
+                ContentResolver.QUERY_ARG_LIMIT
+        });
+        extras.putInt(ContentResolver.EXTRA_TOTAL_COUNT, recordsetSize);
+        return c;
+    }
+
+    private AbstractWindowedCursor buildPagedWindowedResults(
+            Uri uri, Bundle queryArgs, int recordsetSize) {
+        int offset = getIntValue(ContentResolver.QUERY_ARG_OFFSET, queryArgs, uri, 0);
+        int limit = getIntValue(ContentResolver.QUERY_ARG_LIMIT, queryArgs, uri, recordsetSize);
+
+        int windowSize = limit - 1;
+
+        TestWindowedCursor c = new TestWindowedCursor(PROJECTION, recordsetSize);
+        CursorWindow window = c.getWindow();
+        window.setNumColumns(PROJECTION.length);
+
+        Bundle extras = c.getExtras();
+
+        // Build the unpaged result set.
+        for (int row = 0; row < windowSize; row++) {
+            if (!window.allocRow()) {
+                break;
+            }
+            if (!fillRow(window, row)) {
+                window.freeLastRow();
+                break;
+            }
+        }
+
+        extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[] {
+                ContentResolver.QUERY_ARG_OFFSET,
+                ContentResolver.QUERY_ARG_LIMIT
+        });
+        extras.putInt(ContentResolver.EXTRA_TOTAL_COUNT, recordsetSize);
+        return c;
+    }
+
+    private MatrixCursor buildUnpagedResults(int recordsetSize) {
+        MatrixCursor c = createInMemoryCursor();
+
+        // Build the unpaged result set.
+        for (int i = 0; i < recordsetSize; i++) {
+            fillRow(c.newRow(), i);
+        }
+
+        return c;
+    }
+
+    /**
+     * Returns data type of the given object's value.
+     *<p>
+     * Returned values are
+     * <ul>
+     *   <li>{@link Cursor#FIELD_TYPE_NULL}</li>
+     *   <li>{@link Cursor#FIELD_TYPE_INTEGER}</li>
+     *   <li>{@link Cursor#FIELD_TYPE_FLOAT}</li>
+     *   <li>{@link Cursor#FIELD_TYPE_STRING}</li>
+     *   <li>{@link Cursor#FIELD_TYPE_BLOB}</li>
+     *</ul>
+     *</p>
+     */
+    public static int getTypeOfObject(Object obj) {
+        if (obj == null) {
+            return Cursor.FIELD_TYPE_NULL;
+        } else if (obj instanceof byte[]) {
+            return Cursor.FIELD_TYPE_BLOB;
+        } else if (obj instanceof Float || obj instanceof Double) {
+            return Cursor.FIELD_TYPE_FLOAT;
+        } else if (obj instanceof Long || obj instanceof Integer
+                || obj instanceof Short || obj instanceof Byte) {
+            return Cursor.FIELD_TYPE_INTEGER;
+        } else {
+            return Cursor.FIELD_TYPE_STRING;
+        }
+    }
+
+    private MatrixCursor createInMemoryCursor() {
+        MatrixCursor c = new MatrixCursor(PROJECTION);
+        Bundle extras = new Bundle();
+        c.setExtras(extras);
+        return c;
+    }
+
+    private void fillRow(RowBuilder row, int rowId) {
+        row.add(createCellValue(rowId, 0));
+        row.add(createCellValue(rowId, 1));
+        row.add(createCellValue(rowId, 2));
+        row.add(createCellValue(rowId, 3));
+        row.add(createCellValue(rowId, 4));
+    }
+
+    /**
+     * @return true if the row was successfully populated. If false, caller should freeLastRow.
+     */
+    private static boolean fillRow(CursorWindow window, int row) {
+        if (!window.putLong((int) createCellValue(row, 0), row, 0)) {
+            return false;
+        }
+        for (int i = 1; i < PROJECTION.length; i++) {
+            if (!window.putString((String) createCellValue(row, i), row, i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static Object createCellValue(int row, int col) {
+        switch(col) {
+            case 0:
+                return row;
+            case 1:
+                return "--aaa--" + row;
+            case 2:
+                return "**bbb**" + row;
+            case 3:
+                return ("^^ccc^^" + row);
+            case 4:
+                return "##ddd##" + row;
+            default:
+                throw new IllegalArgumentException("Unsupported column: " + col);
+        }
+    }
+
+    /**
+     * Asserts that the value at the current cursor position x column
+     * is expected test data for the supplied row.
+     *
+     * <p>Cursor must be pre-positioned.
+     *
+     * @param cursor must be prepositioned to the row to be tested.
+     * @param row row value expected to be reflected in cell. This can be different
+     *            than the cursor position due to paging.
+     * @param column
+     */
+    @VisibleForTesting
+    public static void assertExpectedCellValue(Cursor cursor, int row, int column) {
+        int type = cursor.getType(column);
+        switch(type) {
+            case Cursor.FIELD_TYPE_NULL:
+                throw new UnsupportedOperationException("Not implemented.");
+            case Cursor.FIELD_TYPE_INTEGER:
+                assertEquals(createCellValue(row, column), cursor.getInt(column));
+                break;
+            case Cursor.FIELD_TYPE_FLOAT:
+                assertEquals(createCellValue(row, column), cursor.getDouble(column));
+                break;
+            case Cursor.FIELD_TYPE_BLOB:
+                assertEquals(createCellValue(row, column), cursor.getBlob(column));
+                break;
+            case Cursor.FIELD_TYPE_STRING:
+                assertEquals(createCellValue(row, column), cursor.getString(column));
+                break;
+            default:
+                throw new UnsupportedOperationException("Unknown column type: " + type);
+        }
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+
+    private static int constrain(int amount, int low, int high) {
+        return amount < low ? low : (amount > high ? high : amount);
+    }
+
+    /**
+     * Returns a Uri that includes paging information embedded in the URI.
+     * This allows a test client to force paged results when running on older SDKs...
+     * pre Android O SDKs lacking the ContentResolver#query w/ Bundle override
+     * necessary for paging.
+     */
+    public static Uri forcePagingSpec(Uri uri, int offset, int limit) {
+        assert (uri.getPath().equals(TestContentProvider.PAGED_PATH)
+                || uri.getPath().equals(TestContentProvider.PAGED_WINDOWED_PATH));
+        return uri.buildUpon()
+                .appendQueryParameter(ContentResolver.QUERY_ARG_OFFSET, String.valueOf(offset))
+                .appendQueryParameter(ContentResolver.QUERY_ARG_LIMIT, String.valueOf(limit))
+                .build();
+    }
+
+    public static Uri forceRecordCount(Uri uri, int recordCount) {
+        return uri.buildUpon()
+                .appendQueryParameter(RECORD_COUNT, String.valueOf(recordCount))
+                .build();
+    }
+
+    private static final class TestWindowedCursor extends AbstractWindowedCursor {
+
+        private final String[] mProjection;
+        private final int mCount;
+        private final Bundle mExtras;
+
+        TestWindowedCursor(String[] projection, int count) {
+            mProjection = projection;
+            mCount = count;
+            mExtras = new Bundle();
+
+            setWindow(new CursorWindow("stevie"));
+        }
+
+        @Override
+        public Bundle getExtras() {
+            return mExtras;
+        }
+
+        @Override
+        public int getCount() {
+            return mCount;
+        }
+
+        @Override
+        public String[] getColumnNames() {
+            return mProjection;
+        }
+    }
+}
diff --git a/content/tests/java/android/support/content/TestQueryCallback.java b/content/tests/java/android/support/content/TestQueryCallback.java
new file mode 100644
index 0000000..2ed975d
--- /dev/null
+++ b/content/tests/java/android/support/content/TestQueryCallback.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.util.Pair;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+final class TestQueryCallback implements ContentPager.QueryRunner.Callback {
+
+    private static final String URI_KEY = "testUri";
+    private static final String URI_PAGE_ID = "testPageId";
+
+    private CollectorLatch<Query> mQueryLatch;
+    private CollectorLatch<Pair<Integer, Cursor>> mReplyLatch;
+
+    @Override
+    public @Nullable Cursor runQueryInBackground(Query query) {
+        mQueryLatch.accept(query);
+        Bundle extras = new Bundle();
+        extras.putParcelable(URI_KEY, query.getUri());
+        extras.putInt(URI_PAGE_ID, query.getId());
+        MatrixCursor cursor = new MatrixCursor(new String[]{"id"}, 0);
+        cursor.setExtras(extras);
+        return cursor;
+    }
+
+    @Override
+    public void onQueryFinished(Query query, Cursor cursor) {
+        mReplyLatch.accept(new Pair<>(query.getId(), cursor));
+    }
+
+    public void reset(int expectedCount) throws InterruptedException {
+        mQueryLatch = new CollectorLatch<>(expectedCount);
+        mReplyLatch = new CollectorLatch<>(expectedCount);
+    }
+
+    public void waitFor(int seconds) throws InterruptedException {
+        assertTrue(mQueryLatch.await(seconds, TimeUnit.SECONDS));
+        assertTrue(mReplyLatch.await(seconds, TimeUnit.SECONDS));
+    }
+
+    public void assertQueried(final int expectedPageId) {
+        mQueryLatch.assertHasItem(new Matcher<Query>() {
+            @Override
+            public boolean matches(Query query) {
+                return expectedPageId == query.getId();
+            }
+        });
+    }
+
+    public void assertReceivedContent(Uri expectedUri, final int expectedPageId) {
+        mReplyLatch.assertHasItem(new Matcher<Pair<Integer, Cursor>>() {
+            @Override
+            public boolean matches(Pair<Integer, Cursor> value) {
+                return expectedPageId == value.first;
+            }
+        });
+        List<Pair<Integer, Cursor>> collected = mReplyLatch.getCollected();
+        Cursor cursor = null;
+
+        for (Pair<Integer, Cursor> pair : collected) {
+            if (expectedPageId == pair.first) {
+                cursor = pair.second;
+            }
+        }
+
+        assertEquals(0, cursor.getCount());  // we don't add any records to our test cursor.
+        Bundle extras = cursor.getExtras();
+        assertNotNull(extras);
+        assertTrue(extras.containsKey(URI_KEY));
+        assertEquals(extras.getParcelable(URI_KEY), expectedUri);
+        assertTrue(extras.containsKey(URI_PAGE_ID));
+        assertEquals(extras.getInt(URI_PAGE_ID), expectedPageId);
+    }
+
+    private static final class CollectorLatch<T> extends CountDownLatch {
+
+        private final List<T> mCollected = new ArrayList<>();
+
+        CollectorLatch(int count) {
+            super(count);
+        }
+
+        void accept(@Nullable T value) {
+            onReceived(value);
+            super.countDown();
+        }
+
+        @Override
+        public void countDown() {
+            throw new UnsupportedOperationException("Count is incremented by calls to accept.");
+        }
+
+        void onReceived(@Nullable T value) {
+            mCollected.add(value);
+        }
+
+        List<T> getCollected() {
+            return mCollected;
+        }
+
+        public void assertHasItem(Matcher<T> matcher) {
+            T item = null;
+            for (T val : mCollected) {
+                if (matcher.matches(val)) {
+                    item = val;
+                }
+            }
+            assertNotNull(item);
+        }
+
+        public @Nullable T get(int index) {
+            return mCollected.get(index);
+        }
+    }
+
+    interface Matcher<T> {
+        boolean matches(T value);
+    }
+}
diff --git a/content/tests/java/android/support/content/TestQueryRunner.java b/content/tests/java/android/support/content/TestQueryRunner.java
new file mode 100644
index 0000000..957d814
--- /dev/null
+++ b/content/tests/java/android/support/content/TestQueryRunner.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.content;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Test friendly synchronous QueryRunner. Not suitable for use
+ * in production code.
+ */
+public final class TestQueryRunner implements ContentPager.QueryRunner {
+
+    // if false, we'll skip calling through to the mCallback when query is called
+    // this simulates async processing, and allows tests to check that cancel
+    // is handled correctly.
+    public boolean runQuery = true;
+
+    private final Set<Query> mRunning = new HashSet<>();
+
+    @Override
+    public void query(Query query, Callback callback) {
+        if (runQuery) {
+            callback.onQueryFinished(query, callback.runQueryInBackground(query));
+        } else {
+            mRunning.add(query);
+        }
+    }
+
+    @Override
+    public boolean isRunning(Query query) {
+        return mRunning.contains(query);
+    }
+
+    @Override
+    public void cancel(Query query) {
+        mRunning.remove(query);
+    }
+}
diff --git a/core-ui/AndroidManifest.xml b/core-ui/AndroidManifest.xml
index b952b5e..715f92c 100644
--- a/core-ui/AndroidManifest.xml
+++ b/core-ui/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.coreui">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.coreui"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.coreui.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/core-ui/api/26.1.0-SNAPSHOT.txt b/core-ui/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from core-ui/api/26.1.0-SNAPSHOT.txt
rename to core-ui/api/27.0.0-SNAPSHOT.txt
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
index 0cbea4a..6f88e9a 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -4,14 +4,10 @@
     api project(':support-annotations')
     api project(':support-compat')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation project(':support-testutils')
 }
 
@@ -29,10 +25,6 @@
     buildTypes.all {
         consumerProguardFiles 'proguard-rules.pro'
     }
-
-    testOptions {
-        unitTests.returnDefaultValues = true
-    }
 }
 
 supportLibrary {
diff --git a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java b/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
index e3f2462..602df70 100644
--- a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
+++ b/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
@@ -994,7 +994,7 @@
     protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
         final LayoutParams lp = (LayoutParams) child.getLayoutParams();
         boolean result;
-        final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);
+        final int save = canvas.save();
 
         if (mCanSlide && !lp.slideable && mSlideableView != null) {
             // Clip against the slider; no sense drawing what will immediately be covered.
diff --git a/core-ui/lint-baseline.xml b/core-ui/lint-baseline.xml
index 8961812..1062fea 100644
--- a/core-ui/lint-baseline.xml
+++ b/core-ui/lint-baseline.xml
@@ -12,15 +12,4 @@
             column="47"/>
     </issue>
 
-    <issue
-        id="WrongConstant"
-        message="Must be one or more of: Canvas.ALL_SAVE_FLAG"
-        errorLine1="        final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="java/android/support/v4/widget/SlidingPaneLayout.java"
-            line="997"
-            column="38"/>
-    </issue>
-
 </issues>
diff --git a/core-utils/AndroidManifest.xml b/core-utils/AndroidManifest.xml
index 5c10a5b..c24e023 100644
--- a/core-utils/AndroidManifest.xml
+++ b/core-utils/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.coreutils">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.coreutils"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.coreutils.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/core-utils/api/26.1.0-SNAPSHOT.txt b/core-utils/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from core-utils/api/26.1.0-SNAPSHOT.txt
rename to core-utils/api/27.0.0-SNAPSHOT.txt
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index c6e98f0..239516f 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -4,14 +4,10 @@
     api project(':support-annotations')
     api project(':support-compat')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
 }
 
 android {
diff --git a/customtabs/AndroidManifest.xml b/customtabs/AndroidManifest.xml
index 4069dae..6a25c8a 100644
--- a/customtabs/AndroidManifest.xml
+++ b/customtabs/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.customtabs">
     <uses-sdk android:minSdkVersion="15"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.customtabs.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/customtabs/api/26.1.0-SNAPSHOT.txt b/customtabs/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from customtabs/api/26.1.0-SNAPSHOT.txt
rename to customtabs/api/27.0.0-SNAPSHOT.txt
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index 17e8cb9..fe2b1cf 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -4,12 +4,8 @@
     api project(':support-compat')
     api project(':support-annotations')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
     androidTestImplementation project(':support-testutils')
 }
 
diff --git a/design/AndroidManifest.xml b/design/AndroidManifest.xml
index afae16e..aa02181 100644
--- a/design/AndroidManifest.xml
+++ b/design/AndroidManifest.xml
@@ -14,11 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.design">
-    <uses-sdk android:minSdkVersion="14"
-              tools:overrideLibrary="android.support.transition"/>
+    <uses-sdk android:minSdkVersion="14" />
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.design.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/design/api/26.1.0-SNAPSHOT.txt b/design/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from design/api/26.1.0-SNAPSHOT.txt
rename to design/api/27.0.0-SNAPSHOT.txt
diff --git a/design/src/android/support/design/widget/BottomSheetBehavior.java b/design/src/android/support/design/widget/BottomSheetBehavior.java
index a28d3be..aaa9b80 100644
--- a/design/src/android/support/design/widget/BottomSheetBehavior.java
+++ b/design/src/android/support/design/widget/BottomSheetBehavior.java
@@ -312,7 +312,9 @@
         if (mState == STATE_DRAGGING && action == MotionEvent.ACTION_DOWN) {
             return true;
         }
-        mViewDragHelper.processTouchEvent(event);
+        if (mViewDragHelper != null) {
+            mViewDragHelper.processTouchEvent(event);
+        }
         // Record the velocity
         if (action == MotionEvent.ACTION_DOWN) {
             reset();
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index 818e3a6..d97d4e6 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -232,7 +232,7 @@
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
-        resetTouchBehaviors();
+        resetTouchBehaviors(false);
         if (mNeedsPreDrawListener) {
             if (mOnPreDrawListener == null) {
                 mOnPreDrawListener = new OnPreDrawListener();
@@ -251,7 +251,7 @@
     @Override
     public void onDetachedFromWindow() {
         super.onDetachedFromWindow();
-        resetTouchBehaviors();
+        resetTouchBehaviors(false);
         if (mNeedsPreDrawListener && mOnPreDrawListener != null) {
             final ViewTreeObserver vto = getViewTreeObserver();
             vto.removeOnPreDrawListener(mOnPreDrawListener);
@@ -373,20 +373,25 @@
      * in response to an UP or CANCEL event, when intercept is request-disallowed
      * and similar cases where an event stream in progress will be aborted.
      */
-    private void resetTouchBehaviors() {
-        if (mBehaviorTouchView != null) {
-            final Behavior b = ((LayoutParams) mBehaviorTouchView.getLayoutParams()).getBehavior();
+    private void resetTouchBehaviors(boolean notifyOnInterceptTouchEvent) {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            final Behavior b = lp.getBehavior();
             if (b != null) {
                 final long now = SystemClock.uptimeMillis();
                 final MotionEvent cancelEvent = MotionEvent.obtain(now, now,
                         MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
-                b.onTouchEvent(this, mBehaviorTouchView, cancelEvent);
+                if (notifyOnInterceptTouchEvent) {
+                    b.onInterceptTouchEvent(this, child, cancelEvent);
+                } else {
+                    b.onTouchEvent(this, child, cancelEvent);
+                }
                 cancelEvent.recycle();
             }
-            mBehaviorTouchView = null;
         }
 
-        final int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
             final View child = getChildAt(i);
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
@@ -493,7 +498,7 @@
 
         // Make sure we reset in case we had missed a previous important event.
         if (action == MotionEvent.ACTION_DOWN) {
-            resetTouchBehaviors();
+            resetTouchBehaviors(true);
         }
 
         final boolean intercepted = performIntercept(ev, TYPE_ON_INTERCEPT);
@@ -503,7 +508,7 @@
         }
 
         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
-            resetTouchBehaviors();
+            resetTouchBehaviors(true);
         }
 
         return intercepted;
@@ -548,7 +553,7 @@
         }
 
         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
-            resetTouchBehaviors();
+            resetTouchBehaviors(false);
         }
 
         return handled;
@@ -558,7 +563,7 @@
     public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
         super.requestDisallowInterceptTouchEvent(disallowIntercept);
         if (disallowIntercept && !mDisallowInterceptReset) {
-            resetTouchBehaviors();
+            resetTouchBehaviors(false);
             mDisallowInterceptReset = true;
         }
     }
diff --git a/design/tests/AndroidManifest.xml b/design/tests/AndroidManifest.xml
index c4673b3..756d7c1 100755
--- a/design/tests/AndroidManifest.xml
+++ b/design/tests/AndroidManifest.xml
@@ -89,6 +89,10 @@
             android:name="android.support.design.widget.AppBarWithScrollbarsActivity"
             android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
 
+        <activity
+            android:name="android.support.design.widget.AppBarHorizontalScrollingActivity"
+            android:theme="@style/Theme.AppCompat.NoActionBar"/>
+
     </application>
 
 </manifest>
diff --git a/design/tests/res/layout/design_appbar_horizontal_scrolling.xml b/design/tests/res/layout/design_appbar_horizontal_scrolling.xml
new file mode 100644
index 0000000..131a07e
--- /dev/null
+++ b/design/tests/res/layout/design_appbar_horizontal_scrolling.xml
@@ -0,0 +1,89 @@
+<?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.
+  -->
+
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
+
+    <android.support.design.widget.AppBarLayout
+        android:id="@+id/app_bar"
+        android:layout_width="match_parent"
+        android:layout_height="200dp"
+        android:fitsSystemWindows="true">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+            android:id="@+id/toolbar_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:fitsSystemWindows="true"
+            app:contentScrim="?attr/colorPrimary"
+            app:layout_scrollFlags="scroll|exitUntilCollapsed">
+
+            <HorizontalScrollView
+                android:id="@+id/hsv"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <View
+                        android:layout_width="200dp"
+                        android:layout_height="200dp"
+                        android:background="#ff0000"/>
+
+                    <View
+                        android:layout_width="900dp"
+                        android:layout_height="200dp"
+                        android:background="#00ff00"/>
+
+                    <View
+                        android:layout_width="900dp"
+                        android:layout_height="200dp"
+                        android:background="#0000ff"/>
+                </LinearLayout>
+            </HorizontalScrollView>
+
+            <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_width="match_parent"
+                android:layout_height="?attr/actionBarSize"
+                app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+    </android.support.design.widget.AppBarLayout>
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+        <Button
+            android:id="@+id/button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="24dp"
+            android:text="@string/text1"/>
+
+    </FrameLayout>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java
new file mode 100644
index 0000000..960dbd9
--- /dev/null
+++ b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.design.widget;
+
+import android.os.Bundle;
+import android.support.design.test.R;
+import android.support.v7.widget.Toolbar;
+
+public class AppBarHorizontalScrollingActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.design_appbar_horizontal_scrolling;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+    }
+}
diff --git a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java
new file mode 100644
index 0000000..ccda8b0
--- /dev/null
+++ b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.design.widget;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.swipeLeft;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.os.SystemClock;
+import android.support.design.test.R;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.HorizontalScrollView;
+
+import org.junit.Test;
+
+/**
+ * Testing that if we have a {@link AppBarLayout} child that intercepts touch events (such as
+ * {@link HorizontalScrollView} that handles horizontal swipes), that does not interfere with
+ * event handling after the event sequence is no longer being intercepted by that child.
+ */
+@LargeTest
+public class AppBarHorizontalScrollingTest extends
+        BaseInstrumentationTestCase<AppBarHorizontalScrollingActivity> {
+
+    public AppBarHorizontalScrollingTest() {
+        super(AppBarHorizontalScrollingActivity.class);
+    }
+
+    @Test
+    public void testScrollAndClick() throws Throwable {
+        final Activity activity = mActivityTestRule.getActivity();
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+
+        final Button button = activity.findViewById(R.id.button);
+        final View.OnClickListener mockClickListener = mock(View.OnClickListener.class);
+        button.setOnClickListener(mockClickListener);
+
+        // Emulate a click on the button to verify that the registered listener is invoked
+        // prior to performing a horizontal swipe across the app bar
+        final int[] buttonXY = new int[2];
+        button.getLocationOnScreen(buttonXY);
+        final int buttonWidth = button.getWidth();
+        final int buttonHeight = button.getHeight();
+        final float emulatedTapX = buttonXY[0] + buttonWidth / 2.0f;
+        final float emulatedTapY = buttonXY[1] + buttonHeight / 2.0f;
+
+        emulateButtonClick(instrumentation, emulatedTapX, emulatedTapY);
+        verify(mockClickListener).onClick(button);
+        reset(mockClickListener);
+
+        final HorizontalScrollView hsv = activity.findViewById(R.id.hsv);
+        final int scrollXBefore = hsv.getScrollX();
+        // Now scroll / swipe horizontally across our scrollable content in the app bar
+        onView(withId(R.id.app_bar)).perform(swipeLeft());
+        assertTrue("Horizontal scroll performed", hsv.getScrollX() > scrollXBefore);
+
+        // And emulate another click on the button to verify that the registered listener is still
+        // invoked immediately after performing the horizontal swipe across the app bar
+        emulateButtonClick(instrumentation, emulatedTapX, emulatedTapY);
+        verify(mockClickListener).onClick(button);
+    }
+
+    private void emulateButtonClick(Instrumentation instrumentation, float emulatedTapX,
+            float emulatedTapY) {
+        // Note that the reason to not use Espresso's click() view action is so that we can
+        // faithfully emulate what was happening in the reported bug. We don't want the events
+        // to be sent directly to the button, but rather be processed by the parent coordinator
+        // layout, so that we reproduce what is happening as the events are processed at the level
+        // of that parent.
+
+        // Inject DOWN event
+        long downTime = SystemClock.uptimeMillis();
+        MotionEvent eventDown = MotionEvent.obtain(
+                downTime, downTime, MotionEvent.ACTION_DOWN, emulatedTapX, emulatedTapY, 1);
+        instrumentation.sendPointerSync(eventDown);
+
+        // Inject MOVE event
+        long moveTime = SystemClock.uptimeMillis();
+        MotionEvent eventMove = MotionEvent.obtain(
+                moveTime, moveTime, MotionEvent.ACTION_MOVE, emulatedTapX, emulatedTapY, 1);
+        instrumentation.sendPointerSync(eventMove);
+
+        // Inject UP event
+        long upTime = SystemClock.uptimeMillis();
+        MotionEvent eventUp = MotionEvent.obtain(
+                upTime, upTime, MotionEvent.ACTION_UP, emulatedTapX, emulatedTapY, 1);
+        instrumentation.sendPointerSync(eventUp);
+
+        // Wait for the system to process all events in the queue
+        instrumentation.waitForIdleSync();
+    }
+}
diff --git a/design/tests/src/android/support/design/widget/BaseTestActivity.java b/design/tests/src/android/support/design/widget/BaseTestActivity.java
index bdeb231..4662001 100755
--- a/design/tests/src/android/support/design/widget/BaseTestActivity.java
+++ b/design/tests/src/android/support/design/widget/BaseTestActivity.java
@@ -17,6 +17,7 @@
 package android.support.design.widget;
 
 import android.os.Bundle;
+import android.support.annotation.LayoutRes;
 import android.support.design.testutils.RecreatedAppCompatActivity;
 import android.view.WindowManager;
 
@@ -44,6 +45,7 @@
         overridePendingTransition(0, 0);
     }
 
+    @LayoutRes
     protected abstract int getContentViewLayoutResId();
 
     protected void onContentViewSet() {}
diff --git a/droiddoc.mk b/droiddoc.mk
deleted file mode 100644
index 0913f5f..0000000
--- a/droiddoc.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# API Level information for the Support Library, which is currently
-# included as part of the core framework docs build.
-SUPPORT_PATH := $(call my-dir)
-
-framework_docs_LOCAL_DROIDDOC_OPTIONS += \
-    -since $(SUPPORT_PATH)/api/22.0.0.txt 22.0.0 \
-    -since $(SUPPORT_PATH)/api/22.1.0.txt 22.1.0 \
-    -since $(SUPPORT_PATH)/api/22.2.0.txt 22.2.0 \
-    -since $(SUPPORT_PATH)/api/22.2.1.txt 22.2.1 \
-    -since $(SUPPORT_PATH)/api/23.0.0.txt 23.0.0 \
-    -since $(SUPPORT_PATH)/api/23.1.0.txt 23.1.0 \
-    -since $(SUPPORT_PATH)/api/23.1.1.txt 23.1.1 \
-    -since $(SUPPORT_PATH)/api/23.2.0.txt 23.2.0 \
-    -since $(SUPPORT_PATH)/api/23.2.1.txt 23.2.1 \
-    -since $(SUPPORT_PATH)/api/23.4.0.txt 23.4.0 \
-    -since $(SUPPORT_PATH)/api/24.0.0.txt 24.0.0 \
-    -since $(SUPPORT_PATH)/api/24.1.0.txt 24.1.0 \
-    -since $(SUPPORT_PATH)/api/24.2.0.txt 24.2.0 \
-    -since $(SUPPORT_PATH)/api/25.0.0.txt 25.0.0 \
-    -since $(SUPPORT_PATH)/api/25.1.0.txt 25.1.0 \
-    -since $(SUPPORT_PATH)/api/25.2.0.txt 25.2.0 \
-    -since $(SUPPORT_PATH)/api/25.3.0.txt 25.3.0 \
-    -since $(SUPPORT_PATH)/api/25.4.0.txt 25.4.0 \
-    -since $(SUPPORT_PATH)/api/26.0.0-alpha1.txt 26.0.0-alpha1 \
-    -since $(SUPPORT_PATH)/api/26.0.0-beta1.txt 26.0.0-beta1 \
-    -since $(SUPPORT_PATH)/api/26.0.0-beta2.txt 26.0.0-beta2
diff --git a/dynamic-animation/AndroidManifest.xml b/dynamic-animation/AndroidManifest.xml
index f818402..a46ea43 100644
--- a/dynamic-animation/AndroidManifest.xml
+++ b/dynamic-animation/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.dynamicanimation">
     <uses-sdk android:minSdkVersion="16"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.dynamicanimation.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/dynamic-animation/api/26.1.0-SNAPSHOT.txt b/dynamic-animation/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from dynamic-animation/api/26.1.0-SNAPSHOT.txt
rename to dynamic-animation/api/27.0.0-SNAPSHOT.txt
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index 2667bef..8ceaaf3 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -3,14 +3,10 @@
 dependencies {
     api project(':support-core-utils')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
 }
 
 android {
diff --git a/emoji/appcompat/AndroidManifest.xml b/emoji/appcompat/AndroidManifest.xml
index b44bda7..8261137 100644
--- a/emoji/appcompat/AndroidManifest.xml
+++ b/emoji/appcompat/AndroidManifest.xml
@@ -18,6 +18,7 @@
           package="android.support.text.emoji.appcompat">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.text.emoji.appcompat.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/emoji/appcompat/api/26.1.0-SNAPSHOT.txt b/emoji/appcompat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/appcompat/api/26.1.0-SNAPSHOT.txt
rename to emoji/appcompat/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/appcompat/build.gradle b/emoji/appcompat/build.gradle
index 05bff7f..a545352 100644
--- a/emoji/appcompat/build.gradle
+++ b/emoji/appcompat/build.gradle
@@ -23,8 +23,6 @@
 }
 
 android {
-    compileSdkVersion project.ext.currentSdk
-
     defaultConfig {
         minSdkVersion 14
     }
diff --git a/emoji/bundled/AndroidManifest.xml b/emoji/bundled/AndroidManifest.xml
index 3d3a684..a2b14cf 100644
--- a/emoji/bundled/AndroidManifest.xml
+++ b/emoji/bundled/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.text.emoji.bundled">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.text.emoji.bundled.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
\ No newline at end of file
diff --git a/emoji/bundled/api/26.1.0-SNAPSHOT.txt b/emoji/bundled/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/bundled/api/26.1.0-SNAPSHOT.txt
rename to emoji/bundled/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/bundled/build.gradle b/emoji/bundled/build.gradle
index 1309a72..10eecb2 100644
--- a/emoji/bundled/build.gradle
+++ b/emoji/bundled/build.gradle
@@ -5,8 +5,6 @@
 }
 
 android {
-    compileSdkVersion project.ext.currentSdk
-
     defaultConfig {
         minSdkVersion 14
     }
diff --git a/emoji/core/AndroidManifest.xml b/emoji/core/AndroidManifest.xml
index 1a7b7f4..1143f40 100644
--- a/emoji/core/AndroidManifest.xml
+++ b/emoji/core/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.text.emoji">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.text.emoji.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/emoji/core/api/26.1.0-SNAPSHOT.txt b/emoji/core/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/core/api/26.1.0-SNAPSHOT.txt
rename to emoji/core/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 75d1b45..31de0d0 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -16,20 +16,14 @@
 
     api project(':support-compat')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation project(':support-testutils')
 }
 
 android {
-    compileSdkVersion project.ext.currentSdk
-
     defaultConfig {
         minSdkVersion 14
     }
diff --git a/exifinterface/AndroidManifest.xml b/exifinterface/AndroidManifest.xml
index 344b99b..8c449f7 100644
--- a/exifinterface/AndroidManifest.xml
+++ b/exifinterface/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.exifinterface">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.exifinterface.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/exifinterface/api/26.1.0-SNAPSHOT.txt b/exifinterface/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from exifinterface/api/26.1.0-SNAPSHOT.txt
rename to exifinterface/api/27.0.0-SNAPSHOT.txt
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index 26b6069..5a9d602 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -3,9 +3,7 @@
 dependencies {
     api project(':support-annotations')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/fragment/AndroidManifest.xml b/fragment/AndroidManifest.xml
index 725fe43..4d532bd 100644
--- a/fragment/AndroidManifest.xml
+++ b/fragment/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.fragment">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.fragment"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.fragment.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/fragment/api/26.1.0-SNAPSHOT.txt b/fragment/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from fragment/api/26.1.0-SNAPSHOT.txt
rename to fragment/api/27.0.0-SNAPSHOT.txt
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 0f030c4..b484bc4 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -6,14 +6,10 @@
     api project(':support-core-utils')
     api project(':support-annotations')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
 }
 
 android {
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/java/android/support/v4/app/Fragment.java
index f8e3d47..7639568 100644
--- a/fragment/java/android/support/v4/app/Fragment.java
+++ b/fragment/java/android/support/v4/app/Fragment.java
@@ -39,7 +39,6 @@
 import android.support.v4.util.SimpleArrayMap;
 import android.support.v4.view.LayoutInflaterCompat;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.util.SparseArray;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
@@ -57,119 +56,6 @@
 import java.io.PrintWriter;
 import java.lang.reflect.InvocationTargetException;
 
-final class FragmentState implements Parcelable {
-    final String mClassName;
-    final int mIndex;
-    final boolean mFromLayout;
-    final int mFragmentId;
-    final int mContainerId;
-    final String mTag;
-    final boolean mRetainInstance;
-    final boolean mDetached;
-    final Bundle mArguments;
-    final boolean mHidden;
-
-    Bundle mSavedFragmentState;
-
-    Fragment mInstance;
-
-    public FragmentState(Fragment frag) {
-        mClassName = frag.getClass().getName();
-        mIndex = frag.mIndex;
-        mFromLayout = frag.mFromLayout;
-        mFragmentId = frag.mFragmentId;
-        mContainerId = frag.mContainerId;
-        mTag = frag.mTag;
-        mRetainInstance = frag.mRetainInstance;
-        mDetached = frag.mDetached;
-        mArguments = frag.mArguments;
-        mHidden = frag.mHidden;
-    }
-
-    public FragmentState(Parcel in) {
-        mClassName = in.readString();
-        mIndex = in.readInt();
-        mFromLayout = in.readInt() != 0;
-        mFragmentId = in.readInt();
-        mContainerId = in.readInt();
-        mTag = in.readString();
-        mRetainInstance = in.readInt() != 0;
-        mDetached = in.readInt() != 0;
-        mArguments = in.readBundle();
-        mHidden = in.readInt() != 0;
-        mSavedFragmentState = in.readBundle();
-    }
-
-    public Fragment instantiate(FragmentHostCallback host, FragmentContainer container,
-            Fragment parent, FragmentManagerNonConfig childNonConfig) {
-        if (mInstance == null) {
-            final Context context = host.getContext();
-            if (mArguments != null) {
-                mArguments.setClassLoader(context.getClassLoader());
-            }
-
-            if (container != null) {
-                mInstance = container.instantiate(context, mClassName, mArguments);
-            } else {
-                mInstance = Fragment.instantiate(context, mClassName, mArguments);
-            }
-
-            if (mSavedFragmentState != null) {
-                mSavedFragmentState.setClassLoader(context.getClassLoader());
-                mInstance.mSavedFragmentState = mSavedFragmentState;
-            }
-            mInstance.setIndex(mIndex, parent);
-            mInstance.mFromLayout = mFromLayout;
-            mInstance.mRestored = true;
-            mInstance.mFragmentId = mFragmentId;
-            mInstance.mContainerId = mContainerId;
-            mInstance.mTag = mTag;
-            mInstance.mRetainInstance = mRetainInstance;
-            mInstance.mDetached = mDetached;
-            mInstance.mHidden = mHidden;
-            mInstance.mFragmentManager = host.mFragmentManager;
-
-            if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
-                    "Instantiated fragment " + mInstance);
-        }
-        mInstance.mChildNonConfig = childNonConfig;
-        return mInstance;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mClassName);
-        dest.writeInt(mIndex);
-        dest.writeInt(mFromLayout ? 1 : 0);
-        dest.writeInt(mFragmentId);
-        dest.writeInt(mContainerId);
-        dest.writeString(mTag);
-        dest.writeInt(mRetainInstance ? 1 : 0);
-        dest.writeInt(mDetached ? 1 : 0);
-        dest.writeBundle(mArguments);
-        dest.writeInt(mHidden? 1 : 0);
-        dest.writeBundle(mSavedFragmentState);
-    }
-
-    public static final Parcelable.Creator<FragmentState> CREATOR
-            = new Parcelable.Creator<FragmentState>() {
-        @Override
-        public FragmentState createFromParcel(Parcel in) {
-            return new FragmentState(in);
-        }
-
-        @Override
-        public FragmentState[] newArray(int size) {
-            return new FragmentState[size];
-        }
-    };
-}
-
 /**
  * Static library support version of the framework's {@link android.app.Fragment}.
  * Used to write apps that run on platforms prior to Android 3.0.  When running
diff --git a/fragment/java/android/support/v4/app/FragmentState.java b/fragment/java/android/support/v4/app/FragmentState.java
new file mode 100644
index 0000000..dbe6327
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentState.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.app;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+final class FragmentState implements Parcelable {
+    final String mClassName;
+    final int mIndex;
+    final boolean mFromLayout;
+    final int mFragmentId;
+    final int mContainerId;
+    final String mTag;
+    final boolean mRetainInstance;
+    final boolean mDetached;
+    final Bundle mArguments;
+    final boolean mHidden;
+
+    Bundle mSavedFragmentState;
+
+    Fragment mInstance;
+
+    FragmentState(Fragment frag) {
+        mClassName = frag.getClass().getName();
+        mIndex = frag.mIndex;
+        mFromLayout = frag.mFromLayout;
+        mFragmentId = frag.mFragmentId;
+        mContainerId = frag.mContainerId;
+        mTag = frag.mTag;
+        mRetainInstance = frag.mRetainInstance;
+        mDetached = frag.mDetached;
+        mArguments = frag.mArguments;
+        mHidden = frag.mHidden;
+    }
+
+    FragmentState(Parcel in) {
+        mClassName = in.readString();
+        mIndex = in.readInt();
+        mFromLayout = in.readInt() != 0;
+        mFragmentId = in.readInt();
+        mContainerId = in.readInt();
+        mTag = in.readString();
+        mRetainInstance = in.readInt() != 0;
+        mDetached = in.readInt() != 0;
+        mArguments = in.readBundle();
+        mHidden = in.readInt() != 0;
+        mSavedFragmentState = in.readBundle();
+    }
+
+    public Fragment instantiate(FragmentHostCallback host, FragmentContainer container,
+            Fragment parent, FragmentManagerNonConfig childNonConfig) {
+        if (mInstance == null) {
+            final Context context = host.getContext();
+            if (mArguments != null) {
+                mArguments.setClassLoader(context.getClassLoader());
+            }
+
+            if (container != null) {
+                mInstance = container.instantiate(context, mClassName, mArguments);
+            } else {
+                mInstance = Fragment.instantiate(context, mClassName, mArguments);
+            }
+
+            if (mSavedFragmentState != null) {
+                mSavedFragmentState.setClassLoader(context.getClassLoader());
+                mInstance.mSavedFragmentState = mSavedFragmentState;
+            }
+            mInstance.setIndex(mIndex, parent);
+            mInstance.mFromLayout = mFromLayout;
+            mInstance.mRestored = true;
+            mInstance.mFragmentId = mFragmentId;
+            mInstance.mContainerId = mContainerId;
+            mInstance.mTag = mTag;
+            mInstance.mRetainInstance = mRetainInstance;
+            mInstance.mDetached = mDetached;
+            mInstance.mHidden = mHidden;
+            mInstance.mFragmentManager = host.mFragmentManager;
+
+            if (FragmentManagerImpl.DEBUG) {
+                Log.v(FragmentManagerImpl.TAG, "Instantiated fragment " + mInstance);
+            }
+        }
+        mInstance.mChildNonConfig = childNonConfig;
+        return mInstance;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mClassName);
+        dest.writeInt(mIndex);
+        dest.writeInt(mFromLayout ? 1 : 0);
+        dest.writeInt(mFragmentId);
+        dest.writeInt(mContainerId);
+        dest.writeString(mTag);
+        dest.writeInt(mRetainInstance ? 1 : 0);
+        dest.writeInt(mDetached ? 1 : 0);
+        dest.writeBundle(mArguments);
+        dest.writeInt(mHidden ? 1 : 0);
+        dest.writeBundle(mSavedFragmentState);
+    }
+
+    public static final Parcelable.Creator<FragmentState> CREATOR =
+            new Parcelable.Creator<FragmentState>() {
+                @Override
+                public FragmentState createFromParcel(Parcel in) {
+                    return new FragmentState(in);
+                }
+
+                @Override
+                public FragmentState[] newArray(int size) {
+                    return new FragmentState[size];
+                }
+            };
+}
diff --git a/graphics/drawable/animated/AndroidManifest.xml b/graphics/drawable/animated/AndroidManifest.xml
index b59fa47..ec4a4a6 100644
--- a/graphics/drawable/animated/AndroidManifest.xml
+++ b/graphics/drawable/animated/AndroidManifest.xml
@@ -17,6 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.graphics.drawable.animated">
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.graphics.drawable.animated.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/graphics/drawable/animated/api/26.1.0-SNAPSHOT.txt b/graphics/drawable/animated/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from graphics/drawable/animated/api/26.1.0-SNAPSHOT.txt
rename to graphics/drawable/animated/api/27.0.0-SNAPSHOT.txt
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index f218e0b..3dcf04c 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -4,12 +4,8 @@
     api project(':support-vector-drawable')
     api project(':support-core-ui')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/graphics/drawable/static/AndroidManifest.xml b/graphics/drawable/static/AndroidManifest.xml
index 14821a8..d8427ca 100644
--- a/graphics/drawable/static/AndroidManifest.xml
+++ b/graphics/drawable/static/AndroidManifest.xml
@@ -17,6 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.support.graphics.drawable">
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.graphics.drawable.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/graphics/drawable/static/api/26.1.0-SNAPSHOT.txt b/graphics/drawable/static/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from graphics/drawable/static/api/26.1.0-SNAPSHOT.txt
rename to graphics/drawable/static/api/27.0.0-SNAPSHOT.txt
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index e820bb1..d3b517f 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -4,9 +4,7 @@
     api project(':support-annotations')
     api project(':support-compat')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
index b68ef1b..2c7ae41 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
@@ -47,8 +47,8 @@
 import android.support.v4.graphics.PathParser;
 import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.util.ArrayMap;
+import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
-import android.util.LayoutDirection;
 import android.util.Log;
 import android.util.Xml;
 
@@ -820,7 +820,7 @@
     private boolean needMirroring() {
         if (Build.VERSION.SDK_INT >= 17) {
             return isAutoMirrored()
-                    && DrawableCompat.getLayoutDirection(this) == LayoutDirection.RTL;
+                    && DrawableCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
         } else {
             return false;
         }
@@ -1642,13 +1642,14 @@
         /////////////////////////////////////////////////////
         // Variables below need to be copied (deep copy if applicable) for mutation.
         private int[] mThemeAttrs;
-
+        private static final int FILL_TYPE_WINDING = 0;
         int mStrokeColor = Color.TRANSPARENT;
         float mStrokeWidth = 0;
 
         int mFillColor = Color.TRANSPARENT;
         float mStrokeAlpha = 1.0f;
-        int mFillRule = 0; // 0 is default value as "non-zero" fill type.
+        // Default fill rule is winding, or as known as "non-zero".
+        int mFillRule = FILL_TYPE_WINDING;
         float mFillAlpha = 1.0f;
         float mTrimPathStart = 0;
         float mTrimPathEnd = 1;
diff --git a/lifecycle/common/build.gradle b/lifecycle/common/build.gradle
index 1b64d9d..d237d30 100644
--- a/lifecycle/common/build.gradle
+++ b/lifecycle/common/build.gradle
@@ -1,3 +1,5 @@
+import android.support.LibraryVersions
+
 apply plugin: 'java'
 apply plugin: 'maven'
 
@@ -10,4 +12,4 @@
 }
 
 createAndroidCheckstyle(project)
-version = "1.0.0-SNAPSHOT"
\ No newline at end of file
+version = LibraryVersions.LIFECYCLES.toString()
\ No newline at end of file
diff --git a/lifecycle/reactivestreams/src/main/AndroidManifest.xml b/lifecycle/reactivestreams/src/main/AndroidManifest.xml
index 2210041..c7b09a2 100644
--- a/lifecycle/reactivestreams/src/main/AndroidManifest.xml
+++ b/lifecycle/reactivestreams/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.lifecycle.reactivestreams">
+    <application>
+        <meta-data android:name="android.arch.lifecycle.reactivestreams.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/runtime/build.gradle
index 36d9126..926b9a2 100644
--- a/lifecycle/runtime/build.gradle
+++ b/lifecycle/runtime/build.gradle
@@ -1,3 +1,5 @@
+import android.support.LibraryVersions
+
 apply plugin: 'com.android.library'
 apply plugin: 'maven'
 
@@ -44,4 +46,4 @@
 }
 
 createAndroidCheckstyle(project)
-version = "1.0.0-SNAPSHOT"
+version = LibraryVersions.LIFECYCLES.toString()
diff --git a/lifecycle/runtime/src/main/AndroidManifest.xml b/lifecycle/runtime/src/main/AndroidManifest.xml
index 274a076..5641eac 100644
--- a/lifecycle/runtime/src/main/AndroidManifest.xml
+++ b/lifecycle/runtime/src/main/AndroidManifest.xml
@@ -17,4 +17,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.lifecycle">
+    <application>
+        <meta-data android:name="android.arch.lifecycle.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/media-compat/AndroidManifest.xml b/media-compat/AndroidManifest.xml
index f5e74a2..8a65eba 100644
--- a/media-compat/AndroidManifest.xml
+++ b/media-compat/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.mediacompat">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.mediacompat"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.mediacompat.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/media-compat/api/26.1.0-SNAPSHOT.txt b/media-compat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from media-compat/api/26.1.0-SNAPSHOT.txt
rename to media-compat/api/27.0.0-SNAPSHOT.txt
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index 3d8463a..8d192ed 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -4,14 +4,10 @@
     api project(':support-annotations')
     api project(':support-compat')
 
-    androidTestImplementation(libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation(libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation project(':support-testutils')
 }
 
diff --git a/paging/runtime/src/main/AndroidManifest.xml b/paging/runtime/src/main/AndroidManifest.xml
index 95247e5..75dcf2c 100644
--- a/paging/runtime/src/main/AndroidManifest.xml
+++ b/paging/runtime/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.util.paging.runtime">
+    <application>
+        <meta-data android:name="android.arch.util.paging.runtime.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/percent/AndroidManifest.xml b/percent/AndroidManifest.xml
index 58eebfe..db8dfa2 100644
--- a/percent/AndroidManifest.xml
+++ b/percent/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.percent">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.percent.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/percent/api/26.1.0-SNAPSHOT.txt b/percent/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from percent/api/26.1.0-SNAPSHOT.txt
rename to percent/api/27.0.0-SNAPSHOT.txt
diff --git a/percent/build.gradle b/percent/build.gradle
index 4738118..17d1a96 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -3,12 +3,8 @@
 dependencies {
     api project(':support-compat')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/recommendation/AndroidManifest.xml b/recommendation/AndroidManifest.xml
index 09017e0..031e250 100644
--- a/recommendation/AndroidManifest.xml
+++ b/recommendation/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.recommendation">
     <uses-sdk android:minSdkVersion="21"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.recommendation.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/recommendation/api/26.1.0-SNAPSHOT.txt b/recommendation/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from recommendation/api/26.1.0-SNAPSHOT.txt
rename to recommendation/api/27.0.0-SNAPSHOT.txt
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index 8b660f2..5da5c61 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -1,7 +1,7 @@
 apply plugin: android.support.SupportLibraryPlugin
 
 dependencies {
-    api project(':support-v4')
+    api project(':support-annotations')
 }
 
 android {
@@ -12,8 +12,6 @@
     sourceSets {
         main.java.srcDirs = ['src']
         main.res.srcDir 'res'
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'src'
     }
 
 }
diff --git a/room/db-impl/src/main/AndroidManifest.xml b/room/db-impl/src/main/AndroidManifest.xml
index 9350b90..89d09af 100644
--- a/room/db-impl/src/main/AndroidManifest.xml
+++ b/room/db-impl/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.db.framework">
+    <application>
+        <meta-data android:name="android.arch.persistence.db.framework.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/room/db/src/main/AndroidManifest.xml b/room/db/src/main/AndroidManifest.xml
index 8a27324..5894255 100644
--- a/room/db/src/main/AndroidManifest.xml
+++ b/room/db/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.db">
+    <application>
+        <meta-data android:name="android.arch.persistence.db.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/room/runtime/src/main/AndroidManifest.xml b/room/runtime/src/main/AndroidManifest.xml
index 54a5b36..79ffb93 100644
--- a/room/runtime/src/main/AndroidManifest.xml
+++ b/room/runtime/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.room">
+    <application>
+        <meta-data android:name="android.arch.persistence.room.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/room/rxjava2/src/main/AndroidManifest.xml b/room/rxjava2/src/main/AndroidManifest.xml
index 33279c6..958f331 100644
--- a/room/rxjava2/src/main/AndroidManifest.xml
+++ b/room/rxjava2/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.room.rxjava2">
+    <application>
+        <meta-data android:name="android.arch.persistence.room.rxjava2.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/room/testing/src/main/AndroidManifest.xml b/room/testing/src/main/AndroidManifest.xml
index 594f016..3e6414c 100644
--- a/room/testing/src/main/AndroidManifest.xml
+++ b/room/testing/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.arch.persistence.room.testing">
+    <application>
+        <meta-data android:name="android.arch.persistence.room.testing.VERSION"
+                   android:value="${version}" />
+    </application>
 </manifest>
diff --git a/samples/Support13Demos/build.gradle b/samples/Support13Demos/build.gradle
index 4c015ae..f647e40 100644
--- a/samples/Support13Demos/build.gradle
+++ b/samples/Support13Demos/build.gradle
@@ -15,7 +15,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -33,8 +32,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
index e265698..e9d6b5a 100644
--- a/samples/Support4Demos/build.gradle
+++ b/samples/Support4Demos/build.gradle
@@ -15,7 +15,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -33,8 +32,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/Support7Demos/build.gradle b/samples/Support7Demos/build.gradle
index 2e3ac33..65b19ea 100644
--- a/samples/Support7Demos/build.gradle
+++ b/samples/Support7Demos/build.gradle
@@ -21,7 +21,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -38,8 +37,7 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
-
diff --git a/samples/SupportAnimationDemos/build.gradle b/samples/SupportAnimationDemos/build.gradle
index d1ea614..ea8038e 100644
--- a/samples/SupportAnimationDemos/build.gradle
+++ b/samples/SupportAnimationDemos/build.gradle
@@ -15,7 +15,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -32,8 +31,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/SupportAppNavigation/build.gradle b/samples/SupportAppNavigation/build.gradle
index c7d03b8..fdd72b6 100644
--- a/samples/SupportAppNavigation/build.gradle
+++ b/samples/SupportAppNavigation/build.gradle
@@ -47,7 +47,7 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
diff --git a/samples/SupportContentDemos/.gitignore b/samples/SupportContentDemos/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/samples/SupportContentDemos/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/samples/SupportContentDemos/build.gradle b/samples/SupportContentDemos/build.gradle
new file mode 100644
index 0000000..7e204b1
--- /dev/null
+++ b/samples/SupportContentDemos/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+apply plugin: 'com.android.application'
+
+dependencies {
+    implementation project(':design')
+    implementation project(':appcompat-v7')
+    implementation project(':support-content')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        applicationId "com.example.android.support.content.demos"
+        minSdkVersion 14
+        targetSdkVersion project.ext.currentSdk
+    }
+
+    lintOptions {
+        abortOnError true
+        disable "SetTextI18n", "AppCompatResource", "WrongConstant", "AllowBackup",
+                "GoogleAppIndexingWarning", "AlwaysShowAction"
+    }
+}
diff --git a/samples/SupportContentDemos/src/main/AndroidManifest.xml b/samples/SupportContentDemos/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f647d8e
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/AndroidManifest.xml
@@ -0,0 +1,46 @@
+<?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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.example.android.support.content.demos">
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+        <activity
+            android:name=".ContentPagerDemoActivity"
+            android:label="@string/app_name"
+            android:theme="@style/AppTheme.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+
+        <provider
+            android:name=".UnpagedDemoDataProvider"
+            android:authorities="com.example.android.support.content.demos"
+            android:enabled="true"
+            android:exported="false">
+        </provider>
+    </application>
+
+</manifest>
diff --git a/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java
new file mode 100644
index 0000000..a496dd3
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.content.demos;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.content.ContentPager;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.content.LoaderQueryRunner;
+import android.support.content.Query;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.Locale;
+
+/**
+ * ContentPager demo activity.
+ */
+public class ContentPagerDemoActivity extends AppCompatActivity {
+
+    private static final int PAGE_SIZE = 20;
+
+    private RecyclerView mRecycler;
+    private ContentPager mPager;
+    private Adapter mAdapter;
+    private FloatingActionButton mFab;
+    private Menu mMenu;
+    private int mCurrentPage = -1;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_demo);
+
+        ContentPager.QueryRunner runner = new LoaderQueryRunner(this, getLoaderManager());
+        mPager = new ContentPager(getContentResolver(), runner);
+        mAdapter = new Adapter(mPager, PAGE_SIZE);
+
+        mRecycler = (RecyclerView) findViewById(R.id.list);
+        mRecycler.setLayoutManager(new LinearLayoutManager(this));
+        mRecycler.setAdapter(mAdapter);
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mPager.reset();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // Inflate the menu; this adds items to the action bar if it is present.
+        getMenuInflater().inflate(R.menu.menu_demo, menu);
+        mMenu = menu;
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        switch (item.getItemId()) {
+            case R.id.action_load:
+                onLoadContent();
+                break;
+            case R.id.action_previous:
+                onLoadPreviousPage();
+                break;
+            case R.id.action_next:
+                onLoadNextPage();
+                break;
+        }
+        // Handle action bar item clicks here. The action bar will
+        // automatically handle clicks on the Home/Up button, so long
+        // as you specify a parent activity in AndroidManifest.xml.
+        int id = item.getItemId();
+
+        //noinspection SimplifiableIfStatement
+        if (id == R.id.action_load) {
+            return true;
+        }
+
+        return super.onOptionsItemSelected(item);
+    }
+
+    private void onLoadContent() {
+        mAdapter.reset(UnpagedDemoDataProvider.URI);
+        mCurrentPage = 0;
+        mAdapter.loadPage(mCurrentPage);
+
+        updateOptionsMenu();
+    }
+
+    private void onLoadNextPage() {
+        mAdapter.loadPage(mCurrentPage + 1);
+
+        updateOptionsMenu();
+    }
+
+    private void onLoadPreviousPage() {
+        mAdapter.loadPage(mCurrentPage - 1);
+
+        updateOptionsMenu();
+    }
+
+    private void updateOptionsMenu() {
+        MenuItem prev = mMenu.findItem(R.id.action_previous);
+        MenuItem next = mMenu.findItem(R.id.action_next);
+
+        int lastPage = (UnpagedDemoDataProvider.TOTAL_SIZE / PAGE_SIZE) - 1;
+        prev.setEnabled(mCurrentPage > 0);
+        next.setEnabled(mCurrentPage < lastPage);
+    }
+
+    private void msg(String msg) {
+        Snackbar.make(
+                mRecycler,
+                msg, Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show();
+    }
+
+    private final class Adapter extends RecyclerView.Adapter<Holder> implements ContentCallback {
+
+        private final ContentPager mPager;
+        private final int mPageSize;
+
+        private Uri mUri;
+        private Cursor mCursor;
+
+        private Adapter(ContentPager pager, int pageSize) {
+            mPager = pager;
+            mPageSize = pageSize;
+        }
+
+        private void reset(Uri uri) {
+            mUri = uri;
+            mCursor = null;
+        }
+
+        void loadPage(int page) {
+            if (page < 0 || page >= (UnpagedDemoDataProvider.TOTAL_SIZE / PAGE_SIZE)) {
+                throw new IndexOutOfBoundsException();
+            }
+
+            mCurrentPage = page;
+            int offset = mCurrentPage * mPageSize;
+            mPager.query(mUri, null, ContentPager.createArgs(offset, mPageSize), null, this);
+        }
+
+        @Override
+        public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new Holder(new TextView(ContentPagerDemoActivity.this));
+        }
+
+        @Override
+        public void onBindViewHolder(Holder holder, int position) {
+            if (!mCursor.moveToPosition(position)) {
+                holder.view.setText("Nope, couldn't position cursor to: " + position);
+                return;
+            }
+
+            holder.view.setText(String.format(Locale.US,
+                    "%d.%d (%d): %s",
+                    mCurrentPage,
+                    mCursor.getInt(0),
+                    mCursor.getLong(2),
+                    mCursor.getString(1)));
+        }
+
+        @Override
+        public int getItemCount() {
+            return mCursor == null ? 0 : mCursor.getCount();
+        }
+
+        @Override
+        public void onCursorReady(@NonNull Query query, Cursor cursor) {
+            if (cursor == null) {
+                msg("Content query returned a null cursor: " + query.getUri());
+            }
+
+            mCurrentPage = query.getOffset() / mPageSize;
+            mCursor = cursor;
+            notifyDataSetChanged();
+        }
+
+        private int getCorpusSize(Bundle extras) {
+            return extras.getInt(ContentPager.EXTRA_TOTAL_COUNT, -1);
+        }
+    }
+
+    private class Holder extends RecyclerView.ViewHolder {
+
+        public final TextView view;
+
+        private Holder(TextView view) {
+            super(view);
+            this.view = view;
+        }
+    }
+}
diff --git a/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/UnpagedDemoDataProvider.java b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/UnpagedDemoDataProvider.java
new file mode 100644
index 0000000..75b8c55
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/UnpagedDemoDataProvider.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.content.demos;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+
+/**
+ * Provides test data for Content Pager Demo app.
+ */
+public class UnpagedDemoDataProvider extends ContentProvider {
+
+    public static final Uri URI =
+            Uri.parse("content://com.example.android.support.content.demos/poodles");
+
+    static final int TOTAL_SIZE = 100;
+    private static final String[] COLUMNS = new String[] {
+            "id",
+            "name",
+            "time"
+    };
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder) {
+        MatrixCursor cursor = new MatrixCursor(COLUMNS);
+        Object[] values = new Object[3];
+
+        for (int i = 0; i < TOTAL_SIZE; i++) {
+            values[0] = i;
+            values[1] = "I'm row number " + i;
+            values[2] = System.currentTimeMillis();
+            cursor.addRow(values);
+        }
+
+        return cursor;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection,
+            String[] selectionArgs) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+}
diff --git a/samples/SupportContentDemos/src/main/res/layout/activity_demo.xml b/samples/SupportContentDemos/src/main/res/layout/activity_demo.xml
new file mode 100644
index 0000000..f557f40
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/layout/activity_demo.xml
@@ -0,0 +1,40 @@
+<?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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.example.android.support.content.demos.ContentPagerDemoActivity">
+
+    <android.support.v7.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize"
+        android:background="?attr/colorPrimary"
+        android:theme="@style/AppTheme.AppBarOverlay"
+        app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</LinearLayout>
diff --git a/samples/SupportContentDemos/src/main/res/menu/menu_demo.xml b/samples/SupportContentDemos/src/main/res/menu/menu_demo.xml
new file mode 100644
index 0000000..7f0310c
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/menu/menu_demo.xml
@@ -0,0 +1,38 @@
+<!--
+  ~ 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.
+  -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto"
+      xmlns:tools="http://schemas.android.com/tools"
+      tools:context="com.example.android.support.content.demos.ContentPagerDemoActivity">
+
+    <item android:id="@+id/action_load"
+          android:orderInCategory="100"
+          android:title="@string/action_load"
+          app:showAsAction="always"/>
+
+    <item android:id="@+id/action_previous"
+          android:orderInCategory="100"
+          android:title="@string/action_previous"
+          android:enabled="false"
+          app:showAsAction="always"/>
+
+    <item android:id="@+id/action_next"
+          android:orderInCategory="100"
+          android:title="@string/action_next"
+          android:enabled="false"
+          app:showAsAction="always"/>
+</menu>
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9a078e3
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..efc028a
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..3af2608
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9bec2e6
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..34947cd
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/values/colors.xml b/samples/SupportContentDemos/src/main/res/values/colors.xml
new file mode 100644
index 0000000..86b4304
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/values/colors.xml
@@ -0,0 +1,22 @@
+<?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>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+</resources>
diff --git a/samples/SupportContentDemos/src/main/res/values/strings.xml b/samples/SupportContentDemos/src/main/res/values/strings.xml
new file mode 100644
index 0000000..523dafe
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?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>
+    <string name="app_name">Pager Demo</string>
+    <string name="action_load">Load</string>
+    <string name="action_previous">Previous</string>
+    <string name="action_next">Next</string>
+</resources>
diff --git a/samples/SupportContentDemos/src/main/res/values/styles.xml b/samples/SupportContentDemos/src/main/res/values/styles.xml
new file mode 100644
index 0000000..afb6bad
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/values/styles.xml
@@ -0,0 +1,34 @@
+<?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>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+    <style name="AppTheme.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+    </style>
+    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
+    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
+
+</resources>
diff --git a/samples/SupportDesignDemos/build.gradle b/samples/SupportDesignDemos/build.gradle
index 9dbf54b..ca4c12d 100644
--- a/samples/SupportDesignDemos/build.gradle
+++ b/samples/SupportDesignDemos/build.gradle
@@ -16,7 +16,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -33,8 +32,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/SupportEmojiDemos/build.gradle b/samples/SupportEmojiDemos/build.gradle
index c5be42e..70b2909 100644
--- a/samples/SupportEmojiDemos/build.gradle
+++ b/samples/SupportEmojiDemos/build.gradle
@@ -54,7 +54,7 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/build.gradle b/samples/SupportLeanbackDemos/build.gradle
index 014cd16..1a69d94 100644
--- a/samples/SupportLeanbackDemos/build.gradle
+++ b/samples/SupportLeanbackDemos/build.gradle
@@ -16,7 +16,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -33,8 +32,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/SupportLeanbackJank/build.gradle b/samples/SupportLeanbackJank/build.gradle
index 6db5dcf..2d40ef3 100644
--- a/samples/SupportLeanbackJank/build.gradle
+++ b/samples/SupportLeanbackJank/build.gradle
@@ -14,6 +14,13 @@
         targetSdkVersion project.ext.currentSdk
     }
 
+    buildTypes {
+        release {
+            minifyEnabled true
+            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
+        }
+    }
+
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
diff --git a/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4 b/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4
new file mode 100644
index 0000000..46c9723
--- /dev/null
+++ b/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/values/dimens.xml b/samples/SupportLeanbackJank/res/values/dimens.xml
index e2b1f9f..5557953 100644
--- a/samples/SupportLeanbackJank/res/values/dimens.xml
+++ b/samples/SupportLeanbackJank/res/values/dimens.xml
@@ -19,4 +19,6 @@
     <dimen name="grid_item_height">100dp</dimen>
     <dimen name="card_width">156dp</dimen>
     <dimen name="card_height">88dp</dimen>
+    <dimen name="shadow_unfocused_z">0dp</dimen>
+    <dimen name="shadow_focused_z">10dp</dimen>
 </resources>
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
index 6d04cb0..7ce55a4 100644
--- a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
+++ b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
@@ -28,9 +28,10 @@
 
     // Define values for WHICH_VIDEO.
     public static final int NO_VIDEO = 0;
-    public static final int VIDEO_480P_60FPS = 1;
-    public static final int VIDEO_1080P_60FPS = 2;
-    public static final int VIDEO_2160P_60FPS = 3;
+    public static final int VIDEO_360P_60FPS = 1;
+    public static final int VIDEO_480P_60FPS = 2;
+    public static final int VIDEO_1080P_60FPS = 3;
+    public static final int VIDEO_2160P_60FPS = 4;
 
     private IntentKeys() {
     }
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
index d301c4e..61ab7c6 100644
--- a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
+++ b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
@@ -16,12 +16,16 @@
 
 package com.google.android.leanbackjank.presenter;
 
+import android.net.Uri;
 import android.support.v17.leanback.widget.ImageCardView;
 import android.support.v17.leanback.widget.Presenter;
 import android.support.v4.content.res.ResourcesCompat;
 import android.view.ViewGroup;
 
 import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.drawable.GlideDrawable;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.target.Target;
 import com.google.android.leanbackjank.R;
 import com.google.android.leanbackjank.model.VideoInfo;
 
@@ -46,37 +50,44 @@
         ImageCardView cardView = new ImageCardView(parent.getContext()) {
             @Override
             public void setSelected(boolean selected) {
-                updateCardBackgroundColor(this, selected);
+                findViewById(R.id.info_field).setBackgroundColor(
+                        selected ? mSelectedBackgroundColor : mDefaultBackgroundColor);
                 super.setSelected(selected);
             }
         };
 
         cardView.setFocusable(true);
         cardView.setFocusableInTouchMode(true);
-        updateCardBackgroundColor(cardView, false);
         return new ViewHolder(cardView);
     }
 
-    private void updateCardBackgroundColor(ImageCardView view, boolean selected) {
-        int color = selected ? mSelectedBackgroundColor : mDefaultBackgroundColor;
-
-        // Both background colors should be set because the view's
-        // background is temporarily visible during animations.
-        view.setBackgroundColor(color);
-        view.findViewById(R.id.info_field).setBackgroundColor(color);
-    }
-
     @Override
     public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
         VideoInfo videoInfo = (VideoInfo) item;
 
-        ImageCardView cardView = (ImageCardView) viewHolder.view;
+        final ImageCardView cardView = (ImageCardView) viewHolder.view;
         cardView.setTitleText(videoInfo.getTitle());
         cardView.setContentText(videoInfo.getStudio());
         cardView.setMainImageDimensions(mCardWidth, mCardHeight);
+        cardView.setBackgroundColor(mDefaultBackgroundColor);
 
         Glide.with(cardView.getContext())
                 .load(videoInfo.getImageUri())
+                .listener(new RequestListener<Uri, GlideDrawable>() {
+                    @Override
+                    public boolean onException(Exception e, Uri uri, Target<GlideDrawable> target,
+                            boolean b) {
+                        return false;
+                    }
+
+                    @Override
+                    public boolean onResourceReady(GlideDrawable glideDrawable, Uri uri,
+                            Target<GlideDrawable> target, boolean b, boolean b1) {
+                        // Remove the background color to reduce overdraw.
+                        cardView.setBackground(null);
+                        return false;
+                    }
+                })
                 .into(cardView.getMainImageView());
     }
 
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
index 42abf3e..6869e46 100644
--- a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
+++ b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
@@ -17,6 +17,7 @@
 package com.google.android.leanbackjank.ui;
 
 import android.content.Intent;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.support.v17.leanback.app.BackgroundManager;
@@ -27,6 +28,7 @@
 import android.support.v17.leanback.widget.ListRowPresenter;
 import android.support.v17.leanback.widget.Presenter;
 import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.ShadowOverlayHelper;
 import android.support.v4.content.res.ResourcesCompat;
 
 import com.google.android.leanbackjank.IntentDefaults;
@@ -90,6 +92,8 @@
                 resource = R.raw.testvideo_1080p_60fps;
             } else if (whichVideo == IntentKeys.VIDEO_480P_60FPS) {
                 resource = R.raw.bbb_480p;
+            } else if (whichVideo == IntentKeys.VIDEO_360P_60FPS) {
+                resource = R.raw.bbb_360p;
             }
             Uri uri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/"
                     + resource);
@@ -129,7 +133,16 @@
 
     private void loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows,
             boolean useSingleBitmap, int cardWidth, int cardHeight) {
-        ListRowPresenter listRowPresenter = new ListRowPresenter();
+        ListRowPresenter listRowPresenter = new ListRowPresenter() {
+            @Override
+            protected ShadowOverlayHelper.Options createShadowOverlayOptions() {
+                Resources res = getResources();
+                ShadowOverlayHelper.Options options = new ShadowOverlayHelper.Options();
+                options.dynamicShadowZ(res.getDimension(R.dimen.shadow_unfocused_z),
+                        res.getDimension(R.dimen.shadow_focused_z));
+                return options;
+            }
+        };
         listRowPresenter.setShadowEnabled(!disableShadows);
         mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
         HashMap<String, List<VideoInfo>> data = VideoProvider.buildMedia(categoryCount,
diff --git a/samples/SupportPercentDemos/build.gradle b/samples/SupportPercentDemos/build.gradle
index f52f293..251678d 100644
--- a/samples/SupportPercentDemos/build.gradle
+++ b/samples/SupportPercentDemos/build.gradle
@@ -15,7 +15,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -32,8 +31,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/SupportPreferenceDemos/build.gradle b/samples/SupportPreferenceDemos/build.gradle
index 0ed8424..6e78088 100644
--- a/samples/SupportPreferenceDemos/build.gradle
+++ b/samples/SupportPreferenceDemos/build.gradle
@@ -20,7 +20,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -37,7 +36,7 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
diff --git a/samples/SupportTransitionDemos/build.gradle b/samples/SupportTransitionDemos/build.gradle
index 720e2a2..6b34453 100644
--- a/samples/SupportTransitionDemos/build.gradle
+++ b/samples/SupportTransitionDemos/build.gradle
@@ -16,7 +16,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -33,8 +32,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 
     aaptOptions {
diff --git a/samples/SupportVectorDrawableDemos/build.gradle b/samples/SupportVectorDrawableDemos/build.gradle
index a3a4db6..c47967c 100644
--- a/samples/SupportVectorDrawableDemos/build.gradle
+++ b/samples/SupportVectorDrawableDemos/build.gradle
@@ -34,7 +34,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -51,8 +50,8 @@
     }
 
     compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 }
 
diff --git a/samples/SupportWearDemos/build.gradle b/samples/SupportWearDemos/build.gradle
index df63aac..e980793 100644
--- a/samples/SupportWearDemos/build.gradle
+++ b/samples/SupportWearDemos/build.gradle
@@ -31,7 +31,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
-        main.aidl.srcDirs = ['src']
         main.res.srcDirs = ['res']
     }
 
@@ -53,4 +52,3 @@
         targetCompatibility JavaVersion.VERSION_1_8
     }
 }
-
diff --git a/settings.gradle b/settings.gradle
index 6dd5d37..c281bb1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -100,6 +100,9 @@
 include ':support-emoji-appcompat'
 project(':support-emoji-appcompat').projectDir = new File(rootDir, 'emoji/appcompat')
 
+include ':support-content'
+project(':support-content').projectDir = new File(rootDir, 'content')
+
 /////////////////////////////
 //
 // Samples
@@ -108,6 +111,9 @@
 
 File samplesRoot = new File(rootDir, 'samples')
 
+include ':support-content-demos'
+project(':support-content-demos').projectDir = new File(samplesRoot, 'SupportContentDemos')
+
 include ':support-design-demos'
 project(':support-design-demos').projectDir = new File(samplesRoot, 'SupportDesignDemos')
 
@@ -193,4 +199,4 @@
 
 ///// FLATFOOT START
 
-///// FLATFOOT END
\ No newline at end of file
+///// FLATFOOT END
diff --git a/transition/AndroidManifest.xml b/transition/AndroidManifest.xml
index 309b695..1b70510 100644
--- a/transition/AndroidManifest.xml
+++ b/transition/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.transition">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.transition.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/transition/api/26.1.0-SNAPSHOT.txt b/transition/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from transition/api/26.1.0-SNAPSHOT.txt
rename to transition/api/27.0.0-SNAPSHOT.txt
diff --git a/transition/build.gradle b/transition/build.gradle
index a7b8fca..5756785 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -5,14 +5,10 @@
     api project(':support-compat')
     compileOnly project(':support-fragment')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation project(':support-v4')
     androidTestImplementation project(':appcompat-v7')
 }
diff --git a/tv-provider/AndroidManifest.xml b/tv-provider/AndroidManifest.xml
index f07d090..f7569a6 100644
--- a/tv-provider/AndroidManifest.xml
+++ b/tv-provider/AndroidManifest.xml
@@ -19,6 +19,7 @@
     <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
     <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.media.tv.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/tv-provider/api/26.1.0-SNAPSHOT.txt b/tv-provider/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from tv-provider/api/26.1.0-SNAPSHOT.txt
rename to tv-provider/api/27.0.0-SNAPSHOT.txt
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index 2a129f4..e9e204e 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -4,9 +4,7 @@
     api project(':support-annotations')
     api project(':support-compat')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/v13/AndroidManifest.xml b/v13/AndroidManifest.xml
index 6eea520..6f5a696 100644
--- a/v13/AndroidManifest.xml
+++ b/v13/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v13">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.v13"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v13.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v13/api/26.1.0-SNAPSHOT.txt b/v13/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v13/api/26.1.0-SNAPSHOT.txt
rename to v13/api/27.0.0-SNAPSHOT.txt
diff --git a/v13/build.gradle b/v13/build.gradle
index 8019c0e..95ff484 100644
--- a/v13/build.gradle
+++ b/v13/build.gradle
@@ -4,14 +4,10 @@
     api project(':support-annotations')
     api project(':support-v4')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
 }
 
 android {
diff --git a/v14/preference/AndroidManifest.xml b/v14/preference/AndroidManifest.xml
index 95bab75..18cc666 100644
--- a/v14/preference/AndroidManifest.xml
+++ b/v14/preference/AndroidManifest.xml
@@ -17,6 +17,7 @@
     package="android.support.v14.preference">
     <uses-sdk android:minSdkVersion="14" />
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v14.preference.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v14/preference/api/26.1.0-SNAPSHOT.txt b/v14/preference/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v14/preference/api/26.1.0-SNAPSHOT.txt
rename to v14/preference/api/27.0.0-SNAPSHOT.txt
diff --git a/v17/leanback/AndroidManifest.xml b/v17/leanback/AndroidManifest.xml
index 9176231..23c5c00 100644
--- a/v17/leanback/AndroidManifest.xml
+++ b/v17/leanback/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.v17.leanback">
     <uses-sdk android:minSdkVersion="17"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v17.leanback.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v17/leanback/api/26.1.0-SNAPSHOT.txt b/v17/leanback/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from v17/leanback/api/26.1.0-SNAPSHOT.txt
rename to v17/leanback/api/27.0.0-SNAPSHOT.txt
index fb2aebc..bc0eecc 100644
--- a/v17/leanback/api/26.1.0-SNAPSHOT.txt
+++ b/v17/leanback/api/27.0.0-SNAPSHOT.txt
@@ -3154,8 +3154,7 @@
     method public final int getPickerItemLayoutId();
     method public final int getPickerItemTextViewId();
     method public int getSelectedColumn();
-    method public final deprecated java.lang.CharSequence getSeparator();
-    method public final java.util.List<java.lang.CharSequence> getSeparators();
+    method public final java.lang.CharSequence getSeparator();
     method public float getVisibleItemCount();
     method public void onColumnValueChanged(int, int);
     method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
@@ -3166,7 +3165,6 @@
     method public final void setPickerItemTextViewId(int);
     method public void setSelectedColumn(int);
     method public final void setSeparator(java.lang.CharSequence);
-    method public final void setSeparators(java.util.List<java.lang.CharSequence>);
     method public void setVisibleItemCount(float);
   }
 
diff --git a/v17/leanback/res/values-af/strings.xml b/v17/leanback/res/values-af/strings.xml
index a9ef3e8..5e5c649 100644
--- a/v17/leanback/res/values-af/strings.xml
+++ b/v17/leanback/res/values-af/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediakontroles word versteek; druk D-paneel om te wys"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooi"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Gaan voort"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-foutkode %1$d ekstra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BEGIN HIER"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Volgende"</string>
diff --git a/v17/leanback/res/values-am/strings.xml b/v17/leanback/res/values-am/strings.xml
index 5ac73a5..2427364 100644
--- a/v17/leanback/res/values-am/strings.xml
+++ b/v17/leanback/res/values-am/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"የሚዲያ መቆጣጠሪያዎች ተደብቀዋል። d-pad ን ለማሳየት ይጫኑ"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ጨርስ"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ቀጥል"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"፦"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"የMediaPlayer ስህተት ኮድ %1$d ተጨማሪ %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ይጀምሩ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ቀጣይ"</string>
diff --git a/v17/leanback/res/values-ar/strings.xml b/v17/leanback/res/values-ar/strings.xml
index 11f0d8c..90cd489 100644
--- a/v17/leanback/res/values-ar/strings.xml
+++ b/v17/leanback/res/values-ar/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"‏تم إخفاء عناصر التحكم في الوسائط، يمكنك الضغط على d-pad لإظهارها"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"إنهاء"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"متابعة"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"‏رمز الخطأ في MediaPlayer %1$d بالإضافة إلى %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"البدء"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"التالية"</string>
diff --git a/v17/leanback/res/values-az/strings.xml b/v17/leanback/res/values-az/strings.xml
index 31d4304..e3fe52b 100644
--- a/v17/leanback/res/values-az/strings.xml
+++ b/v17/leanback/res/values-az/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media idarəetmələri gizlidir, göstərmək üçün d-pad\'i basın"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Bitir"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davam edin"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Media Pleyer xəta kodu %1$d əlavə %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BAŞLAYIN"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Növbəti"</string>
diff --git a/v17/leanback/res/values-b+sr+Latn/strings.xml b/v17/leanback/res/values-b+sr+Latn/strings.xml
index 1a002b4..4659835 100644
--- a/v17/leanback/res/values-b+sr+Latn/strings.xml
+++ b/v17/leanback/res/values-b+sr+Latn/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrole za medije su skrivene, pritisnite kontrole za kretanje da biste ih prikazali"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dovrši"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastavi"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kôd greške MediaPlayer-a %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAPOČNITE"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalje"</string>
diff --git a/v17/leanback/res/values-be/strings.xml b/v17/leanback/res/values-be/strings.xml
index b5860f1..85c3e7c 100644
--- a/v17/leanback/res/values-be/strings.xml
+++ b/v17/leanback/res/values-be/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Адключыць высокую якасць"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Уключыць схаваныя цітры"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Адключыць схаваныя цітры"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Калі ласка, увядзіце выяву ў рэжыме Выяў"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Перайсці ў рэжым \"Відарыс у відарысе\""</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Элементы кіравання мультымедыя паказаны"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Элементы кіравання мультымедыя схаваны. Каб паказаць іх, націсніце пераключальнік напрамкаў"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Завяршыць"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далей"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Код памылкі MediaPlayer %1$d дадаткова %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПАЧАЦЬ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далей"</string>
diff --git a/v17/leanback/res/values-bg/strings.xml b/v17/leanback/res/values-bg/strings.xml
index d98e8c4..d8c9325 100644
--- a/v17/leanback/res/values-bg/strings.xml
+++ b/v17/leanback/res/values-bg/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Деактивиране на високото качество"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Активиране на субтитрите"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Деактивиране на субтитрите"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Вход в режима „Картина в картина“"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Вход в режима „Картина в картината“"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Контролите за мултимедия са показани"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Контролите за мултимедия са скрити. Натиснете контролния пад, за да се покажат"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Край"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Напред"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Код на грешката на MediaPlayer %1$d (допълнително: %2$d)"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПЪРВИ СТЪПКИ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Напред"</string>
 </resources>
diff --git a/v17/leanback/res/values-bn/strings.xml b/v17/leanback/res/values-bn/strings.xml
index 37f0e48..949faac 100644
--- a/v17/leanback/res/values-bn/strings.xml
+++ b/v17/leanback/res/values-bn/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"সাবটাইটেল সক্ষম করুন"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"সাবটাইটেল অক্ষম করুন"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ছবি মোডে ছবি লগান"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"মিডিয়ার নিয়ন্ত্রণগুলি দেখানো হয়েছে"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"মিডিয়ার নিয়ন্ত্রণগুলি লুকানো আছে, দেখার জন্য ডি-প্যাড টিপুন"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"শেষ করুন"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"চালিয়ে যান"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ত্রুটি কোড %1$d অতিরিক্ত %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"শুরু করা যাক"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"পরবর্তী"</string>
 </resources>
diff --git a/v17/leanback/res/values-bs/strings.xml b/v17/leanback/res/values-bs/strings.xml
index 804d6ca..12f404e 100644
--- a/v17/leanback/res/values-bs/strings.xml
+++ b/v17/leanback/res/values-bs/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrole za medije su skrivene. Pritisnite d-pad da ih prikažete"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završiti"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastaviti"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kôd greške MediaPlayera %1$d dodatno %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAPOČNITE"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Naprijed"</string>
diff --git a/v17/leanback/res/values-ca/strings.xml b/v17/leanback/res/values-ca/strings.xml
index 74c9700..943a6c3 100644
--- a/v17/leanback/res/values-ca/strings.xml
+++ b/v17/leanback/res/values-ca/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"S\'han amagat els controls multimèdia; prem el teclat direccional per mostrar-los"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalitza"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Codi d\'error de MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMENÇA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Següent"</string>
diff --git a/v17/leanback/res/values-cs/strings.xml b/v17/leanback/res/values-cs/strings.xml
index 17b4dfc..c99f631 100644
--- a/v17/leanback/res/values-cs/strings.xml
+++ b/v17/leanback/res/values-cs/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Vypnout vysokou kvalitu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnout titulky"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnout titulky"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Přejít do režimu Obraz v obraze"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Přejít do režimu obraz v obraze"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Ovládací prvky médií jsou zobrazeny"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Ovládací prvky médií jsou skryty, zobrazíte je stisknutím křížového ovladače"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončit"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovat"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kód chyby přehrávače MediaPlayer %1$d, další %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČÍNÁME"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Další"</string>
diff --git a/v17/leanback/res/values-da/strings.xml b/v17/leanback/res/values-da/strings.xml
index 3c6843f..97c4a32 100644
--- a/v17/leanback/res/values-da/strings.xml
+++ b/v17/leanback/res/values-da/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiver høj kvalitet"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivér undertekster"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiver undertekster"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tilføj billedet i billedtilstand"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tilstand med integreret billede"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Knapperne til afspilning er synlige"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Knapperne til afspilning er skjult. Tryk på D-pad\'en for at se dem"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Afslut"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsæt"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-fejlkode %1$d ekstra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM GODT I GANG"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Næste"</string>
 </resources>
diff --git a/v17/leanback/res/values-de/strings.xml b/v17/leanback/res/values-de/strings.xml
index ff9a409..e50c4ed 100644
--- a/v17/leanback/res/values-de/strings.xml
+++ b/v17/leanback/res/values-de/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hohe Qualität deaktivieren"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Untertitel aktivieren"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Untertitel deaktivieren"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Bild-in-Bild-Modus aktivieren"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Bild-im-Bild-Modus aktivieren"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Mediensteuerelemente eingeblendet"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediensteuerelemente ausgeblendet. Drücke das Steuerkreuz, um die Steuerelemente wieder einzublenden."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fertigstellen"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Weiter"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-Fehlercode %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"JETZT STARTEN"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Weiter"</string>
diff --git a/v17/leanback/res/values-el/strings.xml b/v17/leanback/res/values-el/strings.xml
index 795a501..c0f039f 100644
--- a/v17/leanback/res/values-el/strings.xml
+++ b/v17/leanback/res/values-el/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Απόκρυψη στοιχείων ελέγχου μέσων, πιέστε το d-pad για εμφάνιση"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Τέλος"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Συνέχεια"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Κωδικός σφάλματος MediaPlayer %1$d επιπλέον %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ΕΝΑΡΞΗ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Επόμενο"</string>
diff --git a/v17/leanback/res/values-en-rAU/strings.xml b/v17/leanback/res/values-en-rAU/strings.xml
index 03dedda..c15bd3b 100644
--- a/v17/leanback/res/values-en-rAU/strings.xml
+++ b/v17/leanback/res/values-en-rAU/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media controls hidden, press d-pad to show"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer error code %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
diff --git a/v17/leanback/res/values-en-rGB/strings.xml b/v17/leanback/res/values-en-rGB/strings.xml
index 03dedda..c15bd3b 100644
--- a/v17/leanback/res/values-en-rGB/strings.xml
+++ b/v17/leanback/res/values-en-rGB/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media controls hidden, press d-pad to show"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer error code %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
diff --git a/v17/leanback/res/values-en-rIN/strings.xml b/v17/leanback/res/values-en-rIN/strings.xml
index 03dedda..c15bd3b 100644
--- a/v17/leanback/res/values-en-rIN/strings.xml
+++ b/v17/leanback/res/values-en-rIN/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media controls hidden, press d-pad to show"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer error code %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
diff --git a/v17/leanback/res/values-es-rUS/strings.xml b/v17/leanback/res/values-es-rUS/strings.xml
index cf84f62..41fe3f4 100644
--- a/v17/leanback/res/values-es-rUS/strings.xml
+++ b/v17/leanback/res/values-es-rUS/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Los controles de medios están ocultos; presiona el control direccional para mostrarlos"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Código de error de MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMENZAR"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Siguiente"</string>
diff --git a/v17/leanback/res/values-es/strings.xml b/v17/leanback/res/values-es/strings.xml
index bae575f..afd9195 100644
--- a/v17/leanback/res/values-es/strings.xml
+++ b/v17/leanback/res/values-es/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Controles multimedia ocultos (pulsa la cruceta para mostrarlos)"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Código de error de MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"EMPEZAR"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Siguiente"</string>
diff --git a/v17/leanback/res/values-et/strings.xml b/v17/leanback/res/values-et/strings.xml
index 34a4f0c..d87aba3 100644
--- a/v17/leanback/res/values-et/strings.xml
+++ b/v17/leanback/res/values-et/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Meedia juhtnupud on peidetud, kuvamiseks vajutage DPAD-i"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Lõpeta"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jätka"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayeri veakood %1$d, lisa %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ALUSTAGE"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Järgmine"</string>
diff --git a/v17/leanback/res/values-eu/strings.xml b/v17/leanback/res/values-eu/strings.xml
index 980ac8b..416d8a0 100644
--- a/v17/leanback/res/values-eu/strings.xml
+++ b/v17/leanback/res/values-eu/strings.xml
@@ -47,13 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desgaitu kalitate handiko erreprodukzioa"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Gaitu azpitituluak"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desgaitu azpitituluak"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktibatu \"Argazkia argazkian\" modua"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktibatu \"Pantaila txiki gainjarri\" modua"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Multimedia kontrolatzeko aukerak ikusgai"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Ezkutatuta daude multimedia kontrolatzeko aukerak. Erakusteko, sakatu nabigazio-gurutzea."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Amaitu"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jarraitu"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer errore-kodea: %1$d (%2$d gehigarria)"</string>
-    <string name="lb_onboarding_get_started" msgid="6961440391306351139">"LEHEN URRATSAK"</string>
+    <string name="lb_onboarding_get_started" msgid="6961440391306351139">"HASI ERABILTZEN"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Hurrengoa"</string>
 </resources>
diff --git a/v17/leanback/res/values-fa/strings.xml b/v17/leanback/res/values-fa/strings.xml
index 320d819..daa6bab 100644
--- a/v17/leanback/res/values-fa/strings.xml
+++ b/v17/leanback/res/values-fa/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"فعال کردن زیرنویس"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"غیرفعال کردن زیرنویس"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"وارد حالت تصویر در تصویر شوید"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"کنترل‌های رسانه نشان داده می‌شوند"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"‏کنترل‌های رسانه پنهان هستند، برای نمایش آن‌ها d-pad (پد کنترل) را فشار دهید"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"پایان"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ادامه"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"‏کد خطای MediaPlayer‏ %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"شروع به‌ کار"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"بعدی"</string>
 </resources>
diff --git a/v17/leanback/res/values-fi/strings.xml b/v17/leanback/res/values-fi/strings.xml
index 863fcd5..bc83b9d 100644
--- a/v17/leanback/res/values-fi/strings.xml
+++ b/v17/leanback/res/values-fi/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediasäätimet piilotettu, näytä painamalla ohjaimen nuolia."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Valmis"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jatka"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayerin virhekoodi %1$d ylimääräinen %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ALOITA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seuraava"</string>
diff --git a/v17/leanback/res/values-fr-rCA/strings.xml b/v17/leanback/res/values-fr-rCA/strings.xml
index d8ec857..300c087 100644
--- a/v17/leanback/res/values-fr-rCA/strings.xml
+++ b/v17/leanback/res/values-fr-rCA/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Les commandes multimédias sont masquées, appuyez sur le pavé directionnel pour les afficher."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Code d\'erreur MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMMENCER"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Suivant"</string>
diff --git a/v17/leanback/res/values-fr/strings.xml b/v17/leanback/res/values-fr/strings.xml
index d3208a8..b659bed 100644
--- a/v17/leanback/res/values-fr/strings.xml
+++ b/v17/leanback/res/values-fr/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Désactiver la haute qualité"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activer les sous-titres"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Désactiver les sous-titres"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activer le mode PIP"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activer le mode Picture-in-picture"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Les commandes multimédias sont affichées"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Les commandes multimédias sont masquées. Appuyez sur le pavé directionnel pour les afficher"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Code d\'erreur MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMMENCER"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Suivant"</string>
diff --git a/v17/leanback/res/values-gl/strings.xml b/v17/leanback/res/values-gl/strings.xml
index 6c5cfb5..5406b8a 100644
--- a/v17/leanback/res/values-gl/strings.xml
+++ b/v17/leanback/res/values-gl/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desactivar alta calidade"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activar subtítulos"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desactivar subtítulos"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activar o modo Imaxe superposta"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activar o modo Pantalla superposta"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Móstranse os controis de recursos multimedia"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Os controis de recursos multimedia están ocultos. Preme d-pad para mostralos"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro de MediaPlayer %1$d %2$d de máis"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"INTRODUCIÓN"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seguinte"</string>
diff --git a/v17/leanback/res/values-gu/strings.xml b/v17/leanback/res/values-gu/strings.xml
index 2be274d..12796b3 100644
--- a/v17/leanback/res/values-gu/strings.xml
+++ b/v17/leanback/res/values-gu/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ઉપશીર્ષક સક્ષમ કરો"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"વિગતવાર ઉપશીર્ષકોને અક્ષમ કરો"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ચિત્ર મોડમાં ચિત્ર દાખલ કરો"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"મીડિયા નિયંત્રણો બતાવેલા છે"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"મીડિયા નિયંત્રણો છુપાયેલા છે, તે બતાવવા માટે d-પૅડ દબાવો"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"સમાપ્ત કરો"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ચાલુ રાખો"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ભૂલ કોડ %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"પ્રારંભ કરો"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"આગલું"</string>
 </resources>
diff --git a/v17/leanback/res/values-hi/strings.xml b/v17/leanback/res/values-hi/strings.xml
index 41b0b11..91ff72a 100644
--- a/v17/leanback/res/values-hi/strings.xml
+++ b/v17/leanback/res/values-hi/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मीडिया नियंत्रण छिपे हुए हैं, दिखाने के लिए डी-पैड दबाएं"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त करें"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी रखें"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer गड़बड़ी कोड %1$d अतिरिक्त %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"प्रारंभ करें"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"अगला"</string>
diff --git a/v17/leanback/res/values-hr/strings.xml b/v17/leanback/res/values-hr/strings.xml
index 02e5386..6ff3ed8 100644
--- a/v17/leanback/res/values-hr/strings.xml
+++ b/v17/leanback/res/values-hr/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Medijske kontrole skrivene su, pritisnite D-pad za prikaz"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završi"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastavi"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kôd pogreške MediaPlayera: %1$d, dodatno %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"POČETAK"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalje"</string>
diff --git a/v17/leanback/res/values-hu/strings.xml b/v17/leanback/res/values-hu/strings.xml
index 7e67bed..c0f89c3 100644
--- a/v17/leanback/res/values-hu/strings.xml
+++ b/v17/leanback/res/values-hu/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Feliratok engedélyezése"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Feliratok letiltása"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Kép a képben mód indítása"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Médiavezérlők megjelenítve"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"A médiavezérlők el vannak rejtve. Megjelenítésükhöz nyomja le a d-padet."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Befejezés"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Folytatás"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-hibakód: %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KEZDŐ LÉPÉSEK"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Következő"</string>
 </resources>
diff --git a/v17/leanback/res/values-hy/strings.xml b/v17/leanback/res/values-hy/strings.xml
index e71bc52..dfaed6e 100644
--- a/v17/leanback/res/values-hy/strings.xml
+++ b/v17/leanback/res/values-hy/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Մեդիայի կառավարման տարրերը թաքցված են։ Ցուցադրելու համար սեղմեք D-pad-ը"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Վերջ"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Շարունակել"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Մեդիա նվագարկչի սխալի կոդ %1$d լրացուցիչ %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ՍԿՍԵԼ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Հաջորդը"</string>
diff --git a/v17/leanback/res/values-in/strings.xml b/v17/leanback/res/values-in/strings.xml
index c5b0568..68f4b55 100644
--- a/v17/leanback/res/values-in/strings.xml
+++ b/v17/leanback/res/values-in/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Nonaktifkan Kualitas Tinggi"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktifkan Pembuatan Teks"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Nonaktifkan Pembuatan Teks"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Masukkan Foto Dalam Mode Foto"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Masuk Mode Picture In Picture"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kontrol media ditampilkan"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrol media disembunyikan, tekan d-pad untuk menampilkannya"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Lanjutkan"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kode error MediaPlayer %1$d ekstra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"MULAI"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Berikutnya"</string>
diff --git a/v17/leanback/res/values-is/strings.xml b/v17/leanback/res/values-is/strings.xml
index afd1709..3d49bda 100644
--- a/v17/leanback/res/values-is/strings.xml
+++ b/v17/leanback/res/values-is/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Spilunarstýringar faldar, ýttu á stefnuhnappa til að sýna þær"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Ljúka"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Halda áfram"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Villukóði MediaPlayer %1$d aukalegt %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"HEFJAST HANDA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Áfram"</string>
diff --git a/v17/leanback/res/values-it/strings.xml b/v17/leanback/res/values-it/strings.xml
index f08671b..5db967d 100644
--- a/v17/leanback/res/values-it/strings.xml
+++ b/v17/leanback/res/values-it/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disattiva alta qualità"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Attiva sottotitoli"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disattiva sottotitoli"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Attiva modalità Picture-in-picture"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Attiva modalità Picture in picture"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Controlli multimediali visualizzati"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Controlli multimediali nascosti, premi il d-pad per visualizzarli"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fine"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Codice di errore MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"INIZIA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Avanti"</string>
diff --git a/v17/leanback/res/values-iw/strings.xml b/v17/leanback/res/values-iw/strings.xml
index 8431583..0f79a99 100644
--- a/v17/leanback/res/values-iw/strings.xml
+++ b/v17/leanback/res/values-iw/strings.xml
@@ -31,8 +31,8 @@
     <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"‏העברה קדימה של %1$dX"</string>
     <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"הרץ אחורה"</string>
     <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"‏העברה לאחור של %1$dX"</string>
-    <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"דלג אל הפריט הבא"</string>
-    <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"דלג אל הפריט הקודם"</string>
+    <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"ברצוני לדלג אל הפריט הבא"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"ברצוני לדלג אל הפריט הקודם"</string>
     <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"עוד פעולות"</string>
     <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"בטל בחירה באגודל כלפי מעלה"</string>
     <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"בחר באגודל כלפי מעלה"</string>
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"השבת איכות גבוהה"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"הפעל כתוביות"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"השבת כתוביות"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"הזן את התמונה במצב תמונה"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"עבור למצב תמונה בתוך תמונה"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"פקדי המדיה מוצגים"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"‏פקדי המדיה מוסתרים. הקש על ה-d-pad כדי להציג אותם"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"סיום"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"המשך"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"‏קוד שגיאה %1$d‏ של MediaPlayer ועוד %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"התחל"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"הבא"</string>
 </resources>
diff --git a/v17/leanback/res/values-ja/strings.xml b/v17/leanback/res/values-ja/strings.xml
index 613b7a7..88fe50f 100644
--- a/v17/leanback/res/values-ja/strings.xml
+++ b/v17/leanback/res/values-ja/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"高品質を無効にする"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"字幕を有効にする"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"字幕を無効にする"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"PIP モードに移動"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ピクチャー イン ピクチャー モードに移動"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"メディア コントロールは表示されています"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"メディア コントロールは非表示になっています。表示するには D-pad を押してください"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完了"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"続行"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer エラーコード: %1$d、追加: %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"使ってみる"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"次へ"</string>
diff --git a/v17/leanback/res/values-ka/strings.xml b/v17/leanback/res/values-ka/strings.xml
index 0913a1d..7879ecc 100644
--- a/v17/leanback/res/values-ka/strings.xml
+++ b/v17/leanback/res/values-ka/strings.xml
@@ -51,15 +51,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"მაღალი ხარისხის გამორთვა"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"დახურული წარწერების ჩართვა"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"დახურული წარწერების გაუქმება"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"რეჟიმზე „სურათი სურათში“ გადასვლა"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"რეჟიმზე „ეკრანი ეკრანში“ გადასვლა"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"ნაჩვენებია მედიის მართვის საშუალებები"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"მედიის მართვის საშუალებები დამალულია, გამოსაჩენად დააჭირეთ D-pad-ს"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"დასრულება"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"გაგრძელება"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-ის შეცდომის კოდი: %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"დაწყება"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"შემდეგი"</string>
 </resources>
diff --git a/v17/leanback/res/values-kk/strings.xml b/v17/leanback/res/values-kk/strings.xml
index 22c67b2..36902f5 100644
--- a/v17/leanback/res/values-kk/strings.xml
+++ b/v17/leanback/res/values-kk/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Мультимедияны басқару элементтері жасырын, оларды көрсету үшін d-тақтасын басыңыз"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Аяқтау"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Жалғастыру"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer қате коды %1$d, қосымша %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ІСКЕ КІРІСУ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Келесі"</string>
diff --git a/v17/leanback/res/values-km/strings.xml b/v17/leanback/res/values-km/strings.xml
index 4c3d61c..270dff7 100644
--- a/v17/leanback/res/values-km/strings.xml
+++ b/v17/leanback/res/values-km/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"បិទ​គុណភាព​ខ្ពស់"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"បើក​ការ​ដាក់​ចំណង​ដែល​បាន​បិទ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"បិទ​ការ​ដាក់​ចំណង​ដែល​បាន​បិទ"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"បញ្ចូលរូបភាពនៅក្នុងរបៀបរូបភាព"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ចូលមុខងាររូបក្នុងរូប"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"ការ​គ្រប់គ្រង​មេឌៀ​ត្រូវ​បាន​បង្ហាញ"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ការ​គ្រប់គ្រង​មេឌៀ​ត្រូវ​បាន​លាក់ សូមចុច d-pad ដើម្បី​បង្ហាញ"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"បញ្ចប់"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"បន្ត"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"៖"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"លេខកូដបញ្ហា MediaPlayer %1$d និង %2$d បន្ថែម"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ចាប់ផ្ដើម"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"បន្ទាប់"</string>
 </resources>
diff --git a/v17/leanback/res/values-kn/strings.xml b/v17/leanback/res/values-kn/strings.xml
index 7132cef..dd14e38 100644
--- a/v17/leanback/res/values-kn/strings.xml
+++ b/v17/leanback/res/values-kn/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ಚಿತ್ರವನ್ನು ಚಿತ್ರ ಮೋಡ್‌ನಲ್ಲಿ ಪ್ರವೇಶಿಸಿ"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"ಮಾಧ್ಯಮ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ಮಾಧ್ಯಮ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ, ತೋರಿಸಲು d-pad ಒತ್ತಿರಿ"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ಪೂರ್ಣಗೊಳಿಸು"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ಮುಂದುವರಿಸು"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"ಮೀಡಿಯಾ ಪ್ಲೇಯರ್ ದೋಷ ಕೋಡ್ %1$d ಹೆಚ್ಚುವರಿ %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ಮುಂದೆ"</string>
 </resources>
diff --git a/v17/leanback/res/values-ko/strings.xml b/v17/leanback/res/values-ko/strings.xml
index f6e5136..0c8fb19 100644
--- a/v17/leanback/res/values-ko/strings.xml
+++ b/v17/leanback/res/values-ko/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"고화질 사용 중지"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"자막 사용 설정"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"자막 사용 중지"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"사진 모드에서 사진 입력"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"PIP 모드 시작"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"미디어 컨트롤이 표시되었습니다."</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"미디어 컨트롤이 숨겨져 있습니다. 표시하려면 D-Pad를 누르세요."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"완료"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"계속"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 오류 코드 %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"시작하기"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"다음"</string>
 </resources>
diff --git a/v17/leanback/res/values-ky/strings.xml b/v17/leanback/res/values-ky/strings.xml
index f24a0a6..80c7af2 100644
--- a/v17/leanback/res/values-ky/strings.xml
+++ b/v17/leanback/res/values-ky/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Жабык субтитрлерди иштетүү"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Жабык субтитрлерди өчүрүү"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Сүрөт режиминде сүрөт киргизүү"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Медиа файлды башкаруу көрсөтүлдү"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Медиа файлды башкаруу жашырылган, көрүү үчүн d-pad көзөмөлдөө каражатын басыңыз"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Бүтүрүү"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Улантуу"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer\'деги катанын коду: 1$d, кошумча: %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"БАШТАДЫК"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Кийинки"</string>
 </resources>
diff --git a/v17/leanback/res/values-lo/strings.xml b/v17/leanback/res/values-lo/strings.xml
index 92b7c90..7fb28b8 100644
--- a/v17/leanback/res/values-lo/strings.xml
+++ b/v17/leanback/res/values-lo/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"​ເປີດ​ນຳ​ໃຊ້​​ຄຳ​ບັນ​ຍາຍ​ແບບ​ປິດ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"​ປິດ​ນຳ​ໃຊ້​ຄຳ​ບັນ​ຍາຍ​ແບບ​ປິດ"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ປ້ອນຮູບພາບໃນໂໝດຮູບພາບ"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"ສະແດງຕົວຄວບຄຸມມີເດຍແລ້ວ"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ເຊື່ອງຕົວຄວບຄຸມມີເດຍແລ້ວ, ກົດປຸ່ມທິດທາງເພື່ອສະແດງ"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ສໍາເລັດ"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"​ສືບ​ຕໍ່"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"ລະຫັດ MediaPlayer ຜິດພາດ %1$d ພິເສດ %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ເລີ່ມຕົ້ນນຳໃຊ້"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ຕໍ່ໄປ"</string>
 </resources>
diff --git a/v17/leanback/res/values-lt/strings.xml b/v17/leanback/res/values-lt/strings.xml
index 0f6bfce..b9d6076 100644
--- a/v17/leanback/res/values-lt/strings.xml
+++ b/v17/leanback/res/values-lt/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Įgalinti subtitrus"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Išjungti subtitrus"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Įjungti vaizdo vaizde režimą"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Medijos valdikliai rodomi"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Medijos valdikliai paslėpti. Paspauskite krypčių valdiklius, kad rodytumėte"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Baigti"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tęsti"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"%1$d ir %2$d „MediaPlayer“ klaidos kodas"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRADĖTI"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Kitas"</string>
 </resources>
diff --git a/v17/leanback/res/values-lv/strings.xml b/v17/leanback/res/values-lv/strings.xml
index 2b17bab..8f69284 100644
--- a/v17/leanback/res/values-lv/strings.xml
+++ b/v17/leanback/res/values-lv/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Iespējot slēgtos parakstus"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Atspējot slēgtos parakstus"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktivizēt režīmu Attēls attēlā"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Multivides vadīklas ir redzamas."</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Multivides vadīklas ir paslēptas. Nospiediet virzienu tastatūru, lai tās tiktu parādītas."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Pabeigt"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Turpināt"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer kļūdas kods: %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"SĀKT DARBU"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Nākamā"</string>
 </resources>
diff --git a/v17/leanback/res/values-mk/strings.xml b/v17/leanback/res/values-mk/strings.xml
index 5284f64..d694167 100644
--- a/v17/leanback/res/values-mk/strings.xml
+++ b/v17/leanback/res/values-mk/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Контролите за аудио-визуелните медиуми се скриени, притиснете на подлогата за насока за да ги прикажете"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Заврши"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продолжи"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Код за грешка на MediaPlayer %1$d дополнително %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЗАПОЧНИ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Следно"</string>
diff --git a/v17/leanback/res/values-ml/strings.xml b/v17/leanback/res/values-ml/strings.xml
index 012bf44..41ac9d5 100644
--- a/v17/leanback/res/values-ml/strings.xml
+++ b/v17/leanback/res/values-ml/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനക്ഷമമാക്കുക"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനരഹിതമാക്കുക"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' മോഡിലേക്ക് പ്രവേശിക്കുക"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"മീഡിയ നിയന്ത്രണങ്ങൾ ‌കാണിച്ചിരിക്കുന്നു"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"മീഡിയ നിയന്ത്രണങ്ങൾ ‌മറച്ചിരിക്കുന്നു, കാണിക്കുന്നതിന് ഡി-‌പാഡ് അമർത്തുക"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"പൂര്‍ത്തിയാക്കുക"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"തുടരുക"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"മീഡിയ പ്ലെയർ പിശക് കോഡ്: %1$d, കൂടെ %2$d എന്നതും"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ആരംഭിക്കുക"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"അടുത്തത്"</string>
 </resources>
diff --git a/v17/leanback/res/values-mn/strings.xml b/v17/leanback/res/values-mn/strings.xml
index 5cd8f4d..63d4392 100644
--- a/v17/leanback/res/values-mn/strings.xml
+++ b/v17/leanback/res/values-mn/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Өндөр чанарыг идэвхгүйжүүлэх"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Текст тайлбарыг идэвхжүүлэх"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Текст тайлбарыг идэвхгүйжүүлэх"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Зургийн горимд зураг оруулна уу"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Дэлгэцэн доторх дэлгэц горимд оруулна уу"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Медиа удирдлага харагдаж байна"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Медиа удирдлага нуугдсан байна, харуулахын тулд d-pad-г дарна уу"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Дуусгах"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Үргэлжлүүлэх"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-н алдааны код %1$d нэмэлт %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЭХЭЛЦГЭЭЕ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Дараах"</string>
 </resources>
diff --git a/v17/leanback/res/values-mr/strings.xml b/v17/leanback/res/values-mr/strings.xml
index ccadd10..79a7b0c 100644
--- a/v17/leanback/res/values-mr/strings.xml
+++ b/v17/leanback/res/values-mr/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षके सक्षम करा"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"उपशीर्षके अक्षम करा"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"चित्र मोडमध्ये चित्र प्रविष्ट करा"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"मीडिया नियंत्रणे दर्शवली आहेत"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मीडिया नियंत्रणे लपलेली आहेत, दर्शवण्‍यासाठी d-pad दाबा"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"सुरू ठेवा"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"मीडियाप्लेअर एरर कोड %1$d अतिरिक्त %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"प्रारंभ करा"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"पुढील"</string>
 </resources>
diff --git a/v17/leanback/res/values-ms/strings.xml b/v17/leanback/res/values-ms/strings.xml
index 5a66aac..8cad319 100644
--- a/v17/leanback/res/values-ms/strings.xml
+++ b/v17/leanback/res/values-ms/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Dayakan Kapsyen Tertutup"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Lumpuhkan Kapsyen Tertutup"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Masukkan Gambar Dalam Mod Gambar"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kawalan media ditunjukkan"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kawalan media disembunyikan, tekan d-pad untuk menunjukkan"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Teruskan"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Kod ralat MediaPlayer %1$d tambahan %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"MULAKAN"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seterusnya"</string>
 </resources>
diff --git a/v17/leanback/res/values-my/strings.xml b/v17/leanback/res/values-my/strings.xml
index 563ee04..5ba51af 100644
--- a/v17/leanback/res/values-my/strings.xml
+++ b/v17/leanback/res/values-my/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"အရည်အသွေးကောင်းအား ပိတ်ထားရန်"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"စာတမ်းထိုး ဖွင့်ရန်"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"စာတမ်းထိုးအား ပိတ်ထားရန်"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ဓာတ်ပုံမုဒ်တွင် ဓာတ်ပုံထည့်ပါ"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"တစ်ခုပေါ်တစ်ခု ထပ်၍ဖွင့်ခြင်းမုဒ်ကို ထည့်ပါ"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"မီဒီယာ ခလုတ်များကို ပြထားပါသည်"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"မီဒီယာခလုတ်များကို ဝှက်ထားပါသည်။ ပြရန် d-pad ကို နှိပ်ပါ"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ပြီးပြီ"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ဆက်လုပ်ရန်"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"−"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer မှားယွင်းမှုကုဒ် %1$d နှင့် အပို %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"စတင်ပါ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ရှေ့သို့"</string>
diff --git a/v17/leanback/res/values-nb/strings.xml b/v17/leanback/res/values-nb/strings.xml
index bdcd016..1e924a8 100644
--- a/v17/leanback/res/values-nb/strings.xml
+++ b/v17/leanback/res/values-nb/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediekontrollene er skjult – trykk på styrepilene for å vise dem"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fullfør"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsett"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-feilkode %1$d ekstra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM I GANG"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Neste"</string>
diff --git a/v17/leanback/res/values-ne/strings.xml b/v17/leanback/res/values-ne/strings.xml
index 1dd2da6..c6579a6 100644
--- a/v17/leanback/res/values-ne/strings.xml
+++ b/v17/leanback/res/values-ne/strings.xml
@@ -50,14 +50,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"बन्द क्याप्सनहरु सक्षम"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"बन्द क्याप्सनहरु असक्षम"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"चित्रलाई चित्र मोडमा प्रविष्ट गर्नुहोस्"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"मिडियाका नियन्त्रणहरू देखाएइका छन्"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मिडियाका नियन्त्रणहरू लुकेका छन्, देखाउनका लागि d-pad लाई थिच्नुहोस्"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त गर्नुहोस्"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी राख्नुहोस्"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer को त्रुटि सम्बन्धी कोड %1$d अतिरिक्त %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"सुरु गरौँ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"अर्को"</string>
 </resources>
diff --git a/v17/leanback/res/values-nl/strings.xml b/v17/leanback/res/values-nl/strings.xml
index c8bc8c8..2b236b0 100644
--- a/v17/leanback/res/values-nl/strings.xml
+++ b/v17/leanback/res/values-nl/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hoge kwaliteit uitschakelen"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ondertiteling inschakelen"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Ondertiteling uitschakelen"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Beeld-in-beeld-modus openen"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Scherm-in-scherm-modus openen"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Opties voor mediabediening worden weergegeven"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Opties voor mediabediening verborgen. Druk op de D-pad om ze weer te geven."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooien"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Doorgaan"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"-"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Mediaspeler: foutcode %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"AAN DE SLAG"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Volgende"</string>
 </resources>
diff --git a/v17/leanback/res/values-pa/strings.xml b/v17/leanback/res/values-pa/strings.xml
index 404bf3b..fe8fbd7 100644
--- a/v17/leanback/res/values-pa/strings.xml
+++ b/v17/leanback/res/values-pa/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ਬੰਦ ਕੈਪਸ਼ਨਿੰਗ ਸਮਰੱਥ ਬਣਾਓ"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ਬੰਦ ਕੈਪਸ਼ਨਿੰਗ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ਤਸਵੀਰ ਮੋਡ ਵਿੱਚ ਤਸਵੀਰ ਦਾਖਲ ਕਰੋ"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"ਮੀਡੀਆ ਕੰਟਰੋਲ ਵਿਖਾਏ ਗਏ"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ਮੀਡੀਆ ਕੰਟਰੋਲ ਲੁਕੇ ਹੋਏ ਹਨ, ਵਿਖਾਉਣ ਲਈ ਡੀ-ਪੈਡ ਦਬਾਓ"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ਖ਼ਤਮ"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ਜਾਰੀ ਰੱਖੋ"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ਗੜਬੜ ਕੋਡ %1$d ਵਾਧੂ %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ਸ਼ੁਰੂਆਤ ਕਰੋ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ਅੱਗੇ"</string>
 </resources>
diff --git a/v17/leanback/res/values-pl/strings.xml b/v17/leanback/res/values-pl/strings.xml
index b986598..879c064 100644
--- a/v17/leanback/res/values-pl/strings.xml
+++ b/v17/leanback/res/values-pl/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Włącz napisy"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Wyłącz napisy"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Włącz tryb obrazu w obrazie"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Elementy sterujące multimediami są wyświetlone"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Elementy sterujące multimediami są ukryte. Naciśnij pad kierunkowy, by je wyświetlić"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Zakończ"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Dalej"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer – kod błędu %1$d, dodatkowo %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ROZPOCZNIJ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalej"</string>
 </resources>
diff --git a/v17/leanback/res/values-pt-rBR/strings.xml b/v17/leanback/res/values-pt-rBR/strings.xml
index c5f238e..1076b87 100644
--- a/v17/leanback/res/values-pt-rBR/strings.xml
+++ b/v17/leanback/res/values-pt-rBR/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Os controles de mídia estão ocultos. Pressione o botão direcional para exibi-los"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro do MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRIMEIROS PASSOS"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Próximo"</string>
diff --git a/v17/leanback/res/values-pt-rPT/strings.xml b/v17/leanback/res/values-pt-rPT/strings.xml
index 41ea488..315828d 100644
--- a/v17/leanback/res/values-pt-rPT/strings.xml
+++ b/v17/leanback/res/values-pt-rPT/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar legendas"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar legendas"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Entrar no modo Imagem na imagem"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Entrar no modo de ecrã no ecrã"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Controlos de multimédia apresentados"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Controlos de multimédia ocultados, prima o teclado direcional para mostrar"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro do MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"INICIAR"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seguinte"</string>
diff --git a/v17/leanback/res/values-pt/strings.xml b/v17/leanback/res/values-pt/strings.xml
index c5f238e..1076b87 100644
--- a/v17/leanback/res/values-pt/strings.xml
+++ b/v17/leanback/res/values-pt/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Os controles de mídia estão ocultos. Pressione o botão direcional para exibi-los"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro do MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRIMEIROS PASSOS"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Próximo"</string>
diff --git a/v17/leanback/res/values-ro/strings.xml b/v17/leanback/res/values-ro/strings.xml
index 325632e..a362541 100644
--- a/v17/leanback/res/values-ro/strings.xml
+++ b/v17/leanback/res/values-ro/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Comenzile media sunt ascunse. Apăsați pe butonul direcțional pentru a le afișa."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizați"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuați"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Cod de eroare MediaPlayer %1$d suplimentar %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ÎNCEPEȚI"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Înainte"</string>
diff --git a/v17/leanback/res/values-ru/strings.xml b/v17/leanback/res/values-ru/strings.xml
index 8631587..8d045cf 100644
--- a/v17/leanback/res/values-ru/strings.xml
+++ b/v17/leanback/res/values-ru/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Элементы управления скрыты. Нажмите D-pad, чтобы показать их."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Готово"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далее"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Код ошибки медиапроигрывателя: %1$d (дополнительный: %2$d)"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"НАЧАТЬ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далее"</string>
diff --git a/v17/leanback/res/values-si/strings.xml b/v17/leanback/res/values-si/strings.xml
index b92e6ec..54f2f08 100644
--- a/v17/leanback/res/values-si/strings.xml
+++ b/v17/leanback/res/values-si/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"වැසුණු ශිර්ෂ කිරීම සබල කරන ලදි"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"වැසුණු ශිර්ෂ කිරීම අබල කරන ලදි"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"පින්තූරය-තුළ-පින්තූරය ප්‍රකාරයට ඇතුළු වන්න"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"මාධ්‍ය පාලක පෙන්වා ඇත"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"මාධ්‍ය පාලක සඟවා ඇත, පෙන්වීමට d-pad ඔබන්න"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"අවසානය"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"දිගටම කර ගෙන යන්න"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer දෝෂ කේතය %1$d අමතර %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ආරම්භ කරන්න"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ඊළඟ"</string>
 </resources>
diff --git a/v17/leanback/res/values-sk/strings.xml b/v17/leanback/res/values-sk/strings.xml
index 731d62b..fe45e2c 100644
--- a/v17/leanback/res/values-sk/strings.xml
+++ b/v17/leanback/res/values-sk/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zakázať médiá vo vysokej kvalite"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnúť skryté titulky"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnúť skryté titulky"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vložiť obrázok v režime obrázka"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Prejsť do režimu obraz v obraze"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Ovládacie prvky médií sa zobrazujú"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Ovládacie prvky médií sú skryté, zobrazíte ich stlačením krížového ovládača"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončiť"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovať"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kód chyby MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČÍNAME"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Ďalej"</string>
diff --git a/v17/leanback/res/values-sl/strings.xml b/v17/leanback/res/values-sl/strings.xml
index 2fd75f7..d47b3af 100644
--- a/v17/leanback/res/values-sl/strings.xml
+++ b/v17/leanback/res/values-sl/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Omogoči podnapise"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Onemogoči podnapise"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vklop načina za sliko v sliki"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kontrolniki predstavnosti so prikazani"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrolniki predstavnosti so skriti, za prikaz pritisnite smerni gumb"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončaj"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Naprej"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Koda napake MediaPlayer %1$d dodatno %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČNITE"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Naprej"</string>
 </resources>
diff --git a/v17/leanback/res/values-sq/strings.xml b/v17/leanback/res/values-sq/strings.xml
index c34f5ba..4057cae 100644
--- a/v17/leanback/res/values-sq/strings.xml
+++ b/v17/leanback/res/values-sq/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Çaktivizo \"Cilësinë e lartë\""</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivizo titrat"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Çaktivizo titrat me sekuencë kohore"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Fut një fotografi në modalitetin e fotografisë"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktivizo modalitetin e figurës brenda figurës"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kontrollet e medias të shfaqura"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrollet e medias të fshehura, shtyp bllokun e drejtimit për t\'i shfaqur"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Përfundo"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Vazhdo"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Kodi i gabimit i MediaPlayer %1$d shtesa %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"FILLO"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Përpara"</string>
diff --git a/v17/leanback/res/values-sr/strings.xml b/v17/leanback/res/values-sr/strings.xml
index 705aafe..e22d127 100644
--- a/v17/leanback/res/values-sr/strings.xml
+++ b/v17/leanback/res/values-sr/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Контроле за медије су скривене, притисните контроле за кретање да бисте их приказали"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Доврши"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Настави"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Кôд грешке MediaPlayer-а %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЗАПОЧНИТЕ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Даље"</string>
diff --git a/v17/leanback/res/values-sv/strings.xml b/v17/leanback/res/values-sv/strings.xml
index d528d53..80a9050 100644
--- a/v17/leanback/res/values-sv/strings.xml
+++ b/v17/leanback/res/values-sv/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediakontrollerna är dolda och visas om du trycker på styrkorset"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Slutför"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsätt"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Felkod för MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM IGÅNG"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Nästa"</string>
diff --git a/v17/leanback/res/values-sw/strings.xml b/v17/leanback/res/values-sw/strings.xml
index 19fbc54..8672cd6 100644
--- a/v17/leanback/res/values-sw/strings.xml
+++ b/v17/leanback/res/values-sw/strings.xml
@@ -47,13 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zima Ubora wa Juu"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Washa manukuu"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Zima manukuu"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Weka Picha Katika Hali ya Picha"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Weka Hali ya Picha ndani ya Picha Nyingine"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Inaonyesha udhibiti wa maudhui"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Imeficha udhibiti wa maudhui, bonyeza d-pad ili uuonyeshe"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Kamilisha"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Endelea"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Msimbo wa hitilafu wa Kichezaji Maudhui %1$d %2$d zaidi"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ANZA KUTUMIA"</string>
-    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Inayofuata"</string>
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Endelea"</string>
 </resources>
diff --git a/v17/leanback/res/values-ta/strings.xml b/v17/leanback/res/values-ta/strings.xml
index ca53421..f5d84e2 100644
--- a/v17/leanback/res/values-ta/strings.xml
+++ b/v17/leanback/res/values-ta/strings.xml
@@ -47,12 +47,14 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"உயர் தரத்தை முடக்கு"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"விரிவான வசனங்களை இயக்கு"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"விரிவான வசனங்களை முடக்கு"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"பிக்ச்சர் இன் பிக்ச்சர் பயன்முறைக்குச் செல்"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறைக்குச் செல்"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"மீடியா கட்டுப்பாடுகள் காட்டப்படுகின்றன"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"மீடியா கட்டுப்பாடுகள் மறைக்கப்பட்டுள்ளன. கட்டுப்பாடுகளைக் காட்ட, டிபேடை அழுத்தவும்"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"முடி"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"தொடர்க"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer பிழைக் குறியீடு: %1$d கூடுதல் %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"தொடங்குக"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"அடுத்து"</string>
diff --git a/v17/leanback/res/values-te/strings.xml b/v17/leanback/res/values-te/strings.xml
index d0ab476..6b8d1f4 100644
--- a/v17/leanback/res/values-te/strings.xml
+++ b/v17/leanback/res/values-te/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"సంవృత శీర్షికలను ప్రారంభించు"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"సంవృత శీర్షికలను నిలిపివేయి"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"చిత్రంలో చిత్రం మోడ్‌లోకి ప్రవేశించండి"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"మీడియా నియంత్రణలు చూపబడ్డాయి"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"మీడియా నియంత్రణలు దాచబడ్డాయి, చూపించడానికి d-ప్యాడ్ నొక్కండి"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ముగించు"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"కొనసాగించు"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ఎర్రర్ కోడ్ %1$d అదనంగా %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ప్రారంభించు"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"తదుపరి"</string>
 </resources>
diff --git a/v17/leanback/res/values-th/strings.xml b/v17/leanback/res/values-th/strings.xml
index 2ab6b50..0dae8eb 100644
--- a/v17/leanback/res/values-th/strings.xml
+++ b/v17/leanback/res/values-th/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"เปิดใช้คำบรรยาย"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ปิดใช้คำบรรยาย"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"เข้าสู่โหมดการแสดงผลหลายแหล่งพร้อมกัน"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"แสดงการควบคุมสื่ออยู่"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ซ่อนการควบคุมสื่ออยู่ กด d-pad เพื่อแสดง"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"เสร็จสิ้น"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ต่อไป"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"รหัสข้อผิดพลาด MediaPlayer %1$d เพิ่มเติม %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"เริ่มต้นใช้งาน"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ถัดไป"</string>
 </resources>
diff --git a/v17/leanback/res/values-tl/strings.xml b/v17/leanback/res/values-tl/strings.xml
index 735e7ec..0214efc 100644
--- a/v17/leanback/res/values-tl/strings.xml
+++ b/v17/leanback/res/values-tl/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"I-enable ang Paglalagay ng Subtitle"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"I-disable ang Paglalagay ng Subtitle"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Pumasok sa Picture In Picture Mode"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Ipinapakita ang mga kontrol ng media"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Nakatago ang mga kontrol ng media, pindutin ang d-pad upang ipakita"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tapusin"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Magpatuloy"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Code ng error na %1$d ng MediaPlayer na may extra na %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"MAGSIMULA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Susunod"</string>
 </resources>
diff --git a/v17/leanback/res/values-tr/strings.xml b/v17/leanback/res/values-tr/strings.xml
index f04c2b1..1f7fe3a 100644
--- a/v17/leanback/res/values-tr/strings.xml
+++ b/v17/leanback/res/values-tr/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yüksek Kalitede Oynatmayı Devre Dışı Bırak"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Altyazıları Etkinleştir"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Altyazıları Devre Dışı Bırak"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Resim İçinde Resim Moduna Geç"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Pencere İçinde Pencere Moduna Geç"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"."</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Medya denetimleri gösteriliyor"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Medya denetimleri gizli durumda. Görüntülemek için d-pad\'e basın."</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Son"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Devam"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer hata kodu %1$d ekstra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BAŞLA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Sonraki"</string>
 </resources>
diff --git a/v17/leanback/res/values-uk/strings.xml b/v17/leanback/res/values-uk/strings.xml
index 12a9ebf..1829560 100644
--- a/v17/leanback/res/values-uk/strings.xml
+++ b/v17/leanback/res/values-uk/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Елементи керування медіа сховано. Натисніть цифрову панель, щоб показати їх"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Закінчити"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продовжити"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Код помилки MediaPlayer: %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПОЧАТИ"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далі"</string>
diff --git a/v17/leanback/res/values-ur/strings.xml b/v17/leanback/res/values-ur/strings.xml
index a5343a2..f5b7a25 100644
--- a/v17/leanback/res/values-ur/strings.xml
+++ b/v17/leanback/res/values-ur/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"سب ٹائٹلز کو فعال کریں"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"سب ٹائٹلز کو غیر فعال کریں"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"\'تصویر میں تصویر موڈ\' میں داخل ہوں"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"میڈیا کنٹرولز عیاں ہیں"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"‏میڈیا کنٹرولز مخفی ہیں، شو کرنے کیلئے d-pad دبائیں"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"مکمل کریں"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"جاری رکھیں"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"‏میڈیا پلیئر کی خرابی کا کوڈ %1$d اضافی %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"شروع کریں"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"اگلا"</string>
 </resources>
diff --git a/v17/leanback/res/values-uz/strings.xml b/v17/leanback/res/values-uz/strings.xml
index f09f78f..9719bc6 100644
--- a/v17/leanback/res/values-uz/strings.xml
+++ b/v17/leanback/res/values-uz/strings.xml
@@ -47,13 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yuqori sifatni o‘chirib qo‘yish"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Taglavhalarni yoqish"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Taglavhalarni o‘chirib qo‘yish"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tasvir ichida tasvir rejimiga kirish"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tasvir ustida tasvir rejimiga kirish"</string>
     <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Boshqaruv elementlari ochiq"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Boshqaruv elementlari berkitilgan, ochish uchun D-pad tugmasini bosing"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tugatish"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davom etish"</string>
-    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer xatosi kodi: %1$d, %2$d"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Media pleyer xatoligi kodi: %1$d (yana: %2$d)"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BOSHLADIK"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Keyingisi"</string>
 </resources>
diff --git a/v17/leanback/res/values-vi/strings.xml b/v17/leanback/res/values-vi/strings.xml
index fb8c229..0de7ca4 100644
--- a/v17/leanback/res/values-vi/strings.xml
+++ b/v17/leanback/res/values-vi/strings.xml
@@ -47,15 +47,15 @@
     <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Tắt chế độ chất lượng cao"</string>
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Bật phụ đề"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Tắt phụ đề"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vào ảnh ở chế độ ảnh"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vào chế độ ảnh trong ảnh"</string>
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"Điều khiển phương tiện được hiển thị"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Điều khiển phương tiện bị ẩn, nhấn d-pad để hiển thị"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Hoàn tất"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tiếp tục"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"Mã lỗi MediaPlayer %1$d %2$d bổ sung"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BẮT ĐẦU"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Tiếp theo"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rCN/strings.xml b/v17/leanback/res/values-zh-rCN/strings.xml
index 1990d40..d635311 100644
--- a/v17/leanback/res/values-zh-rCN/strings.xml
+++ b/v17/leanback/res/values-zh-rCN/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"开启字幕"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"关闭字幕"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"进入画中画模式"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"媒体控件已显示"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"媒体控件已隐藏,按 D-pad 即可显示"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"继续"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 错误代码:%1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"开始使用"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"下一页"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rHK/strings.xml b/v17/leanback/res/values-zh-rHK/strings.xml
index 00df362..2da2e73 100644
--- a/v17/leanback/res/values-zh-rHK/strings.xml
+++ b/v17/leanback/res/values-zh-rHK/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"進入「畫中畫模式」"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"畫面已顯示媒體控制項"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"畫面已隱藏媒體控制項,按十字鍵即可顯示"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 錯誤代碼:%1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"開始使用"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"下一頁"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rTW/strings.xml b/v17/leanback/res/values-zh-rTW/strings.xml
index 421d0ff..721dc6e 100644
--- a/v17/leanback/res/values-zh-rTW/strings.xml
+++ b/v17/leanback/res/values-zh-rTW/strings.xml
@@ -48,14 +48,14 @@
     <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
     <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"進入子母畫面模式"</string>
-    <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
-    <skip />
+    <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
     <string name="lb_playback_controls_shown" msgid="6382160135512023238">"媒體控制項已顯示"</string>
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"媒體控制項已隱藏,按下 D-Pad 即可顯示"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
-    <!-- no translation found for lb_media_player_error (3650250994187305396) -->
-    <skip />
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 錯誤代碼:%1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"開始使用"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"繼續"</string>
 </resources>
diff --git a/v17/leanback/res/values-zu/strings.xml b/v17/leanback/res/values-zu/strings.xml
index 06f5641..6812abd 100644
--- a/v17/leanback/res/values-zu/strings.xml
+++ b/v17/leanback/res/values-zu/strings.xml
@@ -53,6 +53,8 @@
     <string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Izilawuli zemidiya zifihliwe, cindezela ku-d-pad ukuze uzibonise"</string>
     <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Qeda"</string>
     <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Qhubeka"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_media_player_error" msgid="3650250994187305396">"Ikhodi yephutha le-MediaPlayer %1$d extra %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"QALISA"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Okulandelayo"</string>
diff --git a/v17/leanback/res/values/strings.xml b/v17/leanback/res/values/strings.xml
index 1d6c417..aef086a 100644
--- a/v17/leanback/res/values/strings.xml
+++ b/v17/leanback/res/values/strings.xml
@@ -91,6 +91,11 @@
     <!-- Title of standard Continue action for GuidedStepFragment -->
     <string name="lb_guidedaction_continue_title">Continue</string>
 
+    <!-- Separator for date picker [CHAR LIMIT=2] -->
+    <string name="lb_date_separator">/</string>
+    <!-- Separator for time picker [CHAR LIMIT=2] -->
+    <string name="lb_time_separator">:</string>
+
     <!-- Error string for MediaPlayer -->
     <string name="lb_media_player_error">MediaPlayer error code %1$d extra %2$d</string>
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
index 2744dec..7725bf3 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
@@ -29,7 +29,6 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
 
@@ -75,6 +74,7 @@
         super(context, attrs, defStyleAttr);
 
         updateCurrentLocale();
+        setSeparator(mConstant.dateSeparator);
 
         final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
                 R.styleable.lbDatePicker);
@@ -120,98 +120,6 @@
     }
 
     /**
-     * Returns the best localized representation of the date for the given date format and the
-     * current locale.
-     *
-     * @param datePickerFormat The date format skeleton (e.g. "dMy") used to gather the
-     *                         appropriate representation of the date in the current locale.
-     *
-     * @return The best localized representation of the date for the given date format
-     */
-    String getBestYearMonthDayPattern(String datePickerFormat) {
-        final String yearPattern;
-        if (PickerUtility.SUPPORTS_BEST_DATE_TIME_PATTERN) {
-            yearPattern = android.text.format.DateFormat.getBestDateTimePattern(mConstant.locale,
-                    datePickerFormat);
-        } else {
-            final java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(
-                    getContext());
-            if (dateFormat instanceof SimpleDateFormat) {
-                yearPattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();
-            } else {
-                yearPattern = DATE_FORMAT;
-            }
-        }
-        return TextUtils.isEmpty(yearPattern) ? DATE_FORMAT : yearPattern;
-    }
-
-    /**
-     * Extracts the separators used to separate date fields (including before the first and after
-     * the last date field). The separators can vary based on the individual locale date format,
-     * defined in the Unicode CLDR and cannot be supposed to be "/".
-     *
-     * See http://unicode.org/cldr/trac/browser/trunk/common/main
-     *
-     * For example, for Croatian in dMy format, the best localized representation is "d. M. y". This
-     * method returns {"", ".", ".", "."}, where the first separator indicates nothing needs to be
-     * displayed to the left of the day field, "." needs to be displayed tos the right of the day
-     * field, and so forth.
-     *
-     * @return The ArrayList of separators to populate between the actual date fields in the
-     * DatePicker.
-     */
-    List<CharSequence> extractSeparators() {
-        // Obtain the time format string per the current locale (e.g. h:mm a)
-        String hmaPattern = getBestYearMonthDayPattern(mDatePickerFormat);
-
-        List<CharSequence> separators = new ArrayList<>();
-        StringBuilder sb = new StringBuilder();
-        char lastChar = '\0';
-        // See http://www.unicode.org/reports/tr35/tr35-dates.html for date formats
-        final char[] dateFormats = {'Y', 'y', 'M', 'm', 'D', 'd'};
-        boolean processingQuote = false;
-        for (int i = 0; i < hmaPattern.length(); i++) {
-            char c = hmaPattern.charAt(i);
-            if (c == ' ') {
-                continue;
-            }
-            if (c == '\'') {
-                if (!processingQuote) {
-                    sb.setLength(0);
-                    processingQuote = true;
-                } else {
-                    processingQuote = false;
-                }
-                continue;
-            }
-            if (processingQuote) {
-                sb.append(c);
-            } else {
-                if (isAnyOf(c, dateFormats)) {
-                    if (c != lastChar) {
-                        separators.add(sb.toString());
-                        sb.setLength(0);
-                    }
-                } else {
-                    sb.append(c);
-                }
-            }
-            lastChar = c;
-        }
-        separators.add(sb.toString());
-        return separators;
-    }
-
-    private static boolean isAnyOf(char c, char[] any) {
-        for (int i = 0; i < any.length; i++) {
-            if (c == any[i]) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
      * Changes format of showing dates.  For example "YMD".
      * @param datePickerFormat Format of showing dates.
      */
@@ -220,22 +128,16 @@
             datePickerFormat = new String(
                     android.text.format.DateFormat.getDateFormatOrder(getContext()));
         }
+        datePickerFormat = datePickerFormat.toUpperCase();
         if (TextUtils.equals(mDatePickerFormat, datePickerFormat)) {
             return;
         }
         mDatePickerFormat = datePickerFormat;
-        List<CharSequence> separators = extractSeparators();
-        if (separators.size() != (datePickerFormat.length() + 1)) {
-            throw new IllegalStateException("Separators size: " + separators.size() + " must equal"
-                    + " the size of datePickerFormat: " + datePickerFormat.length() + " + 1");
-        }
-        setSeparators(separators);
         mYearColumn = mMonthColumn = mDayColumn = null;
         mColYearIndex = mColDayIndex = mColMonthIndex = -1;
-        String dateFieldsPattern = datePickerFormat.toUpperCase();
         ArrayList<PickerColumn> columns = new ArrayList<PickerColumn>(3);
-        for (int i = 0; i < dateFieldsPattern.length(); i++) {
-            switch (dateFieldsPattern.charAt(i)) {
+        for (int i = 0; i < datePickerFormat.length(); i++) {
+            switch (datePickerFormat.charAt(i)) {
             case 'Y':
                 if (mYearColumn != null) {
                     throw new IllegalArgumentException("datePicker format error");
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
index 486e877..28d7aeb 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
@@ -20,7 +20,6 @@
 import android.support.v17.leanback.widget.OnChildViewHolderSelectedListener;
 import android.support.v17.leanback.widget.VerticalGridView;
 import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.KeyEvent;
@@ -34,7 +33,6 @@
 import android.widget.TextView;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -76,53 +74,23 @@
     private float mVisibleItems = 1;
     private int mSelectedColumn = 0;
 
-    private List<CharSequence> mSeparators = new ArrayList<>();
+    private CharSequence mSeparator;
     private int mPickerItemLayoutId = R.layout.lb_picker_item;
     private int mPickerItemTextViewId = 0;
 
     /**
      * Gets separator string between columns.
-     *
-     * @return The separator that will be populated between all the Picker columns.
-     * @deprecated Use {@link #getSeparators()}
      */
     public final CharSequence getSeparator() {
-        return mSeparators.get(0);
+        return mSeparator;
     }
 
     /**
      * Sets separator String between Picker columns.
-     *
      * @param separator Separator String between Picker columns.
      */
     public final void setSeparator(CharSequence separator) {
-        setSeparators(Arrays.asList(separator));
-    }
-
-    /**
-     * Returns the list of separators that will be populated between the picker column fields.
-     *
-     * @return The list of separators populated between the picker column fields.
-     */
-    public final List<CharSequence> getSeparators() {
-        return mSeparators;
-    }
-
-    /**
-     * Sets the list of separators that will be populated between the Picker columns. The
-     * number of the separators should be either 1 indicating the same separator used between all
-     * the columns fields (and nothing will be placed before the first and after the last column),
-     * or must be one unit larger than the number of columns passed to {@link #setColumns(List)}.
-     * In the latter case, the list of separators corresponds to the positions before the first
-     * column all the way to the position after the last column.
-     * An empty string for a given position indicates no separators needs to be placed for that
-     * position, otherwise a TextView with the given String will be created and placed there.
-     *
-     * @param separators The list of separators to be populated between the Picker columns.
-     */
-    public final void setSeparators(List<CharSequence> separators) {
-        mSeparators.clear();
-        mSeparators.addAll(separators);
+        mSeparator = separator;
     }
 
     /**
@@ -148,7 +116,6 @@
      * layout provided by {@link Picker#getPickerItemLayoutId()} or 0 if the
      * layout provided by {@link Picker#getPickerItemLayoutId()} is a {link
      * TextView}.
-     *
      * @param textViewId View id of TextView inside a Picker item, or 0 if the Picker item is a
      *                   TextView.
      */
@@ -158,6 +125,9 @@
 
     /**
      * Creates a Picker widget.
+     * @param context
+     * @param attrs
+     * @param defStyleAttr
      */
     public Picker(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
@@ -170,8 +140,7 @@
         mVisibleColumnAlpha = 0.5f; //getFloat(R.dimen.picker_item_visible_column_item_alpha);
         mInvisibleColumnAlpha = 0f; //getFloat(R.dimen.picker_item_invisible_column_item_alpha);
 
-        mAlphaAnimDuration =
-                200; // mContext.getResources().getInteger(R.integer.dialog_animation_duration);
+        mAlphaAnimDuration = 200; // mContext.getResources().getInteger(R.integer.dialog_animation_duration);
 
         mDecelerateInterpolator = new DecelerateInterpolator(2.5F);
         mAccelerateInterpolator = new AccelerateInterpolator(2.5F);
@@ -183,8 +152,7 @@
 
     /**
      * Get nth PickerColumn.
-     *
-     * @param colIndex Index of PickerColumn.
+     * @param colIndex  Index of PickerColumn.
      * @return PickerColumn at colIndex or null if {@link #setColumns(List)} is not called yet.
      */
     public PickerColumn getColumnAt(int colIndex) {
@@ -196,7 +164,6 @@
 
     /**
      * Get number of PickerColumns.
-     *
      * @return Number of PickerColumns or 0 if {@link #setColumns(List)} is not called yet.
      */
     public int getColumnsCount() {
@@ -208,30 +175,9 @@
 
     /**
      * Set columns and create Views.
-     *
-     * @param columns The actual focusable columns of a picker which are scrollable if the field
-     *                takes more than one value (e.g. for a DatePicker, day, month, and year fields
-     *                and for TimePicker, hour, minute, and am/pm fields form the columns).
+     * @param columns PickerColumns to be shown in the Picker.
      */
     public void setColumns(List<PickerColumn> columns) {
-        if (mSeparators.size() == 0) {
-            throw new IllegalStateException("Separators size is: " + mSeparators.size()
-                    + ". At least one separator must be provided");
-        } else if (mSeparators.size() == 1) {
-            CharSequence separator = mSeparators.get(0);
-            mSeparators.clear();
-            mSeparators.add("");
-            for (int i = 0; i < columns.size() - 1; i++) {
-                mSeparators.add(separator);
-            }
-            mSeparators.add("");
-        } else {
-            if (mSeparators.size() != (columns.size() + 1)) {
-                throw new IllegalStateException("Separators size: " + mSeparators.size() + " must"
-                        + "equal the size of columns: " + columns.size() + " + 1");
-            }
-        }
-
         mColumnViews.clear();
         mPickerView.removeAllViews();
         mColumns = new ArrayList<PickerColumn>(columns);
@@ -240,13 +186,6 @@
         }
         LayoutInflater inflater = LayoutInflater.from(getContext());
         int totalCol = getColumnsCount();
-
-        if (!TextUtils.isEmpty(mSeparators.get(0))) {
-            TextView separator = (TextView) inflater.inflate(
-                    R.layout.lb_picker_separator, mPickerView, false);
-            separator.setText(mSeparators.get(0));
-            mPickerView.addView(separator);
-        }
         for (int i = 0; i < totalCol; i++) {
             final int colIndex = i;
             final VerticalGridView columnView = (VerticalGridView) inflater.inflate(
@@ -263,16 +202,16 @@
             // as a result of the picker getting activated, otherwise the cached views with the
             // wrong alphas could be laid out.
             columnView.setItemViewCacheSize(0);
-
             mColumnViews.add(columnView);
+
             // add view to root
             mPickerView.addView(columnView);
 
-            if (!TextUtils.isEmpty(mSeparators.get(i + 1))) {
-                // add a separator if not the last element
+            // add a separator if not the last element
+            if (i != totalCol - 1 && getSeparator() != null) {
                 TextView separator = (TextView) inflater.inflate(
                         R.layout.lb_picker_separator, mPickerView, false);
-                separator.setText(mSeparators.get(i + 1));
+                separator.setText(getSeparator());
                 mPickerView.addView(separator);
             }
 
@@ -285,9 +224,8 @@
     /**
      * When column labels change or column range changes, call this function to re-populate the
      * selection list.  Note this function cannot be called from RecyclerView layout/scroll pass.
-     *
      * @param columnIndex Index of column to update.
-     * @param column      New column to update.
+     * @param column New column to update.
      */
     public void setColumnAt(int columnIndex, PickerColumn column) {
         mColumns.set(columnIndex, column);
@@ -301,9 +239,8 @@
 
     /**
      * Manually set current value of a column.  The function will update UI and notify listeners.
-     *
-     * @param columnIndex  Index of column to update.
-     * @param value        New value of the column.
+     * @param columnIndex Index of column to update.
+     * @param value New value of the column.
      * @param runAnimation True to scroll to the value or false otherwise.
      */
     public void setColumnValue(int columnIndex, int value, boolean runAnimation) {
@@ -333,7 +270,6 @@
 
     /**
      * Register a callback to be invoked when the picker's value has changed.
-     *
      * @param listener The callback to ad
      */
     public void addOnValueChangedListener(PickerValueListener listener) {
@@ -345,7 +281,6 @@
 
     /**
      * Remove a previously installed value changed callback
-     *
      * @param listener The callback to remove.
      */
     public void removeOnValueChangedListener(PickerValueListener listener) {
@@ -376,7 +311,7 @@
             if (columnShownAsActivated) {
                 setOrAnimateAlpha(view, animate, mFocusedAlpha, -1, mDecelerateInterpolator);
             } else {
-                setOrAnimateAlpha(view, animate, mUnfocusedAlpha, -1, mDecelerateInterpolator);
+                setOrAnimateAlpha(view, animate, mUnfocusedAlpha, -1,  mDecelerateInterpolator);
             }
         } else {
             // set alpha for remaining items in the column
@@ -408,12 +343,11 @@
     /**
      * Classes extending {@link Picker} can override this function to supply the
      * behavior when a list has been scrolled.  Subclass may call {@link #setColumnValue(int, int,
-     * boolean)} and or {@link #setColumnAt(int, PickerColumn)}.  Subclass should not directly call
+     * boolean)} and or {@link #setColumnAt(int,PickerColumn)}.  Subclass should not directly call
      * {@link PickerColumn#setCurrentValue(int)} which does not update internal state or notify
      * listeners.
-     *
      * @param columnIndex index of which column was changed.
-     * @param newValue    A new value desired to be set on the column.
+     * @param newValue A new value desired to be set on the column.
      */
     public void onColumnValueChanged(int columnIndex, int newValue) {
         PickerColumn column = mColumns.get(columnIndex);
@@ -491,37 +425,35 @@
     private final OnChildViewHolderSelectedListener mColumnChangeListener = new
             OnChildViewHolderSelectedListener() {
 
-                @Override
-                public void onChildViewHolderSelected(RecyclerView parent,
-                        RecyclerView.ViewHolder child,
-                        int position, int subposition) {
-                    PickerScrollArrayAdapter pickerScrollArrayAdapter =
-                            (PickerScrollArrayAdapter) parent
-                                    .getAdapter();
+        @Override
+        public void onChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child,
+                int position, int subposition) {
+            PickerScrollArrayAdapter pickerScrollArrayAdapter = (PickerScrollArrayAdapter) parent
+                    .getAdapter();
 
-                    int colIndex = mColumnViews.indexOf(parent);
-                    updateColumnAlpha(colIndex, true);
-                    if (child != null) {
-                        int newValue = mColumns.get(colIndex).getMinValue() + position;
-                        onColumnValueChanged(colIndex, newValue);
-                    }
-                }
+            int colIndex = mColumnViews.indexOf(parent);
+            updateColumnAlpha(colIndex, true);
+            if (child != null) {
+                int newValue = mColumns.get(colIndex).getMinValue() + position;
+                onColumnValueChanged(colIndex, newValue);
+            }
+        }
 
-            };
+    };
 
     @Override
     public boolean dispatchKeyEvent(android.view.KeyEvent event) {
         if (isActivated()) {
             final int keyCode = event.getKeyCode();
             switch (keyCode) {
-                case KeyEvent.KEYCODE_DPAD_CENTER:
-                case KeyEvent.KEYCODE_ENTER:
-                    if (event.getAction() == KeyEvent.ACTION_UP) {
-                        performClick();
-                    }
-                    break;
-                default:
-                    return super.dispatchKeyEvent(event);
+            case KeyEvent.KEYCODE_DPAD_CENTER:
+            case KeyEvent.KEYCODE_ENTER:
+                if (event.getAction() == KeyEvent.ACTION_UP) {
+                    performClick();
+                }
+                break;
+            default:
+                return super.dispatchKeyEvent(event);
             }
             return true;
         }
@@ -569,11 +501,9 @@
             }
         }
     }
-
     /**
      * Returns number of visible items showing in a column when it's activated.  The default value
      * is 3.
-     *
      * @return Number of visible items showing in a column when it's activated.
      */
     public float getActivatedVisibleItemCount() {
@@ -583,7 +513,6 @@
     /**
      * Changes number of visible items showing in a column when it's activated.  The default value
      * is 3.
-     *
      * @param visiblePickerItems Number of visible items showing in a column when it's activated.
      */
     public void setActivatedVisibleItemCount(float visiblePickerItems) {
@@ -601,7 +530,6 @@
     /**
      * Returns number of visible items showing in a column when it's not activated.  The default
      * value is 1.
-     *
      * @return Number of visible items showing in a column when it's not activated.
      */
     public float getVisibleItemCount() {
@@ -611,7 +539,6 @@
     /**
      * Changes number of visible items showing in a column when it's not activated.  The default
      * value is 1.
-     *
      * @param pickerItems Number of visible items showing in a column when it's not activated.
      */
     public void setVisibleItemCount(float pickerItems) {
@@ -678,7 +605,6 @@
      * Change current selected column.  Picker shows multiple items on selected column if Picker has
      * focus.  Picker shows multiple items on all column if Picker has no focus (e.g. a Touchscreen
      * screen).
-     *
      * @param columnIndex Index of column to activate.
      */
     public void setSelectedColumn(int columnIndex) {
@@ -692,7 +618,6 @@
 
     /**
      * Get current activated column index.
-     *
      * @return Current activated column index.
      */
     public int getSelectedColumn() {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java
index bff278a..1e3a28f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java
@@ -17,7 +17,7 @@
 package android.support.v17.leanback.widget.picker;
 
 import android.content.res.Resources;
-import android.os.Build;
+import android.support.v17.leanback.R;
 
 import java.text.DateFormatSymbols;
 import java.util.Calendar;
@@ -29,13 +29,11 @@
  */
 class PickerUtility {
 
-    // Whether the API version supports the use of {@link DateFormat#getBestDateTimePattern()}
-    static final boolean SUPPORTS_BEST_DATE_TIME_PATTERN =
-            Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
     public static class DateConstant {
         public final Locale locale;
         public final String[] months;
         public final String[] days;
+        public final String dateSeparator;
 
         private DateConstant(Locale locale, Resources resources) {
             this.locale = locale;
@@ -44,6 +42,7 @@
             Calendar calendar = Calendar.getInstance(locale);
             days = createStringIntArrays(calendar.getMinimum(Calendar.DAY_OF_MONTH),
                     calendar.getMaximum(Calendar.DAY_OF_MONTH), "%02d");
+            dateSeparator = resources.getString(R.string.lb_date_separator);
         }
     }
 
@@ -53,6 +52,7 @@
         public final String[] hours24;
         public final String[] minutes;
         public final String[] ampm;
+        public final String timeSeparator;
 
         private TimeConstant(Locale locale, Resources resources) {
             this.locale = locale;
@@ -61,6 +61,7 @@
             hours24 = createStringIntArrays(0, 23, "%02d");
             minutes = createStringIntArrays(0, 59, "%02d");
             ampm = symbols.getAmPmStrings();
+            timeSeparator = resources.getString(R.string.lb_time_separator);
         }
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
index 09a0ea9..29059ba 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
@@ -18,17 +18,18 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.os.Build;
 import android.support.annotation.IntRange;
 import android.support.v17.leanback.R;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewGroup;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.List;
 import java.util.Locale;
 
 /**
@@ -61,6 +62,8 @@
     PickerColumn mHourColumn;
     PickerColumn mMinuteColumn;
     PickerColumn mAmPmColumn;
+    private ViewGroup mPickerView;
+    private View mAmPmSeparatorView;
     int mColHourIndex;
     int mColMinuteIndex;
     int mColAmPmIndex;
@@ -73,8 +76,6 @@
     private int mCurrentMinute;
     private int mCurrentAmPmIndex;
 
-    private String mTimePickerFormat;
-
     /**
      * Constructor called when inflating a TimePicker widget. This version uses a default style of
      * 0, so the only attribute values applied are those in the Context's Theme and the given
@@ -104,6 +105,8 @@
         mConstant = PickerUtility.getTimeConstantInstance(Locale.getDefault(),
                 context.getResources());
 
+        setSeparator(mConstant.timeSeparator);
+        mPickerView = findViewById(R.id.picker);
         final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
                 R.styleable.lbTimePicker);
         mIs24hFormat = attributesArray.getBoolean(R.styleable.lbTimePicker_is24HourFormat,
@@ -111,17 +114,25 @@
         boolean useCurrentTime = attributesArray.getBoolean(R.styleable.lbTimePicker_useCurrentTime,
                 true);
 
-        // The following 2 methods must be called after setting mIs24hFormat since this attribute is
-        // used to extract the time format string.
-        updateColumns();
-        updateColumnsRange();
+        updateColumns(getTimePickerFormat());
+
+        // The column range for the minute and AM/PM column is static and does not change, whereas
+        // the hour column range can change depending on whether 12 or 24 hour format is set at
+        // any given time.
+        updateHourColumn(false);
+        updateMin(mMinuteColumn, 0);
+        updateMax(mMinuteColumn, 59);
+
+        updateMin(mAmPmColumn, 0);
+        updateMax(mAmPmColumn, 1);
+
+        updateAmPmColumn();
 
         if (useCurrentTime) {
             Calendar currentDate = PickerUtility.getCalendarForLocale(null,
                     mConstant.locale);
             setHour(currentDate.get(Calendar.HOUR_OF_DAY));
             setMinute(currentDate.get(Calendar.MINUTE));
-            setAmPmValue();
         }
     }
 
@@ -142,104 +153,22 @@
     }
 
     /**
-     * @return The best localized representation of time for the current locale
-     */
-    String getBestHourMinutePattern() {
-        final String hourPattern;
-        if (PickerUtility.SUPPORTS_BEST_DATE_TIME_PATTERN) {
-            hourPattern = DateFormat.getBestDateTimePattern(mConstant.locale, mIs24hFormat ? "Hma"
-                    : "hma");
-        } else {
-            final java.text.DateFormat dateFormat =
-                    SimpleDateFormat.getTimeInstance(SimpleDateFormat.FULL, mConstant.locale);
-            if (dateFormat instanceof SimpleDateFormat) {
-                String defaultPattern = ((SimpleDateFormat) dateFormat).toPattern();
-                defaultPattern = defaultPattern.replace("s", "");
-                if (mIs24hFormat) {
-                    defaultPattern = defaultPattern.replace('h', 'H');
-                }
-                hourPattern = defaultPattern;
-            } else {
-                hourPattern = mIs24hFormat ? "H:mma" : "h:mma";
-            }
-        }
-        return TextUtils.isEmpty(hourPattern) ? "h:mma" : hourPattern;
-    }
-
-    /**
-     * Extracts the separators used to separate time fields (including before the first and after
-     * the last time field). The separators can vary based on the individual locale and 12 or
-     * 24 hour time format, defined in the Unicode CLDR and cannot be supposed to be ":".
-     *
-     * See http://unicode.org/cldr/trac/browser/trunk/common/main
-     *
-     * For example, for english in 12 hour format
-     * (time pattern of "h:mm a"), this will return {"", ":", "", ""}, where the first separator
-     * indicates nothing needs to be displayed to the left of the hour field, ":" needs to be
-     * displayed to the right of hour field, and so forth.
-     *
-     * @return The ArrayList of separators to populate between the actual time fields in the
-     * TimePicker.
-     */
-    List<CharSequence> extractSeparators() {
-        // Obtain the time format string per the current locale (e.g. h:mm a)
-        String hmaPattern = getBestHourMinutePattern();
-
-        List<CharSequence> separators = new ArrayList<>();
-        StringBuilder sb = new StringBuilder();
-        char lastChar = '\0';
-        // See http://www.unicode.org/reports/tr35/tr35-dates.html for hour formats
-        final char[] timeFormats = {'H', 'h', 'K', 'k', 'm', 'M', 'a'};
-        boolean processingQuote = false;
-        for (int i = 0; i < hmaPattern.length(); i++) {
-            char c = hmaPattern.charAt(i);
-            if (c == ' ') {
-                continue;
-            }
-            if (c == '\'') {
-                if (!processingQuote) {
-                    sb.setLength(0);
-                    processingQuote = true;
-                } else {
-                    processingQuote = false;
-                }
-                continue;
-            }
-            if (processingQuote) {
-                sb.append(c);
-            } else {
-                if (isAnyOf(c, timeFormats)) {
-                    if (c != lastChar) {
-                        separators.add(sb.toString());
-                        sb.setLength(0);
-                    }
-                } else {
-                    sb.append(c);
-                }
-            }
-            lastChar = c;
-        }
-        separators.add(sb.toString());
-        return separators;
-    }
-
-    private static boolean isAnyOf(char c, char[] any) {
-        for (int i = 0; i < any.length; i++) {
-            if (c == any[i]) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
      *
      * @return the time picker format string based on the current system locale and the layout
      *         direction
      */
-    private String extractTimeFields() {
+    private String getTimePickerFormat() {
         // Obtain the time format string per the current locale (e.g. h:mm a)
-        String hmaPattern = getBestHourMinutePattern();
+        String hmaPattern;
+        if (Build.VERSION.SDK_INT >= 18) {
+            hmaPattern = DateFormat.getBestDateTimePattern(mConstant.locale, "hma");
+        } else {
+            // getTimeInstance is not very reliable and it may not include 'a' (for AM/PM)
+            // in the returned pattern string. In those cases, we assume that am/pm appears at the
+            // end of the fields. Need to find a more reliable way for API below 18.
+            hmaPattern  = ((SimpleDateFormat) java.text.DateFormat
+                    .getTimeInstance(java.text.DateFormat.FULL, mConstant.locale)).toPattern();
+        }
 
         boolean isRTL = TextUtils.getLayoutDirectionFromLocale(mConstant.locale) == View
                 .LAYOUT_DIRECTION_RTL;
@@ -248,35 +177,21 @@
         // Hour will always appear to the left of minutes regardless of layout direction.
         String timePickerFormat = isRTL ? "mh" : "hm";
 
-        if (is24Hour()) {
-            return timePickerFormat;
-        } else {
-            return isAmPmAtEnd ? (timePickerFormat + "a") : ("a" + timePickerFormat);
-        }
+        return isAmPmAtEnd ? (timePickerFormat + "a") : ("a" + timePickerFormat);
     }
 
-    private void updateColumns() {
-        String timePickerFormat = getBestHourMinutePattern();
-        if (TextUtils.equals(timePickerFormat, mTimePickerFormat)) {
-            return;
+    private void updateColumns(String timePickerFormat) {
+        if (TextUtils.isEmpty(timePickerFormat)) {
+            timePickerFormat = "hma";
         }
-        mTimePickerFormat = timePickerFormat;
-
-        String timeFieldsPattern = extractTimeFields();
-        List<CharSequence> separators = extractSeparators();
-        if (separators.size() != (timeFieldsPattern.length() + 1)) {
-            throw new IllegalStateException("Separators size: " + separators.size() + " must equal"
-                    + " the size of timeFieldsPattern: " + timeFieldsPattern.length() + " + 1");
-        }
-        setSeparators(separators);
-        timeFieldsPattern = timeFieldsPattern.toUpperCase();
+        timePickerFormat = timePickerFormat.toUpperCase();
 
         mHourColumn = mMinuteColumn = mAmPmColumn = null;
         mColHourIndex = mColMinuteIndex = mColAmPmIndex = -1;
 
         ArrayList<PickerColumn> columns = new ArrayList<>(3);
-        for (int i = 0; i < timeFieldsPattern.length(); i++) {
-            switch (timeFieldsPattern.charAt(i)) {
+        for (int i = 0; i < timePickerFormat.length(); i++) {
+            switch (timePickerFormat.charAt(i)) {
                 case 'H':
                     columns.add(mHourColumn = new PickerColumn());
                     mHourColumn.setStaticLabels(mConstant.hours24);
@@ -299,28 +214,38 @@
             }
         }
         setColumns(columns);
+        mAmPmSeparatorView = mPickerView.getChildAt(mColAmPmIndex == 0 ? 1 :
+                (2 * mColAmPmIndex - 1));
     }
 
-    private void updateColumnsRange() {
-        // updateHourColumn(false);
+    /**
+     * Updates the range in the hour column and notifies column changed if notifyChanged is true.
+     * Hour column can have either [0-23] or [1-12] depending on whether the 24 hour format is set
+     * or not.
+     *
+     * @param notifyChanged {code true} if we should notify data set changed on the hour column,
+     *                      {@code false} otherwise.
+     */
+    private void updateHourColumn(boolean notifyChanged) {
         updateMin(mHourColumn, mIs24hFormat ? 0 : 1);
         updateMax(mHourColumn, mIs24hFormat ? 23 : 12);
-
-        updateMin(mMinuteColumn, 0);
-        updateMax(mMinuteColumn, 59);
-
-        if (mAmPmColumn != null) {
-            updateMin(mAmPmColumn, 0);
-            updateMax(mAmPmColumn, 1);
+        if (notifyChanged) {
+            setColumnAt(mColHourIndex, mHourColumn);
         }
     }
 
     /**
-     * Updates the value of AM/PM column for a 12 hour time format. The correct value should already
-     * be calculated before this method is called by calling setHour.
+     * Updates AM/PM column depending on whether the 24 hour format is set or not. The visibility of
+     * this column is set to {@code GONE} for a 24 hour format, and {@code VISIBLE} in 12 hour
+     * format. This method also updates the value of this column for a 12 hour format.
      */
-    private void setAmPmValue() {
-        if (!is24Hour()) {
+    private void updateAmPmColumn() {
+        if (mIs24hFormat) {
+            mColumnViews.get(mColAmPmIndex).setVisibility(GONE);
+            mAmPmSeparatorView.setVisibility(GONE);
+        } else {
+            mColumnViews.get(mColAmPmIndex).setVisibility(VISIBLE);
+            mAmPmSeparatorView.setVisibility(VISIBLE);
             setColumnValue(mColAmPmIndex, mCurrentAmPmIndex, false);
         }
     }
@@ -336,7 +261,7 @@
             throw new IllegalArgumentException("hour: " + hour + " is not in [0-23] range in");
         }
         mCurrentHour = hour;
-        if (!is24Hour()) {
+        if (!mIs24hFormat) {
             if (mCurrentHour >= HOURS_IN_HALF_DAY) {
                 mCurrentAmPmIndex = PM_INDEX;
                 if (mCurrentHour > HOURS_IN_HALF_DAY) {
@@ -348,7 +273,7 @@
                     mCurrentHour = HOURS_IN_HALF_DAY;
                 }
             }
-            setAmPmValue();
+            updateAmPmColumn();
         }
         setColumnValue(mColHourIndex, mCurrentHour, false);
     }
@@ -376,6 +301,9 @@
      * @see #getMinute()
      */
     public void setMinute(@IntRange(from = 0, to = 59) int minute) {
+        if (mCurrentMinute == minute) {
+            return;
+        }
         if (minute < 0 || minute > 59) {
             throw new IllegalArgumentException("minute: " + minute + " is not in [0-59] range.");
         }
@@ -406,14 +334,10 @@
         }
         // the ordering of these statements is important
         int currentHour = getHour();
-        int currentMinute = getMinute();
         mIs24hFormat = is24Hour;
-        updateColumns();
-        updateColumnsRange();
-
+        updateHourColumn(true);
         setHour(currentHour);
-        setMinute(currentMinute);
-        setAmPmValue();
+        updateAmPmColumn();
     }
 
     /**
diff --git a/v17/leanback/tests/AndroidManifest.xml b/v17/leanback/tests/AndroidManifest.xml
index dc8c963..b21246e 100644
--- a/v17/leanback/tests/AndroidManifest.xml
+++ b/v17/leanback/tests/AndroidManifest.xml
@@ -22,11 +22,11 @@
         <activity android:name="android.support.v17.leanback.widget.GridActivity"
                   android:exported="true"/>
 
-        <activity android:name="android.support.v17.leanback.widget.picker.TimePickerActivity"
+        <activity android:name="android.support.v17.leanback.widget.TimePickerActivity"
                   android:exported="true"
                   android:theme="@style/Theme.Leanback"/>
 
-        <activity android:name="android.support.v17.leanback.widget.picker.DatePickerActivity"
+        <activity android:name="android.support.v17.leanback.widget.DatePickerActivity"
                   android:exported="true"
                   android:theme="@style/Theme.Leanback"/>
 
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerActivity.java
similarity index 95%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerActivity.java
index dda9c91..eda702f 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
 
 import android.app.Activity;
 import android.os.Bundle;
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerTest.java
similarity index 82%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerTest.java
index c25838e..e2d2e99 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerTest.java
@@ -14,11 +14,10 @@
  * limitations under the License.
  */
 
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
@@ -28,19 +27,16 @@
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.v17.leanback.test.R;
+import android.support.v17.leanback.widget.picker.DatePicker;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Arrays;
-import java.util.List;
-
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class DatePickerTest {
@@ -59,13 +55,9 @@
             new ActivityTestRule<>(DatePickerActivity.class, false, false);
     private DatePickerActivity mActivity;
 
-    @Before
-    public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getTargetContext();
-    }
-
     public void initActivity(Intent intent) throws Throwable {
         mActivity = mActivityTestRule.launchActivity(intent);
+        mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
         mDatePickerView = (DatePicker) mActivity.findViewById(R.id.date_picker);
         mDatePickerInnerView = (ViewGroup) mDatePickerView.findViewById(R.id.picker);
         mDatePickerView.setActivatedVisibleItemCount(3);
@@ -383,86 +375,6 @@
         }
     }
 
-    @Test
-    public void testExtractSeparatorsForDifferentLocales() throws Throwable {
-        // date pattern for en_US (English)
-        DatePicker datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "M/d/y";
-            }
-        };
-        List<CharSequence> actualSeparators = datePicker.extractSeparators();
-        List<String> expectedSeparators = Arrays.asList(new String[]{"", "/", "/", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // date pattern for fa_IR (Farsi)
-        datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "y/M/d";
-            }
-        };
-        actualSeparators = datePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[]{"", "/", "/", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // date pattern for ar_EG (Arabic)
-        datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "d/M/y";
-            }
-        };
-        actualSeparators = datePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[]{"", "/", "/", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // date pattern for cs_CZ (Czech)
-        datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "d. M. y";
-            }
-        };
-        actualSeparators = datePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[]{"", ".", ".", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // date pattern for hr_HR (Croatian)
-        datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "dd. MM. y.";
-            }
-        };
-        actualSeparators = datePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[]{"", ".", ".", "."});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // date pattern for hr_HR (Bulgarian)
-        datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "d.MM.y 'r'.";
-            }
-        };
-        actualSeparators = datePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[]{"", ".", ".", "r."});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // date pattern for en_XA (English pseudo-locale)
-        datePicker = new DatePicker(mContext, null) {
-            @Override
-            String getBestYearMonthDayPattern(String datePickerFormat) {
-                return "[M/d/y]";
-            }
-        };
-        actualSeparators = datePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[]{"[", "/", "/", "]"});
-        assertEquals(expectedSeparators, actualSeparators);
-    }
-
     private void sendKeys(int ...keys) {
         for (int i = 0; i < keys.length; i++) {
             InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keys[i]);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerActivity.java
similarity index 95%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerActivity.java
index 6cf7042..11c4d3c 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerActivity.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
 
 import android.app.Activity;
 import android.os.Bundle;
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerTest.java
similarity index 80%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerTest.java
index 980eb1f..7146d31 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerTest.java
@@ -14,11 +14,10 @@
  * limitations under the License.
  */
 
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import android.content.Context;
 import android.content.Intent;
@@ -27,18 +26,15 @@
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.v17.leanback.test.R;
+import android.support.v17.leanback.widget.picker.TimePicker;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Arrays;
-import java.util.List;
-
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class TimePickerTest {
@@ -47,6 +43,8 @@
     private static final long TRANSITION_LENGTH = 1000;
     private static final long UPDATE_LENGTH = 1000;
 
+
+    Context mContext;
     View mViewAbove;
     TimePicker mTimePicker12HourView;
     TimePicker mTimePicker24HourView;
@@ -56,12 +54,6 @@
     public ActivityTestRule<TimePickerActivity> mActivityTestRule =
             new ActivityTestRule<>(TimePickerActivity.class, false, false);
     private TimePickerActivity mActivity;
-    private Context mContext;
-
-    @Before
-    public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getTargetContext();
-    }
 
     public void initActivity(Intent intent) throws Throwable {
         mActivity = mActivityTestRule.launchActivity(intent);
@@ -75,7 +67,7 @@
             }
         });
 
-        if (intent.getIntExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        if (intent.getIntExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets) == R.layout.timepicker_with_other_widgets) {
             mViewAbove = mActivity.findViewById(R.id.above_picker);
             mViewBelow = mActivity.findViewById(R.id.below_picker);
@@ -87,7 +79,7 @@
                     mTimePicker24HourView.setActivated(!mTimePicker24HourView.isActivated());
                 }
             });
-        } else if (intent.getIntExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        } else if (intent.getIntExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets) == R.layout.timepicker_alone) {
             // A layout with only a TimePicker widget that is initially activated.
             mActivityTestRule.runOnUiThread(new Runnable() {
@@ -103,10 +95,9 @@
     @Test
     public void testSetHourIn24hFormat() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
-
         mActivityTestRule.runOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -161,7 +152,7 @@
     @Test
     public void testSetHourIn12hFormat() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -218,7 +209,7 @@
     @Test
     public void testSetMinuteIn24hFormat() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -255,7 +246,7 @@
     @Test
     public void testSetMinuteIn12hFormat() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -293,7 +284,7 @@
     @Test
     public void testAmToPmTransition() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -335,7 +326,7 @@
     @Test
     public void testPmToAmTransition() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -377,7 +368,7 @@
     @Test
     public void test12To24HourFormatTransition() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -409,7 +400,7 @@
     @Test
     public void test24To12HourFormatTransition() throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_with_other_widgets);
         initActivity(intent);
         mActivityTestRule.runOnUiThread(new Runnable() {
@@ -442,7 +433,7 @@
     public void testInitiallyActiveTimePicker()
             throws Throwable {
         Intent intent = new Intent();
-        intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+        intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
                 R.layout.timepicker_alone);
         initActivity(intent);
 
@@ -482,106 +473,12 @@
         sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
         Thread.sleep(TRANSITION_LENGTH);
         assertThat("The third column of TimePicker should hold focus after scrolling right",
-                mTimePickerInnerView.getChildAt(3).hasFocus(), is(true));
+                mTimePickerInnerView.getChildAt(4).hasFocus(), is(true));
 
         sendKeys(KeyEvent.KEYCODE_DPAD_UP);
         Thread.sleep(TRANSITION_LENGTH);
         assertThat("The third column of TimePicker should still hold focus after scrolling down",
-                mTimePickerInnerView.getChildAt(3).hasFocus(), is(true));
-    }
-
-    @Test
-    public void testExtractSeparatorsForDifferentLocales() throws Throwable {
-        // A typical time pattern for different locales in 12-hour format
-        TimePicker timePicker = new TimePicker(mContext, null) {
-            @Override
-            String getBestHourMinutePattern() {
-                return "h:mm a";
-            }
-        };
-        List<CharSequence> actualSeparators = timePicker.extractSeparators();
-        List<String> expectedSeparators = Arrays.asList(new String[] {"", ":", "", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // time pattern for ja_JP in 12 hour format
-        timePicker = new TimePicker(mContext, null) {
-            @Override
-            String getBestHourMinutePattern() {
-                return "aK:mm";
-            }
-
-            @Override
-            public boolean is24Hour() {
-                return false;
-            }
-        };
-        actualSeparators = timePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[] {"", "", ":", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // time pattern for fr_CA in 24 hour format
-        timePicker = new TimePicker(mContext, null) {
-            @Override
-            String getBestHourMinutePattern() {
-                return "HH 'h' mm";
-            }
-
-            @Override
-            public boolean is24Hour() {
-                return true;
-            }
-        };
-        actualSeparators = timePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[] {"", "h", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // time pattern for hsb_DE in 24 hour format
-        timePicker = new TimePicker(mContext, null) {
-            @Override
-            String getBestHourMinutePattern() {
-                return "H:mm 'hodz'";
-            }
-
-            @Override
-            public boolean is24Hour() {
-                return true;
-            }
-        };
-        actualSeparators = timePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[] {"", ":", "hodz"});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // time pattern for ko_KR in 12 hour format
-        timePicker = new TimePicker(mContext, null) {
-            @Override
-            String getBestHourMinutePattern() {
-                return "a h:mm";
-            }
-
-            @Override
-            public boolean is24Hour() {
-                return false;
-            }
-        };
-        actualSeparators = timePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[] {"", "", ":", ""});
-        assertEquals(expectedSeparators, actualSeparators);
-
-        // time pattern for fa_IR in 24 hour format
-        timePicker = new TimePicker(mContext, null) {
-            @Override
-            String getBestHourMinutePattern() {
-                return "H:mm";
-            }
-
-            @Override
-            public boolean is24Hour() {
-                return true;
-            }
-        };
-        actualSeparators = timePicker.extractSeparators();
-        expectedSeparators = Arrays.asList(new String[] {"", ":", ""});
-        assertEquals(expectedSeparators, actualSeparators);
+                mTimePickerInnerView.getChildAt(4).hasFocus(), is(true));
     }
 
     private void sendKeys(int ...keys) {
diff --git a/v17/preference-leanback/AndroidManifest.xml b/v17/preference-leanback/AndroidManifest.xml
index e2cfe35..c34c254 100644
--- a/v17/preference-leanback/AndroidManifest.xml
+++ b/v17/preference-leanback/AndroidManifest.xml
@@ -16,9 +16,10 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.support.v17.preference"
-    android:versionCode="1"
-    android:versionName="1.0">
+    package="android.support.v17.preference">
     <uses-sdk android:minSdkVersion="17" />
-    <application />
+    <application>
+        <meta-data android:name="android.support.v17.preference.VERSION"
+                   android:value="${support-version}" />
+    </application>
 </manifest>
diff --git a/v17/preference-leanback/api/26.1.0-SNAPSHOT.txt b/v17/preference-leanback/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v17/preference-leanback/api/26.1.0-SNAPSHOT.txt
rename to v17/preference-leanback/api/27.0.0-SNAPSHOT.txt
diff --git a/v4/AndroidManifest.xml b/v4/AndroidManifest.xml
index 470f5c2..c179eb2 100644
--- a/v4/AndroidManifest.xml
+++ b/v4/AndroidManifest.xml
@@ -14,10 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v4">
-    <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.v4"/>
+    <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v4.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/appcompat/AndroidManifest.xml b/v7/appcompat/AndroidManifest.xml
index 7de91ff..786d361 100644
--- a/v7/appcompat/AndroidManifest.xml
+++ b/v7/appcompat/AndroidManifest.xml
@@ -14,11 +14,10 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v7.appcompat">
-    <uses-sdk android:minSdkVersion="14"
-              tools:overrideLibrary="android.support.graphics.drawable.animated"/>
+    <uses-sdk android:minSdkVersion="14" />
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.appcompat.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/appcompat/api/26.1.0-SNAPSHOT.txt b/v7/appcompat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/appcompat/api/26.1.0-SNAPSHOT.txt
rename to v7/appcompat/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 102c779..90662f8 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -6,14 +6,10 @@
     api project(':support-vector-drawable')
     api project(':animated-vector-drawable')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation project(':support-testutils')
 }
 
diff --git a/v7/appcompat/lint-baseline.xml b/v7/appcompat/lint-baseline.xml
index febede9..3ae048f 100644
--- a/v7/appcompat/lint-baseline.xml
+++ b/v7/appcompat/lint-baseline.xml
@@ -3,72 +3,6 @@
 
     <issue
         id="WrongConstant"
-        message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine1="                    ? TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/v7/widget/AppCompatButton.java"
-            line="274"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine1="                    : TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/v7/widget/AppCompatButton.java"
-            line="275"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine1="        return TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/v7/widget/AppCompatButton.java"
-            line="281"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine1="                    ? TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/v7/widget/AppCompatTextView.java"
-            line="280"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine1="                    : TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
-        errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/v7/widget/AppCompatTextView.java"
-            line="281"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
-        errorLine1="        return TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/v7/widget/AppCompatTextView.java"
-            line="287"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
         message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
         errorLine1="        setDisplayOptions(options, 0xffffffff);"
         errorLine2="                                   ~~~~~~~~~~">
diff --git a/v7/appcompat/res/values-af/strings.xml b/v7/appcompat/res/values-af/strings.xml
index b00b917..15ed3b2 100644
--- a/v7/appcompat/res/values-af/strings.xml
+++ b/v7/appcompat/res/values-af/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Stemsoektog"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Kies \'n program"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Sien alles"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deel met %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deel met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deel met"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"AF"</string>
diff --git a/v7/appcompat/res/values-am/strings.xml b/v7/appcompat/res/values-am/strings.xml
index 9a57819..42bbc06 100644
--- a/v7/appcompat/res/values-am/strings.xml
+++ b/v7/appcompat/res/values-am/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"የድምፅ ፍለጋ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"መተግበሪያ ይምረጡ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ሁሉንም ይመልከቱ"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ከ%s ጋር ያጋሩ"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"ከ<xliff:g id="APPLICATION_NAME">%s</xliff:g> ጋር አጋራ"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ከሚከተለው ጋር ያጋሩ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"በርቷል"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ጠፍቷል"</string>
diff --git a/v7/appcompat/res/values-ar/strings.xml b/v7/appcompat/res/values-ar/strings.xml
index a884a9f..3278162 100644
--- a/v7/appcompat/res/values-ar/strings.xml
+++ b/v7/appcompat/res/values-ar/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"البحث الصوتي"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"اختيار تطبيق"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"عرض الكل"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏مشاركة مع %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"مشاركة مع <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"مشاركة مع"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"تشغيل"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"إيقاف"</string>
diff --git a/v7/appcompat/res/values-az/strings.xml b/v7/appcompat/res/values-az/strings.xml
index 6f6fa9c..29e00dd 100644
--- a/v7/appcompat/res/values-az/strings.xml
+++ b/v7/appcompat/res/values-az/strings.xml
@@ -20,7 +20,7 @@
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Evə naviqasiya et"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yuxarı get"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Digər variantlar"</string>
-    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Dağıt"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Yığışdırın"</string>
     <string name="abc_searchview_description_search" msgid="8264924765203268293">"Axtarış"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"Axtarış..."</string>
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"Axtarış sorğusu"</string>
@@ -29,9 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Səsli axtarış"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Tətbiq seçin"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Hamısına baxın"</string>
-    <!-- String.format failed for translation -->
-    <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
-    <skip />
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə paylaşın"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bununla paylaşın"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTİV"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DEAKTİV"</string>
diff --git a/v7/appcompat/res/values-b+sr+Latn/strings.xml b/v7/appcompat/res/values-b+sr+Latn/strings.xml
index 06caa95..c3462f6 100644
--- a/v7/appcompat/res/values-b+sr+Latn/strings.xml
+++ b/v7/appcompat/res/values-b+sr+Latn/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovna pretraga"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izbor aplikacije"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deli sa aplikacijom %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deljenje sa aplikacijom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deli sa"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČI"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČI"</string>
diff --git a/v7/appcompat/res/values-be/strings.xml b/v7/appcompat/res/values-be/strings.xml
index 42e9583..99ee19f 100644
--- a/v7/appcompat/res/values-be/strings.xml
+++ b/v7/appcompat/res/values-be/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Галасавы пошук"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Выбраць праграму"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Прагледзець усё"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Абагуліць з %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Абагуліць праз праграму <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Абагуліць з"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"УКЛ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ВЫКЛ."</string>
diff --git a/v7/appcompat/res/values-bg/strings.xml b/v7/appcompat/res/values-bg/strings.xml
index 85ece2d..1d37d0d 100644
--- a/v7/appcompat/res/values-bg/strings.xml
+++ b/v7/appcompat/res/values-bg/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласово търсене"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Изберете приложение"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Вижте всички"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Споделяне със: %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Споделяне със: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Споделяне със:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИЗКЛ."</string>
diff --git a/v7/appcompat/res/values-bn/strings.xml b/v7/appcompat/res/values-bn/strings.xml
index 2602be0..5959799 100644
--- a/v7/appcompat/res/values-bn/strings.xml
+++ b/v7/appcompat/res/values-bn/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ভয়েস অনুসন্ধান"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"একটি অ্যাপ্লিকেশান বেছে নিন"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"সবগুলো দেখুন"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s এর সাথে শেয়ার করুন"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এর সাথে শেয়ার করুন"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"এর সাথে শেয়ার করুন"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"চালু"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"বন্ধ"</string>
diff --git a/v7/appcompat/res/values-bs/strings.xml b/v7/appcompat/res/values-bs/strings.xml
index 3c15659..3687875 100644
--- a/v7/appcompat/res/values-bs/strings.xml
+++ b/v7/appcompat/res/values-bs/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="abc_action_mode_done" msgid="4076576682505996667">"Završeno"</string>
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Gotovo"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Vrati se na početnu stranicu"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigiraj prema gore"</string>
     <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Više opcija"</string>
@@ -26,10 +26,10 @@
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"Pretraži upit"</string>
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Obriši upit"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Pošalji upit"</string>
-    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pretraživanje glasom"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno pretraživanje"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odaberite aplikaciju"</string>
-    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Vidi sve"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Podijeli sa %s"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Podijeli koristeći aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Podijeli sa"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČI"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČI"</string>
diff --git a/v7/appcompat/res/values-ca/strings.xml b/v7/appcompat/res/values-ca/strings.xml
index 568b72d..03ebec3 100644
--- a/v7/appcompat/res/values-ca/strings.xml
+++ b/v7/appcompat/res/values-ca/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Cerca per veu"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecciona una aplicació"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Mostra\'ls tots"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Comparteix amb %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Comparteix amb <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Comparteix amb"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAT"</string>
diff --git a/v7/appcompat/res/values-cs/strings.xml b/v7/appcompat/res/values-cs/strings.xml
index 727721b..05cd4e0 100644
--- a/v7/appcompat/res/values-cs/strings.xml
+++ b/v7/appcompat/res/values-cs/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Hlasové vyhledávání"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Vybrat aplikaci"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobrazit vše"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Sdílet pomocí %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Sdílet s aplikací <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Sdílet pomocí"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTO"</string>
diff --git a/v7/appcompat/res/values-da/strings.xml b/v7/appcompat/res/values-da/strings.xml
index 21981f1..813885a 100644
--- a/v7/appcompat/res/values-da/strings.xml
+++ b/v7/appcompat/res/values-da/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Talesøgning"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Vælg en app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Se alle"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"TIL"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"FRA"</string>
diff --git a/v7/appcompat/res/values-de/strings.xml b/v7/appcompat/res/values-de/strings.xml
index 184ba98..0b57259 100644
--- a/v7/appcompat/res/values-de/strings.xml
+++ b/v7/appcompat/res/values-de/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Sprachsuche"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"App auswählen"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Alle ansehen"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Freigeben für %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Mit <xliff:g id="APPLICATION_NAME">%s</xliff:g> teilen"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Freigeben für"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"An"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"Aus"</string>
diff --git a/v7/appcompat/res/values-el/strings.xml b/v7/appcompat/res/values-el/strings.xml
index 4954e50..ec7a666 100644
--- a/v7/appcompat/res/values-el/strings.xml
+++ b/v7/appcompat/res/values-el/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Φωνητική αναζήτηση"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Επιλέξτε κάποια εφαρμογή"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Προβολή όλων"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Κοινή χρήση με %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Κοινή χρήση με <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Κοινή χρήση με"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
diff --git a/v7/appcompat/res/values-en-rAU/strings.xml b/v7/appcompat/res/values-en-rAU/strings.xml
index ed11ab6..a4d048c 100644
--- a/v7/appcompat/res/values-en-rAU/strings.xml
+++ b/v7/appcompat/res/values-en-rAU/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-en-rGB/strings.xml b/v7/appcompat/res/values-en-rGB/strings.xml
index ed11ab6..a4d048c 100644
--- a/v7/appcompat/res/values-en-rGB/strings.xml
+++ b/v7/appcompat/res/values-en-rGB/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-en-rIN/strings.xml b/v7/appcompat/res/values-en-rIN/strings.xml
index ed11ab6..a4d048c 100644
--- a/v7/appcompat/res/values-en-rIN/strings.xml
+++ b/v7/appcompat/res/values-en-rIN/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-es-rUS/strings.xml b/v7/appcompat/res/values-es-rUS/strings.xml
index 84a8ab3..0cc8a70 100644
--- a/v7/appcompat/res/values-es-rUS/strings.xml
+++ b/v7/appcompat/res/values-es-rUS/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Búsqueda por voz"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Elige una aplicación."</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todo"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
diff --git a/v7/appcompat/res/values-es/strings.xml b/v7/appcompat/res/values-es/strings.xml
index 31fb801..3e0828b 100644
--- a/v7/appcompat/res/values-es/strings.xml
+++ b/v7/appcompat/res/values-es/strings.xml
@@ -29,9 +29,9 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Búsqueda por voz"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Seleccionar una aplicación"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todo"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
-    <string name="abc_capital_on" msgid="3405795526292276155">"SÍ"</string>
-    <string name="abc_capital_off" msgid="121134116657445385">"NO"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Buscar"</string>
 </resources>
diff --git a/v7/appcompat/res/values-et/strings.xml b/v7/appcompat/res/values-et/strings.xml
index 9f34e02..3a3dcbf 100644
--- a/v7/appcompat/res/values-et/strings.xml
+++ b/v7/appcompat/res/values-et/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Häälotsing"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Valige rakendus"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Kuva kõik"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jagamine kasutajaga %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Jagamine rakendusega <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jagamine:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"SEES"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VÄLJAS"</string>
diff --git a/v7/appcompat/res/values-eu/strings.xml b/v7/appcompat/res/values-eu/strings.xml
index ab18c68..a651036 100644
--- a/v7/appcompat/res/values-eu/strings.xml
+++ b/v7/appcompat/res/values-eu/strings.xml
@@ -26,10 +26,10 @@
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"Bilaketa-kontsulta"</string>
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Garbitu kontsulta"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Bidali kontsulta"</string>
-    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ahots bidezko bilaketa"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ahozko bilaketa"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Aukeratu aplikazio bat"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ikusi guztiak"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partekatu %s erabiltzailearekin"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partekatu <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikazioarekin"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partekatu hauekin"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTIBATUTA"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESAKTIBATUTA"</string>
diff --git a/v7/appcompat/res/values-fa/strings.xml b/v7/appcompat/res/values-fa/strings.xml
index 99af06a..9b844b0 100644
--- a/v7/appcompat/res/values-fa/strings.xml
+++ b/v7/appcompat/res/values-fa/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"جستجوی گفتاری"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"انتخاب برنامه"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"مشاهده همه"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏اشتراک‌گذاری با %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"اشتراک‌گذاری با <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراک‌گذاری با"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"روشن"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"خاموش"</string>
diff --git a/v7/appcompat/res/values-fi/strings.xml b/v7/appcompat/res/values-fi/strings.xml
index a7713b0..e9bd952 100644
--- a/v7/appcompat/res/values-fi/strings.xml
+++ b/v7/appcompat/res/values-fi/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Puhehaku"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Valitse sovellus"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Näytä kaikki"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jakaminen: %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Jaa sovelluksessa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jakaminen:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"KÄYTÖSSÄ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"POIS KÄYTÖSTÄ"</string>
diff --git a/v7/appcompat/res/values-fr-rCA/strings.xml b/v7/appcompat/res/values-fr-rCA/strings.xml
index de9ad41..a3e763b 100644
--- a/v7/appcompat/res/values-fr-rCA/strings.xml
+++ b/v7/appcompat/res/values-fr-rCA/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Recherche vocale"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Sélectionnez une application"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Voir toutes les chaînes"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
diff --git a/v7/appcompat/res/values-fr/strings.xml b/v7/appcompat/res/values-fr/strings.xml
index d3eb762..1e412ec 100644
--- a/v7/appcompat/res/values-fr/strings.xml
+++ b/v7/appcompat/res/values-fr/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Recherche vocale"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Sélectionner une application"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tout afficher"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager avec"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
diff --git a/v7/appcompat/res/values-gl/strings.xml b/v7/appcompat/res/values-gl/strings.xml
index 30185b8..2af80a1 100644
--- a/v7/appcompat/res/values-gl/strings.xml
+++ b/v7/appcompat/res/values-gl/strings.xml
@@ -26,10 +26,10 @@
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de busca"</string>
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Borrar consulta"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
-    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Busca de voz"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Busca por voz"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Escoller unha aplicación"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todas"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
diff --git a/v7/appcompat/res/values-gu/strings.xml b/v7/appcompat/res/values-gu/strings.xml
index a52fd66..7a243ed 100644
--- a/v7/appcompat/res/values-gu/strings.xml
+++ b/v7/appcompat/res/values-gu/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"વૉઇસ શોધ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"એક ઍપ્લિકેશન પસંદ કરો"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"બધું જુઓ"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s સાથે શેર કરો"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ની સાથે શેર કરો"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"આની સાથે શેર કરો"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ચાલુ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"બંધ"</string>
diff --git a/v7/appcompat/res/values-hi/strings.xml b/v7/appcompat/res/values-hi/strings.xml
index cfabcf7..30d3001 100644
--- a/v7/appcompat/res/values-hi/strings.xml
+++ b/v7/appcompat/res/values-hi/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ध्वनि खोज"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"कोई एप्‍लिकेशन चुनें"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सभी देखें"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s के साथ साझा करें"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ साझा करें"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके द्वारा साझा करें"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
diff --git a/v7/appcompat/res/values-hr/strings.xml b/v7/appcompat/res/values-hr/strings.xml
index 78aa1d3..27a1c2e 100644
--- a/v7/appcompat/res/values-hr/strings.xml
+++ b/v7/appcompat/res/values-hr/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno pretraživanje"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odabir aplikacije"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dijeljenje sa: %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Dijeli putem aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dijeljenje sa"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČENO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČENO"</string>
diff --git a/v7/appcompat/res/values-hu/strings.xml b/v7/appcompat/res/values-hu/strings.xml
index bdaba78..d3e413f 100644
--- a/v7/appcompat/res/values-hu/strings.xml
+++ b/v7/appcompat/res/values-hu/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Hangalapú keresés"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Válasszon ki egy alkalmazást"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Összes megtekintése"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Megosztás a következővel: %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Megosztás a következő alkalmazással: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Megosztás a következővel:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"BE"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"KI"</string>
diff --git a/v7/appcompat/res/values-hy/strings.xml b/v7/appcompat/res/values-hy/strings.xml
index 872901e..1c41ef6 100644
--- a/v7/appcompat/res/values-hy/strings.xml
+++ b/v7/appcompat/res/values-hy/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ձայնային որոնում"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Ընտրել ծրագիր"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Տեսնել բոլորը"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Կիսվել %s-ի միջոցով"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Ուղարկել <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ին"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Կիսվել"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ՄԻԱՑՎԱԾ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ԱՆՋԱՏՎԱԾ"</string>
diff --git a/v7/appcompat/res/values-in/strings.xml b/v7/appcompat/res/values-in/strings.xml
index 27f1a92..2e9fbb7 100644
--- a/v7/appcompat/res/values-in/strings.xml
+++ b/v7/appcompat/res/values-in/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Penelusuran suara"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pilih aplikasi"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Lihat semua"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bagikan dengan %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Bagikan ke <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bagikan dengan"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTIF"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"NONAKTIF"</string>
diff --git a/v7/appcompat/res/values-is/strings.xml b/v7/appcompat/res/values-is/strings.xml
index 7a95c6d..3f61d84 100644
--- a/v7/appcompat/res/values-is/strings.xml
+++ b/v7/appcompat/res/values-is/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Raddleit"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Veldu forrit"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Sjá allt"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deila með %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deila með <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deila með"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"KVEIKT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"SLÖKKT"</string>
diff --git a/v7/appcompat/res/values-it/strings.xml b/v7/appcompat/res/values-it/strings.xml
index 9597b8b..fbd2c58 100644
--- a/v7/appcompat/res/values-it/strings.xml
+++ b/v7/appcompat/res/values-it/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ricerca vocale"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Scegli un\'applicazione"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Visualizza tutte"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Condividi con %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Condividi tramite <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Condividi con"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-iw/strings.xml b/v7/appcompat/res/values-iw/strings.xml
index 4163b9a..9ac2072 100644
--- a/v7/appcompat/res/values-iw/strings.xml
+++ b/v7/appcompat/res/values-iw/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"חיפוש קולי"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"בחר אפליקציה"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ראה הכל"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏שתף עם %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"שתף עם <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"שתף עם"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"פועל"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"כבוי"</string>
diff --git a/v7/appcompat/res/values-ja/strings.xml b/v7/appcompat/res/values-ja/strings.xml
index 4c7811c..c4d0e20 100644
--- a/v7/appcompat/res/values-ja/strings.xml
+++ b/v7/appcompat/res/values-ja/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"音声検索"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"アプリの選択"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"すべて表示"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sと共有"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>と共有"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"共有"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-ka/strings.xml b/v7/appcompat/res/values-ka/strings.xml
index 8df5d11..3b077a3 100644
--- a/v7/appcompat/res/values-ka/strings.xml
+++ b/v7/appcompat/res/values-ka/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ხმოვანი ძიება"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"აპის არჩევა"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ყველას ნახვა"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-თან გაზიარება"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"გაუზიარეთ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ს"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"გაზიარება:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ჩართულია"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"გამორთულია"</string>
diff --git a/v7/appcompat/res/values-kk/strings.xml b/v7/appcompat/res/values-kk/strings.xml
index 2035353..c32045b 100644
--- a/v7/appcompat/res/values-kk/strings.xml
+++ b/v7/appcompat/res/values-kk/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Дауыс арқылы іздеу"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Қолданбаны таңдау"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Барлығын көру"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s бөлісу"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасымен бөлісу"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлісу"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ҚОСУЛЫ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ӨШІРУЛІ"</string>
diff --git a/v7/appcompat/res/values-km/strings.xml b/v7/appcompat/res/values-km/strings.xml
index b0db2b5..ffe289a 100644
--- a/v7/appcompat/res/values-km/strings.xml
+++ b/v7/appcompat/res/values-km/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ការស្វែងរក​សំឡេង"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ជ្រើស​កម្មវិធី​​"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"មើល​ទាំងអស់"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ចែករំលែក​ជាមួយ %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"ចែក​រំលែក​ជា​មួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ចែករំលែក​ជាមួយ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"បើក"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"បិទ"</string>
diff --git a/v7/appcompat/res/values-kn/strings.xml b/v7/appcompat/res/values-kn/strings.xml
index 057f602..4218bd6 100644
--- a/v7/appcompat/res/values-kn/strings.xml
+++ b/v7/appcompat/res/values-kn/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ಧ್ವನಿ ಹುಡುಕಾಟ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ಒಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ಆನ್"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ಆಫ್"</string>
diff --git a/v7/appcompat/res/values-ko/strings.xml b/v7/appcompat/res/values-ko/strings.xml
index 21d822f..6c84a2a 100644
--- a/v7/appcompat/res/values-ko/strings.xml
+++ b/v7/appcompat/res/values-ko/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"음성 검색"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"앱 선택"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"전체 보기"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s와(과) 공유"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>와(과) 공유"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"공유 대상"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"사용"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"사용 안함"</string>
diff --git a/v7/appcompat/res/values-ky/strings.xml b/v7/appcompat/res/values-ky/strings.xml
index e6f811a..66202f7 100644
--- a/v7/appcompat/res/values-ky/strings.xml
+++ b/v7/appcompat/res/values-ky/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Үн аркылуу издөө"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Колдонмо тандоо"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Бардыгын көрүү"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s аркылуу бөлүшүү"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> аркылуу бөлүшүү"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлүшүү"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"КҮЙҮК"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ӨЧҮК"</string>
diff --git a/v7/appcompat/res/values-lo/strings.xml b/v7/appcompat/res/values-lo/strings.xml
index 44e222f..1b92df0 100644
--- a/v7/appcompat/res/values-lo/strings.xml
+++ b/v7/appcompat/res/values-lo/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ຊອກຫາດ້ວຍສຽງ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ເລືອກແອັບຯ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ເບິ່ງທັງຫມົດ"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ແບ່ງ​ປັນ​ກັບ​ %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"ແບ່ງປັນດ້ວຍ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ແບ່ງປັນກັບ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ເປີດ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ປິດ"</string>
diff --git a/v7/appcompat/res/values-lt/strings.xml b/v7/appcompat/res/values-lt/strings.xml
index d88c48e..5793069 100644
--- a/v7/appcompat/res/values-lt/strings.xml
+++ b/v7/appcompat/res/values-lt/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Paieška balsu"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pasirinkti programą"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Peržiūrėti viską"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bendrinti naudojant „%s“"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Bendrinti naudojant programą „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bendrinti naudojant"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ĮJUNGTI"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTA"</string>
diff --git a/v7/appcompat/res/values-lv/strings.xml b/v7/appcompat/res/values-lv/strings.xml
index 0f35a3e..67e18d3 100644
--- a/v7/appcompat/res/values-lv/strings.xml
+++ b/v7/appcompat/res/values-lv/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Meklēšana ar balsi"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izvēlieties lietotni"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Skatīt visu"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kopīgot ar %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Kopīgot ar lietojumprogrammu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kopīgot ar:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"IESLĒGTS"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IZSLĒGTS"</string>
diff --git a/v7/appcompat/res/values-mk/strings.xml b/v7/appcompat/res/values-mk/strings.xml
index 4ea23cd..b12a235 100644
--- a/v7/appcompat/res/values-mk/strings.xml
+++ b/v7/appcompat/res/values-mk/strings.xml
@@ -29,9 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласовно пребарување"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Избери апликација"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Види ги сите"</string>
-    <!-- String.format failed for translation -->
-    <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
-    <skip />
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Сподели со <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Сподели со"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛУЧЕНО"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИСКЛУЧЕНО"</string>
diff --git a/v7/appcompat/res/values-ml/strings.xml b/v7/appcompat/res/values-ml/strings.xml
index cd89c76..9033f8a 100644
--- a/v7/appcompat/res/values-ml/strings.xml
+++ b/v7/appcompat/res/values-ml/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ശബ്ദതിരയൽ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ഒരു അപ്ലിക്കേഷൻ തിരഞ്ഞെടുക്കുക"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"എല്ലാം കാണുക"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s എന്നതുമായി പങ്കിടുക"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-മായി പങ്കിടുക"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ഇവരുമായി പങ്കിടുക"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ഓൺ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ഓഫ്"</string>
diff --git a/v7/appcompat/res/values-mn/strings.xml b/v7/appcompat/res/values-mn/strings.xml
index cda3d84..56036ea 100644
--- a/v7/appcompat/res/values-mn/strings.xml
+++ b/v7/appcompat/res/values-mn/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Дуут хайлт"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Апп сонгох"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Бүгдийг харах"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-тай хуваалцах"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-тай хуваалцах"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Хуваалцах"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ИДЭВХТЭЙ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИДЭВХГҮЙ"</string>
diff --git a/v7/appcompat/res/values-mr/strings.xml b/v7/appcompat/res/values-mr/strings.xml
index 4c97b99..e813edc 100644
--- a/v7/appcompat/res/values-mr/strings.xml
+++ b/v7/appcompat/res/values-mr/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"व्हॉइस शोध"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"एक अ‍ॅप निवडा"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सर्व पहा"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सह सामायिक करा"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सह शेअर करा"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"यांच्यासह सामायिक करा"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
diff --git a/v7/appcompat/res/values-ms/strings.xml b/v7/appcompat/res/values-ms/strings.xml
index 4fe302a..18f84ce 100644
--- a/v7/appcompat/res/values-ms/strings.xml
+++ b/v7/appcompat/res/values-ms/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Carian suara"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pilih apl"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Lihat semua"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kongsi dengan %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Kongsi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kongsi dengan"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"HIDUP"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"MATI"</string>
diff --git a/v7/appcompat/res/values-my/strings.xml b/v7/appcompat/res/values-my/strings.xml
index 830f6ed..cbc8791 100644
--- a/v7/appcompat/res/values-my/strings.xml
+++ b/v7/appcompat/res/values-my/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"အသံဖြင့် ရှာဖွေခြင်း"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"အက်ပ်တစ်ခုခုကို ရွေးချယ်ပါ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"အားလုံးကို ကြည့်ရန်"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ကို မျှဝေပါရန်"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ဖြင့် မျှဝေရန်"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"မျှဝေဖို့ ရွေးပါ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ဖွင့်"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ပိတ်"</string>
diff --git a/v7/appcompat/res/values-nb/strings.xml b/v7/appcompat/res/values-nb/strings.xml
index 2a9da65..6005234 100644
--- a/v7/appcompat/res/values-nb/strings.xml
+++ b/v7/appcompat/res/values-nb/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Talesøk"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Velg en app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Se alle"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
diff --git a/v7/appcompat/res/values-ne/strings.xml b/v7/appcompat/res/values-ne/strings.xml
index 8625fe2..0d23bd7 100644
--- a/v7/appcompat/res/values-ne/strings.xml
+++ b/v7/appcompat/res/values-ne/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"भ्वाइस खोजी"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"एउटा अनुप्रयोग छान्नुहोस्"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सबै हेर्नुहोस्"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सँग साझेदारी गर्नुहोस्"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग आदान-प्रदान गर्नुहोस्"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"साझेदारी गर्नुहोस्..."</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"सक्रिय गर्नुहोस्"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"निष्क्रिय पार्नुहोस्"</string>
diff --git a/v7/appcompat/res/values-nl/strings.xml b/v7/appcompat/res/values-nl/strings.xml
index 5ca1d93..e0d2044 100644
--- a/v7/appcompat/res/values-nl/strings.xml
+++ b/v7/appcompat/res/values-nl/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Gesproken zoekopdracht"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Een app selecteren"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Alles weergeven"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Delen met %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Delen met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Delen met"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"UIT"</string>
diff --git a/v7/appcompat/res/values-pa/strings.xml b/v7/appcompat/res/values-pa/strings.xml
index f495b8f..bc2e6ea 100644
--- a/v7/appcompat/res/values-pa/strings.xml
+++ b/v7/appcompat/res/values-pa/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ਵੌਇਸ ਖੋਜ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ਇੱਕ ਐਪ ਚੁਣੋ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ਸਭ ਦੇਖੋ"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ਤੇ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ਬੰਦ"</string>
diff --git a/v7/appcompat/res/values-pl/strings.xml b/v7/appcompat/res/values-pl/strings.xml
index ec49385..d706241 100644
--- a/v7/appcompat/res/values-pl/strings.xml
+++ b/v7/appcompat/res/values-pl/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Wyszukiwanie głosowe"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Wybierz aplikację"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobacz wszystkie"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Udostępnij dla %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Udostępnij przez: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Udostępnij dla"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"WŁ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"WYŁ."</string>
diff --git a/v7/appcompat/res/values-pt-rBR/strings.xml b/v7/appcompat/res/values-pt-rBR/strings.xml
index 12828e3..90461ec 100644
--- a/v7/appcompat/res/values-pt-rBR/strings.xml
+++ b/v7/appcompat/res/values-pt-rBR/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
diff --git a/v7/appcompat/res/values-pt-rPT/strings.xml b/v7/appcompat/res/values-pt-rPT/strings.xml
index 3e59366..40f6499 100644
--- a/v7/appcompat/res/values-pt-rPT/strings.xml
+++ b/v7/appcompat/res/values-pt-rPT/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Escolher uma aplicação"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partilhar com %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partilhar com a aplicação <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partilhar com"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ATIVADO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESATIVADO"</string>
diff --git a/v7/appcompat/res/values-pt/strings.xml b/v7/appcompat/res/values-pt/strings.xml
index 12828e3..90461ec 100644
--- a/v7/appcompat/res/values-pt/strings.xml
+++ b/v7/appcompat/res/values-pt/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
diff --git a/v7/appcompat/res/values-ro/strings.xml b/v7/appcompat/res/values-ro/strings.xml
index a896f19..6d04be9 100644
--- a/v7/appcompat/res/values-ro/strings.xml
+++ b/v7/appcompat/res/values-ro/strings.xml
@@ -29,9 +29,9 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Căutare vocală"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Alegeți o aplicație"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Afișați-le pe toate"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Trimiteți la %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Trimiteți folosind <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Trimiteți la"</string>
-    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAȚI"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"DEZACTIVAȚI"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Căutați"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ru/strings.xml b/v7/appcompat/res/values-ru/strings.xml
index f82381b..2b28958 100644
--- a/v7/appcompat/res/values-ru/strings.xml
+++ b/v7/appcompat/res/values-ru/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Голосовой поиск"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Выбрать приложение"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Показать все"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Открыть доступ пользователю %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Открыть доступ приложению \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Открыть доступ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ОТКЛ."</string>
diff --git a/v7/appcompat/res/values-si/strings.xml b/v7/appcompat/res/values-si/strings.xml
index 9539746..7631288 100644
--- a/v7/appcompat/res/values-si/strings.xml
+++ b/v7/appcompat/res/values-si/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"හඬ සෙවීම"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"යෙදුමක් තෝරන්න"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"සියල්ල බලන්න"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s සමඟ බෙදාගන්න"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සමඟ බෙදා ගන්න"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"සමඟ බෙදාගන්න"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ක්‍රියාත්මකයි"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ක්‍රියාවිරහිතයි"</string>
diff --git a/v7/appcompat/res/values-sk/strings.xml b/v7/appcompat/res/values-sk/strings.xml
index cc864b2..03faf14 100644
--- a/v7/appcompat/res/values-sk/strings.xml
+++ b/v7/appcompat/res/values-sk/strings.xml
@@ -29,9 +29,9 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Hlasové vyhľadávanie"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Zvoľte aplikáciu"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobraziť všetko"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Zdieľať pomocou %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Zdieľať s aplikáciou <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Zdieľať pomocou"</string>
-    <string name="abc_capital_on" msgid="3405795526292276155">"ZAP."</string>
-    <string name="abc_capital_off" msgid="121134116657445385">"VYP."</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTÉ"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTÉ"</string>
     <string name="search_menu_title" msgid="146198913615257606">"Vyhľadávanie"</string>
 </resources>
diff --git a/v7/appcompat/res/values-sl/strings.xml b/v7/appcompat/res/values-sl/strings.xml
index 5bd2dbf..22b8bd4 100644
--- a/v7/appcompat/res/values-sl/strings.xml
+++ b/v7/appcompat/res/values-sl/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno iskanje"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izbira aplikacije"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Pokaži vse"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deljenje z:"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deljenje z drugimi prek aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deljenje z"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"VKLOPLJENO"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IZKLOPLJENO"</string>
diff --git a/v7/appcompat/res/values-sq/strings.xml b/v7/appcompat/res/values-sq/strings.xml
index aff2307..1a1f02e 100644
--- a/v7/appcompat/res/values-sq/strings.xml
+++ b/v7/appcompat/res/values-sq/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Kërkim me zë"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Zgjidh një aplikacion"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Shikoji të gjitha"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shpërnda publikisht me %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Ndaje me <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shpërnda publikisht me"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AKTIV"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"JOAKTIV"</string>
diff --git a/v7/appcompat/res/values-sr/strings.xml b/v7/appcompat/res/values-sr/strings.xml
index 602cc6d..5678341 100644
--- a/v7/appcompat/res/values-sr/strings.xml
+++ b/v7/appcompat/res/values-sr/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласовна претрага"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Избор апликације"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Прикажи све"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Дели са апликацијом %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Дељење са апликацијом <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Дели са"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"УКЉУЧИ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ИСКЉУЧИ"</string>
diff --git a/v7/appcompat/res/values-sv/strings.xml b/v7/appcompat/res/values-sv/strings.xml
index 832ecc5..62d470f 100644
--- a/v7/appcompat/res/values-sv/strings.xml
+++ b/v7/appcompat/res/values-sv/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Röstsökning"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Välj en app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Visa alla"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dela med %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Dela med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dela med"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
diff --git a/v7/appcompat/res/values-sw/strings.xml b/v7/appcompat/res/values-sw/strings.xml
index a5f412a..c575ae0 100644
--- a/v7/appcompat/res/values-sw/strings.xml
+++ b/v7/appcompat/res/values-sw/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Tafuta kwa kutamka"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Chagua programu"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Angalia zote"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shiriki na %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Shiriki ukitumia <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shiriki na:"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"IMEWASHWA"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"IMEZIMWA"</string>
diff --git a/v7/appcompat/res/values-ta/strings.xml b/v7/appcompat/res/values-ta/strings.xml
index 4d15da8..7daeaaf 100644
--- a/v7/appcompat/res/values-ta/strings.xml
+++ b/v7/appcompat/res/values-ta/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"குரல் தேடல்"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"பயன்பாட்டைத் தேர்வுசெய்க"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"எல்லாம் காட்டு"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s உடன் பகிர்"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> மூலம் பகிர்"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"இதனுடன் பகிர்"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"இயக்கு"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"முடக்கு"</string>
diff --git a/v7/appcompat/res/values-te/strings.xml b/v7/appcompat/res/values-te/strings.xml
index f31f637..93f9aec 100644
--- a/v7/appcompat/res/values-te/strings.xml
+++ b/v7/appcompat/res/values-te/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"వాయిస్ శోధన"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"అనువర్తనాన్ని ఎంచుకోండి"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"అన్నీ చూడండి"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sతో భాగస్వామ్యం చేయి"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>తో భాగస్వామ్యం చేయండి"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"వీరితో భాగస్వామ్యం చేయి"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ఆన్ చేయి"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ఆఫ్ చేయి"</string>
diff --git a/v7/appcompat/res/values-th/strings.xml b/v7/appcompat/res/values-th/strings.xml
index 1dcd0ca..f8ea1cd 100644
--- a/v7/appcompat/res/values-th/strings.xml
+++ b/v7/appcompat/res/values-th/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ค้นหาด้วยเสียง"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"เลือกแอป"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ดูทั้งหมด"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"แชร์กับ %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"แชร์ทาง <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"แชร์กับ"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"เปิด"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ปิด"</string>
diff --git a/v7/appcompat/res/values-tl/strings.xml b/v7/appcompat/res/values-tl/strings.xml
index 8bc2f9d..1ad2689 100644
--- a/v7/appcompat/res/values-tl/strings.xml
+++ b/v7/appcompat/res/values-tl/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Paghahanap gamit ang boses"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pumili ng isang app"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tingnan lahat"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Ibahagi sa/kay %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Ibahagi gamit ang <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ibahagi sa/kay"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"I-ON"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"I-OFF"</string>
diff --git a/v7/appcompat/res/values-tr/strings.xml b/v7/appcompat/res/values-tr/strings.xml
index adf2b47..fae41d3 100644
--- a/v7/appcompat/res/values-tr/strings.xml
+++ b/v7/appcompat/res/values-tr/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Sesli arama"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Bir uygulama seçin"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tümünü göster"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ile paylaş"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ile paylaş"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Şununla paylaş"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"AÇ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"KAPAT"</string>
diff --git a/v7/appcompat/res/values-uk/strings.xml b/v7/appcompat/res/values-uk/strings.xml
index bfd0027..afc74ff 100644
--- a/v7/appcompat/res/values-uk/strings.xml
+++ b/v7/appcompat/res/values-uk/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Голосовий пошук"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Вибрати програму"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Переглянути всі"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Надіслати через %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Поділитися через додаток <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Надіслати через"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"УВІМК."</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ВИМК."</string>
diff --git a/v7/appcompat/res/values-ur/strings.xml b/v7/appcompat/res/values-ur/strings.xml
index e0d13e7..60ec34a 100644
--- a/v7/appcompat/res/values-ur/strings.xml
+++ b/v7/appcompat/res/values-ur/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"صوتی تلاش"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ایک ایپ منتخب کریں"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"سبھی دیکھیں"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"‏%s کے ساتھ اشتراک کریں"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> کے ساتھ اشتراک کریں"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراک کریں مع"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"آن"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"آف"</string>
diff --git a/v7/appcompat/res/values-uz/strings.xml b/v7/appcompat/res/values-uz/strings.xml
index ef8cc2a..632e0b9 100644
--- a/v7/appcompat/res/values-uz/strings.xml
+++ b/v7/appcompat/res/values-uz/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ovozli qidiruv"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Dastur tanlang"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Barchasini ko‘rish"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sga ruxsat berish"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> orqali ulashish"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ruxsat berish"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"O‘CHIQ"</string>
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index 8d97f7e..9587bed 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Tìm kiếm bằng giọng nói"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Chọn một ứng dụng"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Xem tất cả"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Chia sẻ với %s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Chia sẻ với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Chia sẻ với"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"BẬT"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"TẮT"</string>
diff --git a/v7/appcompat/res/values-zh-rCN/strings.xml b/v7/appcompat/res/values-zh-rCN/strings.xml
index 110e25c..7b23457 100644
--- a/v7/appcompat/res/values-zh-rCN/strings.xml
+++ b/v7/appcompat/res/values-zh-rCN/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"语音搜索"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"选择应用"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"查看全部"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"通过%s分享"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"使用<xliff:g id="APPLICATION_NAME">%s</xliff:g>分享"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享方式"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"开启"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"关闭"</string>
diff --git a/v7/appcompat/res/values-zh-rHK/strings.xml b/v7/appcompat/res/values-zh-rHK/strings.xml
index b639e4b..fc32117 100644
--- a/v7/appcompat/res/values-zh-rHK/strings.xml
+++ b/v7/appcompat/res/values-zh-rHK/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"語音搜尋"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"選擇應用程式"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"顯示全部"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"使用「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」分享"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享對象"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
diff --git a/v7/appcompat/res/values-zh-rTW/strings.xml b/v7/appcompat/res/values-zh-rTW/strings.xml
index 5c9656d..35be873 100644
--- a/v7/appcompat/res/values-zh-rTW/strings.xml
+++ b/v7/appcompat/res/values-zh-rTW/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"語音搜尋"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"選擇應用程式"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"查看全部"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"與「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」分享"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"選擇分享對象"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
diff --git a/v7/appcompat/res/values-zu/strings.xml b/v7/appcompat/res/values-zu/strings.xml
index 79b0079..e84ba7a 100644
--- a/v7/appcompat/res/values-zu/strings.xml
+++ b/v7/appcompat/res/values-zu/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ukusesha ngezwi"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Khetha uhlelo lokusebenza"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Buka konke"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Yabelana no-%s"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Yabelana ne-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Yabelana no-"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"VULIWE"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"VALIWE"</string>
diff --git a/v7/cardview/AndroidManifest.xml b/v7/cardview/AndroidManifest.xml
index 8fcf55a..af07bbc 100644
--- a/v7/cardview/AndroidManifest.xml
+++ b/v7/cardview/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.v7.cardview">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.cardview.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/cardview/api/26.1.0-SNAPSHOT.txt b/v7/cardview/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/cardview/api/26.1.0-SNAPSHOT.txt
rename to v7/cardview/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/gridlayout/AndroidManifest.xml b/v7/gridlayout/AndroidManifest.xml
index b6cb783..c18f5a1 100644
--- a/v7/gridlayout/AndroidManifest.xml
+++ b/v7/gridlayout/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.v7.gridlayout">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.gridlayout.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/gridlayout/api/26.1.0-SNAPSHOT.txt b/v7/gridlayout/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/gridlayout/api/26.1.0-SNAPSHOT.txt
rename to v7/gridlayout/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index 9ec6714..db85eda 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -4,12 +4,8 @@
     api project(':support-compat')
     api project(':support-core-ui')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
 }
 
 android {
@@ -20,8 +16,6 @@
     sourceSets {
         main.java.srcDir 'src'
         main.res.srcDir 'res'
-        main.assets.srcDir 'assets'
-        main.resources.srcDir 'src'
     }
 }
 
diff --git a/v7/mediarouter/AndroidManifest.xml b/v7/mediarouter/AndroidManifest.xml
index c4577f9..c2c4ee3 100644
--- a/v7/mediarouter/AndroidManifest.xml
+++ b/v7/mediarouter/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.v7.mediarouter">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.mediarouter.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/mediarouter/api/26.1.0-SNAPSHOT.txt b/v7/mediarouter/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/mediarouter/api/26.1.0-SNAPSHOT.txt
rename to v7/mediarouter/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index 54c720b..59ecb17 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -4,12 +4,8 @@
     api project(":appcompat-v7")
     api project(":palette-v7")
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,   { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
     androidTestImplementation libs.test_rules
 }
 
diff --git a/v7/mediarouter/res/values-be/strings.xml b/v7/mediarouter/res/values-be/strings.xml
index 2d80bca..396088f 100644
--- a/v7/mediarouter/res/values-be/strings.xml
+++ b/v7/mediarouter/res/values-be/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляцыі. Адключана"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляцыі. Ідзе падключэнне"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляцыі. Падключана"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"Трансляваць на"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Трансліраваць на"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Спыніць трансляцыю"</string>
diff --git a/v7/mediarouter/res/values-bs/strings.xml b/v7/mediarouter/res/values-bs/strings.xml
index 245b9da..ab9575e 100644
--- a/v7/mediarouter/res/values-bs/strings.xml
+++ b/v7/mediarouter/res/values-bs/strings.xml
@@ -18,11 +18,11 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
-    <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za prebacivanje"</string>
-    <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za prebacivanje. Veza je prekinuta"</string>
-    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za prebacivanje. Povezivanje"</string>
-    <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za prebacivanje. Povezan"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za emitiranje"</string>
+    <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za emitiranje. Veza je prekinuta"</string>
+    <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za emitiranje. Povezivanje"</string>
+    <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za emitiranje. Povezano"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi prebacivanje"</string>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index be50201..47a7c6b 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -23,7 +23,7 @@
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Icône Cast. Connexion…"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Icône Cast. Connecté"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils en cours…"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils…"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Arrêter la diffusion"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
diff --git a/v7/mediarouter/res/values-gl/strings.xml b/v7/mediarouter/res/values-gl/strings.xml
index 7e38bb4..e509ab7 100644
--- a/v7/mediarouter/res/values-gl/strings.xml
+++ b/v7/mediarouter/res/values-gl/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de emitir. Desconectado"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de emitir. Conectando"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de emitir. Conectado"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"Emitir en"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Emitir a"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Deter emisión"</string>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index 3e7bc50..02f50ff 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"‏לחצן הפעלת Cast. מנותק"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"‏לחצן הפעלת Cast. מתחבר"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"‏לחצן הפעלת Cast. מחובר"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"העבר אל"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"העברה אל"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"הפסק את ההעברה"</string>
diff --git a/v7/mediarouter/res/values-ka/strings.xml b/v7/mediarouter/res/values-ka/strings.xml
index 57b76e9..22480ca 100644
--- a/v7/mediarouter/res/values-ka/strings.xml
+++ b/v7/mediarouter/res/values-ka/strings.xml
@@ -22,8 +22,8 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ტრანსლირების ღილაკი. გათიშული"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირებული"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"მიმდინარეობს მოწყობილობების მოძიება"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირება:"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"მოწყობილობების მოძიება..."</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ტრანსლირების შეწყვეტა"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
diff --git a/v7/mediarouter/res/values-km/strings.xml b/v7/mediarouter/res/values-km/strings.xml
index e9bef13..f9f339d 100644
--- a/v7/mediarouter/res/values-km/strings.xml
+++ b/v7/mediarouter/res/values-km/strings.xml
@@ -22,8 +22,8 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ខាសប៊ូតុង៖ បានកាត់ផ្តាច់"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ខាសប៊ូតុង៖ កំពុងភ្ជាប់"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"ខាសប៊ូតុង៖ បានភ្ជាប់ហើយ"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"ខាសទៅ"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"ស្វែងរកឧបករណ៍"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"បញ្ជូនទៅ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"កំពុងស្វែងរកឧបករណ៍"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ឈប់ភ្ជាប់"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
diff --git a/v7/mediarouter/res/values-lo/strings.xml b/v7/mediarouter/res/values-lo/strings.xml
index e0703e8..d50ae66 100644
--- a/v7/mediarouter/res/values-lo/strings.xml
+++ b/v7/mediarouter/res/values-lo/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"ຄາ​ສ​ທ໌​ຫາ"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ສົ່ງສັນຍານຫາ"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງ​ຊອກ​ຫາ​ອຸ​ປະ​ກອນ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ຢຸດການສົ່ງສັນຍານ"</string>
diff --git a/v7/mediarouter/res/values-mk/strings.xml b/v7/mediarouter/res/values-mk/strings.xml
index ae1bfee..d5b9365 100644
--- a/v7/mediarouter/res/values-mk/strings.xml
+++ b/v7/mediarouter/res/values-mk/strings.xml
@@ -23,7 +23,7 @@
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Копче за Cast. Се поврзува"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Копче за Cast. Поврзано"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"Наоѓање уреди"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Се бараат уреди"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Сопри го емитувањето"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
diff --git a/v7/mediarouter/res/values-my/strings.xml b/v7/mediarouter/res/values-my/strings.xml
index eb33498..fb0074d 100644
--- a/v7/mediarouter/res/values-my/strings.xml
+++ b/v7/mediarouter/res/values-my/strings.xml
@@ -22,7 +22,7 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"သို့ ကာစ်တ်လုပ်ရန်"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ကာစ်လုပ်ရန် စက်"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ကာစ်လုပ်ခြင်း ရပ်ရန်"</string>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index d31aa73..7c99442 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -23,7 +23,7 @@
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Kobler til"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Tilkoblet"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"Finner enheter"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Søker etter enheter"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stopp castingen"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
diff --git a/v7/mediarouter/res/values-pa/strings.xml b/v7/mediarouter/res/values-pa/strings.xml
index e058e18..f1a1a30 100644
--- a/v7/mediarouter/res/values-pa/strings.xml
+++ b/v7/mediarouter/res/values-pa/strings.xml
@@ -22,8 +22,8 @@
     <string name="mr_cast_button_disconnected" msgid="816305490427819240">"ਕਾਸਟ ਬਟਨ। ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"ਇਸ ਨਾਲ ਕਾਸਟ ਕਰੋ"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡਿਵਾਈਸਾਂ ਲੱਭ ਰਿਹਾ ਹੈ"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"ਏਥੇ ਕਾਸਟ ਕਰੋ"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡੀਵਾਈਸਾਂ ਨੂੰ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ਬੰਦ ਕਰੋ"</string>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index 2df58ef..43a769a 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -23,7 +23,7 @@
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačidlo prenosu. Pripája sa"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačidlo prenosu. Pripojené"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"Vyhľadávanie zariadení"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Hľadajú sa zariadenia"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zastaviť prenášanie"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
diff --git a/v7/mediarouter/res/values-sq/strings.xml b/v7/mediarouter/res/values-sq/strings.xml
index 9f75316..d3cae18 100644
--- a/v7/mediarouter/res/values-sq/strings.xml
+++ b/v7/mediarouter/res/values-sq/strings.xml
@@ -23,7 +23,7 @@
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butoni i transmetimit. Po lidhet"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Butoni i transmetimit. Je i lidhur"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"Gjetja e pajisjeve"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Po kërkon pajisje"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ndalo transmetimin"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Mbyll"</string>
diff --git a/v7/mediarouter/res/values-uz/strings.xml b/v7/mediarouter/res/values-uz/strings.xml
index fae6076..2f9a8a2 100644
--- a/v7/mediarouter/res/values-uz/strings.xml
+++ b/v7/mediarouter/res/values-uz/strings.xml
@@ -33,7 +33,7 @@
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
     <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom muqovasi"</string>
-    <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ovoz balandligi slayderi"</string>
+    <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Tovush balandligi slayderi"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 5801c4f..3fbc252 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -23,7 +23,7 @@
     <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Nút truyền. Đang kết nối"</string>
     <string name="mr_cast_button_connected" msgid="5088427771788648085">"Nút truyền. Đã kết nối"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
-    <string name="mr_chooser_searching" msgid="6349900579507521956">"Tìm thiết bị"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Đang tìm thiết bị"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
     <string name="mr_controller_stop_casting" msgid="8857886794086583226">"Dừng truyền"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
diff --git a/v7/palette/AndroidManifest.xml b/v7/palette/AndroidManifest.xml
index 8e5ffaa..491cc8e 100644
--- a/v7/palette/AndroidManifest.xml
+++ b/v7/palette/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.v7.palette">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.palette.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/palette/api/26.1.0-SNAPSHOT.txt b/v7/palette/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/palette/api/26.1.0-SNAPSHOT.txt
rename to v7/palette/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/palette/build.gradle b/v7/palette/build.gradle
index e4670a7..f945327 100644
--- a/v7/palette/build.gradle
+++ b/v7/palette/build.gradle
@@ -4,9 +4,7 @@
     api project(':support-compat')
     api project(':support-core-utils')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/v7/preference/AndroidManifest.xml b/v7/preference/AndroidManifest.xml
index 772b410..c8df9a0 100644
--- a/v7/preference/AndroidManifest.xml
+++ b/v7/preference/AndroidManifest.xml
@@ -17,6 +17,7 @@
     package="android.support.v7.preference">
     <uses-sdk android:minSdkVersion="14" />
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.preference.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/preference/api/26.1.0-SNAPSHOT.txt b/v7/preference/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/preference/api/26.1.0-SNAPSHOT.txt
rename to v7/preference/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index 65e78f0..ee31034 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -21,14 +21,10 @@
     api project(':appcompat-v7')
     api project(':recyclerview-v7')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
 }
 
 android {
diff --git a/v7/recyclerview/AndroidManifest.xml b/v7/recyclerview/AndroidManifest.xml
index 5b03882..04d095c 100644
--- a/v7/recyclerview/AndroidManifest.xml
+++ b/v7/recyclerview/AndroidManifest.xml
@@ -17,6 +17,7 @@
           package="android.support.v7.recyclerview">
     <uses-sdk android:minSdkVersion="14"/>
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.v7.recyclerview.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/v7/recyclerview/api/26.1.0-SNAPSHOT.txt b/v7/recyclerview/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from v7/recyclerview/api/26.1.0-SNAPSHOT.txt
rename to v7/recyclerview/api/27.0.0-SNAPSHOT.txt
index 4e7e14d..9b4500a 100644
--- a/v7/recyclerview/api/26.1.0-SNAPSHOT.txt
+++ b/v7/recyclerview/api/27.0.0-SNAPSHOT.txt
@@ -307,6 +307,7 @@
     method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
     method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
     method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
     method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
     method public int getMaxFlingVelocity();
     method public int getMinFlingVelocity();
@@ -330,6 +331,7 @@
     method public void onScrollStateChanged(int);
     method public void onScrolled(int, int);
     method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
     method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
     method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
     method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index cde85e5..beec61e 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -5,22 +5,16 @@
     api project(':support-compat')
     api project(':support-core-ui')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
     androidTestImplementation libs.junit
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
     androidTestImplementation project(':support-testutils')
 
     testImplementation libs.junit
     testImplementation libs.mockito_core
-    testImplementation ("$libs.test_runner") {
-        exclude module: 'support-annotations'
-    }
+    testImplementation libs.test_runner, { exclude module: 'support-annotations' }
 }
 
 android {
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 5bb9100..eacae37 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -1488,14 +1488,38 @@
      * @return the ItemDecoration at index position, or null if invalid index.
      */
     public ItemDecoration getItemDecorationAt(int index) {
-        if (index < 0 || index >= mItemDecorations.size()) {
-            return null;
+        final int size = getItemDecorationCount();
+        if (index < 0 || index >= size) {
+            throw new IndexOutOfBoundsException(index + " is an invalid index for size " + size);
         }
 
         return mItemDecorations.get(index);
     }
 
     /**
+     * Returns the number of {@link ItemDecoration} currently added to this RecyclerView.
+     *
+     * @return number of ItemDecorations currently added added to this RecyclerView.
+     */
+    public int getItemDecorationCount() {
+        return mItemDecorations.size();
+    }
+
+    /**
+     * Removes the {@link ItemDecoration} associated with the supplied index position.
+     *
+     * @param index The index position of the ItemDecoration to be removed.
+     */
+    public void removeItemDecorationAt(int index) {
+        final int size = getItemDecorationCount();
+        if (index < 0 || index >= size) {
+            throw new IndexOutOfBoundsException(index + " is an invalid index for size " + size);
+        }
+
+        removeItemDecoration(getItemDecorationAt(index));
+    }
+
+    /**
      * Remove an {@link ItemDecoration} from this RecyclerView.
      *
      * <p>The given decoration will no longer impact the measurement and drawing of
diff --git a/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java b/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
index d85a27a..4c41370 100644
--- a/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
+++ b/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
@@ -229,6 +229,10 @@
         return new LinearSmoothScroller(mRecyclerView.getContext()) {
             @Override
             protected void onTargetFound(View targetView, RecyclerView.State state, Action action) {
+                if (mRecyclerView == null) {
+                    // The associated RecyclerView has been removed so there is no action to take.
+                    return;
+                }
                 int[] snapDistances = calculateDistanceToFinalSnap(mRecyclerView.getLayoutManager(),
                         targetView);
                 final int dx = snapDistances[0];
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
index dba3770..401b359 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
@@ -260,6 +260,7 @@
         getInstrumentation().waitForIdleSync();
         RecyclerView view = (RecyclerView) getActivity().findViewById(
                 android.support.v7.recyclerview.test.R.id.recycler_view);
+        assertTrue(view.getItemDecorationCount() == 1);
         assertTrue(view.getItemDecorationAt(0) instanceof FastScroller);
         FastScroller scroller = (FastScroller) view.getItemDecorationAt(0);
         assertNotNull(scroller.getHorizontalThumbDrawable());
@@ -268,6 +269,22 @@
         assertNotNull(scroller.getVerticalTrackDrawable());
     }
 
+    @Test
+    public void removeFastScrollerSuccessful() throws Throwable {
+        setContentView(android.support.v7.recyclerview.test.R.layout.fast_scrollbar_test_rv);
+        getInstrumentation().waitForIdleSync();
+        final RecyclerView view = (RecyclerView) getActivity().findViewById(
+                android.support.v7.recyclerview.test.R.id.recycler_view);
+        assertTrue(view.getItemDecorationCount() == 1);
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                view.removeItemDecorationAt(0);
+                assertTrue(view.getItemDecorationCount() == 0);
+            }
+        });
+    }
+
     @UiThreadTest
     @Test
     public void initWithBadDrawables() throws Throwable {
diff --git a/wear/AndroidManifest.xml b/wear/AndroidManifest.xml
index 5fa5a83..0541f36 100644
--- a/wear/AndroidManifest.xml
+++ b/wear/AndroidManifest.xml
@@ -16,6 +16,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.wear">
     <application>
-        <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+        <meta-data android:name="android.support.wear.VERSION"
+                   android:value="${support-version}" />
     </application>
 </manifest>
diff --git a/wear/api/26.1.0-SNAPSHOT.txt b/wear/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from wear/api/26.1.0-SNAPSHOT.txt
rename to wear/api/27.0.0-SNAPSHOT.txt
diff --git a/wear/build.gradle b/wear/build.gradle
index 4507e2c..12ab4d2 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -6,14 +6,10 @@
     api project(':percent')
     api project(':recyclerview-v7')
 
-    androidTestImplementation (libs.test_runner) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation (libs.espresso_core) {
-        exclude module: 'support-annotations'
-    }
-    androidTestImplementation libs.mockito_core
-    androidTestImplementation libs.dexmaker_mockito
+    androidTestImplementation libs.test_runner,      { exclude module: 'support-annotations' }
+    androidTestImplementation libs.espresso_core,    { exclude module: 'support-annotations' }
+    androidTestImplementation libs.mockito_core,     { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+    androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
 }
 
 android {
diff --git a/wear/lint-baseline.xml b/wear/lint-baseline.xml
index 81531cf..e961253 100644
--- a/wear/lint-baseline.xml
+++ b/wear/lint-baseline.xml
@@ -1,30 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <issues format="4" by="lint 3.0.0-alpha7">
 
-    <issue
-        id="DuplicateIds"
-        message="Duplicate id `@+id/off`, already defined earlier in this layout"
-        errorLine1="        android:id=&quot;@+id/off&quot;"
-        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="res/drawable-v21/ws_switch_thumb_material_anim.xml"
-            line="27"
-            column="9"/>
-        <location
-            file="res/drawable-v21/ws_switch_thumb_material_anim.xml"
-            line="19"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="ResourceAsColor"
-        message="Should pass resolved color instead of resource id here: `getResources().getColor(android.R.color.darker_gray)`"
-        errorLine1="            mCircleColor = ColorStateList.valueOf(android.R.color.darker_gray);"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/android/support/wear/widget/CircledImageView.java"
-            line="148"
-            column="51"/>
-    </issue>
-
 </issues>
diff --git a/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml b/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml
index 15423e5..56e6864 100644
--- a/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml
+++ b/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml
@@ -24,7 +24,7 @@
         android:drawable="@drawable/ws_switch_thumb_mtrl_14w"
         android:state_checked="true" />
     <item
-        android:id="@+id/off"
+        android:id="@id/off"
         android:drawable="@drawable/ws_switch_thumb_mtrl_14w" />
     <transition
         android:fromId="@id/off"
diff --git a/wear/src/android/support/wear/widget/CircledImageView.java b/wear/src/android/support/wear/widget/CircledImageView.java
index e21a1ab..03ed8c9 100644
--- a/wear/src/android/support/wear/widget/CircledImageView.java
+++ b/wear/src/android/support/wear/widget/CircledImageView.java
@@ -145,7 +145,7 @@
 
         mCircleColor = a.getColorStateList(R.styleable.CircledImageView_background_color);
         if (mCircleColor == null) {
-            mCircleColor = ColorStateList.valueOf(android.R.color.darker_gray);
+            mCircleColor = ColorStateList.valueOf(context.getColor(android.R.color.darker_gray));
         }
 
         mCircleRadius = a.getDimension(R.styleable.CircledImageView_background_radius, 0);