diff --git a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
index a5a1327..5a92165 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
@@ -255,7 +255,8 @@
         // Compose the FILE_DESCRIPTOR_REQUEST_INTENT
         Intent requestIntent = new Intent(MbmsDownloadManager.ACTION_FILE_DESCRIPTOR_REQUEST);
         requestIntent.putExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO,
-                request.getFileServiceInfo());
+                FileServiceRepository.getInstance(this)
+                        .getFileServiceInfoForId(request.getFileServiceId()));
         requestIntent.putExtra(MbmsDownloadManager.EXTRA_FD_COUNT, numFds);
         requestIntent.putExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT,
                 mAppTempFileRoots.get(appKey));
@@ -286,7 +287,9 @@
             Bundle extras) {
         List<UriPathPair> tempFiles = extras.getParcelableArrayList(
                 MbmsDownloadManager.EXTRA_FREE_URI_LIST);
-        List<FileInfo> filesToDownload = request.getFileServiceInfo().getFiles();
+        List<FileInfo> filesToDownload = FileServiceRepository.getInstance(this)
+                .getFileServiceInfoForId(request.getFileServiceId())
+                .getFiles();
 
         if (tempFiles.size() != filesToDownload.size()) {
             Log.w(LOG_TAG, "Different numbers of temp files and files to download...");
@@ -304,7 +307,7 @@
                 break;
             }
             UriPathPair tempFile = tempFiles.get(i);
-            addTempFileInUse(appKey, request.getFileServiceInfo().getServiceId(),
+            addTempFileInUse(appKey, request.getFileServiceId(),
                     tempFile.getFilePathUri());
             FileInfo fileToDownload = filesToDownload.get(i);
             mHandler.postDelayed(() -> {
@@ -313,7 +316,7 @@
                     return;
                 }
                 downloadSingleFile(appKey, request, tempFile, fileToDownload);
-                removeTempFileInUse(appKey, request.getFileServiceInfo().getServiceId(),
+                removeTempFileInUse(appKey, request.getFileServiceId(),
                         tempFile.getFilePathUri());
             }, FILE_SEPARATION_DELAY * i * mDownloadDelayFactor);
         }
@@ -346,9 +349,17 @@
             result = MbmsDownloadManager.RESULT_CANCELLED;
         }
 
+        // Take a round-trip through the download request serialization to exercise it
+        DownloadRequest request1 = new DownloadRequest.Builder()
+                .setSource(request.getSourceUri())
+                .setSubscriptionId(request.getSubscriptionId())
+                .setServiceId(request.getFileServiceId())
+                .setOpaqueData(request.getOpaqueData())
+                .build();
+
         Intent downloadResultIntent =
                 new Intent(MbmsDownloadManager.ACTION_DOWNLOAD_RESULT_INTERNAL);
-        downloadResultIntent.putExtra(MbmsDownloadManager.EXTRA_REQUEST, request);
+        downloadResultIntent.putExtra(MbmsDownloadManager.EXTRA_REQUEST, request1);
         downloadResultIntent.putExtra(MbmsDownloadManager.EXTRA_FINAL_URI,
                 tempFile.getFilePathUri());
         downloadResultIntent.putExtra(MbmsDownloadManager.EXTRA_FILE_INFO, fileToDownload);
@@ -383,7 +394,8 @@
     }
 
     private int getNumFdsNeededForRequest(DownloadRequest request) {
-        return request.getFileServiceInfo().getFiles().size();
+        return FileServiceRepository.getInstance(this)
+                .getFileServiceInfoForId(request.getFileServiceId()).getFiles().size();
     }
 
     private void addTempFileInUse(FrontendAppIdentifier appKey, String serviceId, Uri tempFileUri) {
diff --git a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
index 890cc1a..80045ce 100644
--- a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
+++ b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
@@ -354,7 +354,6 @@
         completionIntent.setClass(this, DownloadCompletionReceiver.class);
 
         DownloadRequest request = new DownloadRequest.Builder()
-                .setId(0)
                 .setServiceInfo(info)
                 .setSource(sourceUriBuilder.build())
                 .setDest(Uri.fromFile(destination))
