diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java
index 3428e38..67d1950 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsTestStreamingService.java
@@ -23,14 +23,11 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.IBinder;
-import android.os.RemoteException;
-import android.telephony.mbms.IMbmsStreamingManagerCallback;
 import android.telephony.mbms.MbmsException;
-import android.telephony.mbms.MbmsStreamingManagerCallback;
+import android.telephony.mbms.MbmsStreamingSessionCallback;
 import android.telephony.mbms.StreamingService;
 import android.telephony.mbms.StreamingServiceCallback;
 import android.telephony.mbms.StreamingServiceInfo;
-import android.telephony.mbms.vendor.IMbmsStreamingService;
 import android.telephony.mbms.vendor.MbmsStreamingServiceBase;
 import android.util.Log;
 
@@ -56,7 +53,7 @@
 
     private static final int SEND_STREAMING_SERVICES_LIST = 1;
 
-    private final Map<FrontendAppIdentifier, MbmsStreamingManagerCallback> mAppCallbacks =
+    private final Map<FrontendAppIdentifier, MbmsStreamingSessionCallback> mAppCallbacks =
             new HashMap<>();
 
     private HandlerThread mHandlerThread;
@@ -67,7 +64,7 @@
                 SomeArgs args = (SomeArgs) msg.obj;
                 FrontendAppIdentifier appKey = (FrontendAppIdentifier) args.arg1;
                 List<StreamingServiceInfo> services = (List) args.arg2;
-                MbmsStreamingManagerCallback appCallback = mAppCallbacks.get(appKey);
+                MbmsStreamingSessionCallback appCallback = mAppCallbacks.get(appKey);
                 if (appCallback != null) {
                     appCallback.onStreamingServicesUpdated(services);
                 }
@@ -78,7 +75,7 @@
 
     private final MbmsStreamingServiceBase mBinder = new MbmsStreamingServiceBase() {
         @Override
-        public int initialize(MbmsStreamingManagerCallback callback, int subId) {
+        public int initialize(MbmsStreamingSessionCallback callback, int subId) {
             int packageUid = Binder.getCallingUid();
             String[] packageNames = getPackageManager().getPackagesForUid(packageUid);
             if (packageNames == null) {
@@ -104,7 +101,7 @@
         }
 
         @Override
-        public int getStreamingServices(int subscriptionId, List<String> serviceClasses) {
+        public int requestUpdateStreamingServices(int subscriptionId, List<String> serviceClasses) {
             FrontendAppIdentifier appKey =
                     new FrontendAppIdentifier(Binder.getCallingUid(), subscriptionId);
             checkInitialized(appKey);
@@ -166,16 +163,6 @@
 
             mHandler.post(() -> StreamStateTracker.stopStreaming(appKey, serviceId,
                     StreamingService.REASON_BY_USER_REQUEST));
-        }
-
-        @Override
-        public void disposeStream(int subscriptionId, String serviceId) {
-            FrontendAppIdentifier appKey =
-                    new FrontendAppIdentifier(Binder.getCallingUid(), subscriptionId);
-            checkInitialized(appKey);
-            checkServiceExists(serviceId);
-
-            Log.i(TAG, "Disposing of stream " + serviceId);
             StreamStateTracker.dispose(appKey, serviceId);
         }
 
diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/FileServiceRepository.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/FileServiceRepository.java
index 7b8cbd5..27911f6 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/FileServiceRepository.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/FileServiceRepository.java
@@ -21,13 +21,8 @@
 import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -67,7 +62,7 @@
     public List<FileServiceInfo> getFileServicesForClasses(
             List<String> serviceClasses) {
         return mIdToServiceInfo.values().stream()
-                .filter((info) -> serviceClasses.contains(info.getClassName()))
+                .filter((info) -> serviceClasses.contains(info.getServiceClassName()))
                 .collect(Collectors.toList());
     }
 
diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/StreamingServiceRepository.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/StreamingServiceRepository.java
index 677f39b..e1a12e3 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/StreamingServiceRepository.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/StreamingServiceRepository.java
@@ -43,7 +43,7 @@
     public static List<StreamingServiceInfo> getStreamingServicesForClasses(
             List<String> serviceClasses) {
         return sIdToServiceInfo.values().stream()
-                .filter((info) -> serviceClasses.contains(info.getClassName()))
+                .filter((info) -> serviceClasses.contains(info.getServiceClassName()))
                 .collect(Collectors.toList());
     }
 
diff --git a/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml b/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml
index b75a157..d28ede2 100644
--- a/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml
+++ b/testapps/EmbmsTestStreamingApp/res/layout/activity_main.xml
@@ -96,13 +96,6 @@
             android:layout_column="1"
             android:text="@string/stop_streaming_button" />
         <Button
-            android:id="@+id/dispose_stream_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_row="2"
-            android:layout_column="0"
-            android:text="@string/dispose_stream_button" />
-        <Button
             android:id="@+id/dispose_manager_button"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
diff --git a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
index 1505846..39d82e6 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/EmbmsTestStreamingApp.java
@@ -22,9 +22,8 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
-import android.telephony.MbmsStreamingManager;
-import android.telephony.mbms.MbmsException;
-import android.telephony.mbms.MbmsStreamingManagerCallback;
+import android.telephony.MbmsStreamingSession;
+import android.telephony.mbms.MbmsStreamingSessionCallback;
 import android.telephony.mbms.StreamingService;
 import android.telephony.mbms.StreamingServiceInfo;
 import android.view.View;
@@ -43,7 +42,7 @@
 import java.util.Map;
 
 public class EmbmsTestStreamingApp extends Activity {
-    private MbmsStreamingManagerCallback mStreamingListener = new MbmsStreamingManagerCallback() {
+    private MbmsStreamingSessionCallback mStreamingListener = new MbmsStreamingSessionCallback() {
         @Override
         public void onStreamingServicesUpdated(List<StreamingServiceInfo> services) {
             EmbmsTestStreamingApp.this.runOnUiThread(() ->
@@ -131,7 +130,7 @@
         }
     }
 
-    private MbmsStreamingManager mStreamingManager = null;
+    private MbmsStreamingSession mStreamingManager = null;
 
     private Handler mHandler;
     private HandlerThread mHandlerThread;
@@ -156,14 +155,8 @@
 
         Button bindButton = (Button) findViewById(R.id.bind_button);
         bindButton.setOnClickListener((view) -> {
-            try {
-                mStreamingManager = MbmsStreamingManager.create(
-                        EmbmsTestStreamingApp.this, mStreamingListener, mHandler);
-            } catch (MbmsException e) {
-                Toast.makeText(EmbmsTestStreamingApp.this,
-                        "Init error: " + e.getErrorCode(), Toast.LENGTH_SHORT).show();
-                return;
-            }
+            mStreamingManager = MbmsStreamingSession.create(
+                    EmbmsTestStreamingApp.this, mStreamingListener, mHandler);
         });
 
         Button getStreamingServicesButton = (Button)
@@ -174,13 +167,8 @@
                         "No streaming service bound", Toast.LENGTH_SHORT).show();
                 return;
             }
-            try {
-                mStreamingManager.getStreamingServices(Collections.singletonList("Class1"));
-            } catch (MbmsException e) {
-                Toast.makeText(EmbmsTestStreamingApp.this,
-                        "Error getting streaming services" + e.getErrorCode(),
-                        Toast.LENGTH_SHORT).show();
-            }
+            mStreamingManager.requestUpdateStreamingServices(
+                    Collections.singletonList("Class1"));
         });
 
         final Spinner serviceSelector = (Spinner) findViewById(R.id.available_streaming_services);
@@ -241,27 +229,13 @@
             stream.stopStreaming();
         });
 
-        Button disposeStreamButton = (Button) findViewById(R.id.dispose_stream_button);
-        disposeStreamButton.setOnClickListener((view) -> {
-            if (getSelectedTrackedStream() == null) {
-                Toast.makeText(EmbmsTestStreamingApp.this,
-                        "No streams selected", Toast.LENGTH_SHORT).show();
-                return;
-            }
-            clearStateAndUriDisplay();
-            StreamingServiceTracker stream = getSelectedTrackedStream();
-            mTrackedStreamingServiceAdapter.remove(stream.getServiceId());
-            mStreamingServiceTrackerById.remove(stream.getServiceId());
-            stream.dispose();
-        });
-
         Button disposeManagerButton = (Button) findViewById(R.id.dispose_manager_button);
         disposeManagerButton.setOnClickListener((view) -> {
             clearStateAndUriDisplay();
             mTrackedStreamingServiceAdapter.clear();
             mStreamingServicesDisplayAdapter.update(Collections.emptyList());
             mStreamingServiceTrackerById.clear();
-            mStreamingManager.dispose();
+            mStreamingManager.close();
         });
     }
 
diff --git a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
index 4821bee..5244d30 100644
--- a/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
+++ b/testapps/EmbmsTestStreamingApp/src/com/android/phone/testapps/embmsfrontend/StreamingServiceTracker.java
@@ -17,8 +17,7 @@
 package com.android.phone.testapps.embmsfrontend;
 
 import android.net.Uri;
-import android.telephony.MbmsStreamingManager;
-import android.telephony.mbms.MbmsException;
+import android.telephony.MbmsStreamingSession;
 import android.telephony.mbms.StreamingService;
 import android.telephony.mbms.StreamingServiceCallback;
 import android.telephony.mbms.StreamingServiceInfo;
@@ -57,37 +56,17 @@
         mStreamingServiceInfo = info;
     }
 
-    public boolean startStreaming(MbmsStreamingManager streamingManager) {
-        try {
-            mStreamingService =
-                    streamingManager.startStreaming(mStreamingServiceInfo, new Callback(), null);
-            return true;
-        } catch (MbmsException e) {
-            Toast.makeText(mActivity,
-                    "Error starting streaming: " + e.getErrorCode(),
-                    Toast.LENGTH_SHORT).show();
-        }
-        return false;
+    /**
+     * Start streaming using the provided streaming session
+     */
+    public boolean startStreaming(MbmsStreamingSession streamingManager) {
+        mStreamingService =
+                streamingManager.startStreaming(mStreamingServiceInfo, new Callback(), null);
+        return true;
     }
 
     public void stopStreaming() {
-        try {
-            mStreamingService.stopStreaming();
-        } catch (MbmsException e) {
-            Toast.makeText(mActivity,
-                    "Error stopping streaming: " + e.getErrorCode(),
-                    Toast.LENGTH_SHORT).show();
-        }
-    }
-
-    public void dispose() {
-        try {
-            mStreamingService.dispose();
-        } catch (MbmsException e) {
-            Toast.makeText(mActivity,
-                    "Error disposing stream" + e.getErrorCode(),
-                    Toast.LENGTH_SHORT).show();
-        }
+        mStreamingService.stopStreaming();
     }
 
     public String getServiceId() {
@@ -108,14 +87,8 @@
 
     private void onStreamStateUpdated(int state, int reason) {
         if (state == StreamingService.STATE_STARTED && mState != StreamingService.STATE_STARTED) {
-            try {
-                mStreamingUri = mStreamingService.getPlaybackUri();
-                mActivity.updateUri();
-            } catch (MbmsException e) {
-                String errorToast = "Got error " + e.getErrorCode() + " while getting uri";
-                mActivity.runOnUiThread(() ->
-                        Toast.makeText(mActivity, errorToast, Toast.LENGTH_SHORT).show());
-            }
+            mStreamingUri = mStreamingService.getPlaybackUri();
+            mActivity.updateUri();
         }
         mState = state;
         mActivity.updateStreamingState();
