diff --git a/media2/session/src/androidTest/java/androidx/media2/session/MediaControllerTest.java b/media2/session/src/androidTest/java/androidx/media2/session/MediaControllerTest.java
index a89340d..7f8062e 100644
--- a/media2/session/src/androidTest/java/androidx/media2/session/MediaControllerTest.java
+++ b/media2/session/src/androidTest/java/androidx/media2/session/MediaControllerTest.java
@@ -66,7 +66,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -1108,45 +1107,14 @@
     }
 
     @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void playFromSearch() throws Exception {
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPlayFromSearch(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-                super.onPlayFromSearch(session, controller, query, extras);
-                assertEquals(mContext.getPackageName(), controller.getPackageName());
-                assertEquals(request, query);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPlayFromSearch").build()) {
-            MediaController controller = createController(session.getToken());
-            SessionResult result = controller.playFromSearch(request, bundle)
-                    .get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            assertEquals(RESULT_SUCCESS, result.getResultCode());
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void playFromUri() throws Exception {
+    public void setMediaUri() throws Exception {
         final Uri request = Uri.parse("foo://boo");
         final Bundle bundle = new Bundle();
         bundle.putString("key", "value");
         final CountDownLatch latch = new CountDownLatch(1);
         final SessionCallback callback = new SessionCallback() {
             @Override
-            public int onPlayFromUri(@NonNull MediaSession session,
+            public int onSetMediaUri(@NonNull MediaSession session,
                     @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
                 assertEquals(mContext.getPackageName(), controller.getPackageName());
                 assertEquals(request, uri);
@@ -1157,125 +1125,9 @@
         };
         try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
                 .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPlayFromUri").build()) {
+                .setId("testSetMediaUri").build()) {
             MediaController controller = createController(session.getToken());
-            SessionResult result = controller.playFromUri(request, bundle)
-                    .get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            assertEquals(RESULT_SUCCESS, result.getResultCode());
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void playFromMediaId() throws Exception {
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPlayFromMediaId(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-                assertEquals(mContext.getPackageName(), controller.getPackageName());
-                assertEquals(request, mediaId);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPlayFromMediaId").build()) {
-            MediaController controller = createController(session.getToken());
-            SessionResult result = controller.playFromMediaId(request, bundle)
-                    .get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            assertEquals(RESULT_SUCCESS, result.getResultCode());
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void prepareFromSearch() throws Exception {
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPrepareFromSearch(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-                assertEquals(mContext.getPackageName(), controller.getPackageName());
-                assertEquals(request, query);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPrepareFromSearch").build()) {
-            MediaController controller = createController(session.getToken());
-            SessionResult result = controller.prepareFromSearch(request, bundle)
-                    .get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            assertEquals(RESULT_SUCCESS, result.getResultCode());
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void prepareFromUri() throws Exception {
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPrepareFromUri(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
-                assertEquals(mContext.getPackageName(), controller.getPackageName());
-                assertEquals(request, uri);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPrepareFromUri").build()) {
-            MediaController controller = createController(session.getToken());
-            SessionResult result = controller.prepareFromUri(request, bundle)
-                    .get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            assertEquals(RESULT_SUCCESS, result.getResultCode());
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void prepareFromMediaId() throws Exception {
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPrepareFromMediaId(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-                assertEquals(mContext.getPackageName(), controller.getPackageName());
-                assertEquals(request, mediaId);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPrepareFromMediaId").build()) {
-            MediaController controller = createController(session.getToken());
-            SessionResult result = controller.prepareFromMediaId(request, bundle)
+            SessionResult result = controller.setMediaUri(request, bundle)
                     .get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
             assertEquals(RESULT_SUCCESS, result.getResultCode());
             assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
@@ -1601,7 +1453,7 @@
         final ControllerCallback callback = new ControllerCallback() {
             @Override
             public void onPlaylistChanged(@NonNull MediaController controller,
-                    @NonNull List<MediaItem> list, @Nullable MediaMetadata metadata) {
+                    @Nullable List<MediaItem> list, @Nullable MediaMetadata metadata) {
                 switch ((int) latch.getCount()) {
                     case 2:
                         assertEquals(currentItemIdx, controller.getCurrentMediaItemIndex());
@@ -1609,6 +1461,7 @@
                         break;
                     case 1:
                         assertEquals(currentItemIdx, controller.getCurrentMediaItemIndex());
+                        assertNotNull(list);
                         assertTrue(list.get(1).getMetadata().containsKey(
                                 MediaMetadata.METADATA_KEY_DURATION));
                         assertEquals(duration, list.get(1).getMetadata().getLong(
diff --git a/media2/session/src/main/aidl/androidx/media2/session/IMediaSession.aidl b/media2/session/src/main/aidl/androidx/media2/session/IMediaSession.aidl
index d626735..c6dfa57 100644
--- a/media2/session/src/main/aidl/androidx/media2/session/IMediaSession.aidl
+++ b/media2/session/src/main/aidl/androidx/media2/session/IMediaSession.aidl
@@ -48,13 +48,7 @@
     void seekTo(IMediaController caller, int seq, long pos) = 11;
     void onCustomCommand(IMediaController caller, int seq, in ParcelImpl sessionCommand,
             in Bundle args) = 12;
-    void prepareFromUri(IMediaController caller, int seq, in Uri uri, in Bundle extras) = 13;
-    void prepareFromSearch(IMediaController caller, int seq, String query, in Bundle extras) = 14;
-    void prepareFromMediaId(IMediaController caller, int seq, String mediaId,
-            in Bundle extras) = 15;
-    void playFromUri(IMediaController caller, int seq, in Uri uri, in Bundle extras) = 16;
-    void playFromSearch(IMediaController caller, int seq, String query, in Bundle extras) = 17;
-    void playFromMediaId(IMediaController caller, int seq, String mediaId, in Bundle extras) = 18;
+    // 13~18: removed
     void setRating(IMediaController caller, int seq, String mediaId, in ParcelImpl rating) = 19;
     void setPlaybackSpeed(IMediaController caller, int seq, float speed) = 20;
 
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaController.java b/media2/session/src/main/java/androidx/media2/session/MediaController.java
index c9db0eb..21162b1 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaController.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaController.java
@@ -469,160 +469,6 @@
     }
 
     /**
-     * Requests that the {@link SessionPlayer} associated with the connected {@link MediaSession}
-     * starts playback for a specific media id.
-     *
-     * @param mediaId the non-empty media id
-     * @param extras optional extras that can include extra information about the media item
-     *               to be played
-     * @return a {@link ListenableFuture} representing the pending completion of the command
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    @NonNull
-    public ListenableFuture<SessionResult> playFromMediaId(@NonNull String mediaId,
-            @Nullable Bundle extras) {
-        if (TextUtils.isEmpty(mediaId)) {
-            throw new IllegalArgumentException("mediaId shouldn't be empty");
-        }
-        if (isConnected()) {
-            return getImpl().playFromMediaId(mediaId, extras);
-        }
-        return createDisconnectedFuture();
-    }
-
-    /**
-     * Requests that the {@link SessionPlayer} associated with the connected {@link MediaSession}
-     * starts playback for a specific search query.
-     *
-     * @param query the non-empty search query
-     * @param extras optional extras that can include extra information about the query
-     * @return a {@link ListenableFuture} representing the pending completion of the command
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    @NonNull
-    public ListenableFuture<SessionResult> playFromSearch(@NonNull String query,
-            @Nullable Bundle extras) {
-        if (TextUtils.isEmpty(query)) {
-            throw new IllegalArgumentException("query shouldn't be empty");
-        }
-        if (isConnected()) {
-            return getImpl().playFromSearch(query, extras);
-        }
-        return createDisconnectedFuture();
-    }
-
-    /**
-     * Requests that the {@link SessionPlayer} associated with the connected {@link MediaSession}
-     * starts playback for a specific {@link Uri}.
-     *
-     * @param uri the URI of the requested media
-     * @param extras optional extras that can include extra information about the media item
-     *               to be played
-     * @return a {@link ListenableFuture} representing the pending completion of the command
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    @NonNull
-    public ListenableFuture<SessionResult> playFromUri(@NonNull Uri uri,
-            @Nullable Bundle extras) {
-        if (uri == null) {
-            throw new NullPointerException("uri shouldn't be null");
-        }
-        if (isConnected()) {
-            return getImpl().playFromUri(uri, extras);
-        }
-        return createDisconnectedFuture();
-    }
-
-    /**
-     * Requests that the {@link SessionPlayer} associated with the connected {@link MediaSession}
-     * prepares a media item with the media id for playback.
-     * In other words, other sessions can continue to play during the preparation of this session.
-     * This method can be used to speed up the start of the playback.
-     * Once the prepare is done, the session will change its playback state to
-     * {@link SessionPlayer#PLAYER_STATE_PAUSED}. Afterwards, {@link #play} can be called to start
-     * playback. If the prepare is not needed, {@link #playFromMediaId} can be directly called
-     * without this method.
-     *
-     * @param mediaId the non-empty media id
-     * @param extras optional extras that can include extra information about the media item
-     *               to be prepared
-     * @return a {@link ListenableFuture} representing the pending completion of the command
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    @NonNull
-    public ListenableFuture<SessionResult> prepareFromMediaId(@NonNull String mediaId,
-            @Nullable Bundle extras) {
-        if (TextUtils.isEmpty(mediaId)) {
-            throw new IllegalArgumentException("mediaId shouldn't be empty");
-        }
-        if (isConnected()) {
-            return getImpl().prepareFromMediaId(mediaId, extras);
-        }
-        return createDisconnectedFuture();
-    }
-
-    /**
-     * Requests that the {@link SessionPlayer} associated with the connected {@link MediaSession}
-     * prepares a media item with the specific search query for playback.
-     * In other words, other sessions can continue to play during the preparation of this session.
-     * This method can be used to speed up the start of the playback.
-     * Once the prepare is done, the session will change its playback state to
-     * {@link SessionPlayer#PLAYER_STATE_PAUSED}. Afterwards, {@link #play} can be called to start
-     * playback. If the prepare is not needed, {@link #playFromSearch} can be directly called
-     * without this method.
-     *
-     * @param query the non-empty search query
-     * @param extras optional extras that can include extra information about the query
-     * @return a {@link ListenableFuture} representing the pending completion of the command
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    @NonNull
-    public ListenableFuture<SessionResult> prepareFromSearch(@NonNull String query,
-            @Nullable Bundle extras) {
-        if (TextUtils.isEmpty(query)) {
-            throw new IllegalArgumentException("query shouldn't be empty");
-        }
-        if (isConnected()) {
-            return getImpl().prepareFromSearch(query, extras);
-        }
-        return createDisconnectedFuture();
-    }
-
-    /**
-     * Requests that the {@link SessionPlayer} associated with the connected {@link MediaSession}
-     * prepares a media item with the specific {@link Uri} for playback.
-     * In other words, other sessions can continue to play during the preparation of this session.
-     * This method can be used to speed up the start of the playback.
-     * Once the prepare is done, the session will change its playback state to
-     * {@link SessionPlayer#PLAYER_STATE_PAUSED}. Afterwards, {@link #play} can be called to start
-     * playback. If the prepare is not needed, {@link #playFromUri} can be directly called
-     * without this method.
-     *
-     * @param uri the URI of the requested media
-     * @param extras optional extras that can include extra information about the media item
-     *               to be prepared
-     * @return a {@link ListenableFuture} representing the pending completion of the command
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    @NonNull
-    public ListenableFuture<SessionResult> prepareFromUri(@NonNull Uri uri,
-            @Nullable Bundle extras) {
-        if (uri == null) {
-            throw new NullPointerException("uri shouldn't be null");
-        }
-        if (isConnected()) {
-            return getImpl().prepareFromUri(uri, extras);
-        }
-        return createDisconnectedFuture();
-    }
-
-    /**
      * Requests that the connected {@link MediaSession} sets the volume of the output that is
      * playing on. The command will be ignored if it does not support
      * {@link VolumeProviderCompat#VOLUME_CONTROL_ABSOLUTE}.
@@ -1616,17 +1462,6 @@
         ListenableFuture<SessionResult> seekTo(long pos);
         ListenableFuture<SessionResult> skipForward();
         ListenableFuture<SessionResult> skipBackward();
-        ListenableFuture<SessionResult> playFromMediaId(@NonNull String mediaId,
-                @Nullable Bundle extras);
-        ListenableFuture<SessionResult> playFromSearch(@NonNull String query,
-                @Nullable Bundle extras);
-        ListenableFuture<SessionResult> playFromUri(@NonNull Uri uri, @Nullable Bundle extras);
-        ListenableFuture<SessionResult> prepareFromMediaId(@NonNull String mediaId,
-                @Nullable Bundle extras);
-        ListenableFuture<SessionResult> prepareFromSearch(@NonNull String query,
-                @Nullable Bundle extras);
-        ListenableFuture<SessionResult> prepareFromUri(@NonNull Uri uri,
-                @Nullable Bundle extras);
         ListenableFuture<SessionResult> setVolumeTo(int value, @VolumeFlags int flags);
         ListenableFuture<SessionResult> adjustVolume(@VolumeDirection int direction,
                 @VolumeFlags int flags);
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaControllerImplBase.java b/media2/session/src/main/java/androidx/media2/session/MediaControllerImplBase.java
index 4389b48..c078ad4 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaControllerImplBase.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaControllerImplBase.java
@@ -41,12 +41,6 @@
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_PLAYER_SKIP_TO_PREVIOUS_PLAYLIST_ITEM;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_PLAYER_UPDATE_LIST_METADATA;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_FAST_FORWARD;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_URI;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_URI;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_REWIND;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SET_RATING;
@@ -384,78 +378,6 @@
     }
 
     @Override
-    public ListenableFuture<SessionResult> playFromMediaId(@NonNull final String mediaId,
-            @Nullable final Bundle extras) {
-        return dispatchRemoteSessionTask(COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID,
-                new RemoteSessionTask() {
-                    @Override
-                    public void run(IMediaSession iSession, int seq) throws RemoteException {
-                        iSession.playFromMediaId(mControllerStub, seq, mediaId, extras);
-                    }
-                });
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> playFromSearch(@NonNull final String query,
-            @Nullable final Bundle extras) {
-        return dispatchRemoteSessionTask(COMMAND_CODE_SESSION_PLAY_FROM_SEARCH,
-                new RemoteSessionTask() {
-                    @Override
-                    public void run(IMediaSession iSession, int seq) throws RemoteException {
-                        iSession.playFromSearch(mControllerStub, seq, query, extras);
-                    }
-                });
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> playFromUri(@NonNull final Uri uri,
-            @Nullable final Bundle extras) {
-        return dispatchRemoteSessionTask(COMMAND_CODE_SESSION_PLAY_FROM_URI,
-                new RemoteSessionTask() {
-                    @Override
-                    public void run(IMediaSession iSession, int seq) throws RemoteException {
-                        iSession.playFromUri(mControllerStub, seq, uri, extras);
-                    }
-                });
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> prepareFromMediaId(@NonNull final String mediaId,
-            @Nullable final Bundle extras) {
-        return dispatchRemoteSessionTask(COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID,
-                new RemoteSessionTask() {
-                    @Override
-                    public void run(IMediaSession iSession, int seq) throws RemoteException {
-                        iSession.prepareFromMediaId(mControllerStub, seq, mediaId, extras);
-                    }
-                });
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> prepareFromSearch(@NonNull final String query,
-            @Nullable final Bundle extras) {
-        return dispatchRemoteSessionTask(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH,
-                new RemoteSessionTask() {
-                    @Override
-                    public void run(IMediaSession iSession, int seq) throws RemoteException {
-                        iSession.prepareFromSearch(mControllerStub, seq, query, extras);
-                    }
-                });
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> prepareFromUri(@NonNull final Uri uri,
-            @Nullable final Bundle extras) {
-        return dispatchRemoteSessionTask(COMMAND_CODE_SESSION_PREPARE_FROM_URI,
-                new RemoteSessionTask() {
-                    @Override
-                    public void run(IMediaSession iSession, int seq) throws RemoteException {
-                        iSession.prepareFromUri(mControllerStub, seq, uri, extras);
-                    }
-                });
-    }
-
-    @Override
     public ListenableFuture<SessionResult> setVolumeTo(final int value,
             final @VolumeFlags int flags) {
         return dispatchRemoteSessionTask(COMMAND_CODE_VOLUME_SET_VOLUME, new RemoteSessionTask() {
@@ -627,7 +549,6 @@
                 });
     }
 
-
     @Override
     public ListenableFuture<SessionResult> setMediaUri(@NonNull final Uri uri,
             @Nullable final Bundle extras) {
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaControllerImplLegacy.java b/media2/session/src/main/java/androidx/media2/session/MediaControllerImplLegacy.java
index b56e4b3..718626e 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaControllerImplLegacy.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaControllerImplLegacy.java
@@ -333,84 +333,6 @@
     }
 
     @Override
-    public ListenableFuture<SessionResult> playFromMediaId(@NonNull String mediaId,
-            @Nullable Bundle extras) {
-        synchronized (mLock) {
-            if (!mConnected) {
-                Log.w(TAG, "Session isn't active", new IllegalStateException());
-                return createFutureWithResult(RESULT_ERROR_SESSION_DISCONNECTED);
-            }
-            mControllerCompat.getTransportControls().playFromMediaId(mediaId, extras);
-        }
-        return createFutureWithResult(RESULT_SUCCESS);
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> playFromSearch(@NonNull String query,
-            @Nullable Bundle extras) {
-        synchronized (mLock) {
-            if (!mConnected) {
-                Log.w(TAG, "Session isn't active", new IllegalStateException());
-                return createFutureWithResult(RESULT_ERROR_SESSION_DISCONNECTED);
-            }
-            mControllerCompat.getTransportControls().playFromSearch(query, extras);
-        }
-        return createFutureWithResult(RESULT_SUCCESS);
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> playFromUri(@NonNull Uri uri,
-            @Nullable Bundle extras) {
-        synchronized (mLock) {
-            if (!mConnected) {
-                Log.w(TAG, "Session isn't active", new IllegalStateException());
-                return createFutureWithResult(RESULT_ERROR_SESSION_DISCONNECTED);
-            }
-            mControllerCompat.getTransportControls().playFromUri(uri, extras);
-        }
-        return createFutureWithResult(RESULT_SUCCESS);
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> prepareFromMediaId(@NonNull String mediaId,
-            @Nullable Bundle extras) {
-        synchronized (mLock) {
-            if (!mConnected) {
-                Log.w(TAG, "Session isn't active", new IllegalStateException());
-                return createFutureWithResult(RESULT_ERROR_SESSION_DISCONNECTED);
-            }
-            mControllerCompat.getTransportControls().prepareFromMediaId(mediaId, extras);
-        }
-        return createFutureWithResult(RESULT_SUCCESS);
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> prepareFromSearch(@NonNull String query,
-            @Nullable Bundle extras) {
-        synchronized (mLock) {
-            if (!mConnected) {
-                Log.w(TAG, "Session isn't active", new IllegalStateException());
-                return createFutureWithResult(RESULT_ERROR_SESSION_DISCONNECTED);
-            }
-            mControllerCompat.getTransportControls().prepareFromSearch(query, extras);
-        }
-        return createFutureWithResult(RESULT_SUCCESS);
-    }
-
-    @Override
-    public ListenableFuture<SessionResult> prepareFromUri(@NonNull Uri uri,
-            @Nullable Bundle extras) {
-        synchronized (mLock) {
-            if (!mConnected) {
-                Log.w(TAG, "Session isn't active", new IllegalStateException());
-                return createFutureWithResult(RESULT_ERROR_SESSION_DISCONNECTED);
-            }
-            mControllerCompat.getTransportControls().prepareFromUri(uri, extras);
-        }
-        return createFutureWithResult(RESULT_SUCCESS);
-    }
-
-    @Override
     public ListenableFuture<SessionResult> setVolumeTo(int value, @VolumeFlags int flags) {
         synchronized (mLock) {
             if (!mConnected) {
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaSession.java b/media2/session/src/main/java/androidx/media2/session/MediaSession.java
index 5fc9d11..a871573 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaSession.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaSession.java
@@ -654,149 +654,6 @@
         }
 
         /**
-         * Called when a controller requested to play a specific mediaId through
-         * {@link MediaController#playFromMediaId(String, Bundle)}.
-         *
-         * @param session the session for this event
-         * @param controller controller information
-         * @param mediaId non-empty media id
-         * @param extras optional extra bundle
-         * @see SessionCommand#COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID
-         * @hide
-         */
-        @RestrictTo(LIBRARY)
-        @ResultCode
-        public int onPlayFromMediaId(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String mediaId,
-                @Nullable Bundle extras) {
-            return RESULT_ERROR_NOT_SUPPORTED;
-        }
-
-        /**
-         * Called when a controller requested to begin playback from a search query through
-         * {@link MediaController#playFromSearch(String, Bundle)}
-         *
-         * @param session the session for this event
-         * @param controller controller information
-         * @param query non-empty search query.
-         * @param extras optional extra bundle
-         * @see SessionCommand#COMMAND_CODE_SESSION_PLAY_FROM_SEARCH
-         * @hide
-         */
-        @RestrictTo(LIBRARY)
-        @ResultCode
-        public int onPlayFromSearch(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String query,
-                @Nullable Bundle extras) {
-            return RESULT_ERROR_NOT_SUPPORTED;
-        }
-
-        /**
-         * Called when a controller requested to play a specific media item represented by a URI
-         * through {@link MediaController#playFromUri(Uri, Bundle)}
-         *
-         * @param session the session for this event
-         * @param controller controller information
-         * @param uri uri
-         * @param extras optional extra bundle
-         * @see SessionCommand#COMMAND_CODE_SESSION_PLAY_FROM_URI
-         * @hide
-         */
-        @RestrictTo(LIBRARY)
-        @ResultCode
-        public int onPlayFromUri(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull Uri uri,
-                @Nullable Bundle extras) {
-            return RESULT_ERROR_NOT_SUPPORTED;
-        }
-
-        /**
-         * Called when a controller requested to prepare for playing a specific mediaId through
-         * {@link MediaController#prepareFromMediaId(String, Bundle)}.
-         * <p>
-         * During the prepare, a session should not hold audio focus in order to allow
-         * other sessions play seamlessly. The state of playback should be updated to
-         * {@link SessionPlayer#PLAYER_STATE_PAUSED} after the prepare is done.
-         * <p>
-         * The playback of the prepared content should start in the later calls of
-         * {@link SessionPlayer#play()}.
-         * <p>
-         * Override {@link #onPlayFromMediaId} to handle requests for starting
-         * playback without preparation.
-         *
-         * @param session the session for this event
-         * @param controller controller information
-         * @param mediaId non-empty media id
-         * @param extras optional extra bundle
-         * @see SessionCommand#COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID
-         * @hide
-         */
-        @RestrictTo(LIBRARY)
-        @ResultCode
-        public int onPrepareFromMediaId(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String mediaId,
-                @Nullable Bundle extras) {
-            return RESULT_ERROR_NOT_SUPPORTED;
-        }
-
-        /**
-         * Called when a controller requested to prepare playback from a search query through
-         * {@link MediaController#prepareFromSearch(String, Bundle)}.
-         * <p>
-         * During the prepare, a session should not hold audio focus in order to allow
-         * other sessions play seamlessly. The state of playback should be updated to
-         * {@link SessionPlayer#PLAYER_STATE_PAUSED} after the prepare is done.
-         * <p>
-         * The playback of the prepared content should start in the later calls of
-         * {@link SessionPlayer#play()}.
-         * <p>
-         * Override {@link #onPlayFromSearch} to handle requests for starting playback without
-         * preparation.
-         *
-         * @param session the session for this event
-         * @param controller controller information
-         * @param query non-empty search query
-         * @param extras optional extra bundle
-         * @see SessionCommand#COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH
-         * @hide
-         */
-        @RestrictTo(LIBRARY)
-        @ResultCode
-        public int onPrepareFromSearch(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String query,
-                @Nullable Bundle extras) {
-            return RESULT_ERROR_NOT_SUPPORTED;
-        }
-
-        /**
-         * Called when a controller requested to prepare a specific media item represented by a URI
-         * through {@link MediaController#prepareFromUri(Uri, Bundle)}.
-         * <p>
-         * During the prepare, a session should not hold audio focus in order to allow
-         * other sessions play seamlessly. The state of playback should be updated to
-         * {@link SessionPlayer#PLAYER_STATE_PAUSED} after the prepare is done.
-         * <p>
-         * The playback of the prepared content should start in the later calls of
-         * {@link SessionPlayer#play()}.
-         * <p>
-         * Override {@link #onPlayFromUri} to handle requests for starting playback without
-         * preparation.
-         *
-         * @param session the session for this event
-         * @param controller controller information
-         * @param uri uri
-         * @param extras optional extra bundle
-         * @see SessionCommand#COMMAND_CODE_SESSION_PREPARE_FROM_URI
-         * @hide
-         */
-        @RestrictTo(LIBRARY)
-        @ResultCode
-        public int onPrepareFromUri(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull Uri uri, @Nullable Bundle extras) {
-            return RESULT_ERROR_NOT_SUPPORTED;
-        }
-
-        /**
          * Called when a controller called {@link MediaController#fastForward()}.
          * <p>
          * It can be implemented in many ways. For example, it can be implemented by seeking forward
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaSessionLegacyStub.java b/media2/session/src/main/java/androidx/media2/session/MediaSessionLegacyStub.java
index 417ab1b..5a564f3 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaSessionLegacyStub.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaSessionLegacyStub.java
@@ -132,51 +132,17 @@
 
     @Override
     public void onPrepareFromMediaId(final String mediaId, final Bundle extras) {
-        dispatchSessionTask(SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID,
-                new SessionTask() {
-                    @Override
-                    public void run(ControllerInfo controller) throws RemoteException {
-                        if (TextUtils.isEmpty(mediaId)) {
-                            Log.w(TAG, "onPrepareFromMediaId(): Ignoring empty mediaId from "
-                                    + controller);
-                            return;
-                        }
-                        mSessionImpl.getCallback().onPrepareFromMediaId(mSessionImpl.getInstance(),
-                                controller, mediaId, extras);
-                    }
-                });
+        // TODO(b/145644087): Support this
     }
 
     @Override
     public void onPrepareFromSearch(final String query, final Bundle extras) {
-        dispatchSessionTask(SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH,
-                new SessionTask() {
-                    @Override
-                    public void run(ControllerInfo controller) throws RemoteException {
-                        if (TextUtils.isEmpty(query)) {
-                            Log.w(TAG, "onPrepareFromSearch(): Ignoring empty query from "
-                                    + controller);
-                            return;
-                        }
-                        mSessionImpl.getCallback().onPrepareFromSearch(mSessionImpl.getInstance(),
-                                controller, query, extras);
-                    }
-                });
+        // TODO(b/145644087): Support this
     }
 
     @Override
     public void onPrepareFromUri(final Uri uri, final Bundle extras) {
-        if (uri == null) {
-            return;
-        }
-        dispatchSessionTask(SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_URI,
-                new SessionTask() {
-                    @Override
-                    public void run(ControllerInfo controller) throws RemoteException {
-                        mSessionImpl.getCallback().onPrepareFromUri(mSessionImpl.getInstance(),
-                                controller, uri, extras);
-                    }
-                });
+        // TODO(b/145644087): Support this
     }
 
     @Override
@@ -193,51 +159,17 @@
 
     @Override
     public void onPlayFromMediaId(final String mediaId, final Bundle extras) {
-        dispatchSessionTask(SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID,
-                new SessionTask() {
-                    @Override
-                    public void run(ControllerInfo controller) throws RemoteException {
-                        if (TextUtils.isEmpty(mediaId)) {
-                            Log.w(TAG, "onPlayFromMediaId(): Ignoring empty mediaId from "
-                                    + controller);
-                            return;
-                        }
-                        mSessionImpl.getCallback().onPlayFromMediaId(mSessionImpl.getInstance(),
-                                controller, mediaId, extras);
-                    }
-                });
+        // TODO(b/145644087): Support this
     }
 
     @Override
     public void onPlayFromSearch(final String query, final Bundle extras) {
-        dispatchSessionTask(SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH,
-                new SessionTask() {
-                    @Override
-                    public void run(ControllerInfo controller) throws RemoteException {
-                        if (TextUtils.isEmpty(query)) {
-                            Log.w(TAG, "onPlayFromSearch(): Ignoring empty query from "
-                                    + controller);
-                            return;
-                        }
-                        mSessionImpl.getCallback().onPlayFromSearch(mSessionImpl.getInstance(),
-                                controller, query, extras);
-                    }
-                });
+        // TODO(b/145644087): Support this
     }
 
     @Override
     public void onPlayFromUri(final Uri uri, final Bundle extras) {
-        if (uri == null) {
-            return;
-        }
-        dispatchSessionTask(SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_URI,
-                new SessionTask() {
-                    @Override
-                    public void run(ControllerInfo controller) throws RemoteException {
-                        mSessionImpl.getCallback().onPlayFromUri(mSessionImpl.getInstance(),
-                                controller, uri, extras);
-                    }
-                });
+        // TODO(b/145644087): Support this
     }
 
     @Override
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaSessionStub.java b/media2/session/src/main/java/androidx/media2/session/MediaSessionStub.java
index bbbb496..b718300 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaSessionStub.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaSessionStub.java
@@ -659,130 +659,6 @@
     }
 
     @Override
-    public void prepareFromUri(final IMediaController caller, int seq, final Uri uri,
-            final Bundle extras) {
-        if (caller == null) {
-            return;
-        }
-        dispatchSessionTask(caller, seq, SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_URI,
-                new SessionCallbackTask<Integer>() {
-                    @Override
-                    public Integer run(ControllerInfo controller) {
-                        if (uri == null) {
-                            Log.w(TAG, "prepareFromUri(): Ignoring null uri from " + controller);
-                            return RESULT_ERROR_BAD_VALUE;
-                        }
-                        return mSessionImpl.getCallback().onPrepareFromUri(
-                                mSessionImpl.getInstance(), controller, uri, extras);
-                    }
-                });
-    }
-
-    @Override
-    public void prepareFromSearch(final IMediaController caller, int seq, final String query,
-            final Bundle extras) {
-        if (caller == null) {
-            return;
-        }
-        dispatchSessionTask(caller, seq, SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH,
-                new SessionCallbackTask<Integer>() {
-                    @Override
-                    public Integer run(ControllerInfo controller) {
-                        if (TextUtils.isEmpty(query)) {
-                            Log.w(TAG, "prepareFromSearch(): Ignoring empty query from "
-                                    + controller);
-                            return RESULT_ERROR_BAD_VALUE;
-                        }
-                        return mSessionImpl.getCallback().onPrepareFromSearch(
-                                mSessionImpl.getInstance(), controller, query, extras);
-                    }
-                });
-    }
-
-    @Override
-    public void prepareFromMediaId(final IMediaController caller, int seq, final String mediaId,
-            final Bundle extras) {
-        if (caller == null) {
-            return;
-        }
-        dispatchSessionTask(caller, seq,
-                SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID,
-                new SessionCallbackTask<Integer>() {
-                    @Override
-                    public Integer run(ControllerInfo controller) {
-                        if (TextUtils.isEmpty(mediaId)) {
-                            Log.w(TAG, "prepareFromMediaId(): Ignoring empty mediaId from "
-                                    + controller);
-                            return RESULT_ERROR_BAD_VALUE;
-                        }
-                        return mSessionImpl.getCallback().onPrepareFromMediaId(
-                                mSessionImpl.getInstance(), controller, mediaId, extras);
-                    }
-                });
-    }
-
-    @Override
-    public void playFromUri(final IMediaController caller, int seq, final Uri uri,
-            final Bundle extras) {
-        if (caller == null) {
-            return;
-        }
-        dispatchSessionTask(caller, seq, SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_URI,
-                new SessionCallbackTask<Integer>() {
-                    @Override
-                    public Integer run(ControllerInfo controller) {
-                        if (uri == null) {
-                            Log.w(TAG, "playFromUri(): Ignoring null uri from " + controller);
-                            return RESULT_ERROR_BAD_VALUE;
-                        }
-                        return mSessionImpl.getCallback().onPlayFromUri(
-                                mSessionImpl.getInstance(), controller, uri, extras);
-                    }
-                });
-    }
-
-    @Override
-    public void playFromSearch(final IMediaController caller, int seq, final String query,
-            final Bundle extras) {
-        if (caller == null) {
-            return;
-        }
-        dispatchSessionTask(caller, seq, SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH,
-                new SessionCallbackTask<Integer>() {
-                    @Override
-                    public Integer run(ControllerInfo controller) {
-                        if (TextUtils.isEmpty(query)) {
-                            Log.w(TAG, "playFromSearch(): Ignoring empty query from " + controller);
-                            return RESULT_ERROR_BAD_VALUE;
-                        }
-                        return mSessionImpl.getCallback().onPlayFromSearch(
-                                mSessionImpl.getInstance(), controller, query, extras);
-                    }
-                });
-    }
-
-    @Override
-    public void playFromMediaId(final IMediaController caller, int seq, final String mediaId,
-            final Bundle extras) {
-        if (caller == null) {
-            return;
-        }
-        dispatchSessionTask(caller, seq, SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID,
-                new SessionCallbackTask<Integer>() {
-                    @Override
-                    public Integer run(ControllerInfo controller) {
-                        if (TextUtils.isEmpty(mediaId)) {
-                            Log.w(TAG, "playFromMediaId(): Ignoring empty mediaId from "
-                                    + controller);
-                            return RESULT_ERROR_BAD_VALUE;
-                        }
-                        return mSessionImpl.getCallback().onPlayFromMediaId(
-                                mSessionImpl.getInstance(), controller, mediaId, extras);
-                    }
-                });
-    }
-
-    @Override
     public void setRating(final IMediaController caller, int seq, final String mediaId,
             final ParcelImpl ratingParcelable) {
         if (caller == null || ratingParcelable == null) {
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionCommand.java b/media2/session/src/main/java/androidx/media2/session/SessionCommand.java
index effc795..47eae9e 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionCommand.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionCommand.java
@@ -19,7 +19,6 @@
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 import android.annotation.SuppressLint;
-import android.net.Uri;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.SparseArray;
@@ -125,12 +124,6 @@
             COMMAND_CODE_SESSION_REWIND,
             COMMAND_CODE_SESSION_SKIP_FORWARD,
             COMMAND_CODE_SESSION_SKIP_BACKWARD,
-            COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID,
-            COMMAND_CODE_SESSION_PLAY_FROM_SEARCH,
-            COMMAND_CODE_SESSION_PLAY_FROM_URI,
-            COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID,
-            COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH,
-            COMMAND_CODE_SESSION_PREPARE_FROM_URI,
             COMMAND_CODE_SESSION_SET_MEDIA_URI,
             COMMAND_CODE_SESSION_SET_RATING,
             COMMAND_CODE_LIBRARY_GET_LIBRARY_ROOT,
@@ -502,59 +495,7 @@
      */
     public static final int COMMAND_CODE_SESSION_SKIP_BACKWARD = 40003;
 
-    /**
-     * Command code for {@link MediaController#playFromMediaId(String, Bundle)}.
-     * <p>
-     * Code version is {@link #COMMAND_VERSION_1}.
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID = 40004;
-
-    /**
-     * Command code for {@link MediaController#playFromSearch(String, Bundle)}.
-     * <p>
-     * Code version is {@link #COMMAND_VERSION_1}.
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int COMMAND_CODE_SESSION_PLAY_FROM_SEARCH = 40005;
-
-    /**
-     * Command code for {@link MediaController#playFromUri(Uri, Bundle)}.
-     * <p>
-     * Code version is {@link #COMMAND_VERSION_1}.
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int COMMAND_CODE_SESSION_PLAY_FROM_URI = 40006;
-
-    /**
-     * Command code for {@link MediaController#prepareFromMediaId(String, Bundle)}.
-     * <p>
-     * Code version is {@link #COMMAND_VERSION_1}.
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID = 40007;
-
-    /**
-     * Command code for {@link MediaController#prepareFromSearch(String, Bundle)}.
-     * <p>
-     * Code version is {@link #COMMAND_VERSION_1}.
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH = 40008;
-
-    /**
-     * Command code for {@link MediaController#prepareFromUri(Uri, Bundle)}.
-     * <p>
-     * Code version is {@link #COMMAND_VERSION_1}.
-     * @hide
-     */
-    @RestrictTo(LIBRARY)
-    public static final int COMMAND_CODE_SESSION_PREPARE_FROM_URI = 40009;
+    // 40004~40009: removed
 
     /**
      * Command code for {@link MediaController#setRating(String, Rating)}.
diff --git a/media2/session/version-compat-tests/common/src/main/aidl/androidx/media2/test/common/IRemoteMediaController.aidl b/media2/session/version-compat-tests/common/src/main/aidl/androidx/media2/test/common/IRemoteMediaController.aidl
index e48bec4..5f7a7dd 100644
--- a/media2/session/version-compat-tests/common/src/main/aidl/androidx/media2/test/common/IRemoteMediaController.aidl
+++ b/media2/session/version-compat-tests/common/src/main/aidl/androidx/media2/test/common/IRemoteMediaController.aidl
@@ -54,12 +54,6 @@
     void rewind(String controllerId);
     void skipForward(String controllerId);
     void skipBackward(String controllerId);
-    void playFromMediaId(String controllerId, String mediaId, in Bundle extras);
-    void playFromSearch(String controllerId, String query, in Bundle extras);
-    void playFromUri(String controllerId, in Uri uri, in Bundle extras);
-    void prepareFromMediaId(String controllerId, String mediaId, in Bundle extras);
-    void prepareFromSearch(String controllerId, String query, in Bundle extras);
-    void prepareFromUri(String controllerId, in Uri uri, in Bundle extras);
     void setRating(String controllerId, String mediaId, in ParcelImpl rating);
     void close(String controllerId);
 
diff --git a/media2/session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java b/media2/session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java
index 150e8ea..c5e7e6c 100644
--- a/media2/session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java
+++ b/media2/session/version-compat-tests/current/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java
@@ -331,48 +331,6 @@
         }
 
         @Override
-        public void playFromMediaId(String controllerId, String mediaId, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.playFromMediaId(mediaId, extras);
-        }
-
-        @Override
-        public void playFromSearch(String controllerId, String query, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.playFromSearch(query, extras);
-        }
-
-        @Override
-        public void playFromUri(String controllerId, Uri uri, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.playFromUri(uri, extras);
-        }
-
-        @Override
-        public void prepareFromMediaId(String controllerId, String mediaId, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.prepareFromMediaId(mediaId, extras);
-        }
-
-        @Override
-        public void prepareFromSearch(String controllerId, String query, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.prepareFromSearch(query, extras);
-        }
-
-        @Override
-        public void prepareFromUri(String controllerId, Uri uri, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.prepareFromUri(uri, extras);
-        }
-
-        @Override
         public void setRating(String controllerId, String mediaId, ParcelImpl rating)
                 throws RemoteException {
             MediaController controller = mMediaControllerMap.get(controllerId);
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java
index 29ad7ea..7ca0a13 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java
@@ -314,54 +314,6 @@
         }
     }
 
-    public void playFromMediaId(@NonNull String mediaId, @Nullable Bundle extras) {
-        try {
-            mBinder.playFromMediaId(mControllerId, mediaId, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call playFromMediaId()");
-        }
-    }
-
-    public void playFromSearch(@NonNull String query, @Nullable Bundle extras) {
-        try {
-            mBinder.playFromSearch(mControllerId, query, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call playFromSearch()");
-        }
-    }
-
-    public void playFromUri(@NonNull Uri uri, @Nullable Bundle extras) {
-        try {
-            mBinder.playFromUri(mControllerId, uri, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call playFromUri()");
-        }
-    }
-
-    public void prepareFromMediaId(@NonNull String mediaId, @Nullable Bundle extras) {
-        try {
-            mBinder.prepareFromMediaId(mControllerId, mediaId, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call prepareFromMediaId()");
-        }
-    }
-
-    public void prepareFromSearch(@NonNull String query, @Nullable Bundle extras) {
-        try {
-            mBinder.prepareFromSearch(mControllerId, query, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call prepareFromSearch()");
-        }
-    }
-
-    public void prepareFromUri(@NonNull Uri uri, @Nullable Bundle extras) {
-        try {
-            mBinder.prepareFromUri(mControllerId, uri, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call prepareFromUri()");
-        }
-    }
-
     public void setRating(@NonNull String mediaId, @NonNull Rating rating) {
         try {
             mBinder.setRating(mControllerId, mediaId, MediaParcelUtils.toParcelable(rating));
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java
index badf2c2..f6bc94e 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java
@@ -50,7 +50,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -322,169 +321,6 @@
     }
 
     @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void onPlayFromSearch() throws InterruptedException {
-        final String testQuery = "random query";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPlayFromSearch(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testQuery, query);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPlayFromSearch").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.playFromSearch(testQuery, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void onPlayFromUri() throws InterruptedException {
-        final Uri testUri = Uri.parse("foo://boo");
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPlayFromUri(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testUri, uri);
-                assertTrue(TestUtils.equals(extras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPlayFromUri")
-                .build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.playFromUri(testUri, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void onPlayFromMediaId() throws InterruptedException {
-        final String testMediaId = "media_id";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPlayFromMediaId(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(mediaId, mediaId);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPlayFromMediaId").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.playFromMediaId(testMediaId, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void onPrepareFromSearch() throws InterruptedException {
-        final String testQuery = "random query";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPrepareFromSearch(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testQuery, query);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPrepareFromSearch").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.prepareFromSearch(testQuery, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void onPrepareFromUri() throws InterruptedException {
-        final Uri testUri = Uri.parse("foo://boo");
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPrepareFromUri(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testUri, uri);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPrepareFromUri").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.prepareFromUri(testUri, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void onPrepareFromMediaId() throws InterruptedException {
-        final String testMediaId = "media_id";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPrepareFromMediaId(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testMediaId, mediaId);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPrepareFromMediaId").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.prepareFromMediaId(testMediaId, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
     public void onSetMediaUri() throws InterruptedException {
         if (!MediaTestUtils.isClientToT()) {
             return;
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTestWithMediaControllerCompat.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTestWithMediaControllerCompat.java
index a671060..33ce027 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTestWithMediaControllerCompat.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTestWithMediaControllerCompat.java
@@ -30,7 +30,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.media.AudioManager;
-import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
@@ -67,7 +66,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -573,175 +571,6 @@
     }
 
     @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void testPlayFromSearch() throws InterruptedException {
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPlayFromSearch(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-                super.onPlayFromSearch(session, controller, query, extras);
-                assertEquals(EXPECTED_CONTROLLER_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(request, query);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPlayFromSearch").build()) {
-            RemoteMediaControllerCompat controller = new RemoteMediaControllerCompat(
-                    mContext, session.getSessionCompat().getSessionToken(), true);
-            controller.getTransportControls().playFromSearch(request, bundle);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void testPlayFromUri() throws InterruptedException {
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPlayFromUri(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
-                assertEquals(EXPECTED_CONTROLLER_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(request, uri);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPlayFromUri").build()) {
-            RemoteMediaControllerCompat controller = new RemoteMediaControllerCompat(
-                    mContext, session.getSessionCompat().getSessionToken(), true);
-            controller.getTransportControls().playFromUri(request, bundle);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void testPlayFromMediaId() throws InterruptedException {
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPlayFromMediaId(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-                assertEquals(EXPECTED_CONTROLLER_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(request, mediaId);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPlayFromMediaId").build()) {
-            RemoteMediaControllerCompat controller = new RemoteMediaControllerCompat(
-                    mContext, session.getSessionCompat().getSessionToken(), true);
-            controller.getTransportControls().playFromMediaId(request, bundle);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void testPrepareFromSearch() throws InterruptedException {
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPrepareFromSearch(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-                assertEquals(EXPECTED_CONTROLLER_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(request, query);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPrepareFromSearch").build()) {
-            RemoteMediaControllerCompat controller = new RemoteMediaControllerCompat(
-                    mContext, session.getSessionCompat().getSessionToken(), true);
-            controller.getTransportControls().prepareFromSearch(request, bundle);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void testPrepareFromUri() throws InterruptedException {
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPrepareFromUri(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
-                assertEquals(EXPECTED_CONTROLLER_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(request, uri);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPrepareFromUri").build()) {
-            RemoteMediaControllerCompat controller = new RemoteMediaControllerCompat(
-                    mContext, session.getSessionCompat().getSessionToken(), true);
-            controller.getTransportControls().prepareFromUri(request, bundle);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    @Ignore("This tests hidden API, which isn't public at this moment.")
-    public void testPrepareFromMediaId() throws InterruptedException {
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        final CountDownLatch latch = new CountDownLatch(1);
-        final SessionCallback callback = new SessionCallback() {
-            @Override
-            public int onPrepareFromMediaId(@NonNull MediaSession session,
-                    @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-                assertEquals(EXPECTED_CONTROLLER_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(request, mediaId);
-                assertTrue(TestUtils.equals(bundle, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testPrepareFromMediaId").build()) {
-            RemoteMediaControllerCompat controller = new RemoteMediaControllerCompat(
-                    mContext, session.getSessionCompat().getSessionToken(), true);
-            controller.getTransportControls().prepareFromMediaId(request, bundle);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
     public void testSetRating() throws InterruptedException {
         final int ratingType = RatingCompat.RATING_5_STARS;
         final float ratingValue = 3.5f;
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java
index 1f154ed..694beed 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java
@@ -455,96 +455,6 @@
     }
 
     @Test
-    public void testPlayFromSearch() throws Exception {
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.playFromSearch(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPlayFromSearchCalled);
-        assertEquals(request, mSessionCallback.mQuery);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPlayFromUri() throws Exception {
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.playFromUri(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPlayFromUriCalled);
-        assertEquals(request, mSessionCallback.mUri);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPlayFromMediaId() throws Exception {
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.playFromMediaId(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPlayFromMediaIdCalled);
-        assertEquals(request, mSessionCallback.mMediaId);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPrepareFromSearch() throws Exception {
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.prepareFromSearch(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPrepareFromSearchCalled);
-        assertEquals(request, mSessionCallback.mQuery);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPrepareFromUri() throws Exception {
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.prepareFromUri(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPrepareFromUriCalled);
-        assertEquals(request, mSessionCallback.mUri);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPrepareFromMediaId() throws Exception {
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.prepareFromMediaId(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPrepareFromMediaIdCalled);
-        assertEquals(request, mSessionCallback.mMediaId);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
     public void testSetRating() throws Exception {
         final float ratingValue = 3.5f;
         final Rating rating2 = new StarRating(5, ratingValue);
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java
index 9bd5a2a..d7c2a29 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java
@@ -29,13 +29,8 @@
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_PLAYER_SKIP_TO_PREVIOUS_PLAYLIST_ITEM;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_PLAYER_UPDATE_LIST_METADATA;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_FAST_FORWARD;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_URI;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_URI;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_REWIND;
+import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SET_RATING;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SKIP_BACKWARD;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SKIP_FORWARD;
@@ -380,117 +375,25 @@
     }
 
     @Test
-    public void playFromMediaId() throws InterruptedException {
-        final String mediaId = "testPlayFromMediaId";
+    public void setMediaUri() throws InterruptedException {
+        if (!MediaTestUtils.isClientToT()) {
+            return;
+        }
+        final Uri uri = Uri.parse("media://uri");
         createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).playFromMediaId(mediaId, null);
+                createCommandGroupWith(COMMAND_CODE_SESSION_SET_MEDIA_URI));
+        createRemoteController(mSession.getToken()).setMediaUri(uri, null);
 
         assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPlayFromMediaIdCalled);
-        assertEquals(mediaId, mCallback.mMediaId);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).playFromMediaId(mediaId, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPlayFromMediaIdCalled);
-    }
-
-    @Test
-    public void playFromUri() throws InterruptedException {
-        final Uri uri = Uri.parse("play://from.uri");
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PLAY_FROM_URI));
-        createRemoteController(mSession.getToken()).playFromUri(uri, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPlayFromUriCalled);
+        assertTrue(mCallback.mOnSetMediaUriCalled);
         assertEquals(uri, mCallback.mUri);
         assertNull(mCallback.mExtras);
 
         createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PLAY_FROM_URI));
-        createRemoteController(mSession.getToken()).playFromUri(uri, null);
+                createCommandGroupWithout(COMMAND_CODE_SESSION_SET_MEDIA_URI));
+        createRemoteController(mSession.getToken()).setMediaUri(uri, null);
         assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPlayFromUriCalled);
-    }
-
-    @Test
-    public void playFromSearch() throws InterruptedException {
-        final String query = "testPlayFromSearch";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PLAY_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).playFromSearch(query, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPlayFromSearchCalled);
-        assertEquals(query, mCallback.mQuery);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PLAY_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).playFromSearch(query, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPlayFromSearchCalled);
-    }
-
-    @Test
-    public void prepareFromMediaId() throws InterruptedException {
-        final String mediaId = "testPrepareFromMediaId";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).prepareFromMediaId(mediaId, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromMediaIdCalled);
-        assertEquals(mediaId, mCallback.mMediaId);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).prepareFromMediaId(mediaId, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPrepareFromMediaIdCalled);
-    }
-
-    @Test
-    public void prepareFromUri() throws InterruptedException {
-        final Uri uri = Uri.parse("prepare://from.uri");
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_URI));
-        createRemoteController(mSession.getToken()).prepareFromUri(uri, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromUriCalled);
-        assertEquals(uri, mCallback.mUri);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_URI));
-        createRemoteController(mSession.getToken()).prepareFromUri(uri, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPrepareFromUriCalled);
-    }
-
-    @Test
-    public void prepareFromSearch() throws InterruptedException {
-        final String query = "testPrepareFromSearch";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).prepareFromSearch(query, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromSearchCalled);
-        assertEquals(query, mCallback.mQuery);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).prepareFromSearch(query, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPrepareFromSearchCalled);
+        assertFalse(mCallback.mOnSetMediaUriCalled);
     }
 
     @Test
@@ -515,23 +418,24 @@
 
     @Test
     public void changingPermissionWithSetAllowedCommands() throws InterruptedException {
-        final String query = "testChangingPermissionWithSetAllowedCommands";
+        final String mediaId = "testSetRating";
+        final Rating rating = new StarRating(5, 3.5f);
         createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
+                createCommandGroupWith(COMMAND_CODE_SESSION_SET_RATING));
         RemoteMediaController controller = createRemoteController(mSession.getToken());
+        controller.setRating(mediaId, rating);
 
-        controller.prepareFromSearch(query, null);
         assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromSearchCalled);
-        assertEquals(query, mCallback.mQuery);
-        assertNull(mCallback.mExtras);
+        assertTrue(mCallback.mOnSetRatingCalled);
+        assertEquals(mediaId, mCallback.mMediaId);
+        assertEquals(rating, mCallback.mRating);
         mCallback.reset();
 
         // Change allowed commands.
         mSession.setAllowedCommands(getTestControllerInfo(),
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
+                createCommandGroupWithout(COMMAND_CODE_SESSION_SET_RATING));
 
-        controller.prepareFromSearch(query, null);
+        controller.setRating(mediaId, rating);
         assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
     }
 
@@ -557,22 +461,16 @@
 
         public SessionCommand mCommand;
         public String mMediaId;
-        public String mQuery;
         public Uri mUri;
         public Bundle mExtras;
         public Rating mRating;
 
         public boolean mOnCommandRequestCalled;
-        public boolean mOnPlayFromMediaIdCalled;
-        public boolean mOnPlayFromSearchCalled;
-        public boolean mOnPlayFromUriCalled;
-        public boolean mOnPrepareFromMediaIdCalled;
-        public boolean mOnPrepareFromSearchCalled;
-        public boolean mOnPrepareFromUriCalled;
         public boolean mOnFastForwardCalled;
         public boolean mOnRewindCalled;
         public boolean mOnSkipForwardCalled;
         public boolean mOnSkipBackwardCalled;
+        public boolean mOnSetMediaUriCalled;
         public boolean mOnSetRatingCalled;
 
 
@@ -585,19 +483,13 @@
 
             mCommand = null;
             mMediaId = null;
-            mQuery = null;
             mUri = null;
             mExtras = null;
 
             mOnCommandRequestCalled = false;
-            mOnPlayFromMediaIdCalled = false;
-            mOnPlayFromSearchCalled = false;
-            mOnPlayFromUriCalled = false;
-            mOnPrepareFromMediaIdCalled = false;
-            mOnPrepareFromSearchCalled = false;
-            mOnPrepareFromUriCalled = false;
             mOnFastForwardCalled = false;
             mOnRewindCalled = false;
+            mOnSetMediaUriCalled = false;
             mOnSetRatingCalled = false;
         }
 
@@ -647,65 +539,10 @@
         }
 
         @Override
-        public int onPlayFromMediaId(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPlayFromMediaIdCalled = true;
-            mMediaId = mediaId;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPlayFromSearch(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPlayFromSearchCalled = true;
-            mQuery = query;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPlayFromUri(@NonNull MediaSession session, @NonNull ControllerInfo controller,
-                @NonNull Uri uri, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPlayFromUriCalled = true;
-            mUri = uri;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPrepareFromMediaId(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String mediaId, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPrepareFromMediaIdCalled = true;
-            mMediaId = mediaId;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPrepareFromSearch(@NonNull MediaSession session,
-                @NonNull ControllerInfo controller, @NonNull String query, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPrepareFromSearchCalled = true;
-            mQuery = query;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPrepareFromUri(@NonNull MediaSession session,
+        public int onSetMediaUri(@NonNull MediaSession session,
                 @NonNull ControllerInfo controller, @NonNull Uri uri, Bundle extras) {
             assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPrepareFromUriCalled = true;
+            mOnSetMediaUriCalled = true;
             mUri = uri;
             mExtras = extras;
             mCountDownLatch.countDown();
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/SessionCommandTest.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/SessionCommandTest.java
index 2192829..575b3c8 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/SessionCommandTest.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/tests/SessionCommandTest.java
@@ -120,16 +120,21 @@
     }
 
     @Test
-    public void addAllPredefinedCommands_withVersion1_notHaveHiddenCodes() {
+    public void addAllPredefinedCommands_withVersion1_notHaveVersion2Commands() {
         SessionCommandGroup.Builder builder = new SessionCommandGroup.Builder();
         builder.addAllPredefinedCommands(SessionCommand.COMMAND_VERSION_1);
         SessionCommandGroup commands = builder.build();
-        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID));
-        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_URI));
-        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH));
-        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID));
-        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_URI));
-        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
+        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI));
+        assertFalse(commands.hasCommand(SessionCommand.COMMAND_CODE_PLAYER_MOVE_PLAYLIST_ITEM));
+    }
+
+    @Test
+    public void addAllPredefinedCommands_withVersion2_hasVersion2Commands() {
+        SessionCommandGroup.Builder builder = new SessionCommandGroup.Builder();
+        builder.addAllPredefinedCommands(SessionCommand.COMMAND_VERSION_2);
+        SessionCommandGroup commands = builder.build();
+        assertTrue(commands.hasCommand(SessionCommand.COMMAND_CODE_SESSION_SET_MEDIA_URI));
+        assertTrue(commands.hasCommand(SessionCommand.COMMAND_CODE_PLAYER_MOVE_PLAYLIST_ITEM));
     }
 
     private static List<Field> getSessionCommandsFields(String prefix) {
diff --git a/media2/session/version-compat-tests/previous/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java b/media2/session/version-compat-tests/previous/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java
index 8bd77a8..ab1ea72 100644
--- a/media2/session/version-compat-tests/previous/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java
+++ b/media2/session/version-compat-tests/previous/client/src/androidTest/java/androidx/media2/test/client/MediaControllerProviderService.java
@@ -330,48 +330,6 @@
         }
 
         @Override
-        public void playFromMediaId(String controllerId, String mediaId, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.playFromMediaId(mediaId, extras);
-        }
-
-        @Override
-        public void playFromSearch(String controllerId, String query, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.playFromSearch(query, extras);
-        }
-
-        @Override
-        public void playFromUri(String controllerId, Uri uri, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.playFromUri(uri, extras);
-        }
-
-        @Override
-        public void prepareFromMediaId(String controllerId, String mediaId, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.prepareFromMediaId(mediaId, extras);
-        }
-
-        @Override
-        public void prepareFromSearch(String controllerId, String query, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.prepareFromSearch(query, extras);
-        }
-
-        @Override
-        public void prepareFromUri(String controllerId, Uri uri, Bundle extras)
-                throws RemoteException {
-            MediaController controller = mMediaControllerMap.get(controllerId);
-            controller.prepareFromUri(uri, extras);
-        }
-
-        @Override
         public void setRating(String controllerId, String mediaId, ParcelImpl rating)
                 throws RemoteException {
             MediaController controller = mMediaControllerMap.get(controllerId);
diff --git a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java
index 0f90629..656ac6e 100644
--- a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java
+++ b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/RemoteMediaController.java
@@ -26,7 +26,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -298,54 +297,6 @@
         }
     }
 
-    public void playFromMediaId(@NonNull String mediaId, @Nullable Bundle extras) {
-        try {
-            mBinder.playFromMediaId(mControllerId, mediaId, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call playFromMediaId()");
-        }
-    }
-
-    public void playFromSearch(@NonNull String query, @Nullable Bundle extras) {
-        try {
-            mBinder.playFromSearch(mControllerId, query, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call playFromSearch()");
-        }
-    }
-
-    public void playFromUri(@NonNull Uri uri, @Nullable Bundle extras) {
-        try {
-            mBinder.playFromUri(mControllerId, uri, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call playFromUri()");
-        }
-    }
-
-    public void prepareFromMediaId(@NonNull String mediaId, @Nullable Bundle extras) {
-        try {
-            mBinder.prepareFromMediaId(mControllerId, mediaId, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call prepareFromMediaId()");
-        }
-    }
-
-    public void prepareFromSearch(@NonNull String query, @Nullable Bundle extras) {
-        try {
-            mBinder.prepareFromSearch(mControllerId, query, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call prepareFromSearch()");
-        }
-    }
-
-    public void prepareFromUri(@NonNull Uri uri, @Nullable Bundle extras) {
-        try {
-            mBinder.prepareFromUri(mControllerId, uri, extras);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to call prepareFromUri()");
-        }
-    }
-
     public void setRating(@NonNull String mediaId, @NonNull Rating rating) {
         try {
             mBinder.setRating(mControllerId, mediaId, MediaParcelUtils.toParcelable(rating));
diff --git a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java
index 5565280..e174d41 100644
--- a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java
+++ b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCallbackTest.java
@@ -25,7 +25,6 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 
@@ -323,169 +322,6 @@
     }
 
     @Test
-    public void onPlayFromSearch() throws InterruptedException {
-        prepareLooper();
-        final String testQuery = "random query";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPlayFromSearch(MediaSession session, ControllerInfo controller,
-                    String query, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testQuery, query);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPlayFromSearch").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.playFromSearch(testQuery, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    public void onPlayFromUri() throws InterruptedException {
-        prepareLooper();
-        final Uri testUri = Uri.parse("foo://boo");
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPlayFromUri(MediaSession session, ControllerInfo controller, Uri uri,
-                    Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testUri, uri);
-                assertTrue(TestUtils.equals(extras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPlayFromUri")
-                .build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.playFromUri(testUri, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    public void onPlayFromMediaId() throws InterruptedException {
-        prepareLooper();
-        final String testMediaId = "media_id";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPlayFromMediaId(MediaSession session, ControllerInfo controller,
-                    String mediaId, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(mediaId, mediaId);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPlayFromMediaId").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.playFromMediaId(testMediaId, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    public void onPrepareFromSearch() throws InterruptedException {
-        prepareLooper();
-        final String testQuery = "random query";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPrepareFromSearch(MediaSession session, ControllerInfo controller,
-                    String query, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testQuery, query);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPrepareFromSearch").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.prepareFromSearch(testQuery, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    public void onPrepareFromUri() throws InterruptedException {
-        prepareLooper();
-        final Uri testUri = Uri.parse("foo://boo");
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPrepareFromUri(MediaSession session, ControllerInfo controller, Uri uri,
-                    Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testUri, uri);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPrepareFromUri").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.prepareFromUri(testUri, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
-    public void onPrepareFromMediaId() throws InterruptedException {
-        prepareLooper();
-        final String testMediaId = "media_id";
-        final Bundle testExtras = TestUtils.createTestBundle();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final MediaSession.SessionCallback callback = new MediaSession.SessionCallback() {
-            @Override
-            public int onPrepareFromMediaId(MediaSession session, ControllerInfo controller,
-                    String mediaId, Bundle extras) {
-                assertEquals(CLIENT_PACKAGE_NAME, controller.getPackageName());
-                assertEquals(testMediaId, mediaId);
-                assertTrue(TestUtils.equals(testExtras, extras));
-                latch.countDown();
-                return RESULT_SUCCESS;
-            }
-        };
-        try (MediaSession session = new MediaSession.Builder(mContext, mPlayer)
-                .setSessionCallback(sHandlerExecutor, callback)
-                .setId("testOnPrepareFromMediaId").build()) {
-            RemoteMediaController controller = createRemoteController(session.getToken());
-
-            controller.prepareFromMediaId(testMediaId, testExtras);
-            assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        }
-    }
-
-    @Test
     public void onSetRating() throws InterruptedException {
         prepareLooper();
         final float ratingValue = 3.5f;
diff --git a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java
index e6f5118..04824c8 100644
--- a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java
+++ b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSessionCompatCallbackTestWithMediaController.java
@@ -467,102 +467,6 @@
     }
 
     @Test
-    public void testPlayFromSearch() throws Exception {
-        prepareLooper();
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.playFromSearch(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPlayFromSearchCalled);
-        assertEquals(request, mSessionCallback.mQuery);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPlayFromUri() throws Exception {
-        prepareLooper();
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.playFromUri(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPlayFromUriCalled);
-        assertEquals(request, mSessionCallback.mUri);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPlayFromMediaId() throws Exception {
-        prepareLooper();
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.playFromMediaId(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPlayFromMediaIdCalled);
-        assertEquals(request, mSessionCallback.mMediaId);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPrepareFromSearch() throws Exception {
-        prepareLooper();
-        final String request = "random query";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.prepareFromSearch(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPrepareFromSearchCalled);
-        assertEquals(request, mSessionCallback.mQuery);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPrepareFromUri() throws Exception {
-        prepareLooper();
-        final Uri request = Uri.parse("foo://boo");
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.prepareFromUri(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPrepareFromUriCalled);
-        assertEquals(request, mSessionCallback.mUri);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
-    public void testPrepareFromMediaId() throws Exception {
-        prepareLooper();
-        final String request = "media_id";
-        final Bundle bundle = new Bundle();
-        bundle.putString("key", "value");
-        RemoteMediaController controller = createControllerAndWaitConnection();
-        mSessionCallback.reset(1);
-
-        controller.prepareFromMediaId(request, bundle);
-        assertTrue(mSessionCallback.await(TIME_OUT_MS));
-        assertEquals(true, mSessionCallback.mOnPrepareFromMediaIdCalled);
-        assertEquals(request, mSessionCallback.mMediaId);
-        assertTrue(TestUtils.equals(bundle, mSessionCallback.mExtras));
-    }
-
-    @Test
     public void testSetRating() throws Exception {
         prepareLooper();
         final float ratingValue = 3.5f;
diff --git a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java
index c8b680b..5775acb 100644
--- a/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java
+++ b/media2/session/version-compat-tests/previous/service/src/androidTest/java/androidx/media2/test/service/tests/MediaSession_PermissionTest.java
@@ -29,12 +29,6 @@
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_PLAYER_SKIP_TO_PREVIOUS_PLAYLIST_ITEM;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_PLAYER_UPDATE_LIST_METADATA;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_FAST_FORWARD;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_SEARCH;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PLAY_FROM_URI;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH;
-import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_PREPARE_FROM_URI;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_REWIND;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SET_RATING;
 import static androidx.media2.session.SessionCommand.COMMAND_CODE_SESSION_SKIP_BACKWARD;
@@ -47,13 +41,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import android.net.Uri;
 import android.os.Build;
-import android.os.Bundle;
 import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
@@ -398,126 +389,6 @@
     }
 
     @Test
-    public void playFromMediaId() throws InterruptedException {
-        prepareLooper();
-        final String mediaId = "testPlayFromMediaId";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).playFromMediaId(mediaId, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPlayFromMediaIdCalled);
-        assertEquals(mediaId, mCallback.mMediaId);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PLAY_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).playFromMediaId(mediaId, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPlayFromMediaIdCalled);
-    }
-
-    @Test
-    public void playFromUri() throws InterruptedException {
-        prepareLooper();
-        final Uri uri = Uri.parse("play://from.uri");
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PLAY_FROM_URI));
-        createRemoteController(mSession.getToken()).playFromUri(uri, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPlayFromUriCalled);
-        assertEquals(uri, mCallback.mUri);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PLAY_FROM_URI));
-        createRemoteController(mSession.getToken()).playFromUri(uri, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPlayFromUriCalled);
-    }
-
-    @Test
-    public void playFromSearch() throws InterruptedException {
-        prepareLooper();
-        final String query = "testPlayFromSearch";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PLAY_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).playFromSearch(query, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPlayFromSearchCalled);
-        assertEquals(query, mCallback.mQuery);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PLAY_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).playFromSearch(query, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPlayFromSearchCalled);
-    }
-
-    @Test
-    public void prepareFromMediaId() throws InterruptedException {
-        prepareLooper();
-        final String mediaId = "testPrepareFromMediaId";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).prepareFromMediaId(mediaId, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromMediaIdCalled);
-        assertEquals(mediaId, mCallback.mMediaId);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_MEDIA_ID));
-        createRemoteController(mSession.getToken()).prepareFromMediaId(mediaId, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPrepareFromMediaIdCalled);
-    }
-
-    @Test
-    public void prepareFromUri() throws InterruptedException {
-        prepareLooper();
-        final Uri uri = Uri.parse("prepare://from.uri");
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_URI));
-        createRemoteController(mSession.getToken()).prepareFromUri(uri, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromUriCalled);
-        assertEquals(uri, mCallback.mUri);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_URI));
-        createRemoteController(mSession.getToken()).prepareFromUri(uri, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPrepareFromUriCalled);
-    }
-
-    @Test
-    public void prepareFromSearch() throws InterruptedException {
-        prepareLooper();
-        final String query = "testPrepareFromSearch";
-        createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).prepareFromSearch(query, null);
-
-        assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromSearchCalled);
-        assertEquals(query, mCallback.mQuery);
-        assertNull(mCallback.mExtras);
-
-        createSessionWithAllowedActions(
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
-        createRemoteController(mSession.getToken()).prepareFromSearch(query, null);
-        assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertFalse(mCallback.mOnPrepareFromSearchCalled);
-    }
-
-    @Test
     public void setRating() throws InterruptedException {
         prepareLooper();
         final String mediaId = "testSetRating";
@@ -541,23 +412,24 @@
     @Test
     public void changingPermissionWithSetAllowedCommands() throws InterruptedException {
         prepareLooper();
-        final String query = "testChangingPermissionWithSetAllowedCommands";
+        final String mediaId = "testSetRating";
+        final Rating rating = new StarRating(5, 3.5f);
         createSessionWithAllowedActions(
-                createCommandGroupWith(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
+                createCommandGroupWith(COMMAND_CODE_SESSION_SET_RATING));
         RemoteMediaController controller = createRemoteController(mSession.getToken());
+        controller.setRating(mediaId, rating);
 
-        controller.prepareFromSearch(query, null);
         assertTrue(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        assertTrue(mCallback.mOnPrepareFromSearchCalled);
-        assertEquals(query, mCallback.mQuery);
-        assertNull(mCallback.mExtras);
+        assertTrue(mCallback.mOnSetRatingCalled);
+        assertEquals(mediaId, mCallback.mMediaId);
+        assertEquals(rating, mCallback.mRating);
         mCallback.reset();
 
         // Change allowed commands.
         mSession.setAllowedCommands(getTestControllerInfo(),
-                createCommandGroupWithout(COMMAND_CODE_SESSION_PREPARE_FROM_SEARCH));
+                createCommandGroupWithout(COMMAND_CODE_SESSION_SET_RATING));
 
-        controller.prepareFromSearch(query, null);
+        controller.setRating(mediaId, rating);
         assertFalse(mCallback.mCountDownLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
     }
 
@@ -583,18 +455,9 @@
 
         public SessionCommand mCommand;
         public String mMediaId;
-        public String mQuery;
-        public Uri mUri;
-        public Bundle mExtras;
         public Rating mRating;
 
         public boolean mOnCommandRequestCalled;
-        public boolean mOnPlayFromMediaIdCalled;
-        public boolean mOnPlayFromSearchCalled;
-        public boolean mOnPlayFromUriCalled;
-        public boolean mOnPrepareFromMediaIdCalled;
-        public boolean mOnPrepareFromSearchCalled;
-        public boolean mOnPrepareFromUriCalled;
         public boolean mOnFastForwardCalled;
         public boolean mOnRewindCalled;
         public boolean mOnSkipForwardCalled;
@@ -611,17 +474,8 @@
 
             mCommand = null;
             mMediaId = null;
-            mQuery = null;
-            mUri = null;
-            mExtras = null;
 
             mOnCommandRequestCalled = false;
-            mOnPlayFromMediaIdCalled = false;
-            mOnPlayFromSearchCalled = false;
-            mOnPlayFromUriCalled = false;
-            mOnPrepareFromMediaIdCalled = false;
-            mOnPrepareFromSearchCalled = false;
-            mOnPrepareFromUriCalled = false;
             mOnFastForwardCalled = false;
             mOnRewindCalled = false;
             mOnSetRatingCalled = false;
@@ -670,72 +524,6 @@
         }
 
         @Override
-        public int onPlayFromMediaId(MediaSession session, ControllerInfo controller,
-                String mediaId, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPlayFromMediaIdCalled = true;
-            mMediaId = mediaId;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPlayFromSearch(MediaSession session, ControllerInfo controller,
-                String query, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPlayFromSearchCalled = true;
-            mQuery = query;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPlayFromUri(MediaSession session, ControllerInfo controller,
-                Uri uri, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPlayFromUriCalled = true;
-            mUri = uri;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPrepareFromMediaId(MediaSession session, ControllerInfo controller,
-                String mediaId, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPrepareFromMediaIdCalled = true;
-            mMediaId = mediaId;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPrepareFromSearch(MediaSession session, ControllerInfo controller,
-                String query, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPrepareFromSearchCalled = true;
-            mQuery = query;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
-        public int onPrepareFromUri(MediaSession session, ControllerInfo controller,
-                Uri uri, Bundle extras) {
-            assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
-            mOnPrepareFromUriCalled = true;
-            mUri = uri;
-            mExtras = extras;
-            mCountDownLatch.countDown();
-            return RESULT_SUCCESS;
-        }
-
-        @Override
         public int onSetRating(MediaSession session, ControllerInfo controller,
                 String mediaId, Rating rating) {
             assertTrue(TextUtils.equals(CLIENT_PACKAGE_NAME, controller.getPackageName()));
