Add missing 25.2.0 API file
am: 4ea4223933

Change-Id: Ice9f9557420dbc10430b64d20e5a1874a4784de8
diff --git a/api/current.txt b/api/current.txt
index 38fb0b6..b420217 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5909,72 +5909,72 @@
     field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
   }
 
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
+  public abstract deprecated class TransportController {
+    ctor public deprecated TransportController();
+    method public abstract deprecated int getBufferPercentage();
+    method public abstract deprecated long getCurrentPosition();
+    method public abstract deprecated long getDuration();
+    method public abstract deprecated int getTransportControlFlags();
+    method public abstract deprecated boolean isPlaying();
+    method public abstract deprecated void pausePlaying();
+    method public abstract deprecated void registerStateListener(android.support.v4.media.TransportStateListener);
+    method public abstract deprecated void seekTo(long);
+    method public abstract deprecated void startPlaying();
+    method public abstract deprecated void stopPlaying();
+    method public abstract deprecated void unregisterStateListener(android.support.v4.media.TransportStateListener);
   }
 
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
+  public deprecated class TransportMediator extends android.support.v4.media.TransportController {
+    ctor public deprecated TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
+    ctor public deprecated TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
+    method public deprecated void destroy();
+    method public deprecated boolean dispatchKeyEvent(android.view.KeyEvent);
+    method public deprecated int getBufferPercentage();
+    method public deprecated long getCurrentPosition();
+    method public deprecated long getDuration();
+    method public deprecated java.lang.Object getRemoteControlClient();
+    method public deprecated int getTransportControlFlags();
+    method public deprecated boolean isPlaying();
+    method public deprecated void pausePlaying();
+    method public deprecated void refreshState();
+    method public deprecated void registerStateListener(android.support.v4.media.TransportStateListener);
+    method public deprecated void seekTo(long);
+    method public deprecated void startPlaying();
+    method public deprecated void stopPlaying();
+    method public deprecated void unregisterStateListener(android.support.v4.media.TransportStateListener);
+    field public static final deprecated int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
+    field public static final deprecated int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
+    field public static final deprecated int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
+    field public static final deprecated int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
+    field public static final deprecated int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
+    field public static final deprecated int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+    field public static final deprecated int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
+    field public static final deprecated int FLAG_KEY_MEDIA_STOP = 32; // 0x20
+    field public static final deprecated int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
+    field public static final deprecated int KEYCODE_MEDIA_PLAY = 126; // 0x7e
+    field public static final deprecated int KEYCODE_MEDIA_RECORD = 130; // 0x82
   }
 
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
+  public abstract deprecated class TransportPerformer {
+    ctor public deprecated TransportPerformer();
+    method public deprecated void onAudioFocusChange(int);
+    method public deprecated int onGetBufferPercentage();
+    method public abstract deprecated long onGetCurrentPosition();
+    method public abstract deprecated long onGetDuration();
+    method public deprecated int onGetTransportControlFlags();
+    method public abstract deprecated boolean onIsPlaying();
+    method public deprecated boolean onMediaButtonDown(int, android.view.KeyEvent);
+    method public deprecated boolean onMediaButtonUp(int, android.view.KeyEvent);
+    method public abstract deprecated void onPause();
+    method public abstract deprecated void onSeekTo(long);
+    method public abstract deprecated void onStart();
+    method public abstract deprecated void onStop();
   }
 
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
+  public deprecated class TransportStateListener {
+    ctor public deprecated TransportStateListener();
+    method public deprecated void onPlayingChanged(android.support.v4.media.TransportController);
+    method public deprecated void onTransportControlsChanged(android.support.v4.media.TransportController);
   }
 
   public abstract class VolumeProviderCompat {
@@ -6012,6 +6012,8 @@
   public final class MediaControllerCompat {
     ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
     ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
+    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void addQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
     method public void adjustVolume(int, int);
     method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
     method public android.os.Bundle getExtras();
@@ -6032,6 +6034,8 @@
     method public boolean isShuffleModeEnabled();
     method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
     method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
+    method public void removeQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void removeQueueItemAt(int);
     method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
     method public static void setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat);
     method public void setVolumeTo(int, int);
@@ -6118,11 +6122,14 @@
     method public void setSessionActivity(android.app.PendingIntent);
     method public void setShuffleModeEnabled(boolean);
     field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+    field public static final int FLAG_HANDLES_QUEUE_COMMANDS = 4; // 0x4
     field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
   }
 
   public static abstract class MediaSessionCompat.Callback {
     ctor public MediaSessionCompat.Callback();
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void onAddQueueItem(android.support.v4.media.MediaDescriptionCompat, int);
     method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
     method public void onCustomAction(java.lang.String, android.os.Bundle);
     method public void onFastForward();
@@ -6136,6 +6143,8 @@
     method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
     method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
     method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
+    method public void onRemoveQueueItem(android.support.v4.media.MediaDescriptionCompat);
+    method public void onRemoveQueueItemAt(int);
     method public void onRewind();
     method public void onSeekTo(long);
     method public void onSetRating(android.support.v4.media.RatingCompat);
diff --git a/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java b/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java
index c745f17..23ef7c5 100644
--- a/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java
+++ b/design/tests/src/android/support/design/widget/AppBarWithToolbarAndTabsTest.java
@@ -27,7 +27,9 @@
 import android.support.annotation.StringRes;
 import android.support.design.test.R;
 import android.support.design.testutils.Cheeses;
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
+import android.support.test.filters.Suppress;
 
 import org.junit.Test;
 
@@ -232,6 +234,8 @@
         assertAppBarElevation(mDefaultElevationValue);
     }
 
+    @Suppress
+    @FlakyTest(bugId = 30701044)
     @LargeTest
     @Test
     public void testSnappingToolbarAndSnappingTabs() throws Throwable {
diff --git a/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java b/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
index 308c490..dfab20b 100644
--- a/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
+++ b/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
@@ -48,9 +48,13 @@
 
         @Override
         public void onItemLoaded(MediaBrowser.MediaItem item) {
-            Parcel parcel = Parcel.obtain();
-            item.writeToParcel(parcel, 0);
-            mItemCallback.onItemLoaded(parcel);
+            if (item == null) {
+                mItemCallback.onItemLoaded(null);
+            } else {
+                Parcel parcel = Parcel.obtain();
+                item.writeToParcel(parcel, 0);
+                mItemCallback.onItemLoaded(parcel);
+            }
         }
 
         @Override
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
index 214c815..414662a 100644
--- a/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
@@ -778,10 +778,15 @@
 
             @Override
             public void onItemLoaded(Parcel itemParcel) {
-                itemParcel.setDataPosition(0);
-                MediaItem item = MediaBrowserCompat.MediaItem.CREATOR.createFromParcel(itemParcel);
-                itemParcel.recycle();
-                ItemCallback.this.onItemLoaded(item);
+                if (itemParcel == null) {
+                    ItemCallback.this.onItemLoaded(null);
+                } else {
+                    itemParcel.setDataPosition(0);
+                    MediaItem item =
+                            MediaBrowserCompat.MediaItem.CREATOR.createFromParcel(itemParcel);
+                    itemParcel.recycle();
+                    ItemCallback.this.onItemLoaded(item);
+                }
             }
 
             @Override
diff --git a/media-compat/java/android/support/v4/media/MediaDescriptionCompat.aidl b/media-compat/java/android/support/v4/media/MediaDescriptionCompat.aidl
new file mode 100644
index 0000000..f002cdd
--- /dev/null
+++ b/media-compat/java/android/support/v4/media/MediaDescriptionCompat.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2017, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.support.v4.media;
+
+parcelable MediaDescriptionCompat;
diff --git a/media-compat/java/android/support/v4/media/TransportController.java b/media-compat/java/android/support/v4/media/TransportController.java
index b92a4a1..d1d2649 100644
--- a/media-compat/java/android/support/v4/media/TransportController.java
+++ b/media-compat/java/android/support/v4/media/TransportController.java
@@ -16,64 +16,111 @@
 
 package android.support.v4.media;
 
+import android.support.v4.media.session.MediaControllerCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
+
 /**
  * Base interface to controlling a media transport.  This is the
  * interface for implementing things like on-screen controls: it
  * allows them to request changes in playback, retrieve the current
  * playback state, and monitor for changes to the playback state.
+ *
+ * @deprecated Use {@link MediaControllerCompat}.
  */
+@Deprecated
 public abstract class TransportController {
     /**
-     * Start listening to changes in playback state.
+     * @deprecated Use {@link MediaControllerCompat}.
      */
+    @Deprecated
+    public TransportController() {
+    }
+
+    /**
+     * Start listening to changes in playback state.
+     *
+     * @deprecated Use
+     *         {@link MediaControllerCompat#registerCallback(MediaControllerCompat.Callback)}.
+     */
+    @Deprecated
     public abstract void registerStateListener(TransportStateListener listener);
 
     /**
      * Stop listening to changes in playback state.
+     *
+     * @deprecated Use
+     *         {@link MediaControllerCompat#unregisterCallback(MediaControllerCompat.Callback)}.
      */
+    @Deprecated
     public abstract void unregisterStateListener(TransportStateListener listener);
 
     /**
      * Request that the player start its playback at its current position.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#play}.
      */
+    @Deprecated
     public abstract void startPlaying();
 
     /**
      * Request that the player pause its playback and stay at its current position.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#pause}.
      */
+    @Deprecated
     public abstract void pausePlaying();
 
     /**
      * Request that the player stop its playback; it may clear its state in whatever
      * way is appropriate.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#stop}.
      */
+    @Deprecated
     public abstract void stopPlaying();
 
     /**
      * Retrieve the total duration of the media stream, in milliseconds.
+     *
+     * @deprecated Use {@link MediaMetadataCompat#METADATA_KEY_DURATION}.
      */
+    @Deprecated
     public abstract long getDuration();
 
     /**
      * Retrieve the current playback location in the media stream, in milliseconds.
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getPosition} and
+     *         {@link PlaybackStateCompat#getLastPositionUpdateTime}.
      */
+    @Deprecated
     public abstract long getCurrentPosition();
 
     /**
      * Move to a new location in the media stream.
      * @param pos Position to move to, in milliseconds.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#seekTo}.
      */
+    @Deprecated
     public abstract void seekTo(long pos);
 
     /**
      * Return whether the player is currently playing its stream.
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getState}.
      */
+    @Deprecated
     public abstract boolean isPlaying();
 
     /**
      * Retrieve amount, in percentage (0-100), that the media stream has been buffered
      * on to the local device.  Return 100 if the stream is always local.
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getBufferedPosition} and
+     *         {@link MediaMetadataCompat#METADATA_KEY_DURATION}.
      */
+    @Deprecated
     public abstract int getBufferPercentage();
 
     /**
@@ -87,6 +134,9 @@
      *      {@link TransportMediator#FLAG_KEY_MEDIA_STOP},
      *      {@link TransportMediator#FLAG_KEY_MEDIA_FAST_FORWARD},
      *      {@link TransportMediator#FLAG_KEY_MEDIA_NEXT}
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getActions}.
      */
+    @Deprecated
     public abstract int getTransportControlFlags();
 }
diff --git a/media-compat/java/android/support/v4/media/TransportMediator.java b/media-compat/java/android/support/v4/media/TransportMediator.java
index ec3baec..40c245c 100644
--- a/media-compat/java/android/support/v4/media/TransportMediator.java
+++ b/media-compat/java/android/support/v4/media/TransportMediator.java
@@ -19,7 +19,10 @@
 import android.app.Activity;
 import android.content.Context;
 import android.media.AudioManager;
+import android.media.RemoteControlClient;
 import android.os.Build;
+import android.support.v4.media.session.MediaControllerCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
 import android.view.KeyEvent;
 import android.view.View;
 
@@ -43,7 +46,10 @@
  *
  * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/media/TransportControllerActivity.java
  *      complete}
+ *
+ * @deprecated Use {@link MediaControllerCompat}.
  */
+@Deprecated
 public class TransportMediator extends TransportController {
     final Context mContext;
     final TransportPerformer mCallbacks;
@@ -75,36 +81,91 @@
         }
     };
 
-    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_PLAY KeyEvent.KEYCODE_MEDIA_PLAY} */
+    /**
+     * Synonym for {@link KeyEvent#KEYCODE_MEDIA_PLAY KeyEvent.KEYCODE_MEDIA_PLAY}
+     *
+     * @deprecated Use {@link KeyEvent#KEYCODE_MEDIA_PLAY}.
+     */
+    @Deprecated
     public static final int KEYCODE_MEDIA_PLAY = 126;
-    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_PAUSE KeyEvent.KEYCODE_MEDIA_PAUSE} */
+    /**
+     * Synonym for {@link KeyEvent#KEYCODE_MEDIA_PAUSE KeyEvent.KEYCODE_MEDIA_PAUSE}
+     *
+     * @deprecated Use {@link KeyEvent#KEYCODE_MEDIA_PAUSE}.
+     */
+    @Deprecated
     public static final int KEYCODE_MEDIA_PAUSE = 127;
-    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_RECORD KeyEvent.KEYCODE_MEDIA_RECORD} */
+    /**
+     * Synonym for {@link KeyEvent#KEYCODE_MEDIA_RECORD KeyEvent.KEYCODE_MEDIA_RECORD}
+     *
+     * @deprecated Use {@link KeyEvent#KEYCODE_MEDIA_RECORD}.
+     */
+    @Deprecated
     public static final int KEYCODE_MEDIA_RECORD = 130;
 
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS
-     * RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS
+     * RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_PREVIOUS = 1 << 0;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_REWIND
-     * RemoteControlClient.FLAG_KEY_MEDIA_REWIND} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_REWIND
+     * RemoteControlClient.FLAG_KEY_MEDIA_REWIND}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_REWIND}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_REWIND = 1 << 1;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY
-     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY
+     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_PLAY}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_PLAY = 1 << 2;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY_PAUSE
-     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY_PAUSE
+     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_PLAY_PAUSE}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_PLAY_PAUSE = 1 << 3;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PAUSE
-     * RemoteControlClient.FLAG_KEY_MEDIA_PAUSE} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PAUSE
+     * RemoteControlClient.FLAG_KEY_MEDIA_PAUSE}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_PAUSE}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_PAUSE = 1 << 4;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_STOP
-     * RemoteControlClient.FLAG_KEY_MEDIA_STOP} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_STOP
+     * RemoteControlClient.FLAG_KEY_MEDIA_STOP}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_STOP}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_STOP = 1 << 5;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_FAST_FORWARD
-     * RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_FAST_FORWARD
+     * RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_FAST_FORWARD}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_FAST_FORWARD = 1 << 6;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT
-     * RemoteControlClient.FLAG_KEY_MEDIA_NEXT} */
+    /**
+     * Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT
+     * RemoteControlClient.FLAG_KEY_MEDIA_NEXT}
+     *
+     * @deprecated Use {@link RemoteControlClient#FLAG_KEY_MEDIA_NEXT}.
+     */
+    @Deprecated
     public final static int FLAG_KEY_MEDIA_NEXT = 1 << 7;
 
     static boolean isMediaKey(int keyCode) {
@@ -148,10 +209,18 @@
         }
     };
 
+    /**
+     * @deprecated Use {@link MediaControllerCompat}.
+     */
+    @Deprecated
     public TransportMediator(Activity activity, TransportPerformer callbacks) {
         this(activity, null, callbacks);
     }
 
+    /**
+     * @deprecated Use {@link MediaControllerCompat}.
+     */
+    @Deprecated
     public TransportMediator(View view, TransportPerformer callbacks) {
         this(null, view, callbacks);
     }
@@ -185,7 +254,10 @@
      * you will interact with these through
      * {@link TransportPerformer#onGetCurrentPosition() TransportPerformer.onGetCurrentPosition} and
      * {@link TransportPerformer#onSeekTo TransportPerformer.onSeekTo}, respectively.</p>
+     *
+     * @deprecated Use {@link MediaControllerCompat}.
      */
+    @Deprecated
     public Object getRemoteControlClient() {
         return mController != null ? mController.getRemoteControlClient() : null;
     }
@@ -195,16 +267,33 @@
      * the transport an opportunity to intercept media keys.  Any such keys will show up
      * in {@link TransportPerformer}.
      * @param event
+     *
+     * @deprecated Use {@link MediaControllerCompat#dispatchMediaButtonEvent}.
      */
+    @Deprecated
     public boolean dispatchKeyEvent(KeyEvent event) {
         return event.dispatch(mKeyEventCallback, (KeyEvent.DispatcherState) mDispatcherState, this);
     }
 
+    /**
+     * Start listening to changes in playback state.
+     *
+     * @deprecated Use
+     *         {@link MediaControllerCompat#registerCallback(MediaControllerCompat.Callback)}.
+     */
+    @Deprecated
     @Override
     public void registerStateListener(TransportStateListener listener) {
         mListeners.add(listener);
     }
 
+    /**
+     * Stop listening to changes in playback state.
+     *
+     * @deprecated Use
+     *         {@link MediaControllerCompat#unregisterCallback(MediaControllerCompat.Callback)}.
+     */
+    @Deprecated
     @Override
     public void unregisterStateListener(TransportStateListener listener) {
         mListeners.remove(listener);
@@ -245,6 +334,10 @@
         }
     }
 
+    /**
+     * @deprecated Not needed when you use {@link MediaControllerCompat}.
+     */
+    @Deprecated
     public void refreshState() {
         pushControllerState();
         reportPlayingChanged();
@@ -254,7 +347,10 @@
     /**
      * Move the controller into the playing state.  This updates the remote control
      * client to indicate it is playing, and takes audio focus for the app.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#play}.
      */
+    @Deprecated
     @Override
     public void startPlaying() {
         if (mController != null) {
@@ -268,7 +364,10 @@
     /**
      * Move the controller into the paused state.  This updates the remote control
      * client to indicate it is paused, but keeps audio focus.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#pause}.
      */
+    @Deprecated
     @Override
     public void pausePlaying() {
         if (mController != null) {
@@ -282,7 +381,10 @@
     /**
      * Move the controller into the stopped state.  This updates the remote control
      * client to indicate it is stopped, and removes audio focus from the app.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#stop}.
      */
+    @Deprecated
     @Override
     public void stopPlaying() {
         if (mController != null) {
@@ -293,33 +395,67 @@
         reportPlayingChanged();
     }
 
+    /**
+     * Retrieve the total duration of the media stream, in milliseconds.
+     *
+     * @deprecated Use {@link MediaMetadataCompat#METADATA_KEY_DURATION}.
+     */
+    @Deprecated
     @Override
     public long getDuration() {
         return mCallbacks.onGetDuration();
     }
 
+    /**
+     * Retrieve the current playback location in the media stream, in milliseconds.
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getPosition} and
+     *         {@link PlaybackStateCompat#getLastPositionUpdateTime}.
+     */
+    @Deprecated
     @Override
     public long getCurrentPosition() {
         return mCallbacks.onGetCurrentPosition();
     }
 
+    /**
+     * Move to a new location in the media stream.
+     * @param pos Position to move to, in milliseconds.
+     *
+     * @deprecated Use {@link MediaControllerCompat.TransportControls#seekTo}.
+     */
+    @Deprecated
     @Override
     public void seekTo(long pos) {
         mCallbacks.onSeekTo(pos);
     }
 
+    /**
+     * Return whether the player is currently playing its stream.
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getState}.
+     */
+    @Deprecated
     @Override
     public boolean isPlaying() {
         return mCallbacks.onIsPlaying();
     }
 
+    /**
+     * Retrieve amount, in percentage (0-100), that the media stream has been buffered
+     * on to the local device.  Return 100 if the stream is always local.
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getBufferedPosition} and
+     *         {@link MediaMetadataCompat#METADATA_KEY_DURATION}.
+     */
+    @Deprecated
     @Override
     public int getBufferPercentage() {
         return mCallbacks.onGetBufferPercentage();
     }
 
     /**
-     * Retrieves the flags for the media transport control buttons that this transport supports.
+     * Retrieve the flags for the media transport control buttons that this transport supports.
      * Result is a combination of the following flags:
      *      {@link #FLAG_KEY_MEDIA_PREVIOUS},
      *      {@link #FLAG_KEY_MEDIA_REWIND},
@@ -329,7 +465,10 @@
      *      {@link #FLAG_KEY_MEDIA_STOP},
      *      {@link #FLAG_KEY_MEDIA_FAST_FORWARD},
      *      {@link #FLAG_KEY_MEDIA_NEXT}
+     *
+     * @deprecated Use {@link PlaybackStateCompat#getActions}.
      */
+    @Deprecated
     @Override
     public int getTransportControlFlags() {
         return mCallbacks.onGetTransportControlFlags();
@@ -339,7 +478,10 @@
      * Optionally call when no longer using the TransportController.  Its resources
      * will also be automatically cleaned up when your activity/view is detached from
      * its window, so you don't normally need to call this explicitly.
+     *
+     * @deprecated Not needed when you use {@link MediaControllerCompat}.
      */
+    @Deprecated
     public void destroy() {
         mController.destroy();
     }
diff --git a/media-compat/java/android/support/v4/media/TransportPerformer.java b/media-compat/java/android/support/v4/media/TransportPerformer.java
index 2d3afc9..79e4869 100644
--- a/media-compat/java/android/support/v4/media/TransportPerformer.java
+++ b/media-compat/java/android/support/v4/media/TransportPerformer.java
@@ -17,6 +17,8 @@
 package android.support.v4.media;
 
 import android.os.SystemClock;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.media.session.PlaybackStateCompat.Builder;
 import android.view.KeyEvent;
 
 /**
@@ -25,45 +27,77 @@
  * requests may either come from key events dispatched directly to your UI, or
  * events sent over a media button event receiver that this class keeps active
  * while your window is in focus.
+ *
+ * @deprecated Use {@link MediaSessionCompat}.
  */
+@Deprecated
 public abstract class TransportPerformer {
     /**
+     * @deprecated Use {@link MediaSessionCompat}.
+     */
+    @Deprecated
+    public TransportPerformer() {
+    }
+
+    /**
      * Request to start playback on the media, resuming from whatever current state
      * (position etc) it is in.
+     *
+     * @deprecated Use {@link MediaSessionCompat.Callback#onPlay}.
      */
+    @Deprecated
     public abstract void onStart();
 
     /**
      * Request to pause playback of the media, staying at the current playback position
      * and other state so a later call to {@link #onStart()} will resume at the same place.
+     *
+     * @deprecated Use {@link MediaSessionCompat.Callback#onPause}.
      */
+    @Deprecated
     public abstract void onPause();
 
     /**
      * Request to completely stop playback of the media, clearing whatever state the
      * player thinks is appropriate.
+     *
+     * @deprecated Use {@link MediaSessionCompat.Callback#onStop}.
      */
+    @Deprecated
     public abstract void onStop();
 
     /**
      * Request to return the duration of the current media, in milliseconds.
+     *
+     * @deprecated Use {@link MediaMetadataCompat.Builder#putLong} with
+     *         {@link MediaMetadataCompat#METADATA_KEY_DURATION}.
      */
+    @Deprecated
     public abstract long onGetDuration();
 
     /**
      * Request to return the current playback position, in milliseconds.
+     *
+     * @deprecated Use {@link Builder#setState(int, long, float)}.
      */
+    @Deprecated
     public abstract long onGetCurrentPosition();
 
     /**
      * Request to move the current playback position.
      * @param pos New position to move to, in milliseconds.
+     *
+     * @deprecated Use {@link MediaSessionCompat.Callback#onSeekTo}.
      */
+    @Deprecated
     public abstract void onSeekTo(long pos);
 
     /**
      * Request to find out whether the player is currently playing its media.
+     *
+     * @deprecated Use {@link Builder#setState(int, long, float)}.
      */
+    @Deprecated
     public abstract boolean onIsPlaying();
 
     /**
@@ -71,7 +105,10 @@
      * @return Return a percentage (0-100) indicating how much of the total data
      * has been buffered.  The default implementation returns 100, meaning the content
      * is always on the local device.
+     *
+     * @deprecated Use {@link Builder#setBufferedPosition}.
      */
+    @Deprecated
     public int onGetBufferPercentage() {
         return 100;
     }
@@ -93,7 +130,10 @@
      *      {@link TransportMediator#FLAG_KEY_MEDIA_PLAY_PAUSE},
      *      {@link TransportMediator#FLAG_KEY_MEDIA_PAUSE}, and
      *      {@link TransportMediator#FLAG_KEY_MEDIA_STOP}</p>
+     *
+     * @deprecated Use {@link Builder#setActions}.
      */
+    @Deprecated
     public int onGetTransportControlFlags() {
         return TransportMediator.FLAG_KEY_MEDIA_PLAY
                 | TransportMediator.FLAG_KEY_MEDIA_PLAY_PAUSE
@@ -122,7 +162,10 @@
      * continues on to its default key handling (which for media keys means
      * being delivered to the current media remote control, which should
      * be us).
+     *
+     * @deprecated Use {@link MediaSessionCompat.Callback#onMediaButtonEvent}.
      */
+    @Deprecated
     public boolean onMediaButtonDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
             case TransportMediator.KEYCODE_MEDIA_PLAY:
@@ -159,7 +202,10 @@
      * continues on to its default key handling (which for media keys means
      * being delivered to the current media remote control, which should
      * be us).
+     *
+     * @deprecated Use {@link MediaSessionCompat.Callback#onMediaButtonEvent}.
      */
+    @Deprecated
     public boolean onMediaButtonUp(int keyCode, KeyEvent event) {
         return true;
     }
@@ -183,7 +229,10 @@
      * OnAudioFocusChangeListener.onAudioFocusChange}.  The default implementation will
      * deliver a {@link KeyEvent#KEYCODE_MEDIA_STOP}
      * when receiving {@link android.media.AudioManager#AUDIOFOCUS_LOSS}.
+     *
+     * @deprecated You must implement your own audio focus handler.
      */
+    @Deprecated
     public void onAudioFocusChange(int focusChange) {
         int keyCode = 0;
         switch (focusChange) {
diff --git a/media-compat/java/android/support/v4/media/TransportStateListener.java b/media-compat/java/android/support/v4/media/TransportStateListener.java
index 384cca2..554983e 100644
--- a/media-compat/java/android/support/v4/media/TransportStateListener.java
+++ b/media-compat/java/android/support/v4/media/TransportStateListener.java
@@ -16,16 +16,31 @@
 
 package android.support.v4.media;
 
+import android.support.v4.media.session.MediaControllerCompat.Callback;
+
 /**
  * A listener for playback changes that can be registered with
  * {@link TransportController}.
+ *
+ * @deprecated Use {@link Callback}.
  */
+@Deprecated
 public class TransportStateListener {
     /**
+     * @deprecated Use {@link Callback}.
+     */
+    @Deprecated
+    public TransportStateListener() {
+    }
+
+    /**
      * The play state of the transport changed.  Use
      * {@link android.support.v4.media.TransportController#isPlaying()
      * TransportController.isPlaying()} to determine the new state.
+     *
+     * @deprecated Use {@link Callback#onPlaybackStateChanged}.
      */
+    @Deprecated
     public void onPlayingChanged(TransportController controller) {
     }
 
@@ -33,7 +48,10 @@
      * The available controls of the transport changed.  Use
      * {@link TransportController#getTransportControlFlags()}
      * TransportController.getTransportControlFlags()} to determine the new state.
+     *
+     * @deprecated Use {@link Callback#onPlaybackStateChanged}.
      */
+    @Deprecated
     public void onTransportControlsChanged(TransportController controller) {
     }
 }
diff --git a/media-compat/java/android/support/v4/media/session/IMediaSession.aidl b/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
index 4f2e38a..969b803 100644
--- a/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
+++ b/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
@@ -17,6 +17,7 @@
 
 import android.app.PendingIntent;
 import android.content.Intent;
+import android.support.v4.media.MediaDescriptionCompat;
 import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.RatingCompat;
 import android.support.v4.media.session.IMediaControllerCallback;
@@ -33,7 +34,7 @@
  * @hide
  */
 interface IMediaSession {
-    // Next ID: 40
+    // Next ID: 44
     void sendCommand(String command, in Bundle args, in MediaSessionCompat.ResultReceiverWrapper cb) = 0;
     boolean sendMediaButton(in KeyEvent mediaButton) = 1;
     void registerCallbackListener(in IMediaControllerCallback cb) = 2;
@@ -54,6 +55,10 @@
     int getRatingType() = 31;
     int getRepeatMode() = 36;
     boolean isShuffleModeEnabled() = 37;
+    void addQueueItem(in MediaDescriptionCompat description) = 40;
+    void addQueueItemAt(in MediaDescriptionCompat description, int index) = 41;
+    void removeQueueItem(in MediaDescriptionCompat description) = 42;
+    void removeQueueItemAt(int index) = 43;
 
     // These commands are for the TransportControls
     void prepare() = 32;
diff --git a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
index 3e0bf4d..2783d3b 100644
--- a/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -28,8 +28,10 @@
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.ResultReceiver;
+import android.support.annotation.VisibleForTesting;
 import android.support.v4.app.BundleCompat;
 import android.support.v4.app.SupportActivity;
+import android.support.v4.media.MediaDescriptionCompat;
 import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.RatingCompat;
 import android.support.v4.media.VolumeProviderCompat;
@@ -62,6 +64,19 @@
 
     static final String COMMAND_GET_EXTRA_BINDER =
             "android.support.v4.media.session.command.GET_EXTRA_BINDER";
+    static final String COMMAND_ADD_QUEUE_ITEM =
+            "android.support.v4.media.session.command.ADD_QUEUE_ITEM";
+    static final String COMMAND_ADD_QUEUE_ITEM_AT =
+            "android.support.v4.media.session.command.ADD_QUEUE_ITEM_AT";
+    static final String COMMAND_REMOVE_QUEUE_ITEM =
+            "android.support.v4.media.session.command.REMOVE_QUEUE_ITEM";
+    static final String COMMAND_REMOVE_QUEUE_ITEM_AT =
+            "android.support.v4.media.session.command.REMOVE_QUEUE_ITEM_AT";
+
+    static final String COMMAND_ARGUMENT_MEDIA_DESCRIPTION =
+            "android.support.v4.media.session.command.ARGUMENT_MEDIA_DESCRIPTION";
+    static final String COMMAND_ARGUMENT_INDEX =
+            "android.support.v4.media.session.command.ARGUMENT_INDEX";
 
     private static class MediaControllerExtraData extends SupportActivity.ExtraData {
         private final MediaControllerCompat mMediaController;
@@ -129,7 +144,7 @@
                 return new MediaControllerCompat(activity,
                         MediaSessionCompat.Token.fromToken(sessionTokenObj));
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getMediaController. " + e);
+                Log.e(TAG, "Dead object in getMediaController.", e);
             }
         }
         return null;
@@ -237,6 +252,62 @@
     }
 
     /**
+     * Add a queue item from the given {@code description} at the end of the play queue
+     * of this session. Not all sessions may support this.
+     *
+     * @param description The {@link MediaDescriptionCompat} for creating the
+     *            {@link MediaSessionCompat.QueueItem} to be inserted.
+     * @throws UnsupportedOperationException If this session doesn't support this.
+     * @see MediaSessionCompat#FLAG_HANDLES_QUEUE_COMMANDS
+     */
+    public void addQueueItem(MediaDescriptionCompat description) {
+        mImpl.addQueueItem(description);
+    }
+
+    /**
+     * Add a queue item from the given {@code description} at the specified position
+     * in the play queue of this session. Shifts the queue item currently at that position
+     * (if any) and any subsequent queue items to the right (adds one to their indices).
+     * Not all sessions may support this.
+     *
+     * @param description The {@link MediaDescriptionCompat} for creating the
+     *            {@link MediaSessionCompat.QueueItem} to be inserted.
+     * @param index The index at which the created {@link MediaSessionCompat.QueueItem}
+     *            is to be inserted.
+     * @throws UnsupportedOperationException If this session doesn't support this.
+     * @see MediaSessionCompat#FLAG_HANDLES_QUEUE_COMMANDS
+     */
+    public void addQueueItem(MediaDescriptionCompat description, int index) {
+        mImpl.addQueueItem(description, index);
+    }
+
+    /**
+     * Remove the first occurrence of the specified {@link MediaSessionCompat.QueueItem}
+     * with the given {@link MediaDescriptionCompat description} in the play queue of the
+     * associated session. Not all sessions may support this.
+     *
+     * @param description The {@link MediaDescriptionCompat} for denoting the
+     *            {@link MediaSessionCompat.QueueItem} to be removed.
+     * @throws UnsupportedOperationException If this session doesn't support this.
+     * @see MediaSessionCompat#FLAG_HANDLES_QUEUE_COMMANDS
+     */
+    public void removeQueueItem(MediaDescriptionCompat description) {
+        mImpl.removeQueueItem(description);
+    }
+
+    /**
+     * Remove an queue item at the specified position in the play queue
+     * of this session. Not all sessions may support this.
+     *
+     * @param index The index of the element to be removed.
+     * @throws UnsupportedOperationException If this session doesn't support this.
+     * @see MediaSessionCompat#FLAG_HANDLES_QUEUE_COMMANDS
+     */
+    public void removeQueueItemAt(int index) {
+        mImpl.removeQueueItemAt(index);
+    }
+
+    /**
      * Get the queue title for this session.
      */
     public CharSequence getQueueTitle() {
@@ -423,6 +494,15 @@
         return mImpl.getPackageName();
     }
 
+    @VisibleForTesting
+    boolean isExtraBinderReady() {
+        if (mImpl instanceof MediaControllerImplApi21) {
+            return ((MediaControllerImplApi21) mImpl).mExtraBinder != null;
+        } else {
+            return false;
+        }
+    }
+
     /**
      * Gets the underlying framework
      * {@link android.media.session.MediaController} object.
@@ -580,7 +660,7 @@
 
             @Override
             public void onPlaybackStateChanged(Object stateObj) {
-                if (mHasExtraCallback && android.os.Build.VERSION.SDK_INT < 22) {
+                if (mHasExtraCallback) {
                     // Ignore. ExtraCallback will handle this.
                 } else {
                     Callback.this.onPlaybackStateChanged(
@@ -1033,6 +1113,10 @@
         MediaMetadataCompat getMetadata();
 
         List<MediaSessionCompat.QueueItem> getQueue();
+        void addQueueItem(MediaDescriptionCompat description);
+        void addQueueItem(MediaDescriptionCompat description, int index);
+        void removeQueueItem(MediaDescriptionCompat description);
+        void removeQueueItemAt(int index);
         CharSequence getQueueTitle();
         Bundle getExtras();
         int getRatingType();
@@ -1071,7 +1155,7 @@
                 callback.setHandler(handler);
                 callback.mRegistered = true;
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in registerCallback. " + e);
+                Log.e(TAG, "Dead object in registerCallback.", e);
                 callback.onSessionDestroyed();
             }
         }
@@ -1087,7 +1171,7 @@
                 mBinder.asBinder().unlinkToDeath(callback, 0);
                 callback.mRegistered = false;
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in unregisterCallback. " + e);
+                Log.e(TAG, "Dead object in unregisterCallback.", e);
             }
         }
 
@@ -1099,7 +1183,7 @@
             try {
                 mBinder.sendMediaButton(event);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in dispatchMediaButtonEvent. " + e);
+                Log.e(TAG, "Dead object in dispatchMediaButtonEvent.", e);
             }
             return false;
         }
@@ -1118,7 +1202,7 @@
             try {
                 return mBinder.getPlaybackState();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getPlaybackState. " + e);
+                Log.e(TAG, "Dead object in getPlaybackState.", e);
             }
             return null;
         }
@@ -1128,7 +1212,7 @@
             try {
                 return mBinder.getMetadata();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getMetadata. " + e);
+                Log.e(TAG, "Dead object in getMetadata.", e);
             }
             return null;
         }
@@ -1138,17 +1222,73 @@
             try {
                 return mBinder.getQueue();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getQueue. " + e);
+                Log.e(TAG, "Dead object in getQueue.", e);
             }
             return null;
         }
 
         @Override
+        public void addQueueItem(MediaDescriptionCompat description) {
+            try {
+                long flags = mBinder.getFlags();
+                if ((flags & MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
+                    throw new UnsupportedOperationException(
+                            "This session doesn't support queue management operations");
+                }
+                mBinder.addQueueItem(description);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Dead object in addQueueItem.", e);
+            }
+        }
+
+        @Override
+        public void addQueueItem(MediaDescriptionCompat description, int index) {
+            try {
+                long flags = mBinder.getFlags();
+                if ((flags & MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
+                    throw new UnsupportedOperationException(
+                            "This session doesn't support queue management operations");
+                }
+                mBinder.addQueueItemAt(description, index);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Dead object in addQueueItemAt.", e);
+            }
+        }
+
+        @Override
+        public void removeQueueItem(MediaDescriptionCompat description) {
+            try {
+                long flags = mBinder.getFlags();
+                if ((flags & MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
+                    throw new UnsupportedOperationException(
+                            "This session doesn't support queue management operations");
+                }
+                mBinder.removeQueueItem(description);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Dead object in removeQueueItem.", e);
+            }
+        }
+
+        @Override
+        public void removeQueueItemAt(int index) {
+            try {
+                long flags = mBinder.getFlags();
+                if ((flags & MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS) == 0) {
+                    throw new UnsupportedOperationException(
+                            "This session doesn't support queue management operations");
+                }
+                mBinder.removeQueueItemAt(index);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Dead object in removeQueueItemAt.", e);
+            }
+        }
+
+        @Override
         public CharSequence getQueueTitle() {
             try {
                 return mBinder.getQueueTitle();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getQueueTitle. " + e);
+                Log.e(TAG, "Dead object in getQueueTitle.", e);
             }
             return null;
         }
@@ -1158,7 +1298,7 @@
             try {
                 return mBinder.getExtras();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getExtras. " + e);
+                Log.e(TAG, "Dead object in getExtras.", e);
             }
             return null;
         }
@@ -1168,7 +1308,7 @@
             try {
                 return mBinder.getRatingType();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getRatingType. " + e);
+                Log.e(TAG, "Dead object in getRatingType.", e);
             }
             return 0;
         }
@@ -1178,7 +1318,7 @@
             try {
                 return mBinder.getRepeatMode();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getRepeatMode. " + e);
+                Log.e(TAG, "Dead object in getRepeatMode.", e);
             }
             return 0;
         }
@@ -1188,7 +1328,7 @@
             try {
                 return mBinder.isShuffleModeEnabled();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in isShuffleModeEnabled. " + e);
+                Log.e(TAG, "Dead object in isShuffleModeEnabled.", e);
             }
             return false;
         }
@@ -1198,7 +1338,7 @@
             try {
                 return mBinder.getFlags();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getFlags. " + e);
+                Log.e(TAG, "Dead object in getFlags.", e);
             }
             return 0;
         }
@@ -1211,7 +1351,7 @@
                         info.controlType, info.maxVolume, info.currentVolume);
                 return pi;
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getPlaybackInfo. " + e);
+                Log.e(TAG, "Dead object in getPlaybackInfo.", e);
             }
             return null;
         }
@@ -1221,7 +1361,7 @@
             try {
                 return mBinder.getLaunchPendingIntent();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getSessionActivity. " + e);
+                Log.e(TAG, "Dead object in getSessionActivity.", e);
             }
             return null;
         }
@@ -1231,7 +1371,7 @@
             try {
                 mBinder.setVolumeTo(value, flags, null);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in setVolumeTo. " + e);
+                Log.e(TAG, "Dead object in setVolumeTo.", e);
             }
         }
 
@@ -1240,7 +1380,7 @@
             try {
                 mBinder.adjustVolume(direction, flags, null);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in adjustVolume. " + e);
+                Log.e(TAG, "Dead object in adjustVolume.", e);
             }
         }
 
@@ -1250,7 +1390,7 @@
                 mBinder.sendCommand(command, params,
                         new MediaSessionCompat.ResultReceiverWrapper(cb));
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in sendCommand. " + e);
+                Log.e(TAG, "Dead object in sendCommand.", e);
             }
         }
 
@@ -1259,7 +1399,7 @@
             try {
                 return mBinder.getPackageName();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in getPackageName. " + e);
+                Log.e(TAG, "Dead object in getPackageName.", e);
             }
             return null;
         }
@@ -1282,7 +1422,7 @@
             try {
                 mBinder.prepare();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in prepare. " + e);
+                Log.e(TAG, "Dead object in prepare.", e);
             }
         }
 
@@ -1291,7 +1431,7 @@
             try {
                 mBinder.prepareFromMediaId(mediaId, extras);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in prepareFromMediaId. " + e);
+                Log.e(TAG, "Dead object in prepareFromMediaId.", e);
             }
         }
 
@@ -1300,7 +1440,7 @@
             try {
                 mBinder.prepareFromSearch(query, extras);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in prepareFromSearch. " + e);
+                Log.e(TAG, "Dead object in prepareFromSearch.", e);
             }
         }
 
@@ -1309,7 +1449,7 @@
             try {
                 mBinder.prepareFromUri(uri, extras);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in prepareFromUri. " + e);
+                Log.e(TAG, "Dead object in prepareFromUri.", e);
             }
         }
 
@@ -1318,7 +1458,7 @@
             try {
                 mBinder.play();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in play. " + e);
+                Log.e(TAG, "Dead object in play.", e);
             }
         }
 
@@ -1327,7 +1467,7 @@
             try {
                 mBinder.playFromMediaId(mediaId, extras);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in playFromMediaId. " + e);
+                Log.e(TAG, "Dead object in playFromMediaId.", e);
             }
         }
 
@@ -1336,7 +1476,7 @@
             try {
                 mBinder.playFromSearch(query, extras);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in playFromSearch. " + e);
+                Log.e(TAG, "Dead object in playFromSearch.", e);
             }
         }
 
@@ -1345,7 +1485,7 @@
             try {
                 mBinder.playFromUri(uri, extras);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in playFromUri. " + e);
+                Log.e(TAG, "Dead object in playFromUri.", e);
             }
         }
 
@@ -1354,7 +1494,7 @@
             try {
                 mBinder.skipToQueueItem(id);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in skipToQueueItem. " + e);
+                Log.e(TAG, "Dead object in skipToQueueItem.", e);
             }
         }
 
@@ -1363,7 +1503,7 @@
             try {
                 mBinder.pause();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in pause. " + e);
+                Log.e(TAG, "Dead object in pause.", e);
             }
         }
 
@@ -1372,7 +1512,7 @@
             try {
                 mBinder.stop();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in stop. " + e);
+                Log.e(TAG, "Dead object in stop.", e);
             }
         }
 
@@ -1381,7 +1521,7 @@
             try {
                 mBinder.seekTo(pos);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in seekTo. " + e);
+                Log.e(TAG, "Dead object in seekTo.", e);
             }
         }
 
@@ -1390,7 +1530,7 @@
             try {
                 mBinder.fastForward();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in fastForward. " + e);
+                Log.e(TAG, "Dead object in fastForward.", e);
             }
         }
 
@@ -1399,7 +1539,7 @@
             try {
                 mBinder.next();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in skipToNext. " + e);
+                Log.e(TAG, "Dead object in skipToNext.", e);
             }
         }
 
@@ -1408,7 +1548,7 @@
             try {
                 mBinder.rewind();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in rewind. " + e);
+                Log.e(TAG, "Dead object in rewind.", e);
             }
         }
 
@@ -1417,7 +1557,7 @@
             try {
                 mBinder.previous();
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in skipToPrevious. " + e);
+                Log.e(TAG, "Dead object in skipToPrevious.", e);
             }
         }
 
@@ -1426,7 +1566,7 @@
             try {
                 mBinder.rate(rating);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in setRating. " + e);
+                Log.e(TAG, "Dead object in setRating.", e);
             }
         }
 
@@ -1435,7 +1575,7 @@
             try {
                 mBinder.setRepeatMode(repeatMode);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in setRepeatMode. " + e);
+                Log.e(TAG, "Dead object in setRepeatMode.", e);
             }
         }
 
@@ -1444,7 +1584,7 @@
             try {
                 mBinder.setShuffleModeEnabled(enabled);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in setShuffleModeEnabled. " + e);
+                Log.e(TAG, "Dead object in setShuffleModeEnabled.", e);
             }
         }
 
@@ -1458,7 +1598,7 @@
             try {
                 mBinder.sendCustomAction(action, args);
             } catch (RemoteException e) {
-                Log.e(TAG, "Dead object in sendCustomAction. " + e);
+                Log.e(TAG, "Dead object in sendCustomAction.", e);
             }
         }
     }
@@ -1470,7 +1610,7 @@
         // after API 21.
         private IMediaSession mExtraBinder;
         private HashMap<Callback, ExtraCallback> mCallbackMap = new HashMap<>();
-        private List<Callback> mPendingCallbacks;
+        private List<Callback> mPendingCallbacks = new ArrayList<>();
 
         public MediaControllerImplApi21(Context context, MediaSessionCompat session) {
             mControllerObj = MediaControllerCompatApi21.fromToken(context,
@@ -1498,14 +1638,13 @@
                 try {
                     mExtraBinder.registerCallbackListener(extraCallback);
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in registerCallback. " + e);
+                    Log.e(TAG, "Dead object in registerCallback.", e);
                 }
             } else {
-                if (mPendingCallbacks == null) {
-                    mPendingCallbacks = new ArrayList<>();
-                }
                 callback.setHandler(handler);
-                mPendingCallbacks.add(callback);
+                synchronized (mPendingCallbacks) {
+                    mPendingCallbacks.add(callback);
+                }
             }
         }
 
@@ -1519,13 +1658,12 @@
                         mExtraBinder.unregisterCallbackListener(extraCallback);
                     }
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in unregisterCallback. " + e);
+                    Log.e(TAG, "Dead object in unregisterCallback.", e);
                 }
             } else {
-                if (mPendingCallbacks == null) {
-                    mPendingCallbacks = new ArrayList<>();
+                synchronized (mPendingCallbacks) {
+                    mPendingCallbacks.remove(callback);
                 }
-                mPendingCallbacks.remove(callback);
             }
         }
 
@@ -1542,11 +1680,11 @@
 
         @Override
         public PlaybackStateCompat getPlaybackState() {
-            if (android.os.Build.VERSION.SDK_INT < 22 && mExtraBinder != null) {
+            if (mExtraBinder != null) {
                 try {
                     return mExtraBinder.getPlaybackState();
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in getPlaybackState. " + e);
+                    Log.e(TAG, "Dead object in getPlaybackState.", e);
                 }
             }
             Object stateObj = MediaControllerCompatApi21.getPlaybackState(mControllerObj);
@@ -1567,6 +1705,35 @@
         }
 
         @Override
+        public void addQueueItem(MediaDescriptionCompat description) {
+            Bundle params = new Bundle();
+            params.putParcelable(COMMAND_ARGUMENT_MEDIA_DESCRIPTION, description);
+            sendCommand(COMMAND_ADD_QUEUE_ITEM, params, null);
+        }
+
+        @Override
+        public void addQueueItem(MediaDescriptionCompat description, int index) {
+            Bundle params = new Bundle();
+            params.putParcelable(COMMAND_ARGUMENT_MEDIA_DESCRIPTION, description);
+            params.putInt(COMMAND_ARGUMENT_INDEX, index);
+            sendCommand(COMMAND_ADD_QUEUE_ITEM_AT, params, null);
+        }
+
+        @Override
+        public void removeQueueItem(MediaDescriptionCompat description) {
+            Bundle params = new Bundle();
+            params.putParcelable(COMMAND_ARGUMENT_MEDIA_DESCRIPTION, description);
+            sendCommand(COMMAND_REMOVE_QUEUE_ITEM, params, null);
+        }
+
+        @Override
+        public void removeQueueItemAt(int index) {
+            Bundle params = new Bundle();
+            params.putInt(COMMAND_ARGUMENT_INDEX, index);
+            sendCommand(COMMAND_REMOVE_QUEUE_ITEM_AT, params, null);
+        }
+
+        @Override
         public CharSequence getQueueTitle() {
             return MediaControllerCompatApi21.getQueueTitle(mControllerObj);
         }
@@ -1582,7 +1749,7 @@
                 try {
                     return mExtraBinder.getRatingType();
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in getRatingType. " + e);
+                    Log.e(TAG, "Dead object in getRatingType.", e);
                 }
             }
             return MediaControllerCompatApi21.getRatingType(mControllerObj);
@@ -1594,7 +1761,7 @@
                 try {
                     return mExtraBinder.getRepeatMode();
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in getRepeatMode. " + e);
+                    Log.e(TAG, "Dead object in getRepeatMode.", e);
                 }
             }
             return PlaybackStateCompat.REPEAT_MODE_NONE;
@@ -1606,7 +1773,7 @@
                 try {
                     return mExtraBinder.isShuffleModeEnabled();
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in isShuffleModeEnabled. " + e);
+                    Log.e(TAG, "Dead object in isShuffleModeEnabled.", e);
                 }
             }
             return false;
@@ -1665,21 +1832,23 @@
         }
 
         private void processPendingCallbacks() {
-            if (mPendingCallbacks == null || mExtraBinder == null) {
+            if (mExtraBinder == null) {
                 return;
             }
-            for (Callback callback : mPendingCallbacks) {
-                ExtraCallback extraCallback = new ExtraCallback(callback);
-                mCallbackMap.put(callback, extraCallback);
-                callback.mHasExtraCallback = true;
-                try {
-                    mExtraBinder.registerCallbackListener(extraCallback);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Dead object in registerCallback. " + e);
-                    break;
+            synchronized (mPendingCallbacks) {
+                for (Callback callback : mPendingCallbacks) {
+                    ExtraCallback extraCallback = new ExtraCallback(callback);
+                    mCallbackMap.put(callback, extraCallback);
+                    callback.mHasExtraCallback = true;
+                    try {
+                        mExtraBinder.registerCallbackListener(extraCallback);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "Dead object in registerCallback.", e);
+                        break;
+                    }
                 }
+                mPendingCallbacks.clear();
             }
-            mPendingCallbacks = null;
         }
 
         private static class ExtraBinderRequestResultReceiver extends ResultReceiver {
diff --git a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
index c560c1b..01ac807 100644
--- a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -94,7 +94,10 @@
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP)
-    @IntDef(flag=true, value={FLAG_HANDLES_MEDIA_BUTTONS, FLAG_HANDLES_TRANSPORT_CONTROLS})
+    @IntDef(flag=true, value={
+            FLAG_HANDLES_MEDIA_BUTTONS,
+            FLAG_HANDLES_TRANSPORT_CONTROLS,
+            FLAG_HANDLES_QUEUE_COMMANDS })
     @Retention(RetentionPolicy.SOURCE)
     public @interface SessionFlags {}
 
@@ -111,6 +114,12 @@
     public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 1 << 1;
 
     /**
+     * Set this flag on the session to indicate that it handles queue
+     * management commands through its {@link Callback}.
+     */
+    public static final int FLAG_HANDLES_QUEUE_COMMANDS = 1 << 2;
+
+    /**
      * Custom action to invoke playFromUri() for the forward compatibility.
      */
     static final String ACTION_PLAY_FROM_URI =
@@ -879,6 +888,48 @@
         public void onCustomAction(String action, Bundle extras) {
         }
 
+        /**
+         * Called when a {@link MediaControllerCompat} wants to add a {@link QueueItem}
+         * with the given {@link MediaDescriptionCompat description} at the end of the play queue.
+         *
+         * @param description The {@link MediaDescriptionCompat} for creating the {@link QueueItem}
+         *            to be inserted.
+         */
+        public void onAddQueueItem(MediaDescriptionCompat description) {
+        }
+
+        /**
+         * Called when a {@link MediaControllerCompat} wants to add a {@link QueueItem}
+         * with the given {@link MediaDescriptionCompat description} at the specified position
+         * in the play queue.
+         *
+         * @param description The {@link MediaDescriptionCompat} for creating the {@link QueueItem}
+         *            to be inserted.
+         * @param index The index at which the created {@link QueueItem} is to be inserted.
+         */
+        public void onAddQueueItem(MediaDescriptionCompat description, int index) {
+        }
+
+        /**
+         * Called when a {@link MediaControllerCompat} wants to remove the first occurrence of the
+         * specified {@link QueueItem} with the given {@link MediaDescriptionCompat description}
+         * in the play queue.
+         *
+         * @param description The {@link MediaDescriptionCompat} for denoting the {@link QueueItem}
+         *            to be removed.
+         */
+        public void onRemoveQueueItem(MediaDescriptionCompat description) {
+        }
+
+        /**
+         * Called when a {@link MediaControllerCompat} wants to remove a {@link QueueItem} at the
+         * specified position in the play queue.
+         *
+         * @param index The index of the element to be removed.
+         */
+        public void onRemoveQueueItemAt(int index) {
+        }
+
         private class StubApi21 implements MediaSessionCompatApi21.Callback {
 
             StubApi21() {
@@ -893,6 +944,25 @@
                         BundleCompat.putBinder(result, EXTRA_BINDER, impl.getExtraSessionBinder());
                         cb.send(0, result);
                     }
+                } else if (command.equals(MediaControllerCompat.COMMAND_ADD_QUEUE_ITEM)) {
+                    extras.setClassLoader(MediaDescriptionCompat.class.getClassLoader());
+                    Callback.this.onAddQueueItem(
+                            (MediaDescriptionCompat) extras.getParcelable(
+                                    MediaControllerCompat.COMMAND_ARGUMENT_MEDIA_DESCRIPTION));
+                } else if (command.equals(MediaControllerCompat.COMMAND_ADD_QUEUE_ITEM_AT)) {
+                    extras.setClassLoader(MediaDescriptionCompat.class.getClassLoader());
+                    Callback.this.onAddQueueItem(
+                            (MediaDescriptionCompat) extras.getParcelable(
+                                    MediaControllerCompat.COMMAND_ARGUMENT_MEDIA_DESCRIPTION),
+                            extras.getInt(MediaControllerCompat.COMMAND_ARGUMENT_INDEX));
+                } else if (command.equals(MediaControllerCompat.COMMAND_REMOVE_QUEUE_ITEM)) {
+                    extras.setClassLoader(MediaDescriptionCompat.class.getClassLoader());
+                    Callback.this.onRemoveQueueItem(
+                            (MediaDescriptionCompat) extras.getParcelable(
+                                    MediaControllerCompat.COMMAND_ARGUMENT_MEDIA_DESCRIPTION));
+                } else if (command.equals(MediaControllerCompat.COMMAND_REMOVE_QUEUE_ITEM_AT)) {
+                    Callback.this.onRemoveQueueItemAt(
+                            extras.getInt(MediaControllerCompat.COMMAND_ARGUMENT_INDEX));
                 } else {
                     Callback.this.onCommand(command, extras, cb);
                 }
@@ -1506,10 +1576,22 @@
             postToHandler(what, null);
         }
 
+        void postToHandler(int what, int arg1) {
+            postToHandler(what, null, arg1);
+        }
+
         void postToHandler(int what, Object obj) {
             postToHandler(what, obj, null);
         }
 
+        void postToHandler(int what, Object obj, int arg1) {
+            synchronized (mLock) {
+                if (mHandler != null) {
+                    mHandler.post(what, obj, arg1);
+                }
+            }
+        }
+
         void postToHandler(int what, Object obj, Bundle extras) {
             synchronized (mLock) {
                 if (mHandler != null) {
@@ -2185,6 +2267,26 @@
             }
 
             @Override
+            public void addQueueItem(MediaDescriptionCompat description) {
+                postToHandler(MessageHandler.MSG_ADD_QUEUE_ITEM, description);
+            }
+
+            @Override
+            public void addQueueItemAt(MediaDescriptionCompat description, int index) {
+                postToHandler(MessageHandler.MSG_ADD_QUEUE_ITEM_AT, description, index);
+            }
+
+            @Override
+            public void removeQueueItem(MediaDescriptionCompat description) {
+                postToHandler(MessageHandler.MSG_REMOVE_QUEUE_ITEM, description);
+            }
+
+            @Override
+            public void removeQueueItemAt(int index) {
+                postToHandler(MessageHandler.MSG_REMOVE_QUEUE_ITEM_AT, index);
+            }
+
+            @Override
             public CharSequence getQueueTitle() {
                 return mQueueTitle;
             }
@@ -2257,6 +2359,10 @@
             private static final int MSG_SET_VOLUME = 22;
             private static final int MSG_SET_REPEAT_MODE = 23;
             private static final int MSG_SET_SHUFFLE_MODE_ENABLED = 24;
+            private static final int MSG_ADD_QUEUE_ITEM = 25;
+            private static final int MSG_ADD_QUEUE_ITEM_AT = 26;
+            private static final int MSG_REMOVE_QUEUE_ITEM = 27;
+            private static final int MSG_REMOVE_QUEUE_ITEM_AT = 28;
 
             // KeyEvent constants only available on API 11+
             private static final int KEYCODE_MEDIA_PAUSE = 127;
@@ -2358,14 +2464,26 @@
                     case MSG_CUSTOM_ACTION:
                         cb.onCustomAction((String) msg.obj, msg.getData());
                         break;
+                    case MSG_ADD_QUEUE_ITEM:
+                        cb.onAddQueueItem((MediaDescriptionCompat) msg.obj);
+                        break;
+                    case MSG_ADD_QUEUE_ITEM_AT:
+                        cb.onAddQueueItem((MediaDescriptionCompat) msg.obj, msg.arg1);
+                        break;
+                    case MSG_REMOVE_QUEUE_ITEM:
+                        cb.onRemoveQueueItem((MediaDescriptionCompat) msg.obj);
+                        break;
+                    case MSG_REMOVE_QUEUE_ITEM_AT:
+                        cb.onRemoveQueueItemAt(msg.arg1);
+                        break;
                     case MSG_ADJUST_VOLUME:
-                        adjustVolume((int) msg.obj, 0);
+                        adjustVolume(msg.arg1, 0);
                         break;
                     case MSG_SET_VOLUME:
-                        setVolumeTo((int) msg.obj, 0);
+                        setVolumeTo(msg.arg1, 0);
                         break;
                     case MSG_SET_REPEAT_MODE:
-                        cb.onSetRepeatMode((int) msg.obj);
+                        cb.onSetRepeatMode(msg.arg1);
                         break;
                     case MSG_SET_SHUFFLE_MODE_ENABLED:
                         cb.onSetShuffleModeEnabled((boolean) msg.obj);
@@ -2523,18 +2641,16 @@
 
         @Override
         public void setPlaybackState(PlaybackStateCompat state) {
-            if (android.os.Build.VERSION.SDK_INT < 22) {
-                mPlaybackState = state;
-                int size = mExtraControllerCallbacks.beginBroadcast();
-                for (int i = size - 1; i >= 0; i--) {
-                    IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
-                    try {
-                        cb.onPlaybackStateChanged(state);
-                    } catch (RemoteException e) {
-                    }
+            mPlaybackState = state;
+            int size = mExtraControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mExtraControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onPlaybackStateChanged(state);
+                } catch (RemoteException e) {
                 }
-                mExtraControllerCallbacks.finishBroadcast();
             }
+            mExtraControllerCallbacks.finishBroadcast();
             MediaSessionCompatApi21.setPlaybackState(mSessionObj,
                     state == null ? null : state.getPlaybackState());
         }
@@ -2850,6 +2966,30 @@
             }
 
             @Override
+            public void addQueueItem(MediaDescriptionCompat descriptionCompat) {
+                // Will not be called.
+                throw new AssertionError();
+            }
+
+            @Override
+            public void addQueueItemAt(MediaDescriptionCompat descriptionCompat, int index) {
+                // Will not be called.
+                throw new AssertionError();
+            }
+
+            @Override
+            public void removeQueueItem(MediaDescriptionCompat description) {
+                // Will not be called.
+                throw new AssertionError();
+            }
+
+            @Override
+            public void removeQueueItemAt(int index) {
+                // Will not be called.
+                throw new AssertionError();
+            }
+
+            @Override
             public CharSequence getQueueTitle() {
                 // Will not be called.
                 throw new AssertionError();
diff --git a/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java b/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
index 6a997bf..fd87a76 100644
--- a/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/MediaBrowserCompatTest.java
@@ -19,6 +19,7 @@
 import static android.support.test.InstrumentationRegistry.getInstrumentation;
 
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNull;
 
 import static org.junit.Assert.fail;
 
@@ -388,9 +389,8 @@
         }
     }
 
-    // TODO(hdmoon): Uncomment after fixing failing tests. (Fails on API >= 24)
-    // @Test
-    // @SmallTest
+    @Test
+    @SmallTest
     public void testGetItem() {
         resetCallbacks();
         createMediaBrowser(TEST_BROWSER_SERVICE);
@@ -407,14 +407,14 @@
                 mItemCallback.mLastMediaItem.getMediaId());
     }
 
-    // TODO(hdmoon): Uncomment after fixing failing tests. (Fails on Android O)
-    // @Test
-    // @SmallTest
-    public void testGetItemFailure() {
+    @Test
+    @SmallTest
+    public void testGetItemWhenOnLoadItemIsNotImplemented() {
         resetCallbacks();
         createMediaBrowser(TEST_BROWSER_SERVICE);
         connectMediaBrowserService();
-        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback);
+        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED,
+                mItemCallback);
         new PollingCheck(TIME_OUT_MS) {
             @Override
             protected boolean check() {
@@ -422,7 +422,30 @@
             }
         }.run();
 
-        assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback.mLastErrorId);
+        assertEquals(StubMediaBrowserServiceCompat.MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED,
+                mItemCallback.mLastErrorId);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetItemWhenMediaIdIsInvalid() {
+        resetCallbacks();
+        mItemCallback.mLastMediaItem = new MediaItem(new MediaDescriptionCompat.Builder()
+                .setMediaId("dummy_id").build(), MediaItem.FLAG_BROWSABLE);
+
+        createMediaBrowser(TEST_BROWSER_SERVICE);
+        connectMediaBrowserService();
+        mMediaBrowser.getItem(StubMediaBrowserServiceCompat.MEDIA_ID_INVALID, mItemCallback);
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                // MediaBrowserServiceCompat.onLoadItem implementations must send null result when
+                // the given media id is invalid.
+                return mItemCallback.mLastMediaItem == null;
+            }
+        }.run();
+
+        assertNull(mItemCallback.mLastErrorId);
     }
 
     private void createMediaBrowser(final ComponentName component) {
diff --git a/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java b/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
index 3995200..b943594 100644
--- a/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
+++ b/media-compat/tests/src/android/support/v4/media/StubMediaBrowserServiceCompat.java
@@ -36,6 +36,8 @@
     static final String MEDIA_ID_INVALID = "test_media_id_invalid";
     static final String MEDIA_ID_ROOT = "test_media_id_root";
     static final String MEDIA_ID_CHILDREN_DELAYED = "test_media_id_children_delayed";
+    static final String MEDIA_ID_ON_LOAD_ITEM_NOT_IMPLEMENTED =
+            "test_media_id_on_load_item_not_implemented";
 
     static final String[] MEDIA_ID_CHILDREN = new String[]{
             "test_media_id_children_0", "test_media_id_children_1",
@@ -98,6 +100,11 @@
             return;
         }
 
+        if (MEDIA_ID_INVALID.equals(itemId)) {
+            result.sendResult(null);
+            return;
+        }
+
         for (String id : MEDIA_ID_CHILDREN) {
             if (id.equals(itemId)) {
                 result.sendResult(createMediaItem(id));
@@ -105,6 +112,7 @@
             }
         }
 
+        // Test the case where onLoadItem is not implemented.
         super.onLoadItem(itemId, result);
     }
 
diff --git a/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java b/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java
index fa639a7..2598bef 100644
--- a/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/session/MediaControllerCompatTest.java
@@ -24,12 +24,15 @@
 
 import android.media.AudioManager;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.ResultReceiver;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.PollingCheck;
 import android.support.v4.media.RatingCompat;
 import android.support.v4.media.VolumeProviderCompat;
 
@@ -63,6 +66,7 @@
             public void run() {
                 mSession = new MediaSessionCompat(getContext(), SESSION_TAG);
                 mSession.setCallback(mCallback, mHandler);
+                mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS);
                 mController = mSession.getController();
             }
         });
@@ -86,6 +90,15 @@
                 RatingCompat.RATING_NONE, mController.getRatingType());
 
         mSession.setRatingType(RatingCompat.RATING_5_STARS);
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
+            // Wait until the extra binder is ready.
+            new PollingCheck(TIME_OUT_MS) {
+                @Override
+                protected boolean check() {
+                    return mController.getRatingType() != RatingCompat.RATING_NONE;
+                }
+            }.run();
+        }
         assertEquals(RatingCompat.RATING_5_STARS, mController.getRatingType());
     }
 
@@ -112,6 +125,46 @@
         }
     }
 
+    @Test
+    @SmallTest
+    public void testAddRemoveQueueItems() throws Exception {
+        final String mediaId = "media_id";
+        final String mediaTitle = "media_title";
+        MediaDescriptionCompat itemDescription = new MediaDescriptionCompat.Builder()
+                .setMediaId(mediaId).setTitle(mediaTitle).build();
+
+        synchronized (mWaitLock) {
+            mCallback.reset();
+            mController.addQueueItem(itemDescription);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnAddQueueItemCalled);
+            assertEquals(-1, mCallback.mQueueIndex);
+            assertEquals(mediaId, mCallback.mQueueDescription.getMediaId());
+            assertEquals(mediaTitle, mCallback.mQueueDescription.getTitle());
+
+            mCallback.reset();
+            mController.addQueueItem(itemDescription, 0);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnAddQueueItemAtCalled);
+            assertEquals(0, mCallback.mQueueIndex);
+            assertEquals(mediaId, mCallback.mQueueDescription.getMediaId());
+            assertEquals(mediaTitle, mCallback.mQueueDescription.getTitle());
+
+            mCallback.reset();
+            mController.removeQueueItemAt(0);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnRemoveQueueItemAtCalled);
+            assertEquals(0, mCallback.mQueueIndex);
+
+            mCallback.reset();
+            mController.removeQueueItem(itemDescription);
+            mWaitLock.wait(TIME_OUT_MS);
+            assertTrue(mCallback.mOnRemoveQueueItemCalled);
+            assertEquals(mediaId, mCallback.mQueueDescription.getMediaId());
+            assertEquals(mediaTitle, mCallback.mQueueDescription.getTitle());
+        }
+    }
+
     // TODO: Uncomment after fixing this test. This test causes an Exception on System UI.
     // @Test
     // @SmallTest
@@ -343,6 +396,8 @@
         private ResultReceiver mCommandCallback;
         private int mRepeatMode;
         private boolean mShuffleModeEnabled;
+        private int mQueueIndex;
+        private MediaDescriptionCompat mQueueDescription;
 
         private boolean mOnPlayCalled;
         private boolean mOnPauseCalled;
@@ -365,6 +420,10 @@
         private boolean mOnPrepareFromUriCalled;
         private boolean mOnSetRepeatModeCalled;
         private boolean mOnSetShuffleModeEnabledCalled;
+        private boolean mOnAddQueueItemCalled;
+        private boolean mOnAddQueueItemAtCalled;
+        private boolean mOnRemoveQueueItemCalled;
+        private boolean mOnRemoveQueueItemAtCalled;
 
         public void reset() {
             mSeekPosition = -1;
@@ -379,6 +438,8 @@
             mCommandCallback = null;
             mShuffleModeEnabled = false;
             mRepeatMode = PlaybackStateCompat.REPEAT_MODE_NONE;
+            mQueueIndex = -1;
+            mQueueDescription = null;
 
             mOnPlayCalled = false;
             mOnPauseCalled = false;
@@ -401,6 +462,10 @@
             mOnPrepareFromUriCalled = false;
             mOnSetRepeatModeCalled = false;
             mOnSetShuffleModeEnabledCalled = false;
+            mOnAddQueueItemCalled = false;
+            mOnAddQueueItemAtCalled = false;
+            mOnRemoveQueueItemCalled = false;
+            mOnRemoveQueueItemAtCalled = false;
         }
 
         @Override
@@ -585,6 +650,34 @@
         }
 
         @Override
+        public void onAddQueueItem(MediaDescriptionCompat description) {
+            synchronized (mWaitLock) {
+                mOnAddQueueItemCalled = true;
+                mQueueDescription = description;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
+        public void onAddQueueItem(MediaDescriptionCompat description, int index) {
+            synchronized (mWaitLock) {
+                mOnAddQueueItemAtCalled = true;
+                mQueueIndex = index;
+                mQueueDescription = description;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
+        public void onRemoveQueueItem(MediaDescriptionCompat description) {
+            synchronized (mWaitLock) {
+                mOnRemoveQueueItemCalled = true;
+                mQueueDescription = description;
+                mWaitLock.notify();
+            }
+        }
+
+        @Override
         public void onSetShuffleModeEnabled(boolean enabled) {
             synchronized (mWaitLock) {
                 mOnSetShuffleModeEnabledCalled = true;
@@ -592,5 +685,14 @@
                 mWaitLock.notify();
             }
         }
+
+        @Override
+        public void onRemoveQueueItemAt(int index) {
+            synchronized (mWaitLock) {
+                mOnRemoveQueueItemAtCalled = true;
+                mQueueIndex = index;
+                mWaitLock.notify();
+            }
+        }
     }
 }
diff --git a/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java b/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java
index a5f11ed..0e85c1c 100644
--- a/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/session/MediaSessionCompatTest.java
@@ -31,12 +31,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.media.AudioManager;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Parcel;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.media.PollingCheck;
 import android.support.v4.media.MediaDescriptionCompat;
 import android.support.v4.media.MediaMetadataCompat;
 import android.support.v4.media.RatingCompat;
@@ -62,11 +64,21 @@
     private static final String TEST_SESSION_TAG = "test-session-tag";
     private static final String TEST_KEY = "test-key";
     private static final String TEST_VALUE = "test-val";
+    private static final Bundle TEST_BUNDLE = createTestBundle();
     private static final String TEST_SESSION_EVENT = "test-session-event";
     private static final int TEST_CURRENT_VOLUME = 10;
     private static final int TEST_MAX_VOLUME = 11;
     private static final long TEST_QUEUE_ID = 12L;
     private static final long TEST_ACTION = 55L;
+    private static final int TEST_ERROR_CODE =
+            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED;
+    private static final String TEST_ERROR_MSG = "test-error-msg";
+
+    private static Bundle createTestBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putString(TEST_KEY, TEST_VALUE);
+        return bundle;
+    }
 
     private AudioManager mAudioManager;
     private Handler mHandler = new Handler(Looper.getMainLooper());
@@ -89,6 +101,7 @@
     public void tearDown() throws Exception {
         // It is OK to call release() twice.
         mSession.release();
+        mSession = null;
     }
 
     /**
@@ -128,21 +141,17 @@
     }
 
     /**
-     * Tests that the various configuration bits on a session get passed to the
-     * controller.
+     * Tests {@link MediaSessionCompat#setExtras}.
      */
     @Test
     @SmallTest
-    public void testConfigureSession() throws Exception {
+    public void testSetExtras() throws Exception {
+        final Bundle extras = new Bundle();
         MediaControllerCompat controller = mSession.getController();
         controller.registerCallback(mCallback, mHandler);
-
         synchronized (mWaitLock) {
-            // test setExtras
             mCallback.resetLocked();
-            final Bundle extras = new Bundle();
-            extras.putString(TEST_KEY, TEST_VALUE);
-            mSession.setExtras(extras);
+            mSession.setExtras(TEST_BUNDLE);
             mWaitLock.wait(TIME_OUT_MS);
             assertTrue(mCallback.mOnExtraChangedCalled);
 
@@ -153,12 +162,33 @@
             extrasOut = controller.getExtras();
             assertNotNull(extrasOut);
             assertEquals(TEST_VALUE, extrasOut.get(TEST_KEY));
+        }
+    }
 
-            // test setFlags
+    /**
+     * Tests {@link MediaSessionCompat#setFlags}.
+     */
+    @Test
+    @SmallTest
+    public void testSetFlags() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
+            mCallback.resetLocked();
             mSession.setFlags(5);
             assertEquals(5, controller.getFlags());
+        }
+    }
 
-            // test setMetadata
+    /**
+     * Tests {@link MediaSessionCompat#setMetadata}.
+     */
+    @Test
+    @SmallTest
+    public void testSetMetadata() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
             mCallback.resetLocked();
             MediaMetadataCompat metadata =
                     new MediaMetadataCompat.Builder().putString(TEST_KEY, TEST_VALUE).build();
@@ -173,11 +203,27 @@
             metadataOut = controller.getMetadata();
             assertNotNull(metadataOut);
             assertEquals(TEST_VALUE, metadataOut.getString(TEST_KEY));
+        }
+    }
 
-            // test setPlaybackState
+    /**
+     * Tests {@link MediaSessionCompat#setPlaybackState}.
+     */
+    @Test
+    @SmallTest
+    public void testSetPlaybackState() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            waitUntilExtraBinderReady(controller);
+        }
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
             mCallback.resetLocked();
             PlaybackStateCompat state =
-                    new PlaybackStateCompat.Builder().setActions(TEST_ACTION).build();
+                    new PlaybackStateCompat.Builder()
+                            .setActions(TEST_ACTION)
+                            .setErrorMessage(TEST_ERROR_CODE, TEST_ERROR_MSG)
+                            .build();
             mSession.setPlaybackState(state);
             mWaitLock.wait(TIME_OUT_MS);
             assertTrue(mCallback.mOnPlaybackStateChangedCalled);
@@ -185,12 +231,26 @@
             PlaybackStateCompat stateOut = mCallback.mPlaybackState;
             assertNotNull(stateOut);
             assertEquals(TEST_ACTION, stateOut.getActions());
+            assertEquals(TEST_ERROR_CODE, stateOut.getErrorCode());
+            assertEquals(TEST_ERROR_MSG, stateOut.getErrorMessage().toString());
 
             stateOut = controller.getPlaybackState();
             assertNotNull(stateOut);
             assertEquals(TEST_ACTION, stateOut.getActions());
+            assertEquals(TEST_ERROR_CODE, stateOut.getErrorCode());
+            assertEquals(TEST_ERROR_MSG, stateOut.getErrorMessage().toString());
+        }
+    }
 
-            // test setQueue and setQueueTitle
+    /**
+     * Tests {@link MediaSessionCompat#setQueue} and {@link MediaSessionCompat#setQueueTitle}.
+     */
+    @Test
+    @SmallTest
+    public void testSetQueueAndSetQueueTitle() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
             mCallback.resetLocked();
             List<MediaSessionCompat.QueueItem> queue = new ArrayList<>();
             MediaSessionCompat.QueueItem item = new MediaSessionCompat.QueueItem(
@@ -231,14 +291,36 @@
             assertNull(mCallback.mQueue);
             assertNull(controller.getQueueTitle());
             assertNull(controller.getQueue());
+        }
+    }
 
-            // test setSessionActivity
+    /**
+     * Tests {@link MediaSessionCompat#setSessionActivity}.
+     */
+    @Test
+    @SmallTest
+    public void testSessionActivity() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        synchronized (mWaitLock) {
             Intent intent = new Intent("cts.MEDIA_SESSION_ACTION");
             PendingIntent pi = PendingIntent.getActivity(getContext(), 555, intent, 0);
             mSession.setSessionActivity(pi);
             assertEquals(pi, controller.getSessionActivity());
+        }
+    }
 
-            // test setRepeatMode
+    /**
+     * Tests {@link MediaSessionCompat#setRepeatMode}.
+     */
+    @Test
+    @SmallTest
+    public void testSetRepeatMode() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            waitUntilExtraBinderReady(controller);
+        }
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
             mCallback.resetLocked();
             final int repeatMode = PlaybackStateCompat.REPEAT_MODE_ALL;
             mSession.setRepeatMode(repeatMode);
@@ -246,30 +328,66 @@
             assertTrue(mCallback.mOnRepeatModeChangedCalled);
             assertEquals(repeatMode, mCallback.mRepeatMode);
             assertEquals(repeatMode, controller.getRepeatMode());
+        }
+    }
 
-            // test setShuffleModeEnabled
+    /**
+     * Tests {@link MediaSessionCompat#setShuffleModeEnabled}.
+     */
+    @Test
+    @SmallTest
+    public void testSetShuffleModeEnabled() throws Exception {
+        final boolean shuffleModeEnabled = true;
+        MediaControllerCompat controller = mSession.getController();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            waitUntilExtraBinderReady(controller);
+        }
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
             mCallback.resetLocked();
-            final boolean shuffleModeEnabled = true;
+            final int repeatMode = PlaybackStateCompat.REPEAT_MODE_ALL;
             mSession.setShuffleModeEnabled(shuffleModeEnabled);
             mWaitLock.wait(TIME_OUT_MS);
             assertTrue(mCallback.mOnShuffleModeChangedCalled);
             assertEquals(shuffleModeEnabled, mCallback.mShuffleModeEnabled);
             assertEquals(shuffleModeEnabled, controller.isShuffleModeEnabled());
+        }
+    }
 
-            // test setActivity
-            mSession.setActive(true);
-            assertTrue(mSession.isActive());
-
-            // test sendSessionEvent
+    /**
+     * Tests {@link MediaSessionCompat#sendSessionEvent}.
+     */
+    @Test
+    @SmallTest
+    public void testSendSessionEvent() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
+                Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
+            waitUntilExtraBinderReady(controller);
+        }
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
             mCallback.resetLocked();
-            mSession.sendSessionEvent(TEST_SESSION_EVENT, extras);
+            mSession.sendSessionEvent(TEST_SESSION_EVENT, TEST_BUNDLE);
             mWaitLock.wait(TIME_OUT_MS);
-
             assertTrue(mCallback.mOnSessionEventCalled);
             assertEquals(TEST_SESSION_EVENT, mCallback.mEvent);
             assertEquals(TEST_VALUE, mCallback.mExtras.getString(TEST_KEY));
+        }
+    }
 
-            // test release
+    /**
+     * Tests {@link MediaSessionCompat#setActive} and {@link MediaSessionCompat#release}.
+     */
+    @Test
+    @SmallTest
+    public void testSetActiveAndRelease() throws Exception {
+        MediaControllerCompat controller = mSession.getController();
+        controller.registerCallback(mCallback, mHandler);
+        synchronized (mWaitLock) {
+            mSession.setActive(true);
+            assertTrue(mSession.isActive());
+
             mCallback.resetLocked();
             mSession.release();
             mWaitLock.wait(TIME_OUT_MS);
@@ -278,7 +396,7 @@
     }
 
     /**
-     * Test {@link MediaSessionCompat#setPlaybackToLocal} and
+     * Tests {@link MediaSessionCompat#setPlaybackToLocal} and
      * {@link MediaSessionCompat#setPlaybackToRemote}.
      */
     @Test
@@ -286,7 +404,6 @@
     public void testPlaybackToLocalAndRemote() throws Exception {
         MediaControllerCompat controller = mSession.getController();
         controller.registerCallback(mCallback, mHandler);
-
         synchronized (mWaitLock) {
             // test setPlaybackToRemote, do this before testing setPlaybackToLocal
             // to ensure it switches correctly.
@@ -343,7 +460,7 @@
     }
 
     /**
-     * Test {@link MediaSessionCompat.Callback#onMediaButtonEvent}.
+     * Tests {@link MediaSessionCompat.Callback#onMediaButtonEvent}.
      */
     @Test
     @SmallTest
@@ -503,6 +620,15 @@
         controller.dispatchMediaButtonEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode));
     }
 
+    private void waitUntilExtraBinderReady(final MediaControllerCompat controller) {
+        new PollingCheck(TIME_OUT_MS) {
+            @Override
+            protected boolean check() {
+                return controller.isExtraBinderReady();
+            }
+        }.run();
+    }
+
     private class MediaControllerCallback extends MediaControllerCompat.Callback {
         private volatile boolean mOnPlaybackStateChangedCalled;
         private volatile boolean mOnMetadataChangedCalled;
diff --git a/media-compat/tests/src/android/support/v4/media/session/PlaybackStateCompatTest.java b/media-compat/tests/src/android/support/v4/media/session/PlaybackStateCompatTest.java
index 410ae01..9e320cd 100644
--- a/media-compat/tests/src/android/support/v4/media/session/PlaybackStateCompatTest.java
+++ b/media-compat/tests/src/android/support/v4/media/session/PlaybackStateCompatTest.java
@@ -46,6 +46,8 @@
     private static final float TEST_PLAYBACK_SPEED_ON_REWIND = -2.0f;
     private static final float DELTA = 1e-7f;
 
+    private static final int TEST_ERROR_CODE =
+            PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED;
     private static final String TEST_ERROR_MSG = "test-error-msg";
     private static final String TEST_CUSTOM_ACTION = "test-custom-action";
     private static final String TEST_CUSTOM_ACTION_NAME = "test-custom-action-name";
@@ -68,6 +70,7 @@
         assertEquals(0L, state.getBufferedPosition());
         assertEquals(0.0f, state.getPlaybackSpeed(), DELTA);
         assertEquals(0L, state.getActions());
+        assertEquals(0, state.getErrorCode());
         assertNull(state.getErrorMessage());
         assertEquals(0L, state.getLastPositionUpdateTime());
         assertEquals(MediaSessionCompat.QueueItem.UNKNOWN_ID, state.getActiveQueueItemId());
@@ -94,7 +97,7 @@
                 .setActions(TEST_ACTIONS)
                 .setActiveQueueItemId(TEST_QUEUE_ITEM_ID)
                 .setBufferedPosition(TEST_BUFFERED_POSITION)
-                .setErrorMessage(TEST_ERROR_MSG)
+                .setErrorMessage(TEST_ERROR_CODE, TEST_ERROR_MSG)
                 .setExtras(extras)
                 .build();
         assertEquals(PlaybackStateCompat.STATE_PLAYING, state.getState());
@@ -103,6 +106,7 @@
         assertEquals(TEST_ACTIONS, state.getActions());
         assertEquals(TEST_QUEUE_ITEM_ID, state.getActiveQueueItemId());
         assertEquals(TEST_BUFFERED_POSITION, state.getBufferedPosition());
+        assertEquals(TEST_ERROR_CODE, state.getErrorCode());
         assertEquals(TEST_ERROR_MSG, state.getErrorMessage().toString());
         assertNotNull(state.getExtras());
         assertEquals(EXTRAS_VALUE, state.getExtras().get(EXTRAS_KEY));
@@ -197,7 +201,7 @@
                         .setActions(TEST_ACTIONS)
                         .setActiveQueueItemId(TEST_QUEUE_ITEM_ID)
                         .setBufferedPosition(TEST_BUFFERED_POSITION)
-                        .setErrorMessage(TEST_ERROR_MSG)
+                        .setErrorMessage(TEST_ERROR_CODE, TEST_ERROR_MSG)
                         .setExtras(extras);
 
         for (int i = 0; i < 5; i++) {
@@ -223,6 +227,7 @@
         assertEquals(TEST_BUFFERED_POSITION, stateOut.getBufferedPosition());
         assertEquals(TEST_ACTIONS, stateOut.getActions());
         assertEquals(TEST_QUEUE_ITEM_ID, stateOut.getActiveQueueItemId());
+        assertEquals(TEST_ERROR_CODE, stateOut.getErrorCode());
         assertEquals(TEST_ERROR_MSG, stateOut.getErrorMessage());
         assertNotNull(stateOut.getExtras());
         assertEquals(EXTRAS_VALUE, stateOut.getExtras().get(EXTRAS_KEY));
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
index 50a17cd..2437e51 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
@@ -48,10 +48,10 @@
 import android.support.v4.util.ArrayMap;
 import android.support.v4.util.LongSparseArray;
 import android.support.v4.util.LruCache;
+import android.support.v4.util.SparseArrayCompat;
 import android.support.v7.appcompat.R;
 import android.util.AttributeSet;
 import android.util.Log;
-import android.util.SparseArray;
 import android.util.TypedValue;
 import android.util.Xml;
 
@@ -174,9 +174,9 @@
             R.drawable.abc_btn_radio_material
     };
 
-    private WeakHashMap<Context, SparseArray<ColorStateList>> mTintLists;
+    private WeakHashMap<Context, SparseArrayCompat<ColorStateList>> mTintLists;
     private ArrayMap<String, InflateDelegate> mDelegates;
-    private SparseArray<String> mKnownDrawableIdTags;
+    private SparseArrayCompat<String> mKnownDrawableIdTags;
 
     private final Object mDrawableCacheLock = new Object();
     private final WeakHashMap<Context, LongSparseArray<WeakReference<Drawable.ConstantState>>>
@@ -321,7 +321,7 @@
                 }
             } else {
                 // Create an id cache as we'll need one later
-                mKnownDrawableIdTags = new SparseArray<>();
+                mKnownDrawableIdTags = new SparseArrayCompat<>();
             }
 
             if (mTypedValue == null) {
@@ -423,7 +423,7 @@
                     cache = new LongSparseArray<>();
                     mDrawableCaches.put(context, cache);
                 }
-                cache.put(key, new WeakReference<ConstantState>(cs));
+                cache.put(key, new WeakReference<>(cs));
             }
             return true;
         }
@@ -562,7 +562,7 @@
 
     private ColorStateList getTintListFromCache(@NonNull Context context, @DrawableRes int resId) {
         if (mTintLists != null) {
-            final SparseArray<ColorStateList> tints = mTintLists.get(context);
+            final SparseArrayCompat<ColorStateList> tints = mTintLists.get(context);
             return tints != null ? tints.get(resId) : null;
         }
         return null;
@@ -573,9 +573,9 @@
         if (mTintLists == null) {
             mTintLists = new WeakHashMap<>();
         }
-        SparseArray<ColorStateList> themeTints = mTintLists.get(context);
+        SparseArrayCompat<ColorStateList> themeTints = mTintLists.get(context);
         if (themeTints == null) {
-            themeTints = new SparseArray<>();
+            themeTints = new SparseArrayCompat<>();
             mTintLists.put(context, themeTints);
         }
         themeTints.append(resId, tintList);
diff --git a/v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java b/v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java
index 78fdda3..844f527 100644
--- a/v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/BaseKeyEventsTestCase.java
@@ -29,8 +29,10 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.SmallTest;
+import android.support.test.filters.Suppress;
 import android.support.v7.appcompat.test.R;
 import android.support.v7.testutils.BaseTestActivity;
 import android.support.v7.view.ActionMode;
@@ -90,6 +92,8 @@
         assertTrue("ActionMode was destroyed", destroyed.get());
     }
 
+    @Suppress
+    @FlakyTest(bugId = 34956766)
     @Test
     @LargeTest
     public void testBackCollapsesSearchView() throws InterruptedException {
diff --git a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
index 3fe899d..d81856c 100755
--- a/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/app/DrawerLayoutTest.java
@@ -44,9 +44,11 @@
 import android.support.test.espresso.action.GeneralSwipeAction;
 import android.support.test.espresso.action.Press;
 import android.support.test.espresso.action.Swipe;
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.SmallTest;
+import android.support.test.filters.Suppress;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.appcompat.test.R;
@@ -426,6 +428,8 @@
         mDrawerLayout.removeDrawerListener(mockedListener);
     }
 
+    @Suppress
+    @FlakyTest(bugId = 33659300)
     @Test
     @SmallTest
     public void testDrawerListenerCallbacksOnOpeningViaSwipes() {
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_stop_dark.png b/v7/mediarouter/res/drawable-hdpi/ic_media_stop_dark.png
new file mode 100644
index 0000000..801d341
--- /dev/null
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_stop_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-hdpi/ic_media_stop_light.png b/v7/mediarouter/res/drawable-hdpi/ic_media_stop_light.png
new file mode 100644
index 0000000..9d6b65d
--- /dev/null
+++ b/v7/mediarouter/res/drawable-hdpi/ic_media_stop_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_stop_dark.png b/v7/mediarouter/res/drawable-mdpi/ic_media_stop_dark.png
new file mode 100644
index 0000000..3ad2c9c
--- /dev/null
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_stop_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-mdpi/ic_media_stop_light.png b/v7/mediarouter/res/drawable-mdpi/ic_media_stop_light.png
new file mode 100644
index 0000000..b002ab7
--- /dev/null
+++ b/v7/mediarouter/res/drawable-mdpi/ic_media_stop_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_stop_dark.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_stop_dark.png
new file mode 100644
index 0000000..5239336
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_stop_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xhdpi/ic_media_stop_light.png b/v7/mediarouter/res/drawable-xhdpi/ic_media_stop_light.png
new file mode 100644
index 0000000..5bc5a6c
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xhdpi/ic_media_stop_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_stop_dark.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_stop_dark.png
new file mode 100644
index 0000000..035ca18
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_stop_dark.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable-xxhdpi/ic_media_stop_light.png b/v7/mediarouter/res/drawable-xxhdpi/ic_media_stop_light.png
new file mode 100644
index 0000000..eac183d
--- /dev/null
+++ b/v7/mediarouter/res/drawable-xxhdpi/ic_media_stop_light.png
Binary files differ
diff --git a/v7/mediarouter/res/drawable/mr_media_stop_dark.xml b/v7/mediarouter/res/drawable/mr_media_stop_dark.xml
new file mode 100644
index 0000000..9757552
--- /dev/null
+++ b/v7/mediarouter/res/drawable/mr_media_stop_dark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/ic_media_stop_dark" />
+</selector>
diff --git a/v7/mediarouter/res/drawable/mr_media_stop_light.xml b/v7/mediarouter/res/drawable/mr_media_stop_light.xml
new file mode 100644
index 0000000..c7717c7
--- /dev/null
+++ b/v7/mediarouter/res/drawable/mr_media_stop_light.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <bitmap
+            android:src="@drawable/ic_media_stop_light"
+            android:alpha="0.87" />
+    </item>
+</selector>
diff --git a/v7/mediarouter/res/layout/mr_playback_control.xml b/v7/mediarouter/res/layout/mr_playback_control.xml
index b441254..9d788f6 100644
--- a/v7/mediarouter/res/layout/mr_playback_control.xml
+++ b/v7/mediarouter/res/layout/mr_playback_control.xml
@@ -20,7 +20,7 @@
                 android:orientation="horizontal"
                 android:paddingLeft="24dp"
                 android:paddingRight="12dp" >
-    <ImageButton android:id="@+id/mr_control_play_pause"
+    <ImageButton android:id="@+id/mr_control_playback_ctrl"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="12dp"
@@ -33,7 +33,7 @@
                   android:orientation="vertical"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
-                  android:layout_toLeftOf="@id/mr_control_play_pause"
+                  android:layout_toLeftOf="@id/mr_control_playback_ctrl"
                   android:layout_alignParentLeft="true"
                   android:layout_centerVertical="true">
         <TextView android:id="@+id/mr_control_title"
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 444ffc2..9d311a9 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Saai uit na"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Vind tans toestelle"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ontkoppel"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Hou op uitsaai"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Hou op uitsaai"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Maak toe"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Speel"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Laat wag"</string>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 96a2c09..ef7f3be 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast አድርግ ወደ"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"መሣሪያዎችን በማግኘት ላይ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ግንኙነት አቋርጥ"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Cast ማድረግ አቁም"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Cast ማድረግ አቁም"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ዝጋ"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"አጫውት"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"ለአፍታ አቁም"</string>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index 3caf4b6..897460c 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"إرسال إلى"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"جارٍ البحث عن أجهزة"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع الاتصال"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"إيقاف الإرسال"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"إيقاف الإرسال"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"إغلاق"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"تشغيل"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"إيقاف مؤقت"</string>
diff --git a/v7/mediarouter/res/values-az-rAZ/strings.xml b/v7/mediarouter/res/values-az-rAZ/strings.xml
index 31574c3..a7cc571 100644
--- a/v7/mediarouter/res/values-az-rAZ/strings.xml
+++ b/v7/mediarouter/res/values-az-rAZ/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Bura yayımlayın"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar axtarılır"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantını kəsin"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Yayımı dayandırın"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Yayımı dayandırın"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Qapadın"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Oynadın"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Durdurun"</string>
diff --git a/v7/mediarouter/res/values-b+sr+Latn/strings.xml b/v7/mediarouter/res/values-b+sr+Latn/strings.xml
index 8075d2e..e64356e 100644
--- a/v7/mediarouter/res/values-b+sr+Latn/strings.xml
+++ b/v7/mediarouter/res/values-b+sr+Latn/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Pronalaženje uređaja"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Zaustavi prebacivanje"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Zaustavi prebacivanje"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Pusti"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
diff --git a/v7/mediarouter/res/values-be-rBY/strings.xml b/v7/mediarouter/res/values-be-rBY/strings.xml
index 75c24d5..93ccc1a 100644
--- a/v7/mediarouter/res/values-be-rBY/strings.xml
+++ b/v7/mediarouter/res/values-be-rBY/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Трансляваць на"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Спыніць трансляцыю"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Спыніць трансляцыю"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыць"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Прайграць"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Прыпыніць"</string>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index d756d6c..ef4db0a 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Предаване към"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Търсят се устройства"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекратяване на връзката"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Спиране на предаването"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Спиране на предаването"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Затваряне"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Пускане"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Поставяне на пауза"</string>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index b94b9af..d542100 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"এতে কাস্ট করুন"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ডিভাইসগুলিকে খোঁজা হচ্ছে"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"সংযোগ বিচ্ছিন্ন করুন"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"কাস্ট করা বন্ধ করুন"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"কাস্ট করা বন্ধ করুন"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"বন্ধ করুন"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"চালান"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"বিরাম দিন"</string>
diff --git a/v7/mediarouter/res/values-bs-rBA/strings.xml b/v7/mediarouter/res/values-bs-rBA/strings.xml
index df4e3ef..cd8e586 100644
--- a/v7/mediarouter/res/values-bs-rBA/strings.xml
+++ b/v7/mediarouter/res/values-bs-rBA/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Zaustavi prebacivanje"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Zaustavi prebacivanje"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproduciraj"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index 400d424..875290f 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Emet a"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"S\'estan cercant dispositius"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconnecta"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Atura l\'emissió"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Atura l\'emissió"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Tanca"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reprodueix"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Posa en pausa"</string>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index 5a29bac..532612a 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Odesílat do"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Hledání zařízení"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojit"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Zastavit odesílání"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Zastavit odesílání"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavřít"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Přehrát"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastavit"</string>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index f33a4ee..55864a0 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Finder enheder"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Afbryd"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop med at caste"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Stop med at caste"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Luk"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Afspil"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Sæt på pause"</string>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 13686aa..50025de 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Streamen auf"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Geräte werden gesucht."</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Verbindung trennen"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Streaming stoppen"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Streaming stoppen"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Schließen"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Wiedergeben"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausieren"</string>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 3f45621..fd415cc 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Μετάδοση σε"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Εύρεση συσκευών"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Αποσύνδεση"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Διακοπή μετάδοσης"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Διακοπή μετάδοσης"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Κλείσιμο"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Αναπαραγωγή"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Παύση"</string>
diff --git a/v7/mediarouter/res/values-en-rAU/strings.xml b/v7/mediarouter/res/values-en-rAU/strings.xml
index 9201c1f..7ce2f28 100644
--- a/v7/mediarouter/res/values-en-rAU/strings.xml
+++ b/v7/mediarouter/res/values-en-rAU/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Stop casting"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index 9201c1f..7ce2f28 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Stop casting"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index 9201c1f..7ce2f28 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Stop casting"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index 90aa823..9b411dd 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir a"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Detener la transmisión"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Detener la transmisión"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index 52a886f..057d3d2 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Enviar a"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Dejar de enviar contenido"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Dejar de enviar contenido"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index ce1847a..8fa0e94 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Ülekandmine seadmesse"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Seadmete otsimine"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkesta ühendus"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Peata ülekanne"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Peata ülekanne"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulgemine"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Esitamine"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Peatamine"</string>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index c03d73b..d8efeba 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Utzi igortzeari"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Utzi igortzeari"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Itxi"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Erreproduzitu"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausatu"</string>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index 7cc9fbc..8d965d1 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ارسال محتوا به"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"پیدا کردن دستگاه‌ها"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع ارتباط"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"توقف ارسال محتوا"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"توقف ارسال محتوا"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"بستن"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"پخش"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"مکث"</string>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index 2465802..41727ef 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Suoratoiston kohde"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Etsitään laitteita"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkaise yhteys"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Lopeta suoratoisto"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Lopeta suoratoisto"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulje"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Toista"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Keskeytä"</string>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index fd1ea8c..9f489f2 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Se déconnecter"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Arrêter la diffusion"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Arrêter la diffusion"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Lire"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Interrompre"</string>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index 8c96485..86f70bb 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils en cours…"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Arrêter de diffuser"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Arrêter de diffuser"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Lecture"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index d6d1888..7d250bf 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Emitir en"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Deter emisión"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Deter emisión"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Pechar"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproduce"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
diff --git a/v7/mediarouter/res/values-gu-rIN/strings.xml b/v7/mediarouter/res/values-gu-rIN/strings.xml
index eb7a9b8..6c2237e 100644
--- a/v7/mediarouter/res/values-gu-rIN/strings.xml
+++ b/v7/mediarouter/res/values-gu-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"આના પર કાસ્ટ કરો"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ઉપકરણો શોધી રહ્યાં છીએ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ડિસ્કનેક્ટ કરો"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"કાસ્ટ કરવાનું રોકો"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"કાસ્ટ કરવાનું રોકો"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"બંધ કરો"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ચલાવો"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"થોભાવો"</string>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index e74967e..0048639 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"इस पर कास्‍ट करें"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"डिवाइस ढूंढ रहा है"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करें"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"कास्ट करना बंद करें"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"कास्ट करना बंद करें"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करें"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"चलाएं"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"रोकें"</string>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index f50d748..83b2a7a 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Zaustavi emitiranje"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Zaustavi emitiranje"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvaranje"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reprodukcija"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziranje"</string>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index 6420985..9d4b770 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Átküldés ide"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Eszközök keresése"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Leválasztás"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Átküldés leállítása"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Átküldés leállítása"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Bezárás"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Lejátszás"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Szüneteltetés"</string>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index 6e46af8..f1221d1 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Ընտրեք սարքը"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Սարքերի որոնում"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Անջատել"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Դադարեցնել հեռարձակումը"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Դադարեցնել հեռարձակումը"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Փակել"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Նվագարկել"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Դադար"</string>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index 43e0c62..fbe906a 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmisikan ke"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Hentikan transmisi"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Hentikan transmisi"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Putar"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 53de253..cf5308e 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Senda út í"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Leitað að tækjum"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Aftengjast"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Stöðva útsendingu"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Stöðva útsendingu"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Loka"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Spila"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Hlé"</string>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index df6bbfe..b8f12a5 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Trasmetti a"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Ricerca di dispositivi in corso"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Scollega"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Interrompi trasmissione"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Interrompi trasmissione"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Chiudi"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Riproduci"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index be705a6..89a136a 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"העבר אל"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"עצור העברה"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"עצור העברה"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"סגור"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"הפעל"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"השהה"</string>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index 75d75d6..6b731d2 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"キャストするデバイス"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"端末を検索しています"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"接続を解除"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"キャストを停止"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"キャストを停止"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"閉じる"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"再生"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"一時停止"</string>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index 3bcc513..584203f 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირებული"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"მიმდინარეობს მოწყობილობების მოძიება"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"ტრანსლირების შეჩერება"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"ტრანსლირების შეჩერება"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"დაკვრა"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"პაუზა"</string>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index 43e75b7..185fbf9 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Келесіге трансляциялау"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Құрылғыларды табу"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажырату"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Трансляциялауды тоқтату"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Трансляциялауды тоқтату"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабу"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Ойнату"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Кідірту"</string>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index 44d88f4..7a92a77 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ខាសទៅ"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ស្វែងរកឧបករណ៍"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"បញ្ឈប់ការខាស"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"បញ្ឈប់ការខាស"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ចាក់"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"ផ្អាក"</string>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 193d449..a493757 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ಮುಚ್ಚು"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ಪ್ಲೇ ಮಾಡಿ"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"ವಿರಾಮ"</string>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index 242560a..8630f4f 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"전송할 기기"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"기기를 찾는 중"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"연결 해제"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"전송 중지"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"전송 중지"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"닫기"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"재생"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"일시중지"</string>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index 0898ade..82f64be 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Түзмөктөр изделүүдө"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажыратуу"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Тышк экранга чыгарну токтотуу"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Тышк экранга чыгарну токтотуу"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабуу"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Ойнотуу"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Тындыруу"</string>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index 65b3472..8771268 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ຄາ​ສ​ທ໌​ຫາ"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງ​ຊອກ​ຫາ​ອຸ​ປະ​ກອນ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"ຢຸດການຄາ​ສ​ທ໌"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"ຢຸດການຄາ​ສ​ທ໌"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ປິດ"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ຫຼິ້ນ"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"ຢຸດຊົ່ວຄາວ"</string>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index 35931cf..45398f0 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Perduoti į"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Randami įrenginiai"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atjungti"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Sustabdyti perdavimą"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Sustabdyti perdavimą"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Uždaryti"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Leisti"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pristabdyti"</string>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index c146174..e01705e 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Apraidīšana uz ierīci"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Notiek ierīču meklēšana"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atvienot"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Pārtraukt apraidi"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Pārtraukt apraidi"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Aizvērt"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Atskaņot"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Apturēt"</string>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index 6fd428f..205467e 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Наоѓање уреди"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Запри го емитувањето"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Запри го емитувањето"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Репродуцирај"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index 63a37f8..00fc9dc 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ഇതിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"അടയ്‌ക്കുക"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"പ്ലേ ചെയ്യുക"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index 1197bfe..cccf05e 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Дамжуулах"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Төхөөрөмж хайж байна"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Салгах"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Дамжуулахыг зогсоох"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Дамжуулахыг зогсоох"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Хаах"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Тоглуулах"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Түр зогсоох"</string>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index 40d7d66..37374b4 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्‍कनेक्‍ट करा"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"कास्ट करणे थांबवा"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"कास्ट करणे थांबवा"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करा"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"प्ले करा"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"विराम"</string>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index cc32b96..6474884 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Hantar ke"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari peranti"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Berhenti menghantar"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Berhenti menghantar"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Main"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index e31cc92..836d137 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"သို့ ကာစ်တ်လုပ်ရန်"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"ကာစ်တ်လုပ်ခြင်း ရပ်တန့်ရန်"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"ကာစ်တ်လုပ်ခြင်း ရပ်တန့်ရန်"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ပိတ်ရန်"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ဖွင့်ရန်"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"ခဏရပ်ရန်"</string>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index 97ca73c..172d9d4 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Finner enheter"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Stopp castingen"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Stopp castingen"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Spill av"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Sett på pause"</string>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index 0e48b45..e9e4f03 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"यसमा Cast गर्नुहोस्"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"यन्त्रहरू पत्ता लगाउँदै"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"विच्छेद गर्नुहोस्"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"casting रोक्नुहोस्"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"casting रोक्नुहोस्"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"बन्द गर्नुहोस्"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"बजाउनुहोस्"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"रोक्नुहोस्"</string>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index 5c899fd..21364e7 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Casten naar"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Apparaten zoeken"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Loskoppelen"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Casten stoppen"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Casten stoppen"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Sluiten"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Afspelen"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Onderbreken"</string>
diff --git a/v7/mediarouter/res/values-pa-rIN/strings.xml b/v7/mediarouter/res/values-pa-rIN/strings.xml
index 258529d..1e4dfae 100644
--- a/v7/mediarouter/res/values-pa-rIN/strings.xml
+++ b/v7/mediarouter/res/values-pa-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"ਇਸ ਨਾਲ ਕਾਸਟ ਕਰੋ"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡਿਵਾਈਸਾਂ ਲੱਭ ਰਿਹਾ ਹੈ"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"ਜੋੜਨਾ ਰੋਕੋ"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"ਜੋੜਨਾ ਰੋਕੋ"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ਬੰਦ ਕਰੋ"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ਪਲੇ ਕਰੋ"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"ਰੋਕੋ"</string>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index 0320550..db0934d 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Przesyłaj na"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Znajdowanie urządzeń"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odłącz"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Zatrzymaj przesyłanie"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Zatrzymaj przesyłanie"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zamknij"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Odtwórz"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Wstrzymaj"</string>
diff --git a/v7/mediarouter/res/values-pt-rBR/strings.xml b/v7/mediarouter/res/values-pt-rBR/strings.xml
index 2fd84b1..b424082 100644
--- a/v7/mediarouter/res/values-pt-rBR/strings.xml
+++ b/v7/mediarouter/res/values-pt-rBR/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper transmissão"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Interromper transmissão"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index b62f363..c6c52f9 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"A localizar dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desassociar"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper a transmissão"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Interromper a transmissão"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Interromper"</string>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 2fd84b1..b424082 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper transmissão"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Interromper transmissão"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index 769a0ac..ab2fd61 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Proiectați pe"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Se caută dispozitive"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deconectați-vă"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Opriți proiecția"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Opriți proiecția"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Închideți"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Redați"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Întrerupeți"</string>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index 9bd2170..768f300 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Выберите устройство"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Поиск устройств…"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Отключить"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Остановить трансляцию"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Остановить трансляцию"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыть"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Воспроизвести"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Приостановить"</string>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index baeac3e..e26a087 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"විකාශය"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"උපාංග සෙවීම"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"විසන්ධි කරන්න"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"විකාශ කිරීම නවත්වන්න"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"විකාශ කිරීම නවත්වන්න"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"වසන්න"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ධාවනය කරන්න"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"විරාම ගන්වන්න"</string>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index 4a0f4bf..92c7307 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Vyhľadávanie zariadení"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Zastaviť prenos"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Zastaviť prenos"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Prehrať"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastaviť"</string>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 4ca2bdc..ba5609e 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Predvajanje prek:"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Iskanje naprav"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini povezavo"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Ustavi predvajanje"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Ustavi predvajanje"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Zapri"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Predvajanje"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Zaustavi"</string>
diff --git a/v7/mediarouter/res/values-sq-rAL/strings.xml b/v7/mediarouter/res/values-sq-rAL/strings.xml
index 45e3a34..5ebfbab 100644
--- a/v7/mediarouter/res/values-sq-rAL/strings.xml
+++ b/v7/mediarouter/res/values-sq-rAL/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Gjetja e pajisjeve"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Ndalo transmetimin"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Ndalo transmetimin"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Mbyll"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Luaj"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauzë"</string>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index bddc045..0696486 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Пребацујте на"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Проналажење уређаја"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекини везу"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Заустави пребацивање"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Заустави пребацивање"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Пусти"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index 9597bf9..9be5f57 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Casta till"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Letar efter enheter"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koppla från"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Sluta casta"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Sluta casta"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Stäng"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Spela upp"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index f7ae8f5..989f420 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Tuma kwenye"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Inatafuta vifaa"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ondoa"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Acha kutuma"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Acha kutuma"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Funga"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Cheza"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Sitisha"</string>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index 0ef3fc3..decdebd 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"இதில் திரையிடு"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"அனுப்புவதை நிறுத்து"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"அனுப்புவதை நிறுத்து"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"மூடும்"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"இயக்கும்"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"இடைநிறுத்தும்"</string>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index c7ae34f..7412980 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"దీనికి ప్రసారం చేయండి"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"పరికరాలను కనుగొంటోంది"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"డిస్‌కనెక్ట్ చేయి"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"ప్రసారాన్ని ఆపివేయి"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"ప్రసారాన్ని ఆపివేయి"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"మూసివేస్తుంది"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"ప్లే చేస్తుంది"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"పాజ్ చేస్తుంది"</string>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index 219374c..231aa2e 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"แคสต์ไปยัง"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"กำลังค้นหาอุปกรณ์"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"ยกเลิกการเชื่อมต่อ"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"หยุดการแคสต์"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"หยุดการแคสต์"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"ปิด"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"เล่น"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"หยุดชั่วคราว"</string>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index e2bb7c7..c128aba 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"I-cast sa"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Naghahanap ng mga device"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Idiskonekta"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Itigil ang pagca-cast"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Itigil ang pagca-cast"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Isara"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"I-play"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"I-pause"</string>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index 187682f..6bc7072 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Şuraya yayınla:"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar bulunuyor"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantıyı kes"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Yayını durdur"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Yayını durdur"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Kapat"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Oynat"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Duraklat"</string>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index 8c2a16a..1f9104e 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Транслювати на"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук пристроїв"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Відключити"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Припинити трансляцію"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Припинити трансляцію"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрити"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Відтворити"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Призупинити"</string>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index 053373f..667fddc 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"اس میں کاسٹ کریں"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"آلات تلاش ہو رہے ہیں"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"غیر منسلک کریں"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"کاسٹ کرنا بند کریں"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"کاسٹ کرنا بند کریں"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"بند کریں"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"چلائیں"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"موقوف کریں"</string>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index 9d1e455..91b5e49 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Quyidagiga translatsiya qilish:"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Qurilmalarni topish"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ulanishni uzish"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Translatsiyani to‘xtatish"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Translatsiyani to‘xtatish"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Yopish"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Boshlash"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"To‘xtatib turish"</string>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 488b9f0..44e7a6a 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Tìm thiết bị"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Dừng truyền"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Dừng truyền"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Phát"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Tạm dừng"</string>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index c22a91c..15221e9 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"投射到"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"正在查找设备"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"断开连接"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"停止投射"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"停止投射"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"关闭"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"暂停"</string>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index d17469b..0aebac0 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"投放至"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"停止投放"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"停止投放"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index 1a71c84..aa9c75b 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"投放到"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"停止投放"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"停止投放"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index 860aa09..db82ffa 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -25,7 +25,7 @@
     <string name="mr_chooser_title" msgid="414301941546135990">"Sakaza ku-"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"Ithola amadivayisi"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"Nqamula"</string>
-    <string name="mr_controller_stop" msgid="4570331844078181931">"Misa ukusakaza"</string>
+    <string name="mr_controller_stop_casting" msgid="4570331844078181931">"Misa ukusakaza"</string>
     <string name="mr_controller_close_description" msgid="7333862312480583260">"Vala"</string>
     <string name="mr_controller_play" msgid="683634565969987458">"Dlala"</string>
     <string name="mr_controller_pause" msgid="5451884435510905406">"Misa isikhashana"</string>
diff --git a/v7/mediarouter/res/values/attrs.xml b/v7/mediarouter/res/values/attrs.xml
index c618fd8..10d1c2c 100644
--- a/v7/mediarouter/res/values/attrs.xml
+++ b/v7/mediarouter/res/values/attrs.xml
@@ -32,6 +32,7 @@
     <attr name="mediaRouteCloseDrawable" format="reference" />
     <attr name="mediaRoutePlayDrawable" format="reference" />
     <attr name="mediaRoutePauseDrawable" format="reference" />
+    <attr name="mediaRouteStopDrawable" format="reference" />
     <attr name="mediaRouteAudioTrackDrawable" format="reference" />
     <attr name="mediaRouteDefaultIconDrawable" format="reference" />
     <attr name="mediaRouteTvIconDrawable" format="reference" />
diff --git a/v7/mediarouter/res/values/strings.xml b/v7/mediarouter/res/values/strings.xml
index bff7176..630a482 100644
--- a/v7/mediarouter/res/values/strings.xml
+++ b/v7/mediarouter/res/values/strings.xml
@@ -47,7 +47,7 @@
     <string name="mr_controller_disconnect">Disconnect</string>
 
     <!-- Button to stop playback and disconnect from a media route. [CHAR LIMIT=30] -->
-    <string name="mr_controller_stop">Stop casting</string>
+    <string name="mr_controller_stop_casting">Stop casting</string>
 
     <!-- Content description for accessibility (not shown on the screen): dialog close button. [CHAR LIMIT=NONE] -->
     <string name="mr_controller_close_description">Close</string>
@@ -58,6 +58,9 @@
     <!-- Content description for accessibility (not shown on the screen): media pause button. [CHAR LIMIT=NONE] -->
     <string name="mr_controller_pause">Pause</string>
 
+    <!-- Content description for accessibility (not shown on the screen): media stop button. [CHAR LIMIT=NONE] -->
+    <string name="mr_controller_stop">Stop</string>
+
     <!-- Content description for accessibility (not shown on the screen): group expand button. Pressing button shows group members of a selected route group. [CHAR LIMIT=NONE] -->
     <string name="mr_controller_expand_group">Expand</string>
 
diff --git a/v7/mediarouter/res/values/themes.xml b/v7/mediarouter/res/values/themes.xml
index 1eb4bfd..8c6e97a 100644
--- a/v7/mediarouter/res/values/themes.xml
+++ b/v7/mediarouter/res/values/themes.xml
@@ -23,6 +23,7 @@
         <item name="mediaRouteCloseDrawable">@drawable/mr_dialog_close_dark</item>
         <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_dark</item>
         <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_dark</item>
+        <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_dark</item>
         <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_dark</item>
         <item name="mediaRouteDefaultIconDrawable">@drawable/ic_mr_button_disconnected_dark</item>
         <item name="mediaRouteTvIconDrawable">@drawable/ic_vol_type_tv_dark</item>
@@ -43,6 +44,7 @@
         <item name="mediaRouteCloseDrawable">@drawable/mr_dialog_close_light</item>
         <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_light</item>
         <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_light</item>
+        <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_light</item>
         <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_light</item>
         <item name="mediaRouteDefaultIconDrawable">@drawable/ic_mr_button_grey</item>
         <item name="mediaRouteTvIconDrawable">@drawable/ic_vol_type_tv_light</item>
@@ -59,12 +61,14 @@
     <style name="ThemeOverlay.MediaRouter.Dark" parent="ThemeOverlay.AppCompat.Dark">
         <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_dark</item>
         <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_dark</item>
+        <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_dark</item>
         <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_dark</item>
 
     </style>
     <style name="ThemeOverlay.MediaRouter.Light" parent="ThemeOverlay.AppCompat.Light">
         <item name="mediaRoutePlayDrawable">@drawable/mr_media_play_light</item>
         <item name="mediaRoutePauseDrawable">@drawable/mr_media_pause_light</item>
+        <item name="mediaRouteStopDrawable">@drawable/mr_media_stop_light</item>
         <item name="mediaRouteAudioTrackDrawable">@drawable/mr_vol_type_audiotrack_light</item>
     </style>
 
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index 961e37e..4d40610 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -16,6 +16,11 @@
 
 package android.support.v7.app;
 
+import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PAUSE;
+import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY;
+import static android.support.v4.media.session.PlaybackStateCompat.ACTION_PLAY_PAUSE;
+import static android.support.v4.media.session.PlaybackStateCompat.ACTION_STOP;
+
 import android.app.PendingIntent;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -67,7 +72,6 @@
 import android.widget.RelativeLayout;
 import android.widget.SeekBar;
 import android.widget.TextView;
-
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -119,7 +123,7 @@
 
     private Button mDisconnectButton;
     private Button mStopCastingButton;
-    private ImageButton mPlayPauseButton;
+    private ImageButton mPlaybackControlButton;
     private ImageButton mCloseButton;
     private MediaRouteExpandCollapseButton mGroupExpandCollapseButton;
 
@@ -351,7 +355,7 @@
         mDisconnectButton.setOnClickListener(listener);
 
         mStopCastingButton = (Button) findViewById(BUTTON_STOP_RES_ID);
-        mStopCastingButton.setText(R.string.mr_controller_stop);
+        mStopCastingButton.setText(R.string.mr_controller_stop_casting);
         mStopCastingButton.setTextColor(color);
         mStopCastingButton.setOnClickListener(listener);
 
@@ -388,8 +392,8 @@
         mPlaybackControlLayout = (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);
+        mPlaybackControlButton = (ImageButton) findViewById(R.id.mr_control_playback_ctrl);
+        mPlaybackControlButton.setOnClickListener(listener);
 
         mVolumeControlLayout = (LinearLayout) findViewById(R.id.mr_volume_control);
         mVolumeControlLayout.setVisibility(View.GONE);
@@ -1006,30 +1010,47 @@
             if (mState != null) {
                 boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING
                         || mState.getState() == PlaybackStateCompat.STATE_PLAYING;
-                boolean supportsPlay = (mState.getActions() & (PlaybackStateCompat.ACTION_PLAY
-                        | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
-                boolean supportsPause = (mState.getActions() & (PlaybackStateCompat.ACTION_PAUSE
-                        | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
-                Context playPauseButtonContext = mPlayPauseButton.getContext();
-                if (isPlaying && supportsPause) {
-                    mPlayPauseButton.setVisibility(View.VISIBLE);
-                    mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
-                            playPauseButtonContext, R.attr.mediaRoutePauseDrawable));
-                    mPlayPauseButton.setContentDescription(playPauseButtonContext.getResources()
-                            .getText(R.string.mr_controller_pause));
-                } else if (!isPlaying && supportsPlay) {
-                    mPlayPauseButton.setVisibility(View.VISIBLE);
-                    mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource(
-                            playPauseButtonContext, R.attr.mediaRoutePlayDrawable));
-                    mPlayPauseButton.setContentDescription(playPauseButtonContext.getResources()
-                            .getText(R.string.mr_controller_play));
+                Context playbackControlButtonContext = mPlaybackControlButton.getContext();
+                boolean visible = true;
+                int iconDrawableAttr = 0;
+                int iconDescResId = 0;
+                if (isPlaying && isPauseActionSupported()) {
+                    iconDrawableAttr = R.attr.mediaRoutePauseDrawable;
+                    iconDescResId = R.string.mr_controller_pause;
+                } else if (isPlaying && isStopActionSupported()) {
+                    iconDrawableAttr = R.attr.mediaRouteStopDrawable;
+                    iconDescResId = R.string.mr_controller_stop;
+                } else if (!isPlaying && isPlayActionSupported()) {
+                    iconDrawableAttr = R.attr.mediaRoutePlayDrawable;
+                    iconDescResId = R.string.mr_controller_play;
                 } else {
-                    mPlayPauseButton.setVisibility(View.GONE);
+                    visible = false;
+                }
+                mPlaybackControlButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+                if (visible) {
+                    mPlaybackControlButton.setImageResource(
+                            MediaRouterThemeHelper.getThemeResource(
+                                    playbackControlButtonContext, iconDrawableAttr));
+                    mPlaybackControlButton.setContentDescription(
+                            playbackControlButtonContext.getResources()
+                                    .getText(iconDescResId));
                 }
             }
         }
     }
 
+    private boolean isPlayActionSupported() {
+        return (mState.getActions() & (ACTION_PLAY | ACTION_PLAY_PAUSE)) != 0;
+    }
+
+    private boolean isPauseActionSupported() {
+        return (mState.getActions() & (ACTION_PAUSE | ACTION_PLAY_PAUSE)) != 0;
+    }
+
+    private boolean isStopActionSupported() {
+        return (mState.getActions() & ACTION_STOP) != 0;
+    }
+
     boolean isVolumeControlAvailable(MediaRouter.RouteInfo route) {
         return mVolumeControlEnabled && route.getVolumeHandling()
                 == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE;
@@ -1172,23 +1193,28 @@
                             MediaRouter.UNSELECT_REASON_DISCONNECTED);
                 }
                 dismiss();
-            } else if (id == R.id.mr_control_play_pause) {
+            } else if (id == R.id.mr_control_playback_ctrl) {
                 if (mMediaController != null && mState != null) {
                     boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_PLAYING;
-                    if (isPlaying) {
+                    int actionDescResId = 0;
+                    if (isPlaying && isPauseActionSupported()) {
                         mMediaController.getTransportControls().pause();
-                    } else {
+                        actionDescResId = R.string.mr_controller_pause;
+                    } else if (isPlaying && isStopActionSupported()) {
+                        mMediaController.getTransportControls().stop();
+                        actionDescResId = R.string.mr_controller_stop;
+                    } else if (!isPlaying && isPlayActionSupported()){
                         mMediaController.getTransportControls().play();
+                        actionDescResId = R.string.mr_controller_play;
                     }
                     // Announce the action for accessibility.
-                    if (mAccessibilityManager != null && mAccessibilityManager.isEnabled()) {
+                    if (mAccessibilityManager != null && mAccessibilityManager.isEnabled()
+                            && actionDescResId != 0) {
                         AccessibilityEvent event = AccessibilityEvent.obtain(
                                 AccessibilityEventCompat.TYPE_ANNOUNCEMENT);
                         event.setPackageName(mContext.getPackageName());
                         event.setClassName(getClass().getName());
-                        int resId = isPlaying ?
-                                R.string.mr_controller_pause : R.string.mr_controller_play;
-                        event.getText().add(mContext.getString(resId));
+                        event.getText().add(mContext.getString(actionDescResId));
                         mAccessibilityManager.sendAccessibilityEvent(event);
                     }
                 }
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
index 4437805..cc6762a 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewLayoutTest.java
@@ -51,8 +51,11 @@
 import android.os.Build;
 import android.os.SystemClock;
 import android.support.annotation.Nullable;
+import android.support.test.filters.FlakyTest;
+import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
 import android.support.test.filters.SdkSuppress;
+import android.support.test.filters.Suppress;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.v4.view.ViewCompat;
 import android.support.v7.util.TouchUtils;
@@ -1431,7 +1434,10 @@
         }
     }
 
+    @Suppress
+    @FlakyTest(bugId = 33949798)
     @Test
+    @LargeTest
     public void hasPendingUpdatesBeforeFirstLayout() throws Throwable {
         RecyclerView recyclerView = new RecyclerView(getActivity());
         TestLayoutManager layoutManager = new DumbLayoutManager();
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
index b9bfe40..f231c44 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/StaggeredGridLayoutManagerBaseConfigSetTest.java
@@ -34,7 +34,10 @@
 import android.os.Looper;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.test.filters.FlakyTest;
+import android.support.test.filters.LargeTest;
 import android.support.test.filters.MediumTest;
+import android.support.test.filters.Suppress;
 import android.support.v4.view.ViewCompat;
 import android.util.Log;
 import android.view.View;
@@ -739,7 +742,10 @@
         consistentRelayoutTest(mConfig, true);
     }
 
+    @Suppress
+    @FlakyTest(bugId = 34158822)
     @Test
+    @LargeTest
     public void dontRecycleViewsTranslatedOutOfBoundsFromStart() throws Throwable {
         final Config config = ((Config) mConfig.clone()).itemCount(1000);
         setupByConfig(config);