Merge "Revert "Revert "Use RecyclerView for NavigationView""" into mnc-ub-dev
diff --git a/build.gradle b/build.gradle
index 77cff72..6a90344 100644
--- a/build.gradle
+++ b/build.gradle
@@ -10,7 +10,7 @@
 }
 
 ext.supportVersion = '23.0.1'
-ext.extraVersion = 18
+ext.extraVersion = 19
 ext.supportRepoOut = ''
 ext.buildToolsVersion = '22.1.0'
 ext.buildNumber = Integer.toString(ext.extraVersion)
diff --git a/design/res-public/values/public_attrs.xml b/design/res-public/values/public_attrs.xml
index 737596b..30aa70a 100644
--- a/design/res-public/values/public_attrs.xml
+++ b/design/res-public/values/public_attrs.xml
@@ -19,11 +19,14 @@
     <public type="attr" name="backgroundTint"/>
     <public type="attr" name="backgroundTintMode"/>
     <public type="attr" name="borderWidth"/>
+    <public type="attr" name="collapsedTitleGravity"/>
     <public type="attr" name="collapsedTitleTextAppearance"/>
     <public type="attr" name="contentScrim"/>
     <public type="attr" name="elevation"/>
     <public type="attr" name="errorEnabled"/>
     <public type="attr" name="errorTextAppearance"/>
+    <public type="attr" name="expanded"/>
+    <public type="attr" name="expandedTitleGravity"/>
     <public type="attr" name="expandedTitleMargin"/>
     <public type="attr" name="expandedTitleMarginBottom"/>
     <public type="attr" name="expandedTitleMarginEnd"/>
@@ -32,9 +35,11 @@
     <public type="attr" name="expandedTitleTextAppearance"/>
     <public type="attr" name="fabSize"/>
     <public type="attr" name="headerLayout"/>
+    <public type="attr" name="hintAnimationEnabled"/>
     <public type="attr" name="hintTextAppearance"/>
     <public type="attr" name="itemBackground"/>
     <public type="attr" name="itemIconTint"/>
+    <public type="attr" name="itemTextAppearance"/>
     <public type="attr" name="itemTextColor"/>
     <public type="attr" name="keylines"/>
     <public type="attr" name="menu"/>
@@ -58,5 +63,7 @@
     <public type="attr" name="tabSelectedTextColor"/>
     <public type="attr" name="tabTextAppearance"/>
     <public type="attr" name="tabTextColor"/>
+    <public type="attr" name="title"/>
+    <public type="attr" name="titleEnabled"/>
     <public type="attr" name="toolbarId"/>
 </resources>
diff --git a/design/res-public/values/public_strings.xml b/design/res-public/values/public_strings.xml
new file mode 100644
index 0000000..d215d5c
--- /dev/null
+++ b/design/res-public/values/public_strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- Definitions of styles to be exposed as public -->
+<resources>
+    <public type="string" name="appbar_scrolling_view_behavior"/>
+</resources>
diff --git a/design/res-public/values/public_styles.xml b/design/res-public/values/public_styles.xml
index f65e5e3..4ca2050a 100644
--- a/design/res-public/values/public_styles.xml
+++ b/design/res-public/values/public_styles.xml
@@ -16,6 +16,7 @@
 
 <!-- Definitions of styles to be exposed as public -->
 <resources>
+    <public type="style" name="TextAppearance.Design.CollapsingToolbar.Expanded"/>
     <public type="style" name="TextAppearance.Design.Error"/>
     <public type="style" name="TextAppearance.Design.Hint"/>
     <public type="style" name="TextAppearance.Design.Tab"/>
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java b/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
new file mode 100644
index 0000000..5fac39c
--- /dev/null
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
@@ -0,0 +1,183 @@
+/*
+ * 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.v17.leanback.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.TimeInterpolator;
+import android.transition.Fade;
+import android.transition.Transition;
+import android.transition.TransitionValues;
+import android.transition.Visibility;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.DecelerateInterpolator;
+
+/**
+ * Execute horizontal slide of 1/4 width and fade (to workaround bug 23718734)
+ * @hide
+ */
+public class FadeAndShortSlide extends Visibility {
+
+    private static final TimeInterpolator sDecelerate = new DecelerateInterpolator();
+    // private static final TimeInterpolator sAccelerate = new AccelerateInterpolator();
+    private static final String PROPNAME_SCREEN_POSITION =
+            "android:fadeAndShortSlideTransition:screenPosition";
+
+    private CalculateSlide mSlideCalculator = sCalculateEnd;
+    private Visibility mFade = new Fade();
+
+    private interface CalculateSlide {
+
+        /** Returns the translation value for view when it goes out of the scene */
+        float getGoneX(ViewGroup sceneRoot, View view);
+    }
+
+    private static final CalculateSlide sCalculateStart = new CalculateSlide() {
+        @Override
+        public float getGoneX(ViewGroup sceneRoot, View view) {
+            final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+            final float x;
+            if (isRtl) {
+                x = view.getTranslationX() + sceneRoot.getWidth() / 4;
+            } else {
+                x = view.getTranslationX() - sceneRoot.getWidth() / 4;
+            }
+            return x;
+        }
+    };
+
+    private static final CalculateSlide sCalculateEnd = new CalculateSlide() {
+        @Override
+        public float getGoneX(ViewGroup sceneRoot, View view) {
+            final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+            final float x;
+            if (isRtl) {
+                x = view.getTranslationX() - sceneRoot.getWidth() / 4;
+            } else {
+                x = view.getTranslationX() + sceneRoot.getWidth() / 4;
+            }
+            return x;
+        }
+    };
+
+    public FadeAndShortSlide() {
+        this(Gravity.START);
+    }
+
+    public FadeAndShortSlide(int slideEdge) {
+        setSlideEdge(slideEdge);
+    }
+
+    @Override
+    public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
+        super.setEpicenterCallback(epicenterCallback);
+        mFade.setEpicenterCallback(epicenterCallback);
+    }
+
+    private void captureValues(TransitionValues transitionValues) {
+        View view = transitionValues.view;
+        int[] position = new int[2];
+        view.getLocationOnScreen(position);
+        transitionValues.values.put(PROPNAME_SCREEN_POSITION, position[0]);
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        super.captureStartValues(transitionValues);
+        mFade.captureStartValues(transitionValues);
+        captureValues(transitionValues);
+    }
+
+    @Override
+    public void captureEndValues(TransitionValues transitionValues) {
+        super.captureEndValues(transitionValues);
+        mFade.captureEndValues(transitionValues);
+        captureValues(transitionValues);
+    }
+
+    public void setSlideEdge(int slideEdge) {
+        switch (slideEdge) {
+            case Gravity.START:
+                mSlideCalculator = sCalculateStart;
+                break;
+            case Gravity.END:
+                mSlideCalculator = sCalculateEnd;
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid slide direction");
+        }
+        // SidePropagation propagation = new SidePropagation();
+        // propagation.setSide(slideEdge);
+        // setPropagation(propagation);
+    }
+
+    @Override
+    public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+            TransitionValues endValues) {
+        if (endValues == null) {
+            return null;
+        }
+        Integer position = (Integer) endValues.values.get(PROPNAME_SCREEN_POSITION);
+        float endX = view.getTranslationX();
+        float startX = mSlideCalculator.getGoneX(sceneRoot, view);
+        final Animator slideAnimator = TranslationAnimationCreator.createAnimation(view, endValues,
+                position, startX, endX, sDecelerate, this);
+        final AnimatorSet set = new AnimatorSet();
+        set.play(slideAnimator).with(mFade.onAppear(sceneRoot, view, startValues, endValues));
+
+        return set;
+    }
+
+    @Override
+    public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+            TransitionValues endValues) {
+        if (startValues == null) {
+            return null;
+        }
+        Integer position = (Integer) startValues.values.get(PROPNAME_SCREEN_POSITION);
+        float startX = view.getTranslationX();
+        float endX = mSlideCalculator.getGoneX(sceneRoot, view);
+        final Animator slideAnimator = TranslationAnimationCreator.createAnimation(view,
+                startValues, position, startX, endX, sDecelerate /* sAccelerate */, this);
+        final AnimatorSet set = new AnimatorSet();
+        set.play(slideAnimator).with(mFade.onDisappear(sceneRoot, view, startValues, endValues));
+
+        return set;
+    }
+
+    @Override
+    public Transition addListener(TransitionListener listener) {
+        mFade.addListener(listener);
+        return super.addListener(listener);
+    }
+
+    @Override
+    public Transition removeListener(TransitionListener listener) {
+        mFade.removeListener(listener);
+        return super.removeListener(listener);
+    }
+
+    @Override
+    public Transition clone() {
+        FadeAndShortSlide clone = null;
+        clone = (FadeAndShortSlide) super.clone();
+        clone.mFade = (Visibility) mFade.clone();
+        return clone;
+    }
+}
+
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java b/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
new file mode 100644
index 0000000..c836e77
--- /dev/null
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
@@ -0,0 +1,127 @@
+package android.support.v17.leanback.transition;
+
+import android.support.v17.leanback.R;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.TimeInterpolator;
+import android.graphics.Path;
+import android.transition.Transition;
+import android.transition.TransitionValues;
+import android.view.View;
+
+/**
+ * This class is used by Slide and Explode to create an animator that goes from the start position
+ * to the end position. It takes into account the canceled position so that it will not blink out or
+ * shift suddenly when the transition is interrupted.
+ * @hide
+ */
+class TranslationAnimationCreator {
+
+    /**
+     * Creates an animator that can be used for x and/or y translations. When interrupted, it sets a
+     * tag to keep track of the position so that it may be continued from position.
+     *
+     * @param view The view being moved. This may be in the overlay for onDisappear.
+     * @param values The values containing the view in the view hierarchy.
+     * @param viewPosX The x screen coordinate of view
+     * @param startX The start translation x of view
+     * @param endX The end translation x of view
+     * @param interpolator The interpolator to use with this animator.
+     * @return An animator that moves from (startX, startY) to (endX, endY) unless there was a
+     *         previous interruption, in which case it moves from the current position to (endX,
+     *         endY).
+     */
+    static Animator createAnimation(View view, TransitionValues values, int viewPosX, float startX,
+            float endX, TimeInterpolator interpolator, Transition transition) {
+        float terminalX = view.getTranslationX();
+        Integer startPosition = (Integer) values.view.getTag(R.id.transitionPosition);
+        if (startPosition != null) {
+            startX = startPosition - viewPosX + terminalX;
+        }
+        // Initial position is at translation startX, startY, so position is offset by that
+        // amount
+        int startPosX = viewPosX + Math.round(startX - terminalX);
+
+        view.setTranslationX(startX);
+        if (startX == endX) {
+            return null;
+        }
+        Path path = new Path();
+        path.moveTo(startX, 0);
+        path.lineTo(endX, 0);
+        ObjectAnimator anim =
+                ObjectAnimator.ofFloat(view, View.TRANSLATION_X, View.TRANSLATION_Y, path);
+
+        TransitionPositionListener listener =
+                new TransitionPositionListener(view, values.view, startPosX, terminalX);
+        transition.addListener(listener);
+        anim.addListener(listener);
+        anim.addPauseListener(listener);
+        anim.setInterpolator(interpolator);
+        return anim;
+    }
+
+    private static class TransitionPositionListener extends AnimatorListenerAdapter
+            implements Transition.TransitionListener {
+
+        private final View mViewInHierarchy;
+        private final View mMovingView;
+        private final int mStartX;
+        private Integer mTransitionPosition;
+        private float mPausedX;
+        private final float mTerminalX;
+
+        private TransitionPositionListener(View movingView, View viewInHierarchy, int startX,
+                float terminalX) {
+            mMovingView = movingView;
+            mViewInHierarchy = viewInHierarchy;
+            mStartX = startX - Math.round(mMovingView.getTranslationX());
+            mTerminalX = terminalX;
+            mTransitionPosition = (Integer) mViewInHierarchy.getTag(R.id.transitionPosition);
+            if (mTransitionPosition != null) {
+                mViewInHierarchy.setTag(R.id.transitionPosition, null);
+            }
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+            mTransitionPosition = Math.round(mStartX + mMovingView.getTranslationX());
+            mViewInHierarchy.setTag(R.id.transitionPosition, mTransitionPosition);
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animator) {}
+
+        @Override
+        public void onAnimationPause(Animator animator) {
+            mPausedX = mMovingView.getTranslationX();
+            mMovingView.setTranslationX(mTerminalX);
+        }
+
+        @Override
+        public void onAnimationResume(Animator animator) {
+            mMovingView.setTranslationX(mPausedX);
+        }
+
+        @Override
+        public void onTransitionStart(Transition transition) {}
+
+        @Override
+        public void onTransitionEnd(Transition transition) {
+            mMovingView.setTranslationX(mTerminalX);
+        }
+
+        @Override
+        public void onTransitionCancel(Transition transition) {}
+
+        @Override
+        public void onTransitionPause(Transition transition) {}
+
+        @Override
+        public void onTransitionResume(Transition transition) {}
+    }
+
+}
+
diff --git a/v17/leanback/res/values/ids.xml b/v17/leanback/res/values/ids.xml
index d4ba288..8bc7324 100644
--- a/v17/leanback/res/values/ids.xml
+++ b/v17/leanback/res/values/ids.xml
@@ -18,6 +18,7 @@
      <item type="id" name="lb_focus_animator" />
      <item type="id" name="lb_shadow_impl" />
      <item type="id" name="lb_slide_transition_value" />
+     <item type="id" name="transitionPosition" />
 
      <item type="id" name="lb_control_play_pause" />
      <item type="id" name="lb_control_fast_forward" />
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java b/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java
index 3be5929..fdb7c71 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java
@@ -283,12 +283,15 @@
         ViewGroup.LayoutParams lp = view.getLayoutParams();
         if (lp != null) {
             // if wrapped view has layout params, inherit everything but width/height.
-            // Wrapped view is assigned a FrameLayout.LayoutParams with width
-            // and height only.  User can still change wrapped view width/height afterwards.
+            // Wrapped view is assigned a FrameLayout.LayoutParams with width and height only.
             // Margins, etc are assigned to the wrapper and take effect in parent container.
             ViewGroup.LayoutParams wrapped_lp = new FrameLayout.LayoutParams(lp.width, lp.height);
-            lp.width = LayoutParams.WRAP_CONTENT;
-            lp.height = LayoutParams.WRAP_CONTENT;
+            // Uses MATCH_PARENT for MATCH_PARENT, WRAP_CONTENT for WRAP_CONTENT and fixed size,
+            // App can still change wrapped view fixed width/height afterwards.
+            lp.width = lp.width == LayoutParams.MATCH_PARENT ?
+                    LayoutParams.MATCH_PARENT : LayoutParams.WRAP_CONTENT;
+            lp.height = lp.height == LayoutParams.MATCH_PARENT ?
+                    LayoutParams.MATCH_PARENT : LayoutParams.WRAP_CONTENT;
             this.setLayoutParams(lp);
             addView(view, wrapped_lp);
         } else {
diff --git a/v17/preference-leanback/Android.mk b/v17/preference-leanback/Android.mk
index c3bc803..8b6a0a1 100644
--- a/v17/preference-leanback/Android.mk
+++ b/v17/preference-leanback/Android.mk
@@ -41,7 +41,8 @@
 LOCAL_MODULE := android-support-v17-preference-leanback-api21
 LOCAL_SDK_VERSION := 21
 LOCAL_SRC_FILES := $(call all-java-files-under, api21)
-LOCAL_JAVA_LIBRARIES := android-support-v17-preference-leanback-res
+LOCAL_JAVA_LIBRARIES := android-support-v17-preference-leanback-res \
+        android-support-v17-leanback
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 # Here is the final static library that apps can link against.
diff --git a/v17/preference-leanback/api21/android/support/v17/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java b/v17/preference-leanback/api21/android/support/v17/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
index 2002a54..37e7a79 100644
--- a/v17/preference-leanback/api21/android/support/v17/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
+++ b/v17/preference-leanback/api21/android/support/v17/preference/LeanbackPreferenceFragmentTransitionHelperApi21.java
@@ -16,21 +16,10 @@
 
 package android.support.v17.preference;
 
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.TimeInterpolator;
+import android.support.v17.leanback.transition.FadeAndShortSlide;
 import android.app.Fragment;
-import android.graphics.Path;
-import android.transition.Fade;
 import android.transition.Transition;
-import android.transition.TransitionValues;
-import android.transition.Visibility;
 import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.DecelerateInterpolator;
 
 /**
  * @hide
@@ -38,8 +27,8 @@
 public class LeanbackPreferenceFragmentTransitionHelperApi21 {
 
     public static void addTransitions(Fragment f) {
-        final Transition transitionStartEdge = new FadeAndShortSlideTransition(Gravity.START);
-        final Transition transitionEndEdge = new FadeAndShortSlideTransition(Gravity.END);
+        final Transition transitionStartEdge = new FadeAndShortSlide(Gravity.START);
+        final Transition transitionEndEdge = new FadeAndShortSlide(Gravity.END);
 
         f.setEnterTransition(transitionEndEdge);
         f.setExitTransition(transitionStartEdge);
@@ -47,273 +36,5 @@
         f.setReturnTransition(transitionEndEdge);
     }
 
-    private static class FadeAndShortSlideTransition extends Visibility {
-
-        private static final TimeInterpolator sDecelerate = new DecelerateInterpolator();
-//        private static final TimeInterpolator sAccelerate = new AccelerateInterpolator();
-        private static final String PROPNAME_SCREEN_POSITION =
-                "android:fadeAndShortSlideTransition:screenPosition";
-
-        private CalculateSlide mSlideCalculator = sCalculateEnd;
-        private Visibility mFade = new Fade();
-
-        private interface CalculateSlide {
-
-            /** Returns the translation value for view when it goes out of the scene */
-            float getGoneX(ViewGroup sceneRoot, View view);
-        }
-
-        private static final CalculateSlide sCalculateStart = new CalculateSlide() {
-            @Override
-            public float getGoneX(ViewGroup sceneRoot, View view) {
-                final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
-                final float x;
-                if (isRtl) {
-                    x = view.getTranslationX() + sceneRoot.getWidth() / 4;
-                } else {
-                    x = view.getTranslationX() - sceneRoot.getWidth() / 4;
-                }
-                return x;
-            }
-        };
-
-        private static final CalculateSlide sCalculateEnd = new CalculateSlide() {
-            @Override
-            public float getGoneX(ViewGroup sceneRoot, View view) {
-                final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
-                final float x;
-                if (isRtl) {
-                    x = view.getTranslationX() - sceneRoot.getWidth() / 4;
-                } else {
-                    x = view.getTranslationX() + sceneRoot.getWidth() / 4;
-                }
-                return x;
-            }
-        };
-
-        public FadeAndShortSlideTransition(int slideEdge) {
-            setSlideEdge(slideEdge);
-        }
-
-        @Override
-        public void setEpicenterCallback(EpicenterCallback epicenterCallback) {
-            super.setEpicenterCallback(epicenterCallback);
-            mFade.setEpicenterCallback(epicenterCallback);
-        }
-
-        private void captureValues(TransitionValues transitionValues) {
-            View view = transitionValues.view;
-            int[] position = new int[2];
-            view.getLocationOnScreen(position);
-            transitionValues.values.put(PROPNAME_SCREEN_POSITION, position[0]);
-        }
-
-        @Override
-        public void captureStartValues(TransitionValues transitionValues) {
-            super.captureStartValues(transitionValues);
-            mFade.captureStartValues(transitionValues);
-            captureValues(transitionValues);
-        }
-
-        @Override
-        public void captureEndValues(TransitionValues transitionValues) {
-            super.captureEndValues(transitionValues);
-            mFade.captureEndValues(transitionValues);
-            captureValues(transitionValues);
-        }
-
-        public void setSlideEdge(int slideEdge) {
-            switch (slideEdge) {
-                case Gravity.START:
-                    mSlideCalculator = sCalculateStart;
-                    break;
-                case Gravity.END:
-                    mSlideCalculator = sCalculateEnd;
-                    break;
-                default:
-                    throw new IllegalArgumentException("Invalid slide direction");
-            }
-//            SidePropagation propagation = new SidePropagation();
-//            propagation.setSide(slideEdge);
-//            setPropagation(propagation);
-        }
-
-        @Override
-        public Animator onAppear(ViewGroup sceneRoot, View view,
-                TransitionValues startValues, TransitionValues endValues) {
-            if (endValues == null) {
-                return null;
-            }
-            Integer position = (Integer) endValues.values.get(PROPNAME_SCREEN_POSITION);
-            float endX = view.getTranslationX();
-            float startX = mSlideCalculator.getGoneX(sceneRoot, view);
-            final Animator slideAnimator = TranslationAnimationCreator
-                    .createAnimation(view, endValues, position,
-                            startX, endX, sDecelerate, this);
-            final AnimatorSet set = new AnimatorSet();
-            set.play(slideAnimator)
-                    .with(mFade.onAppear(sceneRoot, view, startValues, endValues));
-
-            return set;
-        }
-
-        @Override
-        public Animator onDisappear(ViewGroup sceneRoot, View view,
-                TransitionValues startValues, TransitionValues endValues) {
-            if (startValues == null) {
-                return null;
-            }
-            Integer position = (Integer) startValues.values.get(PROPNAME_SCREEN_POSITION);
-            float startX = view.getTranslationX();
-            float endX = mSlideCalculator.getGoneX(sceneRoot, view);
-            final Animator slideAnimator = TranslationAnimationCreator
-                    .createAnimation(view, startValues, position,
-                            startX, endX, sDecelerate /*sAccelerate*/, this);
-            final AnimatorSet set = new AnimatorSet();
-            set.play(slideAnimator)
-                    .with(mFade.onDisappear(sceneRoot, view, startValues, endValues));
-
-            return set;
-        }
-
-        @Override
-        public Transition addListener(TransitionListener listener) {
-            mFade.addListener(listener);
-            return super.addListener(listener);
-        }
-
-        @Override
-        public Transition removeListener(TransitionListener listener) {
-            mFade.removeListener(listener);
-            return super.removeListener(listener);
-        }
-
-        @Override
-        public Transition clone() {
-            FadeAndShortSlideTransition clone = null;
-            clone = (FadeAndShortSlideTransition) super.clone();
-            clone.mFade = (Visibility) mFade.clone();
-            return clone;
-        }
-    }
-
-    /**
-     * This class is used by Slide and Explode to create an animator that goes from the start
-     * position to the end position. It takes into account the canceled position so that it
-     * will not blink out or shift suddenly when the transition is interrupted.
-     */
-    private static class TranslationAnimationCreator {
-
-        /**
-         * Creates an animator that can be used for x and/or y translations. When interrupted,
-         * it sets a tag to keep track of the position so that it may be continued from position.
-         *
-         * @param view The view being moved. This may be in the overlay for onDisappear.
-         * @param values The values containing the view in the view hierarchy.
-         * @param viewPosX The x screen coordinate of view
-         * @param startX The start translation x of view
-         * @param endX The end translation x of view
-         * @param interpolator The interpolator to use with this animator.
-         * @return An animator that moves from (startX, startY) to (endX, endY) unless there was
-         * a previous interruption, in which case it moves from the current position to
-         * (endX, endY).
-         */
-        static Animator createAnimation(View view, TransitionValues values, int viewPosX,
-                float startX, float endX, TimeInterpolator interpolator,
-                Transition transition) {
-            float terminalX = view.getTranslationX();
-            Integer startPosition = (Integer) values.view.getTag(R.id.transitionPosition);
-            if (startPosition != null) {
-                startX = startPosition - viewPosX + terminalX;
-            }
-            // Initial position is at translation startX, startY, so position is offset by that
-            // amount
-            int startPosX = viewPosX + Math.round(startX - terminalX);
-
-            view.setTranslationX(startX);
-            if (startX == endX) {
-                return null;
-            }
-            Path path = new Path();
-            path.moveTo(startX, 0);
-            path.lineTo(endX, 0);
-            ObjectAnimator anim =
-                    ObjectAnimator.ofFloat(view, View.TRANSLATION_X, View.TRANSLATION_Y, path);
-
-            TransitionPositionListener listener = new TransitionPositionListener(view, values.view,
-                    startPosX, terminalX);
-            transition.addListener(listener);
-            anim.addListener(listener);
-            anim.addPauseListener(listener);
-            anim.setInterpolator(interpolator);
-            return anim;
-        }
-
-        private static class TransitionPositionListener extends AnimatorListenerAdapter implements
-                Transition.TransitionListener {
-
-            private final View mViewInHierarchy;
-            private final View mMovingView;
-            private final int mStartX;
-            private Integer mTransitionPosition;
-            private float mPausedX;
-            private final float mTerminalX;
-
-            private TransitionPositionListener(View movingView, View viewInHierarchy,
-                    int startX, float terminalX) {
-                mMovingView = movingView;
-                mViewInHierarchy = viewInHierarchy;
-                mStartX = startX - Math.round(mMovingView.getTranslationX());
-                mTerminalX = terminalX;
-                mTransitionPosition = (Integer) mViewInHierarchy.getTag(R.id.transitionPosition);
-                if (mTransitionPosition != null) {
-                    mViewInHierarchy.setTag(R.id.transitionPosition, null);
-                }
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                mTransitionPosition = Math.round(mStartX + mMovingView.getTranslationX());
-                mViewInHierarchy.setTag(R.id.transitionPosition, mTransitionPosition);
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animator) {
-            }
-
-            @Override
-            public void onAnimationPause(Animator animator) {
-                mPausedX = mMovingView.getTranslationX();
-                mMovingView.setTranslationX(mTerminalX);
-            }
-
-            @Override
-            public void onAnimationResume(Animator animator) {
-                mMovingView.setTranslationX(mPausedX);
-            }
-
-            @Override
-            public void onTransitionStart(Transition transition) {
-            }
-
-            @Override
-            public void onTransitionEnd(Transition transition) {
-                mMovingView.setTranslationX(mTerminalX);
-            }
-
-            @Override
-            public void onTransitionCancel(Transition transition) {
-            }
-
-            @Override
-            public void onTransitionPause(Transition transition) {
-            }
-
-            @Override
-            public void onTransitionResume(Transition transition) {
-            }
-        }
-
-    }
 
 }
diff --git a/v17/preference-leanback/res/values/ids.xml b/v17/preference-leanback/res/values/ids.xml
deleted file mode 100644
index 20c1eda..0000000
--- a/v17/preference-leanback/res/values/ids.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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
-  -->
-
-<resources>
-    <item name="transitionPosition" type="id" />
-</resources>
diff --git a/v17/tests/src/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java b/v17/tests/src/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
new file mode 100644
index 0000000..e7ec4bf
--- /dev/null
+++ b/v17/tests/src/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.v17.leanback.widget;
+
+import android.test.AndroidTestCase;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+
+public class ShadowOverlayContainerTest extends AndroidTestCase {
+
+    public void testWrapContent() {
+        FrameLayout frameLayout = new FrameLayout(getContext());
+        TextView textView = new TextView(getContext());
+        textView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
+                LayoutParams.WRAP_CONTENT));
+        textView.setText("abc");
+        ShadowOverlayContainer container = new ShadowOverlayContainer(getContext());
+        container.initialize(true, true, true);
+        container.wrap(textView);
+        frameLayout.addView(container);
+        frameLayout.measure(MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY));
+        frameLayout.layout(0, 0, 500, 500);
+        assertTrue(textView.getWidth() > 0);
+        assertTrue(textView.getWidth() < 500);
+        assertTrue(textView.getHeight() > 0);
+        assertTrue(textView.getHeight() < 500);
+        assertEquals(container.getWidth(), textView.getWidth());
+        assertEquals(container.getHeight(), textView.getHeight());
+
+        // change layout size of textView after wrap()
+        textView.setLayoutParams(new FrameLayout.LayoutParams(123, 123));
+        frameLayout.measure(MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY));
+        frameLayout.layout(0, 0, 500, 500);
+        assertTrue(textView.getWidth() == 123);
+        assertTrue(textView.getHeight() == 123);
+        assertEquals(container.getWidth(), textView.getWidth());
+        assertEquals(container.getHeight(), textView.getHeight());
+    }
+
+    public void testFixedSize() {
+        FrameLayout frameLayout = new FrameLayout(getContext());
+        TextView textView = new TextView(getContext());
+        textView.setLayoutParams(new FrameLayout.LayoutParams(200, LayoutParams.WRAP_CONTENT));
+        textView.setText("abc");
+        ShadowOverlayContainer container = new ShadowOverlayContainer(getContext());
+        container.initialize(true, true, true);
+        container.wrap(textView);
+        frameLayout.addView(container);
+        frameLayout.measure(MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY));
+        frameLayout.layout(0, 0, 500, 500);
+        assertTrue(textView.getWidth() == 200);
+        assertTrue(textView.getHeight() > 0);
+        assertTrue(textView.getHeight() < 500);
+        assertEquals(container.getWidth(), textView.getWidth());
+        assertEquals(container.getHeight(), textView.getHeight());
+
+        // change layout size of textView after wrap()
+        textView.setLayoutParams(new FrameLayout.LayoutParams(123, 123));
+        frameLayout.measure(MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY));
+        frameLayout.layout(0, 0, 500, 500);
+        assertTrue(textView.getWidth() == 123);
+        assertTrue(textView.getHeight() == 123);
+        assertEquals(container.getWidth(), textView.getWidth());
+        assertEquals(container.getHeight(), textView.getHeight());
+    }
+
+    public void testMatchParent() {
+        FrameLayout frameLayout = new FrameLayout(getContext());
+        TextView textView = new TextView(getContext());
+        textView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+                LayoutParams.WRAP_CONTENT));
+        textView.setText("abc");
+        ShadowOverlayContainer container = new ShadowOverlayContainer(getContext());
+        container.initialize(true, true, true);
+        container.wrap(textView);
+        frameLayout.addView(container);
+        frameLayout.measure(MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY));
+        frameLayout.layout(0, 0, 500, 500);
+        assertTrue(textView.getWidth() == 500);
+        assertTrue(textView.getHeight() > 0);
+        assertTrue(textView.getHeight() < 500);
+        assertEquals(container.getWidth(), textView.getWidth());
+        assertEquals(container.getHeight(), textView.getHeight());
+    }
+}
diff --git a/v4/api/current.txt b/v4/api/current.txt
index 5e5eb1a..b0be7a0 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -1093,6 +1093,11 @@
     method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
   }
 
+  public class ParallelExecutorCompat {
+    ctor public ParallelExecutorCompat();
+    method public static java.util.concurrent.Executor getParallelExecutor();
+  }
+
   public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
     ctor public WakefulBroadcastReceiver();
     method public static boolean completeWakefulIntent(android.content.Intent);
diff --git a/v4/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java b/v4/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java
new file mode 100644
index 0000000..fa6af47
--- /dev/null
+++ b/v4/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java
@@ -0,0 +1,31 @@
+/*
+ * 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;
+
+/**
+ * Implementation of parallel executor compatibility that can call Honeycomb APIs.
+ * @hide
+ */
+class ExecutorCompatHoneycomb {
+    public static Executor getParallelExecutor() {
+        return AsyncTask.THREAD_POOL_EXECUTOR;
+    }
+}
diff --git a/v4/java/android/support/v4/app/FragmentManager.java b/v4/java/android/support/v4/app/FragmentManager.java
index fc6a776..79e08e4 100644
--- a/v4/java/android/support/v4/app/FragmentManager.java
+++ b/v4/java/android/support/v4/app/FragmentManager.java
@@ -440,7 +440,12 @@
             if (mView != null) {
                 mShouldRunOnHWLayer = shouldRunOnHWLayer(mView, animation);
                 if (mShouldRunOnHWLayer) {
-                    ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_HARDWARE, null);
+                    mView.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_HARDWARE, null);
+                        }
+                    });
                 }
             }
             if (mOrignalListener != null) {
@@ -452,7 +457,12 @@
         @CallSuper
         public void onAnimationEnd(Animation animation) {
             if (mView != null && mShouldRunOnHWLayer) {
-                ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_NONE, null);
+                mView.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_NONE, null);
+                    }
+                });
             }
             if (mOrignalListener != null) {
                 mOrignalListener.onAnimationEnd(animation);
@@ -523,9 +533,7 @@
     }
 
     static boolean shouldRunOnHWLayer(View v, Animation anim) {
-        // HW layers result in crashes on ICS so we only use it on JB+
-        return Build.VERSION.SDK_INT >= 16
-                && ViewCompat.getLayerType(v) == ViewCompat.LAYER_TYPE_NONE
+        return ViewCompat.getLayerType(v) == ViewCompat.LAYER_TYPE_NONE
                 && ViewCompat.hasOverlappingRendering(v)
                 && modifiesAlpha(anim);
     }
@@ -2270,6 +2278,7 @@
             fragment.mTag = tag;
             fragment.mInLayout = true;
             fragment.mFragmentManager = this;
+            fragment.mHost = mHost;
             fragment.onInflate(mHost.getContext(), attrs, fragment.mSavedFragmentState);
             addFragment(fragment, true);
 
diff --git a/v4/java/android/support/v4/content/ParallelExecutorCompat.java b/v4/java/android/support/v4/content/ParallelExecutorCompat.java
new file mode 100644
index 0000000..c23470b
--- /dev/null
+++ b/v4/java/android/support/v4/content/ParallelExecutorCompat.java
@@ -0,0 +1,36 @@
+/*
+ * 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.Build;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Helper for accessing a shared parallel Executor instance
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class ParallelExecutorCompat {
+    public static Executor getParallelExecutor() {
+        if (Build.VERSION.SDK_INT >= 11) {
+            // From API 11 onwards, return AsyncTask.THREAD_POOL_EXECUTOR
+            return ExecutorCompatHoneycomb.getParallelExecutor();
+        } else {
+            return ModernAsyncTask.THREAD_POOL_EXECUTOR;
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/media/session/MediaSessionCompat.java b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
index 6d3cb27..62896f7 100644
--- a/v4/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -2012,12 +2012,14 @@
 
         @Override
         public void setPlaybackState(PlaybackStateCompat state) {
-            MediaSessionCompatApi21.setPlaybackState(mSessionObj, state.getPlaybackState());
+            MediaSessionCompatApi21.setPlaybackState(mSessionObj,
+                    state == null ? null : state.getPlaybackState());
         }
 
         @Override
         public void setMetadata(MediaMetadataCompat metadata) {
-            MediaSessionCompatApi21.setMetadata(mSessionObj, metadata.getMediaMetadata());
+            MediaSessionCompatApi21.setMetadata(mSessionObj,
+                    metadata == null ? null : metadata.getMediaMetadata());
         }
 
         @Override
diff --git a/v7/appcompat/res-public/values/public_attrs.xml b/v7/appcompat/res-public/values/public_attrs.xml
index 3db510d..f8fae53 100644
--- a/v7/appcompat/res-public/values/public_attrs.xml
+++ b/v7/appcompat/res-public/values/public_attrs.xml
@@ -50,13 +50,15 @@
      <public type="attr" name="actionViewClass"/>
      <public type="attr" name="alertDialogStyle"/>
      <public type="attr" name="alertDialogTheme"/>
+     <public type="attr" name="arrowHeadLength"/>
+     <public type="attr" name="arrowShaftLength"/>
      <public type="attr" name="autoCompleteTextViewStyle"/>
      <public type="attr" name="background"/>
      <public type="attr" name="backgroundSplit"/>
      <public type="attr" name="backgroundStacked"/>
      <public type="attr" name="backgroundTint"/>
      <public type="attr" name="backgroundTintMode"/>
-     <public type="attr" name="barSize"/>
+     <public type="attr" name="barLength"/>
      <public type="attr" name="borderlessButtonStyle"/>
      <public type="attr" name="buttonBarButtonStyle"/>
      <public type="attr" name="buttonBarNegativeButtonStyle"/>
@@ -140,7 +142,6 @@
      <public type="attr" name="preserveIconSpacing"/>
      <public type="attr" name="progressBarPadding"/>
      <public type="attr" name="progressBarStyle"/>
-     <public type="attr" name="prompt"/>
      <public type="attr" name="queryBackground"/>
      <public type="attr" name="queryHint"/>
      <public type="attr" name="radioButtonStyle"/>
@@ -155,7 +156,6 @@
      <public type="attr" name="showText"/>
      <public type="attr" name="spinBars"/>
      <public type="attr" name="spinnerDropDownItemStyle"/>
-     <public type="attr" name="spinnerMode"/>
      <public type="attr" name="spinnerStyle"/>
      <public type="attr" name="splitTrack"/>
      <public type="attr" name="submitBackground"/>
@@ -190,7 +190,6 @@
      <public type="attr" name="titleTextStyle"/>
      <public type="attr" name="toolbarNavigationButtonStyle"/>
      <public type="attr" name="toolbarStyle"/>
-     <public type="attr" name="topBottomBarArrowSize"/>
      <public type="attr" name="track"/>
      <public type="attr" name="voiceIcon"/>
      <public type="attr" name="windowActionBar"/>
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
index b22e209..ef38511 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
@@ -175,7 +175,16 @@
     public abstract MenuInflater getMenuInflater();
 
     /**
-     * Should be called from {@link Activity#onCreate Activity.onCreate()}
+     * Should be called from {@link Activity#onCreate Activity.onCreate()}.
+     *
+     * <p>This should be called before {@code super.onCreate()} as so:</p>
+     * <pre class="prettyprint">
+     * protected void onCreate(Bundle savedInstanceState) {
+     *     getDelegate().onCreate(savedInstanceState);
+     *     super.onCreate(savedInstanceState);
+     *     // ...
+     * }
+     * </pre>
      */
     public abstract void onCreate(Bundle savedInstanceState);
 
@@ -280,8 +289,8 @@
      * <pre class="prettyprint">
      * protected void onCreate(Bundle savedInstanceState) {
      *     getDelegate().installViewFactory();
-     *     super.onCreate(savedInstanceState);
      *     getDelegate().onCreate(savedInstanceState);
+     *     super.onCreate(savedInstanceState);
      *
      *     // ...
      * }
diff --git a/v7/mediarouter/jellybean/android/support/v7/media/SeekBarJellybean.java b/v7/mediarouter/jellybean/android/support/v7/media/SeekBarJellybean.java
new file mode 100644
index 0000000..76bf6fd
--- /dev/null
+++ b/v7/mediarouter/jellybean/android/support/v7/media/SeekBarJellybean.java
@@ -0,0 +1,29 @@
+/*
+ * 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.v7.media;
+
+import android.graphics.drawable.Drawable;
+import android.widget.SeekBar;
+
+/**
+ * @hide
+ */
+public class SeekBarJellybean {
+    public static Drawable getThumb(SeekBar seekBar) {
+        return seekBar.getThumb();
+    }
+}
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png
new file mode 100644
index 0000000..0493c80
--- /dev/null
+++ b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png
new file mode 100644
index 0000000..fce1884
--- /dev/null
+++ b/v7/mediarouter/res/drawable-hdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_pause_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_pause_dark.png
index 81c32fe..7192ad4 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_pause_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_pause_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_pause_light.png b/v7/mediarouter/res/drawable-hdpi/ic_pause_light.png
index 864d8d2..aeb13eb 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_pause_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_pause_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png
index 568ae86..547ef30 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_play_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_play_light.png b/v7/mediarouter/res/drawable-hdpi/ic_play_light.png
index e278033..0648523 100644
--- a/v7/mediarouter/res/drawable-hdpi/ic_play_light.png
+++ b/v7/mediarouter/res/drawable-hdpi/ic_play_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png
new file mode 100644
index 0000000..ddc8789
--- /dev/null
+++ b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png
new file mode 100644
index 0000000..27a8a71
--- /dev/null
+++ b/v7/mediarouter/res/drawable-mdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_pause_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_pause_dark.png
index c4218a4..f49aed7 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_pause_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_pause_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_pause_light.png b/v7/mediarouter/res/drawable-mdpi/ic_pause_light.png
index ab26a30..6708b41 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_pause_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_pause_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png
index 4446faa..a3c80e7 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_play_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_play_light.png b/v7/mediarouter/res/drawable-mdpi/ic_play_light.png
index 55b8c5e..8f6a725 100644
--- a/v7/mediarouter/res/drawable-mdpi/ic_play_light.png
+++ b/v7/mediarouter/res/drawable-mdpi/ic_play_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png
new file mode 100644
index 0000000..c57b9d6
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png
new file mode 100644
index 0000000..920f5ca
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_pause_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_pause_dark.png
index bd7ec0f..660ac65 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_pause_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_pause_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_pause_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_pause_light.png
index e79d7d7..239b5a8 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_pause_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_pause_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_play_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_play_dark.png
index 9a5d45f..be5c062 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_play_dark.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_play_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_play_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_play_light.png
index acaeca6..4be0ef3 100644
--- a/v7/mediarouter/res/drawable-xhdpi/ic_play_light.png
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_play_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png
new file mode 100644
index 0000000..8e9aa70
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_grey.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png
new file mode 100644
index 0000000..860c758
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_bluetooth_white.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_pause_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_pause_dark.png
index 2a96557..3ea7e03 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_pause_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_pause_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_pause_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_pause_light.png
index bf2560f..78456c7 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_pause_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_pause_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_play_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_play_dark.png
index 1ec1995..2745c3a 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_play_dark.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_play_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png
index a5bd8df..27a0dc0 100644
--- a/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_play_light.png
Binary files differ
diff --git a/v7/mediarouter/res/layout/mr_media_route_chooser_dialog.xml b/v7/mediarouter/res/layout/mr_chooser_dialog.xml
similarity index 76%
rename from v7/mediarouter/res/layout/mr_media_route_chooser_dialog.xml
rename to v7/mediarouter/res/layout/mr_chooser_dialog.xml
index 6608f9a..bda99f5 100644
--- a/v7/mediarouter/res/layout/mr_media_route_chooser_dialog.xml
+++ b/v7/mediarouter/res/layout/mr_chooser_dialog.xml
@@ -14,18 +14,15 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:layout_width="fill_parent"
-              android:layout_height="wrap_content"
-              android:orientation="vertical"
-              android:paddingTop="24dp"
-              android:paddingBottom="24dp">
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="fill_parent"
+             android:layout_height="wrap_content" >
 
-    <ListView android:id="@+id/media_route_list"
+    <ListView android:id="@+id/mr_chooser_list"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:divider="@android:color/transparent"
-              android:dividerHeight="@dimen/mr_list_item_margin"/>
+              android:dividerHeight="0dp" />
 
     <LinearLayout android:id="@android:id/empty"
               android:layout_width="fill_parent"
@@ -38,11 +35,11 @@
         <TextView android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_gravity="center"
-                  android:text="@string/mr_media_route_chooser_searching" />
+                  android:text="@string/mr_chooser_searching" />
         <ProgressBar android:layout_width="150dp"
                      android:layout_height="wrap_content"
                      android:layout_gravity="center"
                      android:indeterminate="true"
                      style="?android:attr/progressBarStyleHorizontal" />
     </LinearLayout>
-</LinearLayout>
+</FrameLayout>
diff --git a/v7/mediarouter/res/layout/mr_media_route_list_item.xml b/v7/mediarouter/res/layout/mr_chooser_list_item.xml
similarity index 70%
rename from v7/mediarouter/res/layout/mr_media_route_list_item.xml
rename to v7/mediarouter/res/layout/mr_chooser_list_item.xml
index a2804ae..a363ab0 100644
--- a/v7/mediarouter/res/layout/mr_media_route_list_item.xml
+++ b/v7/mediarouter/res/layout/mr_chooser_list_item.xml
@@ -17,38 +17,35 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
+              android:minHeight="56dp"
+              android:paddingLeft="24dp"
+              android:paddingRight="24dp"
               android:orientation="horizontal"
-              android:gravity="center_vertical">
+              android:gravity="center_vertical" >
 
-    <ImageView android:id="@+id/routeIcon"
+    <ImageView android:id="@+id/mr_chooser_route_icon"
                android:layout_width="24dp"
                android:layout_height="24dp"
-               android:layout_marginLeft="24dp"
                android:layout_marginRight="24dp" />
 
-    <LinearLayout android:layout_width="0dp"
+    <LinearLayout android:layout_width="fill_parent"
                   android:layout_height="wrap_content"
-                  android:layout_weight="1"
-                  android:layout_marginRight="24dp"
-                  android:orientation="vertical"
-                  android:gravity="left|center_vertical"
-                  android:duplicateParentState="true">
+                  android:layout_marginBottom="2.5dp"
+                  android:orientation="vertical" >
 
-        <TextView android:id="@android:id/text1"
+        <TextView android:id="@+id/mr_chooser_route_name"
                   android:layout_width="fill_parent"
                   android:layout_height="32dp"
                   android:singleLine="true"
                   android:ellipsize="marquee"
-                  android:textAppearance="?attr/mediaRouteChooserPrimaryTextStyle"
-                  android:duplicateParentState="true" />
+                  android:textAppearance="?attr/mediaRouteChooserPrimaryTextStyle" />
 
-        <TextView android:id="@android:id/text2"
+        <TextView android:id="@+id/mr_chooser_route_desc"
                   android:layout_width="fill_parent"
                   android:layout_height="24dp"
                   android:singleLine="true"
                   android:ellipsize="marquee"
-                  android:textAppearance="?attr/mediaRouteChooserSecondaryTextStyle"
-                  android:duplicateParentState="true" />
+                  android:textAppearance="?attr/mediaRouteChooserSecondaryTextStyle" />
     </LinearLayout>
 
 </LinearLayout>
diff --git a/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml b/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml
new file mode 100644
index 0000000..8362fd7
--- /dev/null
+++ b/v7/mediarouter/res/layout/mr_controller_material_dialog_b.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:orientation="vertical">
+    <LinearLayout android:id="@+id/mr_title_bar"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:paddingLeft="24dp"
+                  android:paddingRight="24dp"
+                  android:orientation="horizontal" >
+        <TextView android:id="@+id/mr_name"
+                  android:layout_width="0dp"
+                  android:layout_height="72dp"
+                  android:layout_weight="1"
+                  android:gravity="center_vertical"
+                  android:singleLine="true"
+                  android:ellipsize="end"
+                  android:textAppearance="?attr/mediaRouteControllerTitleTextStyle" />
+        <ImageButton android:id="@+id/mr_close"
+                     android:layout_width="24dp"
+                     android:layout_height="24dp"
+                     android:layout_marginLeft="12dp"
+                     android:layout_gravity="center_vertical"
+                     android:contentDescription="@string/mr_controller_close_description"
+                     android:src="?attr/mediaRouteCloseDrawable"
+                     android:background="?attr/selectableItemBackgroundBorderless" />
+    </LinearLayout>
+    <FrameLayout android:id="@+id/mr_custom_control"
+                 android:layout_width="match_parent"
+                 android:layout_height="wrap_content"
+                 android:visibility="gone" />
+    <ImageView android:id="@+id/mr_art"
+               android:layout_width="match_parent"
+               android:layout_height="wrap_content"
+               android:adjustViewBounds="true"
+               android:scaleType="fitCenter"
+               android:background="?attr/colorPrimary"
+               android:visibility="gone" />
+    <LinearLayout android:id="@+id/mr_control"
+                  android:layout_width="fill_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="vertical"
+                  android:paddingTop="16dp"
+                  android:paddingBottom="16dp"
+                  android:background="?attr/colorPrimary">
+        <include android:id="@+id/mr_playback_control"
+                 layout="@layout/mr_playback_control" />
+        <View android:id="@+id/mr_control_divider"
+              android:layout_width="fill_parent"
+              android:layout_height="8dp"
+              android:visibility="gone"
+              android:background="?attr/colorPrimary" />
+        <include android:id="@+id/mr_volume_control"
+                 layout="@layout/mr_volume_control" />
+    </LinearLayout>
+    <ListView android:id="@+id/mr_volume_group_list"
+              android:layout_width="fill_parent"
+              android:layout_height="wrap_content"
+              android:background="?attr/colorPrimaryDark"
+              android:visibility="gone" />
+    <LinearLayout android:id="@+id/mr_buttons"
+                  android:layout_width="fill_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="horizontal">
+        <Button android:id="@+id/mr_button_disconnect"
+                android:layout_width="0dp"
+                android:layout_height="48dp"
+                android:gravity="center"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackgroundBorderless"
+                android:text="@string/mr_controller_disconnect"
+                android:visibility="invisible" />
+        <Button android:id="@+id/mr_button_stop"
+                android:layout_width="0dp"
+                android:layout_height="48dp"
+                android:gravity="center"
+                android:layout_weight="1"
+                android:textColor="?attr/colorAccent"
+                android:background="?attr/selectableItemBackgroundBorderless"
+                android:text="@string/mr_controller_stop" />
+    </LinearLayout>
+</LinearLayout>
diff --git a/v7/mediarouter/res/layout/mr_media_route_controller_volume_item.xml b/v7/mediarouter/res/layout/mr_controller_volume_item.xml
similarity index 82%
rename from v7/mediarouter/res/layout/mr_media_route_controller_volume_item.xml
rename to v7/mediarouter/res/layout/mr_controller_volume_item.xml
index d07d94b..8202810 100644
--- a/v7/mediarouter/res/layout/mr_media_route_controller_volume_item.xml
+++ b/v7/mediarouter/res/layout/mr_controller_volume_item.xml
@@ -18,24 +18,24 @@
               android:layout_width="fill_parent"
               android:layout_height="64dp"
               android:padding="8dp">
-    <TextView android:id="@+id/media_route_name"
+    <TextView android:id="@+id/mr_name"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_alignParentTop="true"
               android:layout_alignParentLeft="true" />
-    <ImageView android:id="@+id/media_route_volume_item_icon"
+    <ImageView android:id="@+id/mr_volume_item_icon"
                android:layout_width="48dp"
                android:layout_height="48dp"
-               android:layout_below="@id/media_route_name"
+               android:layout_below="@id/mr_name"
                android:layout_alignParentLeft="true"
                android:src="?attr/mediaRouteAudioTrackDrawable"
                android:gravity="center"
                android:scaleType="center" />
-    <SeekBar android:id="@+id/media_route_volume_slider"
+    <SeekBar android:id="@+id/mr_volume_slider"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
-             android:layout_below="@id/media_route_name"
-             android:layout_toRightOf="@id/media_route_volume_item_icon"
+             android:layout_below="@id/mr_name"
+             android:layout_toRightOf="@id/mr_volume_item_icon"
              android:layout_gravity="center_vertical"
              android:layout_marginTop="8dp"
              android:layout_marginLeft="8dp"
diff --git a/v7/mediarouter/res/layout/mr_media_route_controller_material_dialog_b.xml b/v7/mediarouter/res/layout/mr_media_route_controller_material_dialog_b.xml
deleted file mode 100644
index cfb3da4..0000000
--- a/v7/mediarouter/res/layout/mr_media_route_controller_material_dialog_b.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 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.
--->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-    <LinearLayout android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical">
-        <LinearLayout android:id="@+id/title_bar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingLeft="24dp"
-                android:paddingRight="24dp"
-                android:orientation="horizontal" >
-            <TextView android:id="@+id/route_name"
-                    android:layout_width="0dp"
-                    android:layout_height="72dp"
-                    android:layout_weight="1"
-                    android:gravity="center_vertical"
-                    android:singleLine="true"
-                    android:ellipsize="end"
-                    android:textAppearance="?attr/mediaRouteControllerTitleTextStyle" />
-            <ImageButton android:id="@+id/close"
-                    android:layout_width="24dp"
-                    android:layout_height="24dp"
-                    android:layout_marginLeft="12dp"
-                    android:layout_gravity="center_vertical"
-                    android:contentDescription="@string/mr_media_route_controller_close_description"
-                    android:src="?attr/mediaRouteCloseDrawable"
-                    android:background="?attr/selectableItemBackgroundBorderless" />
-        </LinearLayout>
-        <FrameLayout android:id="@+id/media_route_control_frame"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" >
-            <RelativeLayout android:id="@+id/default_control_frame"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:background="?attr/colorPrimary">
-                <ImageView android:id="@+id/art"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:adjustViewBounds="true"
-                        android:scaleType="fitCenter"/>
-                <ImageButton android:id="@+id/play_pause"
-                        android:layout_width="48dip"
-                        android:layout_height="48dip"
-                        android:padding="12dip"
-                        android:layout_marginTop="8dip"
-                        android:layout_marginBottom="8dip"
-                        android:layout_alignParentRight="true"
-                        android:layout_below="@id/art"
-                        android:contentDescription="@string/mr_media_route_controller_play"
-                        android:background="?attr/selectableItemBackgroundBorderless"/>
-                <LinearLayout android:orientation="vertical"
-                        android:layout_height="wrap_content"
-                        android:layout_width="wrap_content"
-                        android:minHeight="64dip"
-                        android:layout_marginLeft="24dip"
-                        android:gravity="center_vertical"
-                        android:layout_toLeftOf="@id/play_pause"
-                        android:layout_below="@id/art"
-                        android:layout_alignParentLeft="true" >
-                    <TextView android:id="@+id/title"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:textAppearance="?attr/mediaRouteControllerPrimaryTextStyle"
-                            android:singleLine="true" />
-                    <TextView android:id="@+id/subtitle"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:textAppearance="?attr/mediaRouteControllerSecondaryTextStyle"
-                            android:singleLine="true" />
-                </LinearLayout>
-            </RelativeLayout>
-        </FrameLayout>
-        <!-- Optional volume slider section. -->
-        <LinearLayout android:id="@+id/media_route_volume_layout"
-                      android:layout_width="fill_parent"
-                      android:layout_height="64dp"
-                      android:gravity="center_vertical"
-                      android:padding="8dp"
-                      android:visibility="gone"
-                      android:background="?attr/colorPrimary">
-            <ImageView android:layout_width="48dp"
-                       android:layout_height="48dp"
-                       android:src="?attr/mediaRouteCastDrawable"
-                       android:gravity="center"
-                       android:scaleType="center" />
-            <SeekBar android:id="@+id/media_route_volume_slider"
-                     android:layout_width="0dp"
-                     android:layout_height="wrap_content"
-                     android:layout_weight="1"
-                     android:layout_marginLeft="8dp"
-                     android:layout_marginRight="8dp" />
-            <ImageButton android:id="@+id/media_route_group_expand_collapse"
-                         android:layout_width="48dip"
-                         android:layout_height="48dip"
-                         android:padding="12dip"
-                         android:contentDescription="@string/mr_media_route_controller_expand_group"
-                         android:src="?attr/mediaRouteExpandGroupDrawable"
-                         android:background="?attr/selectableItemBackgroundBorderless"
-                         android:visibility="gone"/>
-        </LinearLayout>
-        <ListView android:id="@+id/media_route_volume_group_list"
-                  android:layout_width="fill_parent"
-                  android:layout_height="wrap_content"
-                  android:visibility="gone">
-        </ListView>
-        <LinearLayout android:id="@+id/buttons"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal" >
-            <Button android:id="@+id/disconnect"
-                android:layout_width="0dp"
-                android:layout_height="48dp"
-                android:gravity="center"
-                android:layout_weight="1"
-                android:background="?attr/selectableItemBackgroundBorderless"
-                android:text="@string/mr_media_route_controller_disconnect"
-                android:visibility="gone" />
-            <Button android:id="@+id/stop"
-                android:layout_width="0dp"
-                android:layout_height="48dp"
-                android:gravity="center"
-                android:layout_weight="1"
-                android:textColor="?attr/colorAccent"
-                android:background="?attr/selectableItemBackgroundBorderless"
-                android:text="@string/mr_media_route_controller_stop" />
-        </LinearLayout>
-    </LinearLayout>
-</ScrollView>
diff --git a/v7/mediarouter/res/layout/mr_playback_control.xml b/v7/mediarouter/res/layout/mr_playback_control.xml
new file mode 100644
index 0000000..b619bed
--- /dev/null
+++ b/v7/mediarouter/res/layout/mr_playback_control.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:background="?attr/colorPrimary">
+    <ImageButton android:id="@+id/mr_control_play_pause"
+                 android:layout_width="wrap_content"
+                 android:layout_height="wrap_content"
+                 android:layout_marginLeft="12dp"
+                 android:layout_marginRight="12dp"
+                 android:layout_alignParentRight="true"
+                 android:layout_centerInParent="true"
+                 android:contentDescription="@string/mr_controller_play"
+                 android:background="?attr/selectableItemBackgroundBorderless"
+                 android:visibility="gone" />
+    <LinearLayout android:orientation="vertical"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layout_marginLeft="24dp"
+                  android:layout_alignParentLeft="true"
+                  android:layout_toLeftOf="@id/mr_control_play_pause"
+                  android:layout_centerInParent="true">
+        <TextView android:id="@+id/mr_control_title"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textAppearance="?attr/mediaRouteControllerPrimaryTextStyle"
+                  android:singleLine="true" />
+        <TextView android:id="@+id/mr_control_subtitle"
+                  android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textAppearance="?attr/mediaRouteControllerSecondaryTextStyle"
+                  android:singleLine="true" />
+    </LinearLayout>
+</RelativeLayout>
diff --git a/v7/mediarouter/res/layout/mr_volume_control.xml b/v7/mediarouter/res/layout/mr_volume_control.xml
new file mode 100644
index 0000000..ab53352
--- /dev/null
+++ b/v7/mediarouter/res/layout/mr_volume_control.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="fill_parent"
+              android:layout_height="wrap_content"
+              android:minHeight="48dp"
+              android:gravity="center_vertical"
+              android:paddingLeft="24dp"
+              android:paddingRight="12dp"
+              android:background="?attr/colorPrimary">
+    <ImageView android:layout_width="24dp"
+               android:layout_height="24dp"
+               android:src="?attr/mediaRouteCastDrawable"
+               android:gravity="center"
+               android:scaleType="center" />
+    <SeekBar android:id="@+id/mr_volume_slider"
+             android:layout_width="0dp"
+             android:layout_height="wrap_content"
+             android:layout_weight="1" />
+    <ImageButton android:id="@+id/mr_group_expand_collapse"
+                 android:layout_width="48dp"
+                 android:layout_height="48dp"
+                 android:contentDescription="@string/mr_controller_expand_group"
+                 android:src="?attr/mediaRouteExpandGroupDrawable"
+                 android:background="?attr/selectableItemBackgroundBorderless"
+                 android:visibility="gone" />
+</LinearLayout>
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 0dcfa86..891e66d 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Stelsel"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Toestelle"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Saai uit"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Koppel aan toestel"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Soek tans vir toestelle…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ontkoppel"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Hou op uitsaai"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Saai uit"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Koppel aan toestel"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Soek tans vir toestelle…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ontkoppel"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Hou op uitsaai"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Roete-instellings"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Speel"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Laat wag"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Speel"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Laat wag"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 5d061c91..9d9a90d 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ስርዓት"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"መሣሪያዎች"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"ውሰድ"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ከመሳሪያ ጋር ያገናኙ"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"መሳሪያዎችን በመፈለግ ላይ…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ግንኙነት አቋርጥ"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"መውሰድ አቁም"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"ውሰድ"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ከመሳሪያ ጋር ያገናኙ"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"መሳሪያዎችን በመፈለግ ላይ…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ግንኙነት አቋርጥ"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"መውሰድ አቁም"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"የመንገድ ቅንብሮች"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"አጫውት"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"ለአፍታ አቁም"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"አጫውት"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"ለአፍታ አቁም"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index ac0fb5d..c0c5a25 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"النظام"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"الأجهزة"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"إرسال"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"الاتصال بجهاز"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"جارٍ البحث عن الأجهزة…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"قطع الاتصال"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"إيقاف الإرسال"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"إرسال"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"الاتصال بجهاز"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"جارٍ البحث عن الأجهزة…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"قطع الاتصال"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"إيقاف الإرسال"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"إعدادات المسار"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"تشغيل"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"إيقاف مؤقت"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"تشغيل"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"إيقاف مؤقت"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index 0918332..93676ed 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Предаване"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Свързване с устройство"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Търсят се устройства…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Прекратяване на връзката"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Спиране на предаването"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Предаване"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Свързване с устройство"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Търсят се устройства…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Прекратяване на връзката"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Спиране на предаването"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Настройки за маршрута"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Пускане"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Поставяне на пауза"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Пускане"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Поставяне на пауза"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index de862e5..ee08f48 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"সিস্টেম"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ডিভাইসগুলি"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"কাস্ট করুন"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ডিভাইসে সংযোগ করুন"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ডিভাইসগুলি অনুসন্ধান করা হচ্ছে…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"সংযোগ বিচ্ছিন্ন করুন"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"কাস্ট করা বন্ধ করুন"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"কাস্ট করুন"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ডিভাইসে সংযোগ করুন"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"ডিভাইসগুলি অনুসন্ধান করা হচ্ছে…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"সংযোগ বিচ্ছিন্ন করুন"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"কাস্ট করা বন্ধ করুন"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"সেটিংস রুট করুন"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"চালান"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"বিরাম দিন"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"চালান"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"বিরাম দিন"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index eac6632..ce4c180 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositius"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Emet"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connecta al dispositiu"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"S\'estan cercant dispositius…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconnecta"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Atura l\'emissió"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Emet"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connecta al dispositiu"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"S\'estan cercant dispositius…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconnecta"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Atura l\'emissió"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuració de la ruta"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reprodueix"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Posa en pausa"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reprodueix"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Posa en pausa"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index 111c02a..c17629a 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zařízení"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Odeslat"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Připojení k zařízení"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Vyhledávání zařízení…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Odpojit"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Ukončit odesílání"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Odeslat"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Připojení k zařízení"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Vyhledávání zařízení…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Odpojit"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Ukončit odesílání"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavení trasy"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Přehrát"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pozastavit"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Přehrát"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pozastavit"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index 3b4fbf6..786cdc6 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheder"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Opret forbindelse til enheden"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Søger efter enheder..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Afbryd forbindelsen"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Stop med at caste"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Opret forbindelse til enheden"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Søger efter enheder..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Afbryd forbindelsen"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop med at caste"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ruteindstillinger"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Afspil"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Sæt på pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Afspil"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Sæt på pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 5b8e494..296b611 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Geräte"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Übertragen"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Mit Gerät verbinden"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Geräte werden gesucht…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Verbindung aufheben"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Übertragung stoppen"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Übertragen"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Mit Gerät verbinden"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Geräte werden gesucht…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Verbindung aufheben"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Übertragung stoppen"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Routingeinstellungen"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Wiedergabe"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Wiedergabe"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 3640111..153ad7b 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Σύστημα"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Συσκευές"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Μετάδοση"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Σύνδεση με τη συσκευή"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Αναζήτηση συσκευών…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Αποσύνδεση"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Διακοπή μετάδοσης"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Μετάδοση"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Σύνδεση με τη συσκευή"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Αναζήτηση συσκευών…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Αποσύνδεση"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Διακοπή μετάδοσης"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ρυθμίσεις διαδρομής"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Αναπαραγωγή"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Παύση"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Αναπαραγωγή"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Παύση"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-en-rAU/strings.xml b/v7/mediarouter/res/values-en-rAU/strings.xml
index f5a8531..1cb9d4a 100644
--- a/v7/mediarouter/res/values-en-rAU/strings.xml
+++ b/v7/mediarouter/res/values-en-rAU/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Play"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index f5a8531..1cb9d4a 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Play"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index f5a8531..1cb9d4a 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Play"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index e1cf915..7d3b402 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar al dispositivo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Detener transmisión"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar al dispositivo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Detener transmisión"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuración de ruta"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reproducir"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausar"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausar"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index 0f2a8ea..d80e303 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Enviar contenido"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar a dispositivo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Dejar de enviar contenido"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Enviar contenido"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar a dispositivo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Dejar de enviar contenido"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ajustes de ruta"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reproducir"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reproducir"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index ebc63fd..e458335 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Süsteem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Seadmed"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Ülekandmine"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Seadmega ühendamine"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Seadmete otsimine …"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Katkesta ühendus"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Lõpeta ülekanne"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Ülekandmine"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Seadmega ühendamine"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Seadmete otsimine …"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Katkesta ühendus"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Lõpeta ülekanne"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Marsruudi seaded"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Esitamine"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Peatamine"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Esitamine"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Peatamine"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index d177a55..899be285 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Gailuak"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Igorri"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Konektatu gailura"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Gailuak bilatzen…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Deskonektatu"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Utzi igortzeari"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Igorri"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Konektatu gailura"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Gailuak bilatzen…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Deskonektatu"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Utzi igortzeari"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ibilbidearen ezarpenak"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Erreproduzitu"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausatu"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Erreproduzitu"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausatu"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index e094982..76dcec6 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"سیستم"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"دستگاه‌ها"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"فرستادن"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"برقراری ارتباط با دستگاه"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"در حال جستجو برای دستگاه‌ها..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"قطع ارتباط"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"توقف فرستادن"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"فرستادن"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"برقراری ارتباط با دستگاه"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"در حال جستجو برای دستگاه‌ها..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"قطع ارتباط"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"توقف فرستادن"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"تنظیمات مسیر"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"پخش"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"توقف موقت"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"پخش"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"توقف موقت"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index a21dc91..44c8b64 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Järjestelmä"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Laitteet"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Lähetä"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Yhdistä laitteeseen"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Etsitään laitteita…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Katkaise yhteys"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Lopeta suoratoisto"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Lähetä"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Yhdistä laitteeseen"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Etsitään laitteita…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Katkaise yhteys"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Lopeta suoratoisto"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Reitin asetukset"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Toista"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Keskeytä"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Toista"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Keskeytä"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index 0655526..6f385ff 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Diffuser"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connexion au périphérique"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Diffuser"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connexion au périphérique"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Paramètres de l\'itinéraire"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Lecture"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Suspendre"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Lecture"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Suspendre"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index 9fce08a..711ccd3 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Caster"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connecter à l\'appareil"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Caster"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connecter à l\'appareil"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Paramètres de l\'itinéraire"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Lecture"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Lecture"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index d1d73f9..61bc1e2 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Emitir"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar co dispositivo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Parar de emitir"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Emitir"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar co dispositivo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Parar de emitir"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuración da ruta"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reproduce"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reproduce"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-gu-rIN/strings.xml b/v7/mediarouter/res/values-gu-rIN/strings.xml
index 2002115..2fd0f36 100644
--- a/v7/mediarouter/res/values-gu-rIN/strings.xml
+++ b/v7/mediarouter/res/values-gu-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"સિસ્ટમ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ઉપકરણો"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"કાસ્ટ કરો"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ઉપકરણ સાથે કનેક્ટ કરો"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ઉપકરણો માટે શોધી રહ્યું છે…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ડિસ્કનેક્ટ કરો"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"કાસ્ટ કરવાનું રોકો"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"કાસ્ટ કરો"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ઉપકરણ સાથે કનેક્ટ કરો"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"ઉપકરણો માટે શોધી રહ્યું છે…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ડિસ્કનેક્ટ કરો"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"કાસ્ટ કરવાનું રોકો"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"રૂટ સેટિંગ્સ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ચલાવો"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"થોભો"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ચલાવો"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"થોભો"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index 6d100ea..c2f58f3 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिवाइस"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"कास्ट करें"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"डिवाइस से कनेक्ट करें"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"डिवाइस की खोज हो रही है…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करें"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"कास्ट करना बंद करें"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट करें"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"डिवाइस से कनेक्ट करें"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"डिवाइस की खोज हो रही है…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करें"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"कास्ट करना बंद करें"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिंग"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"चलाएं"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"रोकें"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"चलाएं"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"रोकें"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index 74e9270d..dcb4934 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sustav"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Emitiranje"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Povezivanje s uređajem"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Traženje uređaja…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Prekini vezu"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Zaustavi emitiranje"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Emitiranje"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Povezivanje s uređajem"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Traženje uređaja…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Prekini vezu"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Zaustavi emitiranje"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Postavke rute"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reprodukcija"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pauziraj"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reprodukcija"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pauziraj"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index efbc193..0a76065 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Rendszer"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Eszközök"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Tartalomátküldés"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Csatlakozás adott eszközhöz"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Eszközkeresés…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Leválasztás"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Átküldés leállítása"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Tartalomátküldés"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Csatlakozás adott eszközhöz"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Eszközkeresés…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Leválasztás"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Átküldés leállítása"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Útvonal-beállítások"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Indítás"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Szüneteltetés"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Indítás"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Szüneteltetés"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index faa6020..19c65ed 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Համակարգ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Սարքեր"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Հեռարձակում"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Միանալ սարքին"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Որոնվում են սարքեր..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Անջատել"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Դադարեցնել հեռարձակումը"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Հեռարձակում"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Միանալ սարքին"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Որոնվում են սարքեր..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Անջատել"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Դադարեցնել հեռարձակումը"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ֆայլերի փոխանցման կարգավորումներ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Նվագարկել"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Դադար"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Նվագարկել"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Դադար"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index e3123c1..b90a0cb 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -18,12 +18,12 @@
     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">"Perangkat"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Transmisi"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Sambungkan ke perangkat"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Menelusuri perangkat…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Hentikan transmisi"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmisi"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Sambungkan ke perangkat"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Menelusuri perangkat…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Hentikan transmisi"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Setelan rute"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Putar"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Jeda"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Putar"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Jeda"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 262e4e9..9fa308e 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Kerfi"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Tæki"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Senda út"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Tengjast tæki"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Leitar að tækjum…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Aftengja"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Stöðva útsendingu"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Senda út"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Tengjast tæki"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Leitar að tækjum…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Aftengja"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Stöðva útsendingu"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Leiðarstillingar"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Spila"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Hlé"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Spila"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Hlé"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index bedd617..8c3324d 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivi"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Trasmetti"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Connetti al dispositivo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Ricerca di dispositivi…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Disconnetti"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Interrompi trasmissione"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Trasmetti"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Connetti al dispositivo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Ricerca di dispositivi…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnetti"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Interrompi trasmissione"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Impostazioni percorso"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Riproduci"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Riproduci"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index 12d17b9..720a4e2 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"מערכת"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"מכשירים"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"העבר"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"התחבר למכשיר"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"מחפש מכשירים…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"התנתק"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"עצור העברה"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"העבר"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"התחבר למכשיר"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"מחפש מכשירים…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"התנתק"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"עצור העברה"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"הגדרות נתיב"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"הפעל"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"השהה"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"הפעל"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"השהה"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index e97a65a..37d80b6 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"システム"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"端末"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"キャスト"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"端末に接続"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"端末を検索しています…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"接続を解除"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"キャストを停止"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"キャスト"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"端末に接続"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"端末を検索しています…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"接続を解除"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"キャストを停止"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ルーティング設定"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"再生"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"一時停止"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"再生"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"一時停止"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index 758fe73..b37403a 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"სისტემა"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"მოწყობილობები"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"მსახიობები"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"მოწყობილობასთან დაკავშირება"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"მოწყობილობების ძიება…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"კავშირის გაწყვეტა"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"ტრანსლაციის შეჩერება"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"მსახიობები"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"მოწყობილობასთან დაკავშირება"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"მოწყობილობების ძიება…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"კავშირის გაწყვეტა"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"ტრანსლაციის შეჩერება"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"მარშრუტის პარამეტრები"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"დაკვრა"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"პაუზა"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"დაკვრა"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"პაუზა"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index c549a8c..0778828 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Жүйе"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Құрылғылар"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Трансляциялау"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Құрылғыға жалғау"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Құрылғыларды іздеуде…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ажырату"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Трансляциялауды тоқтату"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Трансляциялау"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Құрылғыға жалғау"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Құрылғыларды іздеуде…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ажырату"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Трансляциялауды тоқтату"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Жол параметрлері"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Ойнату"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Кідірту"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Ойнату"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Кідірту"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index b3e53c5..d41b47c 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ប្រព័ន្ធ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ឧបករណ៍"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"បញ្ជូន"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ភ្ជាប់​ឧបករណ៍"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"កំពុង​ស្វែងរក​ឧបករណ៍..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ផ្ដាច់"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"បញ្ឈប់ការខាស"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"បញ្ជូន"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ភ្ជាប់​ឧបករណ៍"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"កំពុង​ស្វែងរក​ឧបករណ៍..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ផ្ដាច់"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"បញ្ឈប់ការខាស"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ការកំណត់ផ្លូវ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ចាក់"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"ផ្អាក"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ចាក់"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"ផ្អាក"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 36c3aaa..19785c9e 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ಸಿಸ್ಟಂ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ಸಾಧನಗಳು"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"ಪಾತ್ರ"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"ಪಾತ್ರ"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ಮಾರ್ಗ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ಪ್ಲೇ ಮಾಡು"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"ವಿರಾಮ"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ಪ್ಲೇ ಮಾಡು"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"ವಿರಾಮ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index d165e52..f9ee94ec 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"시스템"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"기기"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"전송"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"기기에 연결"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"기기 검색 중…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"연결 해제"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"전송 중지"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"전송"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"기기에 연결"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"기기 검색 중…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"연결 해제"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"전송 중지"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"경로 설정"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"재생"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"일시중지"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"재생"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"일시중지"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index 1f7aba0..6565d05 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Тандалгандар"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Түзмөккө туташуу"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Түзмөктөр изделүүдө..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ажыратуу"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Тышк экранга чыгарну токтотуу"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Тандалгандар"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Түзмөккө туташуу"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Түзмөктөр изделүүдө..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ажыратуу"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Тышк экранга чыгарну токтотуу"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Багыт жөндөөлөрү"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Ойнотуу"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Тындыруу"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Ойнотуу"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Тындыруу"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index 6d61f7d..8077770 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ລະບົບ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ອຸປະກອນ"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"ສົ່ງ​ສັນ​ຍານ"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ກຳລັງຊອກຫາອຸປະກອນ..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ຕັດການເຊື່ອມຕໍ່"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"ຢຸດການສົ່ງສັນຍານ"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"ສົ່ງ​ສັນ​ຍານ"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"ກຳລັງຊອກຫາອຸປະກອນ..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ຕັດການເຊື່ອມຕໍ່"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"ຢຸດການສົ່ງສັນຍານ"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ການ​ຕັ້ງ​ຄ່າ​ເສັ້ນ​ທາງ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ຫຼິ້ນ"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"ຢຸດຊົ່ວຄາວ"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ຫຼິ້ນ"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"ຢຸດຊົ່ວຄາວ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index 2315618..3e78374 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Įrenginiai"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Perduoti"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Prijungimas prie įrenginio"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Ieškoma įrenginių…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Atjungti"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Sustabdyti perdavimą"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Perduoti"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Prijungimas prie įrenginio"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Ieškoma įrenginių…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Atjungti"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Sustabdyti perdavimą"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Maršruto nustatymai"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Leisti"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pristabdyti"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Leisti"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pristabdyti"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index 93e45de..a7f30a4 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistēma"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Ierīces"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Apraidīt"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Savienojuma izveide ar ierīci"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Notiek ierīču meklēšana..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Atvienot"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Pārtraukt apraidi"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Apraidīt"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Savienojuma izveide ar ierīci"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Notiek ierīču meklēšana..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Atvienot"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Pārtraukt apraidi"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Maršruta iestatījumi"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Atskaņot"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Apturēt"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Atskaņot"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Apturēt"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index 9b3f875d..47df5bc 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уреди"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Емитувај"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Поврзи се со уредот"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Се пребаруваат уреди..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Исклучи се"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Запри префрлување"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Емитувај"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Поврзи се со уредот"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Се пребаруваат уреди..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Исклучи се"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Запри префрлување"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Поставки на маршрутата"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Репродуцирај"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Пауза"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Репродуцирај"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Пауза"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index 64c74b1..93192b6 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"സിസ്റ്റം"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ഉപകരണങ്ങൾ"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"കാസ്‌റ്റുചെയ്യുക"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ഉപകരണങ്ങൾക്കായി തിരയുന്നു…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"വിച്ഛേദിക്കുക"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"കാസ്‌റ്റുചെയ്യുക"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"ഉപകരണങ്ങൾക്കായി തിരയുന്നു…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"വിച്ഛേദിക്കുക"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"റൂട്ട് ക്രമീകരണം"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"പ്ലേ ചെയ്യുക"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"താൽക്കാലികമായി നിർത്തുക"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"പ്ലേ ചെയ്യുക"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"താൽക്കാലികമായി നിർത്തുക"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index 2074767..e14eb50 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Төхөөрөмжүүд"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Дамжуулах"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Төхөөрөмжтэй холбох"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Төхөөрөмжүүдийг хайж байна…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Салгах"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Нэвтрүүлэхийг зогсоох"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Дамжуулах"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Төхөөрөмжтэй холбох"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Төхөөрөмжүүдийг хайж байна…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Салгах"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Нэвтрүүлэхийг зогсоох"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Маршрут тохиргоо"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Тоглуулах"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Түр зогсоох"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Тоглуулах"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Түр зогсоох"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index bd020a7..8313f5a 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"कास्‍ट करा"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"डिव्हाइसला कनेक्ट करा"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"डिव्‍हाइसेस शोधत आहे…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"‍डिस्कनेक्ट करा"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"कास्ट करणे थांबवा"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"कास्‍ट करा"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"डिव्हाइसला कनेक्ट करा"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"डिव्‍हाइसेस शोधत आहे…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"‍डिस्कनेक्ट करा"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"कास्ट करणे थांबवा"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिंग्ज"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"प्ले करा"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"विराम द्या"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"प्ले करा"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"विराम द्या"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index 05e9ffa..23371d3 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -18,12 +18,12 @@
     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">"Peranti"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Barisan pelakon"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Sambung kepada peranti"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Mencari peranti..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Berhenti menghantar"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Barisan pelakon"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Sambung kepada peranti"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Mencari peranti..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Berhenti menghantar"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Tetapan laluan"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Main"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Jeda"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Main"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Jeda"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index 20bfd8d..d8efc8a 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"စနစ်"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"စက်ပစ္စည်းများ"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"သရုပ်ဆောင်​များ"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"စက်တစ်ခုကို ချိတ်ဆက်ပါ"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"စက်ပစ္စည်းများကို ရှာဖွေနေပါသည်"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ချိတ်ဆက်ခြင်းရပ်တန့်ရန်"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"ပုံစံသွင်းမှု ရပ်ရန်"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"သရုပ်ဆောင်​များ"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"စက်တစ်ခုကို ချိတ်ဆက်ပါ"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"စက်ပစ္စည်းများကို ရှာဖွေနေပါသည်"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ချိတ်ဆက်ခြင်းရပ်တန့်ရန်"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"ပုံစံသွင်းမှု ရပ်ရန်"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"လမ်းကြောင်း အပြင်အဆင်များ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ဖွင့်ရန်"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"ခဏရပ်ရန်"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ဖွင့်ရန်"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"ခဏရပ်ရန်"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index 5ee8ec8..f806229 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Koble til enheten"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Søker etter enheter …"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Koble fra"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Stopp castingen"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Koble til enheten"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Søker etter enheter …"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Koble fra"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Stopp castingen"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ruteinnstillinger"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Spill av"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Sett på pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Spill av"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Sett på pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index aadcbcf..237279c 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"प्रणाली"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"उपकरणहरू"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"कास्ट"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"उपकरणसँग जडान गर्नुहोस्"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"उपकरणहरूका लागि खोजी गरिँदै..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"विच्छेदन गर्नुहोस्"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"कास्टिंग रोक्नुहोस्"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"उपकरणसँग जडान गर्नुहोस्"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"उपकरणहरूका लागि खोजी गरिँदै..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"विच्छेदन गर्नुहोस्"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"कास्टिंग रोक्नुहोस्"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिङ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"बजाउनुहोस्"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"रोक्नुहोस्"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"बजाउनुहोस्"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"रोक्नुहोस्"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index fcfac4d..22323b1 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Systeem"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Apparaten"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Casten"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Verbinding maken met apparaat"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Zoeken naar apparaten…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Verbinding verbreken"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Casten stoppen"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Casten"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Verbinding maken met apparaat"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Zoeken naar apparaten…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Verbinding verbreken"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Casten stoppen"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route-instellingen"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Afspelen"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Onderbreken"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Afspelen"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Onderbreken"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pa-rIN/strings.xml b/v7/mediarouter/res/values-pa-rIN/strings.xml
index fb87320..02053d7 100644
--- a/v7/mediarouter/res/values-pa-rIN/strings.xml
+++ b/v7/mediarouter/res/values-pa-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ਸਿਸਟਮ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"ਡਿਵਾਈਸਾਂ"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"ਜੋੜੋ"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"ਡਿਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"ਡਿਵਾਈਸਾਂ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"ਜੋੜਨਾ ਰੋਕੋ"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"ਜੋੜੋ"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"ਡਿਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"ਡਿਵਾਈਸਾਂ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"ਜੋੜਨਾ ਰੋਕੋ"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ਰੂਟ ਸੈਟਿੰਗਾਂ"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ਪਲੇ ਕਰੋ"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"ਰੋਕੋ"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ਪਲੇ ਕਰੋ"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"ਰੋਕੋ"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index 34fea86..fbcb7e1 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Urządzenia"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Przesyłaj"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Połącz z urządzeniem"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Szukam urządzeń…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Rozłącz"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Zakończ przesyłanie"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Przesyłaj"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Połącz z urządzeniem"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Szukam urządzeń…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Rozłącz"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Zakończ przesyłanie"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ustawienia trasy"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Odtwórz"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Wstrzymaj"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Odtwórz"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Wstrzymaj"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index 1e1dbbb..7982b3c 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Ligar ao dispositivo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"A pesquisar dispositivos…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desassociar"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Parar a transmissão"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Ligar ao dispositivo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"A pesquisar dispositivos…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desassociar"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Parar a transmissão"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Definições de trajeto"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Colocar em pausa"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Colocar em pausa"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 67648a7..12a954a 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectar ao dispositivo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Procurando dispositivos…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Interromper transmissão"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar ao dispositivo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Procurando dispositivos…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Interromper transmissão"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configurações de rota"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausar"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausar"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index d738bab..6e8bb4c 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -18,12 +18,12 @@
     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">"Dispozitive"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Trimiteți"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Conectați-vă la dispozitiv"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Se caută dispozitive..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Deconectați-vă"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Nu mai proiectați"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Trimiteți"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Conectați-vă la dispozitiv"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Se caută dispozitive..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Deconectați-vă"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Nu mai proiectați"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Setări pentru traseu"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Redați"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Întrerupeți"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Redați"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Întrerupeți"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index dfa836c..0b9d7a7 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Транслировать."</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Подключение к устройству"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Поиск устройств…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Отключить"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Остановить трансляцию"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Транслировать."</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Подключение к устройству"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Поиск устройств…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Отключить"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Остановить трансляцию"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Настройки передачи файлов"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Воспроизвести."</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Приостановить."</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Воспроизвести."</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Приостановить."</string>
 </resources>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index 1ac7319..6db6506 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"පද්ධතිය"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"උපාංග"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"උපාංගයට සම්බන්ධ වන්න"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"උපාංග සඳහා සොයමින්…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"විසන්ධි කරන්න"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"කාස්ට් කිරීම නවත්වන්න"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"උපාංගයට සම්බන්ධ වන්න"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"උපාංග සඳහා සොයමින්…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"විසන්ධි කරන්න"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"කාස්ට් කිරීම නවත්වන්න"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ගමන් මගේ සැකසීම්"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ධාවනය කරන්න"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"විරාමය"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ධාවනය කරන්න"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"විරාමය"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index 3156edf..e6a02ac 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Zariadenia"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Preniesť"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Pripojenie k zariadeniu"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Prebieha vyhľadávanie zariadení…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Odpojiť"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Zastaviť prenášanie"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Preniesť"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Pripojenie k zariadeniu"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Prebieha vyhľadávanie zariadení…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Odpojiť"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Zastaviť prenášanie"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavenia trasy"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Prehrať"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pozastaviť"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Prehrať"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pozastaviť"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 3de14aa..8b02d5d 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -18,12 +18,12 @@
     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">"Naprave"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Predvajanje"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Povezovanje z napravo"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Iskanje naprav …"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Prekini povezavo"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Ustavi predvajanje"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Predvajanje"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Povezovanje z napravo"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Iskanje naprav …"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Prekini povezavo"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Ustavi predvajanje"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavitve poti"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Predvajaj"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Zaustavi"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Predvajaj"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Zaustavi"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sq-rAL/strings.xml b/v7/mediarouter/res/values-sq-rAL/strings.xml
index 2df43b1..ccd00c7 100644
--- a/v7/mediarouter/res/values-sq-rAL/strings.xml
+++ b/v7/mediarouter/res/values-sq-rAL/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Sistemi"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Pajisjet"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Transmeto"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Lidhu me pajisjen"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Po kërkon për pajisje…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Shkëputu"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Ndalo transmetimin"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Transmeto"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Lidhu me pajisjen"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Po kërkon për pajisje…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Shkëputu"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Ndalo transmetimin"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Cilësimet e rrugës"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Luaj"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pauzë"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Luaj"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pauzë"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index de10685..9bca659 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Уређаји"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Пребацуј"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Повежите са уређајем"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Претраживање уређаја…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Прекини везу"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Заустави пребацивање"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Пребацуј"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Повежите са уређајем"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Претраживање уређаја…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Прекини везу"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Заустави пребацивање"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Подешавања путање"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Пусти"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Паузирај"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Пусти"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Паузирај"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index 3ac428a..e802f47 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Casta"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Anslut till enhet"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Söker efter enheter ..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Koppla från"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Sluta casta"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Casta"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Anslut till enhet"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Söker efter enheter ..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Koppla från"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Sluta casta"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Inställningar för omdirigering"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Spela upp"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Pausa"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Spela upp"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index 00ce337..5f2c5b7 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Mfumo"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Vifaa"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Tuma"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Unganisha kwenye kifaa"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Inatafuta vifaa..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Tenganisha"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Acha kutuma"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Tuma"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Unganisha kwenye kifaa"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Inatafuta vifaa..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Tenganisha"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Acha kutuma"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Mipangilio ya njia"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Google Play"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Sitisha"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Google Play"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Sitisha"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index f92c432..2496d80 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"அமைப்பு"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"அனுப்பு"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"சாதனத்துடன் இணைக்கவும்"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"சாதனங்களைத் தேடுகிறது..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"துண்டி"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"அனுப்புவதை நிறுத்து"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"அனுப்பு"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"சாதனத்துடன் இணைக்கவும்"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"சாதனங்களைத் தேடுகிறது..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"துண்டி"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"அனுப்புவதை நிறுத்து"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"வழி அமைப்புகள்"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"இயக்கு"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"இடைநிறுத்து"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"இயக்கு"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"இடைநிறுத்து"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index 0913420..897fa1e 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"సిస్టమ్"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"పరికరాలు"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"ప్రసారం చేయండి"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"పరికరానికి కనెక్ట్ చేయండి"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"పరికరాల కోసం శోధిస్తోంది…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"డిస్‌కనెక్ట్ చేయి"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"ప్రసారాన్ని ఆపివేయి"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"ప్రసారం చేయండి"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"పరికరానికి కనెక్ట్ చేయండి"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"పరికరాల కోసం శోధిస్తోంది…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"డిస్‌కనెక్ట్ చేయి"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"ప్రసారాన్ని ఆపివేయి"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"మార్గ సెట్టింగ్‌లు"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"ప్లే చేయి"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"పాజ్ చేయి"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"ప్లే చేయి"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"పాజ్ చేయి"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index 31fc9c7..7fed923 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"ระบบ"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"อุปกรณ์"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"ส่ง"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"เชื่อมต่อกับอุปกรณ์"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"กำลังค้นหาอุปกรณ์…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"ยกเลิกการเชื่อมต่อ"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"หยุดการส่ง"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"ส่ง"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"เชื่อมต่อกับอุปกรณ์"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"กำลังค้นหาอุปกรณ์…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"ยกเลิกการเชื่อมต่อ"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"หยุดการส่ง"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"การตั้งค่าเส้นทาง"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"เล่น"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"หยุดชั่วคราว"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"เล่น"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"หยุดชั่วคราว"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index d4896b5..b22031a 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Mga Device"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"I-cast"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Kumonekta sa device"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Naghahanap ng mga device…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Idiskonekta"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Itigil ang pagca-cast"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"I-cast"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Kumonekta sa device"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Naghahanap ng mga device…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Idiskonekta"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Itigil ang pagca-cast"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Mga setting ng ruta"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"I-play"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"I-pause"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"I-play"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"I-pause"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index 05344ff..dad9c60 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -18,12 +18,12 @@
     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">"Cihazlar"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Yayınla"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Cihaza bağlanın"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Cihaz arayın…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Bağlantıyı kes"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Yayını durdur"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Yayınla"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Cihaza bağlanın"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Cihaz arayın…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Bağlantıyı kes"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Yayını durdur"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Rota ayarları"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Oynat"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Duraklat"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Oynat"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Duraklat"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index b445b9c..9daaf87 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Пристрої"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Транслювати"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Під’єднатися до пристрою"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Пошук пристроїв…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Від’єднатися"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Зупинити трансляцію"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Транслювати"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Під’єднатися до пристрою"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Пошук пристроїв…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Від’єднатися"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Зупинити трансляцію"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Налаштування маршруту"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Відтворити"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Призупинити"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Відтворити"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Призупинити"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index e6ce4d6..fd2cbb7 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"سسٹم"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"آلات"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"کاسٹ کریں"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"آلہ سے مربوط ہوں"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"آلات تلاش کر رہا ہے…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"غیر مربوط کریں"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"کاسٹ کرنا بند کریں"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"کاسٹ کریں"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"آلہ سے مربوط ہوں"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"آلات تلاش کر رہا ہے…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"غیر مربوط کریں"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"کاسٹ کرنا بند کریں"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"روٹ کی ترتیبات"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"چلائیں"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"موقوف کریں"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"چلائیں"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"موقوف کریں"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index d2829ee..6c364d5 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Tizim"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Qurilmalar"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Translatsiya qilish"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Qurilmaga ulanish"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Qurilmalar izlanmoqda…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Uzish"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Translatsiyani to‘xtatish"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Translatsiya qilish"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Qurilmaga ulanish"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Qurilmalar izlanmoqda…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Uzish"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Translatsiyani to‘xtatish"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Yo‘naltirish sozlamalari"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Ijro qilish"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"To‘xtatib turish"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Ijro qilish"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"To‘xtatib turish"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 01ec106..0a53da0 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Hệ thống"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Thiết bị"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Truyền"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Kết nối với thiết bị"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Đang tìm kiếm thiết bị…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Ngắt kết nối"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Ngừng truyền"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Truyền"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Kết nối với thiết bị"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Đang tìm kiếm thiết bị…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Ngắt kết nối"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Ngừng truyền"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Cài đặt tuyến đường"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Phát"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Tạm dừng"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Phát"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Tạm dừng"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index 070f1de..e9b04d7 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"系统"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"设备"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"投射"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"连接到设备"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"正在搜索设备…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"断开连接"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"停止投射"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"投射"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"连接到设备"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜索设备…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"断开连接"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"停止投射"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由设置"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"播放"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"暂停"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"暂停"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index a73d636..66d2f55 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"投放"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"停止投放"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"投放"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"停止投放"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由設定"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"播放"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"暫停"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"暫停"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index cb07c25..a6fa252 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"投放"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置..."</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"停止投放"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"投放"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置..."</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"停止投放"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由設定"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"播放"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"暫停"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"暫停"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index 24f0a37..78f415d 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -18,12 +18,12 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"Isistimu"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Amadivayisi"</string>
-    <string name="mr_media_route_button_content_description" msgid="8327680881775995150">"Abalingisi"</string>
-    <string name="mr_media_route_chooser_title" msgid="7106830097177242655">"Xhumeka kudivayisi"</string>
-    <string name="mr_media_route_chooser_searching" msgid="7553005460920830010">"Iseshela amadivayisi…"</string>
-    <string name="mr_media_route_controller_disconnect" msgid="109793632378378069">"Nqamula"</string>
-    <string name="mr_media_route_controller_stop" msgid="5398645111664294430">"Misa ukusakaza"</string>
+    <string name="mr_button_content_description" msgid="8327680881775995150">"Abalingisi"</string>
+    <string name="mr_chooser_title" msgid="7106830097177242655">"Xhumeka kudivayisi"</string>
+    <string name="mr_chooser_searching" msgid="7553005460920830010">"Iseshela amadivayisi…"</string>
+    <string name="mr_controller_disconnect" msgid="109793632378378069">"Nqamula"</string>
+    <string name="mr_controller_stop" msgid="5398645111664294430">"Misa ukusakaza"</string>
     <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Izilungiselelo zomzila"</string>
-    <string name="mr_media_route_controller_play" msgid="5214423499524760404">"Dlala"</string>
-    <string name="mr_media_route_controller_pause" msgid="8315773974194466049">"Misa isikhashana"</string>
+    <string name="mr_controller_play" msgid="5214423499524760404">"Dlala"</string>
+    <string name="mr_controller_pause" msgid="8315773974194466049">"Misa isikhashana"</string>
 </resources>
diff --git a/v7/mediarouter/res/values/attrs.xml b/v7/mediarouter/res/values/attrs.xml
index fe01948..3a5f333 100644
--- a/v7/mediarouter/res/values/attrs.xml
+++ b/v7/mediarouter/res/values/attrs.xml
@@ -38,6 +38,7 @@
     <attr name="mediaRouteDefaultIconDrawable" format="reference" />
     <attr name="mediaRouteSpeakerIconDrawable" format="reference" />
     <attr name="mediaRouteSpeakerGroupIconDrawable" format="reference" />
+    <attr name="mediaRouteBluetoothIconDrawable" format="reference" />
     <attr name="mediaRouteChooserPrimaryTextStyle" format="reference" />
     <attr name="mediaRouteChooserSecondaryTextStyle" format="reference" />
     <attr name="mediaRouteControllerTitleTextStyle" format="reference" />
diff --git a/v7/mediarouter/res/values/dimens.xml b/v7/mediarouter/res/values/dimens.xml
index d253f4c..4fb8218 100644
--- a/v7/mediarouter/res/values/dimens.xml
+++ b/v7/mediarouter/res/values/dimens.xml
@@ -15,6 +15,7 @@
 -->
 
 <resources>
+    <dimen name="mr_dialog_content_width_portrait">288dp</dimen>
+    <dimen name="mr_dialog_content_width_landscape">356dp</dimen>
     <dimen name="mr_media_route_controller_art_max_height">320dp</dimen>
-    <dimen name="mr_list_item_margin">24dp</dimen>
 </resources>
diff --git a/v7/mediarouter/res/values/strings.xml b/v7/mediarouter/res/values/strings.xml
index 9fc2f2e..b989ad6 100644
--- a/v7/mediarouter/res/values/strings.xml
+++ b/v7/mediarouter/res/values/strings.xml
@@ -23,35 +23,41 @@
 
     <!-- Content description of a MediaRouteButton for accessibility support.
         Cast is the standard android verb for sending content to a remote device. [CHAR LIMIT=50] -->
-    <string name="mr_media_route_button_content_description">Cast</string>
+    <string name="mr_button_content_description">Cast</string>
 
     <!-- Title of the media route chooser dialog. [CHAR LIMIT=30] -->
-    <string name="mr_media_route_chooser_title">Cast to</string>
+    <string name="mr_chooser_title">Cast to</string>
 
     <!-- Placeholder text to show when no devices have been found. [CHAR LIMIT=50] -->
-    <string name="mr_media_route_chooser_searching">Finding devices</string>
+    <string name="mr_chooser_searching">Finding devices</string>
 
     <!-- Button to disconnect from a media route.  [CHAR LIMIT=30] -->
-    <string name="mr_media_route_controller_disconnect">Disconnect</string>
+    <string name="mr_controller_disconnect">Disconnect</string>
 
-    <!-- Button to stop playback and disconnect from a media route.  [CHAR LIMIT=30] -->
-    <string name="mr_media_route_controller_stop">Stop casting</string>
+    <!-- Button to stop playback and disconnect from a media route. [CHAR LIMIT=30] -->
+    <string name="mr_controller_stop">Stop casting</string>
 
-    <!-- Description for a button that closes the controller dialog -->
-    <string name="mr_media_route_controller_close_description">Close the controller dialog</string>
+    <!-- Accessibility description for the close button that closes the controller dialog. [CHAR LIMIT=NONE] -->
+    <string name="mr_controller_close_description">Close</string>
 
-    <!-- Accessibility description for the play button -->
-    <string name="mr_media_route_controller_play">Play</string>
+    <!-- Accessibility description for the play button that starts playback. [CHAR LIMIT=NONE] -->
+    <string name="mr_controller_play">Play</string>
 
-    <!-- Accessibility description for the pause button -->
-    <string name="mr_media_route_controller_pause">Pause</string>
+    <!-- Accessibility description for the pause button that pauses playback. [CHAR LIMIT=NONE] -->
+    <string name="mr_controller_pause">Pause</string>
 
-    <!-- Accessibility description for the collapse group button -->
-    <string name="mr_media_route_controller_collapse_group">Collapse group</string>
+    <!-- Accessibility description for the group expand button that shows group members of a selected route group. [CHAR LIMIT=NONE] -->
+    <string name="mr_controller_expand_group">Group expand</string>
 
-    <!-- Accessibility description for the expand group button -->
-    <string name="mr_media_route_controller_expand_group">Expand group</string>
+    <!-- Accessibility description for the group collapse button that hides group members of a selected group. [CHAR LIMIT=NONE] -->
+    <string name="mr_controller_collapse_group">Group collapse</string>
+
+    <!-- Placeholder text to show when no media have been selected on the connected route. [CHAR LIMIT=50] -->
+    <string name="mr_controller_no_media_selected">No media selected</string>
 
     <!-- Placeholder text to show when no title/description have been found for a given song/video. [CHAR LIMIT=50] -->
-    <string name="mr_media_route_controller_no_info_available">No info available</string>
+    <string name="mr_controller_no_info_available">No info available</string>
+
+    <!-- Placeholder text indicating that the user is currently casting screen. [CHAR LIMIT=50] -->
+    <string name="mr_controller_casting_screen">Casting screen</string>
 </resources>
diff --git a/v7/mediarouter/res/values/styles.xml b/v7/mediarouter/res/values/styles.xml
index cebe09a..e02c9e2 100644
--- a/v7/mediarouter/res/values/styles.xml
+++ b/v7/mediarouter/res/values/styles.xml
@@ -17,13 +17,13 @@
 <resources>
     <style name="Widget.MediaRouter.MediaRouteButton"
             parent="Widget.AppCompat.ActionButton">
-        <item name="android:contentDescription">@string/mr_media_route_button_content_description</item>
+        <item name="android:contentDescription">@string/mr_button_content_description</item>
         <item name="externalRouteEnabledDrawable">@drawable/mr_ic_media_route_mono_dark</item>
     </style>
 
     <style name="Widget.MediaRouter.Light.MediaRouteButton"
             parent="Widget.AppCompat.Light.ActionButton">
-        <item name="android:contentDescription">@string/mr_media_route_button_content_description</item>
+        <item name="android:contentDescription">@string/mr_button_content_description</item>
         <item name="externalRouteEnabledDrawable">@drawable/mr_ic_media_route_mono_light</item>
     </style>
 
diff --git a/v7/mediarouter/res/values/themes.xml b/v7/mediarouter/res/values/themes.xml
index 490e04e..da21998 100644
--- a/v7/mediarouter/res/values/themes.xml
+++ b/v7/mediarouter/res/values/themes.xml
@@ -31,6 +31,7 @@
         <item name="mediaRouteDefaultIconDrawable">@drawable/ic_tv_dark</item>
         <item name="mediaRouteSpeakerIconDrawable">@drawable/ic_speaker_dark</item>
         <item name="mediaRouteSpeakerGroupIconDrawable">@drawable/ic_speaker_group_dark</item>
+        <item name="mediaRouteBluetoothIconDrawable">@drawable/ic_bluetooth_white</item>
         <item name="mediaRouteChooserPrimaryTextStyle">@style/Widget.MediaRouter.ChooserText.Primary.Dark</item>
         <item name="mediaRouteChooserSecondaryTextStyle">@style/Widget.MediaRouter.ChooserText.Secondary.Dark</item>
         <item name="mediaRouteControllerTitleTextStyle">@style/Widget.MediaRouter.ControllerText.Title.Dark</item>
@@ -54,6 +55,7 @@
         <item name="mediaRouteDefaultIconDrawable">@drawable/ic_tv_light</item>
         <item name="mediaRouteSpeakerIconDrawable">@drawable/ic_speaker_light</item>
         <item name="mediaRouteSpeakerGroupIconDrawable">@drawable/ic_speaker_group_light</item>
+        <item name="mediaRouteBluetoothIconDrawable">@drawable/ic_bluetooth_grey</item>
         <item name="mediaRouteChooserPrimaryTextStyle">@style/Widget.MediaRouter.ChooserText.Primary.Light</item>
         <item name="mediaRouteChooserSecondaryTextStyle">@style/Widget.MediaRouter.ChooserText.Secondary.Light</item>
         <item name="mediaRouteControllerTitleTextStyle">@style/Widget.MediaRouter.ControllerText.Title.Light</item>
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
index 8b5d6fc..49f4504 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
@@ -22,6 +22,8 @@
 import android.app.Dialog;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -65,6 +67,9 @@
 public class MediaRouteChooserDialog extends Dialog {
     private static final String TAG = "MediaRouteChooserDialog";
 
+    // Should match to SystemMediaRouteProvider.PACKAGE_NAME.
+    static final String SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME = "android";
+
     private final MediaRouter mRouter;
     private final MediaRouterCallback mCallback;
 
@@ -74,6 +79,10 @@
     private ListView mListView;
     private boolean mAttachedToWindow;
 
+    private int mOrientation;
+    private int mDialogWidthPortrait;
+    private int mDialogWidthLandscape;
+
     public MediaRouteChooserDialog(Context context) {
         this(context, 0);
     }
@@ -155,23 +164,49 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        setContentView(R.layout.mr_media_route_chooser_dialog);
-        setTitle(R.string.mr_media_route_chooser_title);
+        setContentView(R.layout.mr_chooser_dialog);
+        setTitle(R.string.mr_chooser_title);
+        View decorView = getWindow().getDecorView();
+        int dialogHorizontalPadding = decorView.getPaddingLeft() + decorView.getPaddingRight();
+        Resources res = getContext().getResources();
+        mDialogWidthPortrait = res.getDimensionPixelSize(
+                R.dimen.mr_dialog_content_width_portrait) + dialogHorizontalPadding;
+        mDialogWidthLandscape = res.getDimensionPixelSize(
+                R.dimen.mr_dialog_content_width_landscape) + dialogHorizontalPadding;
 
-        mRoutes = new ArrayList<MediaRouter.RouteInfo>();
+        mRoutes = new ArrayList<>();
         mAdapter = new RouteAdapter(getContext(), mRoutes);
-        mListView = (ListView)findViewById(R.id.media_route_list);
+        mListView = (ListView)findViewById(R.id.mr_chooser_list);
         mListView.setAdapter(mAdapter);
         mListView.setOnItemClickListener(mAdapter);
         mListView.setEmptyView(findViewById(android.R.id.empty));
     }
 
+    /**
+     * Called by {@link MediaRouteChooserDialogFragment} when the device configuration is changed.
+     */
+    void onConfigurationChanged(Configuration newConfig) {
+        onOrientationChanged(newConfig.orientation);
+    }
+
+    private void onOrientationChanged(int orientation) {
+        if (!mAttachedToWindow || mOrientation == orientation) {
+            return;
+        }
+        mOrientation = orientation;
+        getWindow().setLayout(
+                mOrientation == Configuration.ORIENTATION_PORTRAIT
+                        ? mDialogWidthPortrait : mDialogWidthLandscape,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+    }
+
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
 
         mAttachedToWindow = true;
         mRouter.addCallback(mSelector, mCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
+        onOrientationChanged(getContext().getResources().getConfiguration().orientation);
         refreshRoutes();
     }
 
@@ -203,6 +238,7 @@
         private final Drawable mDefaultIcon;
         private final Drawable mSpeakerIcon;
         private final Drawable mSpeakerGroupIcon;
+        private final Drawable mBluetoothIcon;
 
         public RouteAdapter(Context context, List<MediaRouter.RouteInfo> routes) {
             super(context, 0, routes);
@@ -210,10 +246,12 @@
             TypedArray styledAttributes = getContext().obtainStyledAttributes(new int[] {
                     R.attr.mediaRouteDefaultIconDrawable,
                     R.attr.mediaRouteSpeakerIconDrawable,
-                    R.attr.mediaRouteSpeakerGroupIconDrawable });
+                    R.attr.mediaRouteSpeakerGroupIconDrawable,
+                    R.attr.mediaRouteBluetoothIconDrawable });
             mDefaultIcon = styledAttributes.getDrawable(0);
             mSpeakerIcon = styledAttributes.getDrawable(1);
             mSpeakerGroupIcon = styledAttributes.getDrawable(2);
+            mBluetoothIcon = styledAttributes.getDrawable(3);
             styledAttributes.recycle();
         }
 
@@ -231,12 +269,12 @@
         public View getView(int position, View convertView, ViewGroup parent) {
             View view = convertView;
             if (view == null) {
-                view = mInflater.inflate(R.layout.mr_media_route_list_item, parent, false);
+                view = mInflater.inflate(R.layout.mr_chooser_list_item, parent, false);
             }
 
             MediaRouter.RouteInfo route = getItem(position);
-            TextView text1 = (TextView) view.findViewById(android.R.id.text1);
-            TextView text2 = (TextView) view.findViewById(android.R.id.text2);
+            TextView text1 = (TextView) view.findViewById(R.id.mr_chooser_route_name);
+            TextView text2 = (TextView) view.findViewById(R.id.mr_chooser_route_desc);
             text1.setText(route.getName());
             String description = route.getDescription();
             boolean isConnectedOrConnecting =
@@ -253,7 +291,7 @@
             }
             view.setEnabled(route.isEnabled());
 
-            ImageView iconView = (ImageView) view.findViewById(R.id.routeIcon);
+            ImageView iconView = (ImageView) view.findViewById(R.id.mr_chooser_route_icon);
             if (iconView != null) {
                 iconView.setImageDrawable(getIconDrawable(route));
             }
@@ -292,10 +330,19 @@
                 // Only speakers can be grouped for now.
                 return mSpeakerGroupIcon;
             }
+            if (isSystemLiveAudioOnlyRoute(route)) {
+                return mBluetoothIcon;
+            }
             if (route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
                     && !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)) {
                 return mSpeakerIcon;
             }
+            // A workaround to get the speaker icon for known audio devices.
+            // TODO: Remove once the new setIconUri API is fully launched.
+            if (TextUtils.equals(route.getProvider().getPackageName(), "com.sonos.acr")
+                    || route.getDescription().toLowerCase().contains("audio") ) {
+                return mSpeakerIcon;
+            }
             return mDefaultIcon;
         }
     }
@@ -331,9 +378,6 @@
         private static final float MIN_USAGE_SCORE = 0.1f;
         private static final float USAGE_SCORE_DECAY_FACTOR = 0.95f;
 
-        // Should match to SystemMediaRouteProvider.PACKAGE_NAME.
-        static final String SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME = "android";
-
         public static final RouteComparator sInstance = new RouteComparator();
         public static final HashMap<String, Float> sRouteUsageScoreMap = new HashMap();
 
@@ -360,17 +404,6 @@
             return lhs.getName().compareTo(rhs.getName());
         }
 
-        private boolean isSystemLiveAudioOnlyRoute(MediaRouter.RouteInfo route) {
-            return isSystemMediaRouteProvider(route)
-                    && route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
-                    && !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
-        }
-
-        private boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
-            return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
-                    SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
-        }
-
         private static void loadRouteUsageScores(
                 Context context, List<MediaRouter.RouteInfo> routes) {
             sRouteUsageScoreMap.clear();
@@ -415,4 +448,17 @@
             prefEditor.commit();
         }
     }
+
+    // Used to determine whether the route represents a bluetooth device.
+    // TODO: Find a better way to precisely detect bluetooth routes.
+    private static boolean isSystemLiveAudioOnlyRoute(MediaRouter.RouteInfo route) {
+        return isSystemMediaRouteProvider(route)
+                && route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
+                && !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
+    }
+
+    private static boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
+        return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
+                SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
+    }
 }
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialogFragment.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialogFragment.java
index 3b5239a..4d94c58 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialogFragment.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialogFragment.java
@@ -18,6 +18,7 @@
 
 import android.app.Dialog;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.os.Bundle;
 import android.support.v4.app.DialogFragment;
 import android.support.v7.media.MediaRouteSelector;
@@ -32,6 +33,7 @@
 public class MediaRouteChooserDialogFragment extends DialogFragment {
     private final String ARGUMENT_SELECTOR = "selector";
 
+    private MediaRouteChooserDialog mDialog;
     private MediaRouteSelector mSelector;
 
     /**
@@ -108,8 +110,16 @@
 
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        MediaRouteChooserDialog dialog = onCreateChooserDialog(getActivity(), savedInstanceState);
-        dialog.setRouteSelector(getRouteSelector());
-        return dialog;
+        mDialog = onCreateChooserDialog(getActivity(), savedInstanceState);
+        mDialog.setRouteSelector(getRouteSelector());
+        return mDialog;
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        if (mDialog != null) {
+            mDialog.onConfigurationChanged(newConfig);
+        }
     }
 }
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index 5fc84588..65f8858 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -20,13 +20,16 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.IntentSender;
+import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.AsyncTask;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.support.v4.media.MediaDescriptionCompat;
@@ -37,8 +40,10 @@
 import android.support.v7.graphics.Palette;
 import android.support.v7.media.MediaRouteSelector;
 import android.support.v7.media.MediaRouter;
+import android.support.v7.media.SeekBarJellybean;
 import android.support.v7.mediarouter.R;
 import android.text.TextUtils;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -51,6 +56,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListView;
+import android.widget.RelativeLayout;
 import android.widget.SeekBar;
 import android.widget.TextView;
 
@@ -84,8 +90,12 @@
 
     private boolean mCreated;
     private boolean mAttachedToWindow;
+    private int mOrientation;
+    private int mDialogWidthPortrait;
+    private int mDialogWidthLandscape;
+    private int mDialogPaddingVertical;
 
-    private View mControlView;
+    private View mCustomControlView;
 
     private Button mDisconnectButton;
     private Button mStopCastingButton;
@@ -93,13 +103,18 @@
     private ImageButton mCloseButton;
     private ImageButton mGroupExpandCollapseButton;
 
+    private FrameLayout mCustomControlLayout;
     private ImageView mArtView;
     private TextView mTitleView;
     private TextView mSubtitleView;
-    private TextView mRouteNameView;
+    private TextView mRouteNameTextView;
 
     private boolean mVolumeControlEnabled = true;
-    private LinearLayout mVolumeLayout;
+    private LinearLayout mControlLayout;
+    private RelativeLayout mPlaybackControl;
+    private LinearLayout mVolumeControl;
+    private View mDividerView;
+
     private ListView mVolumeGroupList;
     private SeekBar mVolumeSlider;
     private boolean mVolumeSliderTouched;
@@ -158,7 +173,7 @@
      * @return The media control view, or null if none.
      */
     public View getMediaControlView() {
-        return mControlView;
+        return mCustomControlView;
     }
 
     /**
@@ -172,7 +187,7 @@
         if (mVolumeControlEnabled != enable) {
             mVolumeControlEnabled = enable;
             if (mCreated) {
-                updateVolume();
+                updateVolumeControl();
             }
         }
     }
@@ -231,62 +246,48 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        setContentView(R.layout.mr_media_route_controller_material_dialog_b);
+        setContentView(R.layout.mr_controller_material_dialog_b);
+        View decorView = getWindow().getDecorView();
+        int dialogHorizontalPadding = decorView.getPaddingLeft() + decorView.getPaddingRight();
+        Resources res = getContext().getResources();
+        mDialogWidthPortrait = res.getDimensionPixelSize(
+                R.dimen.mr_dialog_content_width_portrait) + dialogHorizontalPadding;
+        mDialogWidthLandscape = res.getDimensionPixelSize(
+                R.dimen.mr_dialog_content_width_landscape) + dialogHorizontalPadding;
+        mDialogPaddingVertical = decorView.getPaddingTop() + decorView.getPaddingBottom();
 
         ClickListener listener = new ClickListener();
 
-        mDisconnectButton = (Button) findViewById(R.id.disconnect);
+        mDisconnectButton = (Button) findViewById(R.id.mr_button_disconnect);
         mDisconnectButton.setOnClickListener(listener);
 
-        mStopCastingButton = (Button) findViewById(R.id.stop);
+        mStopCastingButton = (Button) findViewById(R.id.mr_button_stop);
         mStopCastingButton.setOnClickListener(listener);
 
-        mCloseButton = (ImageButton) findViewById(R.id.close);
+        mRouteNameTextView = (TextView) findViewById(R.id.mr_name);
+        mCloseButton = (ImageButton) findViewById(R.id.mr_close);
         mCloseButton.setOnClickListener(listener);
+        mCustomControlLayout = (FrameLayout) findViewById(R.id.mr_custom_control);
+        mArtView = (ImageView) findViewById(R.id.mr_art);
 
-        mArtView = (ImageView) findViewById(R.id.art);
-        mTitleView = (TextView) findViewById(R.id.title);
-        mSubtitleView = (TextView) findViewById(R.id.subtitle);
-        mPlayPauseButton = (ImageButton) findViewById(R.id.play_pause);
+        mControlLayout = (LinearLayout) findViewById(R.id.mr_control);
+        mDividerView = findViewById(R.id.mr_control_divider);
+
+        mPlaybackControl = (RelativeLayout) findViewById(R.id.mr_playback_control);
+        mTitleView = (TextView) findViewById(R.id.mr_control_title);
+        mSubtitleView = (TextView) findViewById(R.id.mr_control_subtitle);
+        mPlayPauseButton = (ImageButton) findViewById(R.id.mr_control_play_pause);
         mPlayPauseButton.setOnClickListener(listener);
-        mRouteNameView = (TextView) findViewById(R.id.route_name);
-        mVolumeLayout = (LinearLayout)findViewById(R.id.media_route_volume_layout);
-        mVolumeGroupList = (ListView)findViewById(R.id.media_route_volume_group_list);
 
-        TypedArray styledAttributes = getContext().obtainStyledAttributes(new int[] {
-                R.attr.mediaRouteExpandGroupDrawable,
-                R.attr.mediaRouteCollapseGroupDrawable });
-        final Drawable expandGroupDrawable = styledAttributes.getDrawable(0);
-        final Drawable collapseGroupDrawable = styledAttributes.getDrawable(1);
-        styledAttributes.recycle();
-
-        mGroupExpandCollapseButton = (ImageButton)findViewById(
-                R.id.media_route_group_expand_collapse);
-        mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
-            private boolean mIsExpanded;
-
-            @Override
-            public void onClick(View v) {
-                mIsExpanded = !mIsExpanded;
-                if (mIsExpanded) {
-                    mGroupExpandCollapseButton.setImageDrawable(collapseGroupDrawable);
-                    mVolumeGroupList.setVisibility(View.VISIBLE);
-                    mVolumeGroupList.setAdapter(
-                            new VolumeGroupAdapter(getContext(), getGroup().getRoutes()));
-                } else {
-                    mGroupExpandCollapseButton.setImageDrawable(expandGroupDrawable);
-                    mVolumeGroupList.setVisibility(View.GONE);
-                }
-            }
-        });
-        mVolumeSlider = (SeekBar)findViewById(R.id.media_route_volume_slider);
+        mVolumeControl = (LinearLayout) findViewById(R.id.mr_volume_control);
+        mVolumeSlider = (SeekBar) findViewById(R.id.mr_volume_slider);
         mVolumeSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
             private final Runnable mStopTrackingTouch = new Runnable() {
                 @Override
                 public void run() {
                     if (mVolumeSliderTouched) {
                         mVolumeSliderTouched = false;
-                        updateVolume();
+                        updateVolumeControl();
                     }
                 }
             };
@@ -316,16 +317,62 @@
             }
         });
 
-        mCreated = true;
-        if (update()) {
-            mControlView = onCreateMediaControlView(savedInstanceState);
-            FrameLayout controlFrame =
-                    (FrameLayout)findViewById(R.id.media_route_control_frame);
-            if (mControlView != null) {
-                controlFrame.findViewById(R.id.default_control_frame).setVisibility(View.GONE);
-                controlFrame.addView(mControlView);
+        TypedArray styledAttributes = getContext().obtainStyledAttributes(new int[] {
+                R.attr.mediaRouteExpandGroupDrawable,
+                R.attr.mediaRouteCollapseGroupDrawable
+        });
+        final Drawable expandGroupDrawable = styledAttributes.getDrawable(0);
+        final Drawable collapseGroupDrawable = styledAttributes.getDrawable(1);
+        styledAttributes.recycle();
+
+        mVolumeGroupList = (ListView)findViewById(R.id.mr_volume_group_list);
+        mGroupExpandCollapseButton = (ImageButton) findViewById(R.id.mr_group_expand_collapse);
+        mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() {
+            private boolean mIsExpanded;
+
+            @Override
+            public void onClick(View v) {
+                mIsExpanded = !mIsExpanded;
+                if (mIsExpanded) {
+                    mGroupExpandCollapseButton.setImageDrawable(collapseGroupDrawable);
+                    mVolumeGroupList.setVisibility(View.VISIBLE);
+                    mVolumeGroupList.setAdapter(
+                            new VolumeGroupAdapter(getContext(), getGroup().getRoutes()));
+                } else {
+                    mGroupExpandCollapseButton.setImageDrawable(expandGroupDrawable);
+                    mVolumeGroupList.setVisibility(View.GONE);
+                }
             }
+        });
+
+        mCreated = true;
+        mCustomControlView = onCreateMediaControlView(savedInstanceState);
+        if (mCustomControlView != null) {
+            mCustomControlLayout.addView(mCustomControlView);
+            mCustomControlLayout.setVisibility(View.VISIBLE);
+            mArtView.setVisibility(View.GONE);
         }
+        update();
+    }
+
+    /**
+     * Called by {@link MediaRouteControllerDialogFragment} when the device configuration
+     * is changed.
+     */
+    void onConfigurationChanged(Configuration newConfig) {
+        onOrientationChanged(newConfig.orientation);
+    }
+
+    private void onOrientationChanged(int orientation) {
+        if (!mAttachedToWindow || mOrientation == orientation) {
+            return;
+        }
+        mOrientation = orientation;
+        getWindow().setLayout(
+                mOrientation == Configuration.ORIENTATION_LANDSCAPE
+                        ? mDialogWidthLandscape : mDialogWidthPortrait,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        updateArtView();
     }
 
     @Override
@@ -336,6 +383,7 @@
         mRouter.addCallback(MediaRouteSelector.EMPTY, mCallback,
                 MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS);
         setMediaSession(mRouter.getMediaSessionToken());
+        onOrientationChanged(getContext().getResources().getConfiguration().orientation);
     }
 
     @Override
@@ -365,39 +413,57 @@
         return super.onKeyUp(keyCode, event);
     }
 
-    private boolean update() {
+    private void update() {
         if (!mRoute.isSelected() || mRoute.isDefault()) {
             dismiss();
-            return false;
+            return;
         }
         if (!mCreated) {
-            return false;
+            return;
         }
 
-        updateVolume();
+        mRouteNameTextView.setText(mRoute.getName());
+        mDisconnectButton.setVisibility(mRoute.canDisconnect() ? View.VISIBLE : View.INVISIBLE);
 
-        mRouteNameView.setText(mRoute.getName());
-
-        if (mRoute.canDisconnect()) {
-            mDisconnectButton.setVisibility(View.VISIBLE);
-        } else {
-            mDisconnectButton.setVisibility(View.GONE);
-        }
-
-        if (mRoute.getSettingsIntent() != null) {
-            mCloseButton.setVisibility(View.VISIBLE);
-        } else {
-            mCloseButton.setVisibility(View.GONE);
-        }
-
-        if (mControlView == null) {
+        if (mCustomControlView == null) {
             if (mFetchArtTask != null) {
                 mFetchArtTask.cancel(true);
             }
-            mArtView.setVisibility(View.GONE);
             mFetchArtTask = new FetchArtTask();
             mFetchArtTask.execute();
+        }
+        updateVolumeControl();
+        updatePlaybackControl();
+    }
 
+    private void updateVolumeControl() {
+        if (!mVolumeSliderTouched) {
+            if (isVolumeControlAvailable()) {
+                mVolumeControl.setVisibility(View.VISIBLE);
+                mVolumeSlider.setMax(mRoute.getVolumeMax());
+                mVolumeSlider.setProgress(mRoute.getVolume());
+                if (USE_GROUP) {
+                    if (getGroup() == null) {
+                        mGroupExpandCollapseButton.setVisibility(View.GONE);
+                    } else {
+                        mGroupExpandCollapseButton.setVisibility(View.VISIBLE);
+                        VolumeGroupAdapter adapter =
+                                (VolumeGroupAdapter) mVolumeGroupList.getAdapter();
+                        if (adapter != null) {
+                            adapter.notifyDataSetChanged();
+                        }
+                    }
+                }
+            } else {
+                mVolumeControl.setVisibility(View.GONE);
+            }
+            adjustControlLayoutHeight();
+        }
+    }
+
+    private void updatePlaybackControl() {
+        if (mCustomControlView == null && (mDescription != null || mState != null)) {
+            mPlaybackControl.setVisibility(View.VISIBLE);
             CharSequence title = mDescription == null ? null : mDescription.getTitle();
             boolean hasTitle = !TextUtils.isEmpty(title);
 
@@ -405,7 +471,16 @@
             boolean hasSubtitle = !TextUtils.isEmpty(subtitle);
 
             if (!hasTitle && !hasSubtitle) {
-                mTitleView.setText(R.string.mr_media_route_controller_no_info_available);
+                if (mRoute.getPresentationDisplayId()
+                        != MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE) {
+                    // The user is currently casting screen.
+                    mTitleView.setText(R.string.mr_controller_casting_screen);
+                } else {
+                    mTitleView.setText((mState == null
+                            || mState.getState() == PlaybackStateCompat.STATE_NONE)
+                                    ? R.string.mr_controller_no_media_selected
+                                    : R.string.mr_controller_no_info_available);
+                }
                 mTitleView.setEnabled(false);
                 mTitleView.setVisibility(View.VISIBLE);
                 mSubtitleView.setVisibility(View.GONE);
@@ -422,43 +497,38 @@
                 boolean supportsPlay = (mState.getActions() & (PlaybackStateCompat.ACTION_PLAY
                         | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
                 boolean supportsPause = (mState.getActions() & (PlaybackStateCompat.ACTION_PAUSE
-                                | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
+                        | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
                 if (isPlaying && supportsPause) {
                     mPlayPauseButton.setVisibility(View.VISIBLE);
                     mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
                             getContext(), R.attr.mediaRoutePauseDrawable));
                     mPlayPauseButton.setContentDescription(getContext().getResources()
-                            .getText(R.string.mr_media_route_controller_pause));
+                            .getText(R.string.mr_controller_pause));
                 } else if (!isPlaying && supportsPlay) {
                     mPlayPauseButton.setVisibility(View.VISIBLE);
                     mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
                             getContext(), R.attr.mediaRoutePlayDrawable));
                     mPlayPauseButton.setContentDescription(getContext().getResources()
-                            .getText(R.string.mr_media_route_controller_play));
+                            .getText(R.string.mr_controller_play));
                 } else {
                     mPlayPauseButton.setVisibility(View.GONE);
                 }
-            } else {
-                mPlayPauseButton.setVisibility(View.GONE);
             }
+        } else {
+            mPlaybackControl.setVisibility(View.GONE);
         }
-        return true;
+        adjustControlLayoutHeight();
     }
 
-    private void updateVolume() {
-        if (!mVolumeSliderTouched) {
-            if (isVolumeControlAvailable()) {
-                mVolumeLayout.setVisibility(View.VISIBLE);
-                mVolumeSlider.setMax(mRoute.getVolumeMax());
-                mVolumeSlider.setProgress(mRoute.getVolume());
-                if (USE_GROUP) {
-                    mGroupExpandCollapseButton.setVisibility(
-                            getGroup() != null ? View.VISIBLE : View.GONE);
-                }
-            } else {
-                mVolumeLayout.setVisibility(View.GONE);
-            }
-        }
+    private void adjustControlLayoutHeight() {
+        // TODO: Adjust the top and bottom padding of the control layout according to the display
+        // height.
+        mDividerView.setVisibility((mVolumeControl.getVisibility() == View.VISIBLE
+                && mPlaybackControl.getVisibility() == View.VISIBLE)
+                ? View.VISIBLE : View.GONE);
+        mControlLayout.setVisibility((mVolumeControl.getVisibility() == View.GONE
+                && mPlaybackControl.getVisibility() == View.GONE)
+                ? View.GONE : View.VISIBLE);
     }
 
     private boolean isVolumeControlAvailable() {
@@ -466,6 +536,51 @@
                 MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE;
     }
 
+    private void updateArtView() {
+        if (!(mArtView.getDrawable() instanceof BitmapDrawable)) {
+            mArtView.setVisibility(View.GONE);
+            return;
+        }
+        Bitmap art = ((BitmapDrawable) mArtView.getDrawable()).getBitmap();
+        if (art == null) {
+            mArtView.setVisibility(View.GONE);
+            return;
+        }
+        int desiredArtHeight = getDesiredArtHeight(art.getWidth(), art.getHeight());
+        DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
+        int dialogWidth = displayMetrics.widthPixels < displayMetrics.heightPixels
+                ? mDialogWidthPortrait : mDialogWidthLandscape;
+        View decorView = getWindow().getDecorView();
+        decorView.measure(dialogWidth, View.MeasureSpec.UNSPECIFIED);
+        // Show art if and only if it fits in the screen.
+        if (mArtView.getVisibility() == View.GONE) {
+            if (decorView.getMeasuredHeight() + desiredArtHeight <= displayMetrics.heightPixels) {
+                mArtView.setVisibility(View.VISIBLE);
+                mArtView.setMaxHeight(desiredArtHeight);
+            }
+        } else {
+            if (decorView.getMeasuredHeight() - mArtView.getMeasuredHeight() + desiredArtHeight
+                    <= displayMetrics.heightPixels) {
+                mArtView.setMaxHeight(desiredArtHeight);
+            } else {
+                mArtView.setVisibility(View.GONE);
+            }
+        }
+    }
+
+    /**
+     * Returns desired art height to fit into controller dialog.
+     */
+    private int getDesiredArtHeight(int originalWidth, int originalHeight) {
+        int dialogWidth = getWindow().getAttributes().width - mDialogPaddingVertical;
+        if (originalWidth >= originalHeight) {
+            // For landscape art, fit width to dialog width.
+            return (int) ((float) dialogWidth * originalHeight / originalWidth + 0.5f);
+        }
+        // For portrait art, fit height to 16:9 ratio case's height.
+        return (int) ((float) dialogWidth * 9 / 16 + 0.5f);
+    }
+
     private final class MediaRouterCallback extends MediaRouter.Callback {
         @Override
         public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
@@ -480,7 +595,7 @@
         @Override
         public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
             if (route == mRoute) {
-                updateVolume();
+                updateVolumeControl();
             }
         }
     }
@@ -511,14 +626,14 @@
         @Override
         public void onClick(View v) {
             int id = v.getId();
-            if (id == R.id.stop || id == R.id.disconnect) {
+            if (id == R.id.mr_button_stop || id == R.id.mr_button_disconnect) {
                 if (mRoute.isSelected()) {
-                    mRouter.unselect(id == R.id.stop ?
+                    mRouter.unselect(id == R.id.mr_button_stop ?
                             MediaRouter.UNSELECT_REASON_STOPPED :
                             MediaRouter.UNSELECT_REASON_DISCONNECTED);
                 }
                 dismiss();
-            } else if (id == R.id.play_pause) {
+            } else if (id == R.id.mr_control_play_pause) {
                 if (mMediaController != null && mState != null) {
                     if (mState.getState() == PlaybackStateCompat.STATE_PLAYING) {
                         mMediaController.getTransportControls().pause();
@@ -526,19 +641,20 @@
                         mMediaController.getTransportControls().play();
                     }
                 }
-            } else if (id == R.id.close) {
+            } else if (id == R.id.mr_close) {
                 dismiss();
             }
         }
     }
 
     private class VolumeGroupAdapter extends ArrayAdapter<MediaRouter.RouteInfo> {
+        final static float DISABLED_ALPHA = .3f;
+
         final OnSeekBarChangeListener mOnSeekBarChangeListener = new OnSeekBarChangeListener() {
             @Override
             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                 if (fromUser) {
                     int position = (int) seekBar.getTag();
-                    // TODO: Verify
                     getGroup().getRouteAt(position).requestSetVolume(progress);
                 }
             }
@@ -563,24 +679,39 @@
             View v = convertView;
             if (v == null) {
                 v = LayoutInflater.from(getContext()).inflate(
-                        R.layout.mr_media_route_controller_volume_item, null);
+                        R.layout.mr_controller_volume_item, null);
             }
             MediaRouter.RouteInfo route = getItem(position);
             if (route != null) {
-                TextView textView = (TextView) v.findViewById(R.id.media_route_name);
-                textView.setText(route.getName());
+                boolean isEnabled = route.isEnabled();
 
-                SeekBar volumeSlider = (SeekBar) v.findViewById(R.id.media_route_volume_slider);
-                if (route.getVolumeHandling() == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) {
-                    volumeSlider.setMax(route.getVolumeMax());
-                    volumeSlider.setProgress(route.getVolume());
-                    volumeSlider.setOnSeekBarChangeListener(mOnSeekBarChangeListener);
-                } else {
-                    volumeSlider.setMax(100);
-                    volumeSlider.setProgress(100);
-                    volumeSlider.setEnabled(false);
-                }
+                TextView routeName = (TextView) v.findViewById(R.id.mr_name);
+                routeName.setEnabled(isEnabled);
+                routeName.setText(route.getName());
+
+                SeekBar volumeSlider = (SeekBar) v.findViewById(R.id.mr_volume_slider);
+                volumeSlider.setEnabled(isEnabled);
                 volumeSlider.setTag(position);
+                if (isEnabled) {
+                    if (route.getVolumeHandling()
+                            == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) {
+                        volumeSlider.setMax(route.getVolumeMax());
+                        volumeSlider.setProgress(route.getVolume());
+                        volumeSlider.setOnSeekBarChangeListener(mOnSeekBarChangeListener);
+                    } else {
+                        volumeSlider.setMax(100);
+                        volumeSlider.setProgress(100);
+                        volumeSlider.setEnabled(false);
+                    }
+                }
+                if (Build.VERSION.SDK_INT >= 16) {
+                    SeekBarJellybean.getThumb(volumeSlider).mutate().setAlpha(isEnabled ? 255 : 0);
+                    // TODO: Still see an artifact even though the thumb is transparent. Remove it.
+                }
+
+                ImageView volumeItemIcon =
+                        (ImageView) v.findViewById(R.id.mr_volume_item_icon);
+                volumeItemIcon.setAlpha(isEnabled ? 255 : (int) (255 * DISABLED_ALPHA));
             }
             return v;
         }
@@ -591,12 +722,12 @@
 
         @Override
         protected Bitmap doInBackground(Void... arg) {
-            Bitmap bitmap = null;
+            Bitmap art = null;
             if (mDescription == null) {
                 return null;
             }
             if (mDescription.getIconBitmap() != null) {
-                bitmap = mDescription.getIconBitmap();
+                art = mDescription.getIconBitmap();
             } else if (mDescription.getIconUri() != null) {
                 Uri iconUri = mDescription.getIconUri();
                 String scheme = iconUri.getScheme();
@@ -611,12 +742,14 @@
                     stream = new BufferedInputStream(
                             getContext().getContentResolver().openInputStream(iconUri));
 
-                    // Query bitmap size.
+                    // Query art size.
                     BitmapFactory.Options options = new BitmapFactory.Options();
                     options.inJustDecodeBounds = true;
                     BitmapFactory.decodeStream(stream, null, options);
-
-                    // Rewind the stream in order to restart bitmap decoding.
+                    if (options.outWidth == 0 || options.outHeight == 0) {
+                        return null;
+                    }
+                    // Rewind the stream in order to restart art decoding.
                     try {
                         stream.reset();
                     } catch (IOException e) {
@@ -625,27 +758,15 @@
                         stream = new BufferedInputStream(getContext().getContentResolver()
                                 .openInputStream(iconUri));
                     }
-
-                    // Caculate required size to decode the bitmap and possibly resize it.
+                    // Calculate required size to decode the art and possibly resize it.
                     options.inJustDecodeBounds = false;
-                    int reqWidth;
-                    int reqHeight;
-                    if (options.outWidth >= options.outHeight) {
-                        // For landscape image, fit width to dialog width.
-                        reqWidth = getWindow().getDecorView().getWidth();
-                        reqHeight = reqWidth * (options.outHeight / options.outWidth);
-                    } else {
-                        // For portrait image, fit height to 16:9 ratio case's height.
-                        reqHeight = getWindow().getDecorView().getWidth() * 9 / 16;
-                        reqWidth = reqHeight * (options.outWidth / options.outHeight);
-                    }
-                    int ratio = Math.max(
-                            options.outWidth / reqWidth, options.outHeight / reqHeight);
+                    int reqHeight = getDesiredArtHeight(options.outWidth, options.outHeight);
+                    int ratio = options.outHeight / reqHeight;
                     options.inSampleSize = Math.max(1, Integer.highestOneBit(ratio));
                     if (isCancelled()) {
                         return null;
                     }
-                    bitmap = BitmapFactory.decodeStream(stream, null, options);
+                    art = BitmapFactory.decodeStream(stream, null, options);
                 } catch (IOException e){
                     Log.w(TAG, "Unable to open content: " + iconUri, e);
                 } finally {
@@ -657,14 +778,13 @@
                     }
                 }
             }
-            if (bitmap != null) {
-                if (bitmap.getWidth() < bitmap.getHeight()) {
-                    // Portrait image requires background color.
-                    mBackgroundColor =
-                            new Palette.Builder(bitmap).generate().getDarkVibrantColor(0);
+            if (art != null) {
+                if (art.getWidth() < art.getHeight()) {
+                    // Portrait art requires background color.
+                    mBackgroundColor = new Palette.Builder(art).generate().getDarkVibrantColor(0);
                 }
             }
-            return bitmap;
+            return art;
         }
 
         @Override
@@ -673,20 +793,11 @@
         }
 
         @Override
-        protected void onPostExecute(Bitmap bitmap) {
+        protected void onPostExecute(Bitmap art) {
             mFetchArtTask = null;
-            mArtView.setImageBitmap(bitmap);
-            if (bitmap != null) {
-                mArtView.setVisibility(View.VISIBLE);
-                if (bitmap.getWidth() < bitmap.getHeight()) {
-                    mArtView.setMaxHeight(getWindow().getDecorView().getWidth() * 9 / 16);
-                    mArtView.setBackgroundColor(mBackgroundColor);
-                } else {
-                    mArtView.setMaxHeight(Integer.MAX_VALUE);
-                }
-            } else {
-                mArtView.setVisibility(View.GONE);
-            }
+            mArtView.setImageBitmap(art);
+            mArtView.setBackgroundColor(mBackgroundColor);
+            updateArtView();
         }
     }
 }
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialogFragment.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialogFragment.java
index beb9832..8156492 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialogFragment.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialogFragment.java
@@ -18,6 +18,7 @@
 
 import android.app.Dialog;
 import android.content.Context;
+import android.content.res.Configuration;
 import android.os.Bundle;
 import android.support.v4.app.DialogFragment;
 
@@ -29,6 +30,7 @@
  * </p>
  */
 public class MediaRouteControllerDialogFragment extends DialogFragment {
+    private MediaRouteControllerDialog mDialog;
     /**
      * Creates a media route controller dialog fragment.
      * <p>
@@ -51,7 +53,15 @@
     }
 
     @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        if (mDialog != null) {
+            mDialog.onConfigurationChanged(newConfig);
+        }
+    }
+
+    @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return onCreateControllerDialog(getActivity(), savedInstanceState);
+        mDialog = onCreateControllerDialog(getActivity(), savedInstanceState);
+        return mDialog;
     }
 }
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaRouteDescriptor.java b/v7/mediarouter/src/android/support/v7/media/MediaRouteDescriptor.java
index 88a684c..8e5ad25 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaRouteDescriptor.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaRouteDescriptor.java
@@ -38,7 +38,7 @@
  */
 public final class MediaRouteDescriptor {
     private static final String KEY_ID = "id";
-    private static final String KEY_CHILD_IDS = "childIds";
+    private static final String KEY_GROUP_MEMBER_IDS = "groupMemberIds";
     private static final String KEY_NAME = "name";
     private static final String KEY_DESCRIPTION = "status";
     private static final String KEY_ICON_URI = "iconUri";
@@ -77,16 +77,16 @@
     }
 
     /**
-     * Gets the child ids of the route.
+     * Gets the group member ids of the route.
      * <p>
-     * A route descriptor that has one or more child route ids represents a
-     * route group. A child route may belong to another group.
+     * A route descriptor that has one or more group member route ids
+     * represents a route group. A member route may belong to another group.
      * </p>
      * @hide
      * STOPSHIP: Unhide or remove.
      */
-    public List<String> getChildIds() {
-        return mBundle.getStringArrayList(KEY_CHILD_IDS);
+    public List<String> getGroupMemberIds() {
+        return mBundle.getStringArrayList(KEY_GROUP_MEMBER_IDS);
     }
 
     /**
@@ -234,7 +234,8 @@
      * Gets the route's presentation display id, or -1 if none.
      */
     public int getPresentationDisplayId() {
-        return mBundle.getInt(KEY_PRESENTATION_DISPLAY_ID, -1);
+        return mBundle.getInt(
+                KEY_PRESENTATION_DISPLAY_ID, MediaRouter.RouteInfo.PRESENTATION_DISPLAY_ID_NONE);
     }
 
     /**
@@ -264,7 +265,7 @@
         StringBuilder result = new StringBuilder();
         result.append("MediaRouteDescriptor{ ");
         result.append("id=").append(getId());
-        result.append(", childIds=").append(getChildIds());
+        result.append(", groupMemberIds=").append(getGroupMemberIds());
         result.append(", name=").append(getName());
         result.append(", description=").append(getDescription());
         result.append(", iconUri=").append(getIconUri());
@@ -308,7 +309,7 @@
      */
     public static final class Builder {
         private final Bundle mBundle;
-        private ArrayList<String> mChildIds;
+        private ArrayList<String> mGroupMemberIds;
         private ArrayList<IntentFilter> mControlFilters;
 
         /**
@@ -354,45 +355,45 @@
         }
 
         /**
-         * Adds a child id of the route.
+         * Adds a group member id of the route.
          * <p>
-         * A route descriptor that has one or more child route ids represents a
-         * route group. A child route may belong to another group.
+         * A route descriptor that has one or more group member route ids
+         * represents a route group. A member route may belong to another group.
          * </p>
          * @hide
          * STOPSHIP: Unhide or remove.
          */
-        public Builder addChildId(String childId) {
-            if (TextUtils.isEmpty(childId)) {
-                throw new IllegalArgumentException("childId must not be empty");
+        public Builder addGroupMemberId(String groupMemberId) {
+            if (TextUtils.isEmpty(groupMemberId)) {
+                throw new IllegalArgumentException("groupMemberId must not be empty");
             }
 
-            if (mChildIds == null) {
-                mChildIds = new ArrayList<>();
+            if (mGroupMemberIds == null) {
+                mGroupMemberIds = new ArrayList<>();
             }
-            if (!mChildIds.contains(childId)) {
-                mChildIds.add(childId);
+            if (!mGroupMemberIds.contains(groupMemberId)) {
+                mGroupMemberIds.add(groupMemberId);
             }
             return this;
         }
 
         /**
-         * Adds a list of child ids of the route.
+         * Adds a list of group member ids of the route.
          * <p>
-         * A route descriptor that has one or more child route ids represents a
-         * route group. A child route may belong to another group.
+         * A route descriptor that has one or more group member route ids
+         * represents a route group. A member route may belong to another group.
          * </p>
          * @hide
          * STOPSHIP: Unhide or remove.
          */
-        public Builder addChildIds(Collection<String> childIds) {
-            if (childIds == null) {
-                throw new IllegalArgumentException("childIds must not be null");
+        public Builder addGroupMemberIds(Collection<String> groupMemberIds) {
+            if (groupMemberIds == null) {
+                throw new IllegalArgumentException("groupMemberIds must not be null");
             }
 
-            if (!childIds.isEmpty()) {
-                for (String childId : childIds) {
-                    addChildId(childId);
+            if (!groupMemberIds.isEmpty()) {
+                for (String groupMemberId : groupMemberIds) {
+                    addGroupMemberId(groupMemberId);
                 }
             }
             return this;
@@ -594,8 +595,8 @@
             if (mControlFilters != null) {
                 mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, mControlFilters);
             }
-            if (mChildIds != null) {
-                mBundle.putStringArrayList(KEY_CHILD_IDS, mChildIds);
+            if (mGroupMemberIds != null) {
+                mBundle.putStringArrayList(KEY_GROUP_MEMBER_IDS, mGroupMemberIds);
             }
             return new MediaRouteDescriptor(mBundle, mControlFilters);
         }
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaRouter.java b/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
index 614dade..170ee65 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
@@ -39,6 +39,7 @@
 import android.support.v4.media.session.MediaSessionCompat;
 import android.support.v4.util.Pair;
 import android.support.v7.media.MediaRouteProvider.ProviderMetadata;
+import android.support.v7.media.MediaRouteProvider.RouteController;
 import android.util.Log;
 import android.view.Display;
 
@@ -783,7 +784,7 @@
         private int mVolume;
         private int mVolumeMax;
         private Display mPresentationDisplay;
-        private int mPresentationDisplayId = -1;
+        private int mPresentationDisplayId = PRESENTATION_DISPLAY_ID_NONE;
         private Bundle mExtras;
         private IntentSender mSettingsIntent;
         MediaRouteDescriptor mDescriptor;
@@ -867,6 +868,13 @@
          */
         public static final int PLAYBACK_VOLUME_VARIABLE = 1;
 
+        /**
+         * The default presentation display id indicating no presentation display is associated
+         * with the route.
+         * @hide
+         */
+        public static final int PRESENTATION_DISPLAY_ID_NONE = -1;
+
         static final int CHANGE_GENERAL = 1 << 0;
         static final int CHANGE_VOLUME = 1 << 1;
         static final int CHANGE_PRESENTATION_DISPLAY = 1 << 2;
@@ -1290,6 +1298,14 @@
         }
 
         /**
+         * Gets the route's presentation display id, or -1 if none.
+         * @hide
+         */
+        public int getPresentationDisplayId() {
+            return mPresentationDisplayId;
+        }
+
+        /**
          * Gets a collection of extra properties about this route that were supplied
          * by its media route provider, or null if none.
          */
@@ -1486,15 +1502,15 @@
             if (mDescriptor != descriptor) {
                 mDescriptor = descriptor;
                 if (descriptor != null) {
-                    List<String> childIds = descriptor.getChildIds();
+                    List<String> groupMemberIds = descriptor.getGroupMemberIds();
                     List<RouteInfo> routes = new ArrayList<>();
-                    changed = childIds.size() != mRoutes.size();
-                    for (String childId : childIds) {
-                        String uniqueChildId = sGlobal.getUniqueId(getProvider(), childId);
-                        RouteInfo child = sGlobal.getRoute(uniqueChildId);
-                        if (child != null) {
-                            routes.add(child);
-                            if (!changed && !mRoutes.contains(child)) {
+                    changed = groupMemberIds.size() != mRoutes.size();
+                    for (String groupMemberId : groupMemberIds) {
+                        String uniqueId = sGlobal.getUniqueId(getProvider(), groupMemberId);
+                        RouteInfo groupMember = sGlobal.getRoute(uniqueId);
+                        if (groupMember != null) {
+                            routes.add(groupMember);
+                            if (!changed && !mRoutes.contains(groupMember)) {
                                 changed = true;
                             }
                         }
@@ -1782,7 +1798,8 @@
         private RegisteredMediaRouteProviderWatcher mRegisteredProviderWatcher;
         private RouteInfo mDefaultRoute;
         private RouteInfo mSelectedRoute;
-        private MediaRouteProvider.RouteController mSelectedRouteController;
+        private RouteController mSelectedRouteController;
+        private Map<String, RouteController> mGroupMemberControllers;
         private MediaRouteDiscoveryRequest mDiscoveryRequest;
         private MediaSessionRecord mMediaSession;
         private MediaSessionCompat mRccMediaSession;
@@ -1873,6 +1890,11 @@
         public void requestSetVolume(RouteInfo route, int volume) {
             if (route == mSelectedRoute && mSelectedRouteController != null) {
                 mSelectedRouteController.onSetVolume(volume);
+            } else if (mGroupMemberControllers != null) {
+                RouteController controller = mGroupMemberControllers.get(route.mDescriptorId);
+                if (controller != null) {
+                    controller.onSetVolume(volume);
+                }
             }
         }
 
@@ -2113,7 +2135,7 @@
                             if (sourceIndex < 0) {
                                 // 1. Add the route to the list.
                                 String uniqueId = assignRouteUniqueId(provider, id);
-                                boolean isGroup = routeDescriptor.getChildIds() != null;
+                                boolean isGroup = routeDescriptor.getGroupMemberIds() != null;
                                 RouteInfo route = isGroup ? new RouteGroup(provider, id, uniqueId) :
                                         new RouteInfo(provider, id, uniqueId);
                                 provider.mRoutes.add(targetIndex++, route);
@@ -2355,6 +2377,13 @@
                         mSelectedRouteController.onRelease();
                         mSelectedRouteController = null;
                     }
+                    if (mGroupMemberControllers != null) {
+                        for (RouteController controller : mGroupMemberControllers.values()) {
+                            controller.onUnselect();
+                            controller.onRelease();
+                        }
+                        mGroupMemberControllers = null;
+                    }
                 }
 
                 mSelectedRoute = route;
@@ -2369,6 +2398,17 @@
                         Log.d(TAG, "Route selected: " + mSelectedRoute);
                     }
                     mCallbackHandler.post(CallbackHandler.MSG_ROUTE_SELECTED, mSelectedRoute);
+
+                    if (mSelectedRoute instanceof RouteGroup) {
+                        mGroupMemberControllers = new HashMap<>();
+                        RouteGroup group = (RouteGroup) mSelectedRoute;
+                        for (RouteInfo groupMember : group.getRoutes()) {
+                            RouteController controller = groupMember.getProviderInstance()
+                                    .onCreateRouteController(groupMember.mDescriptorId);
+                            controller.onSelect();
+                            mGroupMemberControllers.put(groupMember.mDescriptorId, controller);
+                        }
+                    }
                 }
 
                 updatePlaybackInfoFromSelectedRoute();
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
index a476559..eec60e2 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
@@ -604,7 +604,7 @@
 
                 // Now generate a quantizer from the Bitmap
                 final ColorCutQuantizer quantizer = new ColorCutQuantizer(
-                        getPixelsFromBitmap(),
+                        getPixelsFromBitmap(bitmap),
                         mMaxColors,
                         mFilters.isEmpty() ? null : mFilters.toArray(new Filter[mFilters.size()]));
 
@@ -669,8 +669,7 @@
                     }, mBitmap);
         }
 
-        private int[] getPixelsFromBitmap() {
-            final Bitmap bitmap = mBitmap;
+        private int[] getPixelsFromBitmap(Bitmap bitmap) {
             final int bitmapWidth = bitmap.getWidth();
             final int bitmapHeight = bitmap.getHeight();
             final int[] pixels = new int[bitmapWidth * bitmapHeight];
diff --git a/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java b/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
index 51f99bb..49efcf9 100644
--- a/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
+++ b/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
@@ -18,10 +18,11 @@
 
 import android.os.Handler;
 import android.os.Looper;
+import android.support.v4.content.ParallelExecutorCompat;
 import android.util.Log;
 
 import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 class MessageThreadUtil<T> implements ThreadUtil<T> {
 
@@ -83,7 +84,8 @@
     public BackgroundCallback<T> getBackgroundProxy(final BackgroundCallback<T> callback) {
         return new BackgroundCallback<T>() {
             final private MessageQueue mQueue = new MessageQueue();
-            final private Executor mExecutor = Executors.newSingleThreadExecutor();
+            final private Executor mExecutor = ParallelExecutorCompat.getParallelExecutor();
+            AtomicBoolean mBackgroundRunning = new AtomicBoolean(false);
 
             private static final int REFRESH = 1;
             private static final int UPDATE_RANGE = 2;
@@ -114,42 +116,51 @@
 
             private void sendMessage(SyncQueueItem msg) {
                 mQueue.sendMessage(msg);
-                mExecutor.execute(mBackgroundRunnable);
+                maybeExecuteBackgroundRunnable();
             }
 
             private void sendMessageAtFrontOfQueue(SyncQueueItem msg) {
                 mQueue.sendMessageAtFrontOfQueue(msg);
-                mExecutor.execute(mBackgroundRunnable);
+                maybeExecuteBackgroundRunnable();
+            }
+
+            private void maybeExecuteBackgroundRunnable() {
+                if (mBackgroundRunning.compareAndSet(false, true)) {
+                    mExecutor.execute(mBackgroundRunnable);
+                }
             }
 
             private Runnable mBackgroundRunnable = new Runnable() {
                 @Override
                 public void run() {
-                    SyncQueueItem msg = mQueue.next();
-                    if (msg == null) {
-                        return;
+                    while (true) {
+                        SyncQueueItem msg = mQueue.next();
+                        if (msg == null) {
+                            break;
+                        }
+                        switch (msg.what) {
+                            case REFRESH:
+                                mQueue.removeMessages(REFRESH);
+                                callback.refresh(msg.arg1);
+                                break;
+                            case UPDATE_RANGE:
+                                mQueue.removeMessages(UPDATE_RANGE);
+                                mQueue.removeMessages(LOAD_TILE);
+                                callback.updateRange(
+                                        msg.arg1, msg.arg2, msg.arg3, msg.arg4, msg.arg5);
+                                break;
+                            case LOAD_TILE:
+                                callback.loadTile(msg.arg1, msg.arg2);
+                                break;
+                            case RECYCLE_TILE:
+                                //noinspection unchecked
+                                callback.recycleTile((TileList.Tile<T>) msg.data);
+                                break;
+                            default:
+                                Log.e("ThreadUtil", "Unsupported message, what=" + msg.what);
+                        }
                     }
-                    switch (msg.what) {
-                        case REFRESH:
-                            mQueue.removeMessages(REFRESH);
-                            callback.refresh(msg.arg1);
-                            break;
-                        case UPDATE_RANGE:
-                            mQueue.removeMessages(UPDATE_RANGE);
-                            mQueue.removeMessages(LOAD_TILE);
-                            callback.updateRange(
-                                    msg.arg1, msg.arg2, msg.arg3, msg.arg4, msg.arg5);
-                            break;
-                        case LOAD_TILE:
-                            callback.loadTile(msg.arg1, msg.arg2);
-                            break;
-                        case RECYCLE_TILE:
-                            //noinspection unchecked
-                            callback.recycleTile((TileList.Tile<T>) msg.data);
-                            break;
-                        default:
-                            Log.e("ThreadUtil", "Unsupported message, what=" + msg.what);
-                    }
+                    mBackgroundRunning.set(false);
                 }
             };
         };
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java b/v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java
index e9147a0..f985898 100644
--- a/v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/util/AsyncListUtilTest.java
@@ -16,22 +16,13 @@
 
 package android.support.v7.util;
 
-import android.support.test.runner.AndroidJUnit4;
+import android.support.annotation.UiThread;
 import android.util.SparseBooleanArray;
 
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
-
-@RunWith(AndroidJUnit4.class)
-public class AsyncListUtilTest {
+public class AsyncListUtilTest extends BaseThreadedTest {
 
     private static final int TILE_SIZE = 10;
 
@@ -40,34 +31,37 @@
 
     AsyncListUtil<String> mAsyncListUtil;
 
-
-    @Before
+    @Override
     public void setUp() throws Exception {
         mDataCallback = new TestDataCallback();
         mViewCallback = new TestViewCallback();
 
         mDataCallback.expectTiles(0, 10, 20);
-        mAsyncListUtil = new AsyncListUtil<String>(String.class, TILE_SIZE, mDataCallback,
-                mViewCallback);
+        super.setUp();
         mDataCallback.waitForTiles("initial load");
     }
 
-    @After
+    @Override
+    @UiThread
+    protected void setUpUi() {
+        mAsyncListUtil = new AsyncListUtil<String>(
+                String.class, TILE_SIZE, mDataCallback, mViewCallback);
+    }
+
+    @Override
     public void tearDown() throws Exception {
         /// Wait a little extra to catch spurious messages.
         new CountDownLatch(1).await(500, TimeUnit.MILLISECONDS);
     }
 
-    @Test
-    public void testWithNoPreload() throws InterruptedException {
+    public void testWithNoPreload() throws Throwable {
         scrollAndExpectTiles(10, "scroll to 10", 30);
         scrollAndExpectTiles(25, "scroll to 25", 40);
         scrollAndExpectTiles(45, "scroll to 45", 50, 60);
         scrollAndExpectTiles(70, "scroll to 70", 70, 80, 90);
     }
 
-    @Test
-    public void testWithPreload() throws InterruptedException {
+    public void testWithPreload() throws Throwable {
         mViewCallback.mStartPreload = 5;
         mViewCallback.mEndPreload = 15;
         scrollAndExpectTiles(50, "scroll down a lot", 40, 50, 60, 70, 80);
@@ -78,8 +72,7 @@
         scrollAndExpectTiles(40, "scroll up a little, no new tiles loaded");
     }
 
-    @Test
-    public void testTileCaching() throws InterruptedException {
+    public void testTileCaching() throws Throwable {
         scrollAndExpectTiles(25, "next screen", 30, 40);
 
         scrollAndExpectTiles(0, "back at top, no new page loads");
@@ -90,35 +83,34 @@
         scrollAndExpectTiles(0, "scroll back to top, all pages should reload", 0, 10, 20);
     }
 
-    @Test
-    public void testDataRefresh() throws InterruptedException {
+    public void testDataRefresh() throws Throwable {
         mViewCallback.expectDataSetChanged(40);
         mDataCallback.expectTiles(0, 10, 20);
-        mAsyncListUtil.refresh();
+        refreshOnUiThread();
         mViewCallback.waitForDataSetChanged("increasing item count");
         mDataCallback.waitForTiles("increasing item count");
 
         mViewCallback.expectDataSetChanged(15);
         mDataCallback.expectTiles(0, 10);
-        mAsyncListUtil.refresh();
+        refreshOnUiThread();
         mViewCallback.waitForDataSetChanged("decreasing item count");
         mDataCallback.waitForTiles("decreasing item count");
     }
 
-    @Test
-    public void testItemChanged() throws InterruptedException {
+    public void testItemChanged() throws Throwable {
         final int position = 30;
         final int count = 20;
 
-        assertEquals("no new items should be loaded", 0, getLoadedItemCount(position, count));
+        assertLoadedItemsOnUiThread("no new items should be loaded", 0, position, count);
 
         mViewCallback.expectItemRangeChanged(position, count);
         scrollAndExpectTiles(20, "scrolling to missing items", 30, 40);
         mViewCallback.waitForItems();
 
-        assertEquals("all new items should be loaded", count, getLoadedItemCount(position, count));
+        assertLoadedItemsOnUiThread("all new items should be loaded", count, position, count);
     }
 
+    @UiThread
     private int getLoadedItemCount(int startPosition, int itemCount) {
         int loaded = 0;
         for (int i = 0; i < itemCount; i++) {
@@ -130,9 +122,9 @@
     }
 
     private void scrollAndExpectTiles(int position, String context, int... positions)
-            throws InterruptedException {
+            throws Throwable {
         mDataCallback.expectTiles(positions);
-        mViewCallback.scrollTo(position);
+        scrollOnUiThread(position);
         mDataCallback.waitForTiles(context);
     }
 
@@ -141,6 +133,36 @@
         assertTrue("timed out waiting for " + context, latch.await(1, TimeUnit.SECONDS));
     }
 
+    private void refreshOnUiThread() throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mAsyncListUtil.refresh();
+            }
+        });
+    }
+
+    private void assertLoadedItemsOnUiThread(final String message,
+                                             final int expectedCount,
+                                             final int position,
+                                             final int count) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                assertEquals(message, expectedCount, getLoadedItemCount(position, count));
+            }
+        });
+    }
+
+    private void scrollOnUiThread(final int position) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mViewCallback.scrollTo(position);
+            }
+        });
+    }
+
     private class TestDataCallback extends AsyncListUtil.DataCallback<String> {
         private int mCacheSize = 10;
 
@@ -205,6 +227,7 @@
         }
 
         @Override
+        @UiThread
         public void onDataRefresh() {
             if (mDataRefreshLatch == null) {
                 return;
@@ -239,12 +262,14 @@
             waitForLatch("onItemChanged", mItemsChangedLatch.mLatch);
         }
 
+        @UiThread
         public void scrollTo(int position) {
             mLastVisibleItem += position - mFirstVisibleItem;
             mFirstVisibleItem = position;
             mAsyncListUtil.onRangeChanged();
         }
 
+        @UiThread
         private void updateViewport() {
             int itemCount = mAsyncListUtil.getItemCount();
             if (mLastVisibleItem < itemCount) {
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/BaseThreadedTest.java b/v7/recyclerview/tests/src/android/support/v7/util/BaseThreadedTest.java
new file mode 100644
index 0000000..73df9a7
--- /dev/null
+++ b/v7/recyclerview/tests/src/android/support/v7/util/BaseThreadedTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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.v7.util;
+
+import android.support.annotation.UiThread;
+import android.support.v7.widget.TestActivity;
+import android.test.ActivityInstrumentationTestCase2;
+
+abstract public class BaseThreadedTest extends ActivityInstrumentationTestCase2<TestActivity> {
+    public BaseThreadedTest() {
+        super(TestActivity.class);
+    }
+
+    @Override
+    public void setUp() throws Exception{
+        try {
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    setUpUi();
+                }
+            });
+        } catch (Throwable throwable) {
+            fail(throwable.getMessage());
+        }
+    }
+
+    @UiThread
+    protected abstract void setUpUi();
+}
diff --git a/v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java b/v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java
index daa2ffc..472374d 100644
--- a/v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/util/ThreadUtilTest.java
@@ -19,27 +19,23 @@
 import static org.hamcrest.MatcherAssert.*;
 import static org.hamcrest.CoreMatchers.*;
 
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
 import android.os.Looper;
-import android.support.test.runner.AndroidJUnit4;
+import android.support.annotation.UiThread;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
-@RunWith(AndroidJUnit4.class)
-public class ThreadUtilTest {
+public class ThreadUtilTest extends BaseThreadedTest {
     Map<String, LockedObject> results = new HashMap<>();
 
     ThreadUtil.MainThreadCallback<Integer> mMainThreadProxy;
     ThreadUtil.BackgroundCallback<Integer> mBackgroundProxy;
 
-    @Before
-    public void setup() {
+    @Override
+    @UiThread
+    public void setUpUi() {
         ThreadUtil<Integer> threadUtil = new MessageThreadUtil<>();
 
         mMainThreadProxy = threadUtil.getMainThreadProxy(
@@ -93,15 +89,15 @@
                 });
     }
 
-    @Test
     public void testUpdateItemCount() throws InterruptedException {
         initWait("updateItemCount");
+        // In this test and below the calls to mMainThreadProxy are not really made from the UI
+        // thread. That's OK since the message queue inside mMainThreadProxy is synchronized.
         mMainThreadProxy.updateItemCount(7, 9);
         Object[] data = waitFor("updateItemCount");
         assertThat(data, is(new Object[]{7, 9}));
     }
 
-    @Test
     public void testAddTile() throws InterruptedException {
         initWait("addTile");
         TileList.Tile<Integer> tile = new TileList.Tile<Integer>(Integer.class, 10);
@@ -110,7 +106,6 @@
         assertThat(data, is(new Object[]{3, tile}));
     }
 
-    @Test
     public void testRemoveTile() throws InterruptedException {
         initWait("removeTile");
         mMainThreadProxy.removeTile(1, 2);
@@ -118,15 +113,15 @@
         assertThat(data, is(new Object[]{1, 2}));
     }
 
-    @Test
     public void testRefresh() throws InterruptedException {
         initWait("refresh");
+        // In this test and below the calls to mBackgroundProxy are not really made from the worker
+        // thread. That's OK since the message queue inside mBackgroundProxy is synchronized.
         mBackgroundProxy.refresh(2);
         Object[] data = waitFor("refresh");
         assertThat(data, is(new Object[]{2}));
     }
 
-    @Test
     public void testRangeUpdate() throws InterruptedException {
         initWait("updateRange");
         mBackgroundProxy.updateRange(10, 20, 5, 25, 1);
@@ -134,7 +129,6 @@
         assertThat(data, is(new Object[] {10, 20, 5, 25, 1}));
     }
 
-    @Test
     public void testLoadTile() throws InterruptedException {
         initWait("loadTile");
         mBackgroundProxy.loadTile(2, 1);
@@ -142,7 +136,6 @@
         assertThat(data, is(new Object[]{2, 1}));
     }
 
-    @Test
     public void testRecycleTile() throws InterruptedException {
         initWait("recycleTile");
         TileList.Tile<Integer> tile = new TileList.Tile<Integer>(Integer.class, 10);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
index 3889cfa..b8f6788 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/AsyncListUtilLayoutTest.java
@@ -76,8 +76,13 @@
         mDataCallback.expectTilesInRange(rangeStart, rangeSize);
         mAdapter.expectItemsInRange(rangeStart, rangeSize);
 
-        mAsyncListUtil = new AsyncListUtil<String>(String.class, TILE_SIZE, mDataCallback,
-                mViewCallback);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mAsyncListUtil = new AsyncListUtil<String>(
+                        String.class, TILE_SIZE, mDataCallback, mViewCallback);
+            }
+        });
 
         mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
             @Override