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 dcb7320..093d683 100644
--- a/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
+++ b/testapps/EmbmsServiceTestApp/src/com/android/phone/testapps/embmsmw/EmbmsSampleDownloadService.java
@@ -32,6 +32,7 @@
 import android.os.RemoteException;
 import android.telephony.MbmsDownloadSession;
 import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.DownloadStateCallback;
 import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsDownloadSessionCallback;
@@ -142,6 +143,13 @@
         }
 
         @Override
+        public int registerStateCallback(DownloadRequest downloadRequest,
+                DownloadStateCallback callback) throws RemoteException {
+            mDownloadStateCallbacks.put(downloadRequest, callback);
+            return MbmsErrors.SUCCESS;
+        }
+
+        @Override
         public int cancelDownload(DownloadRequest downloadRequest) {
             FrontendAppIdentifier appKey = new FrontendAppIdentifier(
                     Binder.getCallingUid(), downloadRequest.getSubscriptionId());
@@ -175,6 +183,8 @@
     // A map of app-identifiers to (maps of service-ids to sets of temp file uris in use)
     private final Map<FrontendAppIdentifier, Map<String, Set<Uri>>> mTempFilesInUse =
             new ConcurrentHashMap<>();
+    private final Map<DownloadRequest, DownloadStateCallback> mDownloadStateCallbacks =
+            new ConcurrentHashMap<>();
 
     private HandlerThread mHandlerThread;
     private Handler mHandler;
@@ -323,6 +333,16 @@
     private void downloadSingleFile(FrontendAppIdentifier appKey, DownloadRequest request,
             UriPathPair tempFile, FileInfo fileToDownload) {
         int result = MbmsDownloadSession.RESULT_SUCCESSFUL;
+        // Test Callback
+        DownloadStateCallback c = mDownloadStateCallbacks.get(request);
+        if (c != null) {
+            c.onProgressUpdated(request, fileToDownload, 0, 10, 0, 10);
+        }
+        // Test Callback
+        if (c != null) {
+            c.onStateUpdated(request, fileToDownload,
+                    MbmsDownloadSession.STATUS_ACTIVELY_DOWNLOADING);
+        }
         try {
             // Get the ParcelFileDescriptor for the single temp file we requested
             ParcelFileDescriptor tempFileFd = getContentResolver().openFileDescriptor(
@@ -346,7 +366,10 @@
         } catch (IOException e) {
             result = MbmsDownloadSession.RESULT_CANCELLED;
         }
-
+        // Test Callback
+        if (c != null) {
+            c.onProgressUpdated(request, fileToDownload, 10, 10, 10, 10);
+        }
         // Take a round-trip through the download request serialization to exercise it
         DownloadRequest request1 = new DownloadRequest.Builder()
                 .setSource(request.getSourceUri())
diff --git a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
index 076bc37..1aea6a5 100644
--- a/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
+++ b/testapps/EmbmsTestDownloadApp/res/layout/activity_main.xml
@@ -105,9 +105,31 @@
                 android:layout_row="4"
                 android:layout_column="0"
                 android:text="@string/cancel_download_button" />
+            <Button
+                android:id="@+id/register_state_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="5"
+                android:layout_column="0"
+                android:text="@string/register_state_callback_button" />
+            <Button
+                android:id="@+id/register_progress_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="5"
+                android:layout_column="1"
+                android:text="@string/register_progress_callback_button" />
+            <Button
+                android:id="@+id/register_all_callback_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_row="6"
+                android:layout_column="0"
+                android:text="@string/register_all_callback_button" />
+
             <Spinner
                 android:id="@+id/active_downloads"
-                android:layout_row="4"
+                android:layout_row="7"
                 android:layout_column="1"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
diff --git a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
index 13d9fc2..b032b26 100644
--- a/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
+++ b/testapps/EmbmsTestDownloadApp/res/values/donottranslate_strings.xml
@@ -24,4 +24,7 @@
     <string name="request_spurious_temp_files_button">Request more temp files</string>
     <string name="delay_download_button">Delay download</string>
     <string name="cancel_download_button">Cancel download</string>
+    <string name="register_state_callback_button">Register State Cb</string>
+    <string name="register_progress_callback_button">Register Progress Cb</string>
+    <string name="register_all_callback_button">Register All Cbs</string>
 </resources>
\ No newline at end of file
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 23f2cc5..4513329 100644
--- a/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
+++ b/testapps/EmbmsTestDownloadApp/src/com/android/phone/testapps/embmsdownload/EmbmsTestDownloadApp.java
@@ -28,6 +28,8 @@
 import android.telephony.MbmsDownloadSession;
 import android.telephony.SubscriptionManager;
 import android.telephony.mbms.DownloadRequest;
+import android.telephony.mbms.DownloadStateCallback;
+import android.telephony.mbms.FileInfo;
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsDownloadSessionCallback;
 import android.util.Log;
@@ -274,6 +276,112 @@
             mDownloadManager.cancelDownload(request);
             mDownloadRequestAdapter.remove(request);
         });
+
+        Button registerProgressCallback =
+                (Button) findViewById(R.id.register_progress_callback_button);
+        registerProgressCallback.setOnClickListener((view) -> {
+            if (mDownloadManager == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No download service bound", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            DownloadRequest req = (DownloadRequest) downloadRequestSpinner.getSelectedItem();
+            if (req == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No DownloadRequest Pending for progress...", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            mDownloadManager.registerStateCallback(req, new DownloadStateCallback(
+                    DownloadStateCallback.PROGRESS_UPDATES) {
+                @Override
+                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
+                        int fullDecodedSize) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
+                                    + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
+                        @MbmsDownloadSession.DownloadStatus int state) {
+                    // only registered for state callback, this shouldn't happen!
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "State ERROR: received state update for callback that didn't filter it",
+                            Toast.LENGTH_SHORT).show();
+                }
+            }, sInstance.getMainThreadHandler());
+        });
+
+        Button registerStateCallback =
+                (Button) findViewById(R.id.register_state_callback_button);
+        registerStateCallback.setOnClickListener((view) -> {
+            if (mDownloadManager == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No download service bound", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            DownloadRequest req = (DownloadRequest) downloadRequestSpinner.getSelectedItem();
+            if (req == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No DownloadRequest Pending for state...", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            mDownloadManager.registerStateCallback(req, new DownloadStateCallback(
+                    DownloadStateCallback.STATE_UPDATES) {
+                @Override
+                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
+                        int fullDecodedSize) {
+                    // only registered for state callback, this shouldn't happen!
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "Progress ERROR: received progress update for callback that didn't "
+                                    + "filter it", Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
+                        @MbmsDownloadSession.DownloadStatus int state) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "State Updated (" + fileInfo + ") state: " + state,
+                            Toast.LENGTH_SHORT).show();
+                }
+            }, sInstance.getMainThreadHandler());
+        });
+
+        Button registerAllCallbacks =
+                (Button) findViewById(R.id.register_all_callback_button);
+        registerAllCallbacks.setOnClickListener((view) -> {
+            if (mDownloadManager == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No download service bound", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            DownloadRequest req = (DownloadRequest) downloadRequestSpinner.getSelectedItem();
+            if (req == null) {
+                Toast.makeText(EmbmsTestDownloadApp.this,
+                        "No DownloadRequest Pending for state...", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            mDownloadManager.registerStateCallback(req, new DownloadStateCallback() {
+                @Override
+                public void onProgressUpdated(DownloadRequest request, FileInfo fileInfo,
+                        int currentDownloadSize, int fullDownloadSize, int currentDecodedSize,
+                        int fullDecodedSize) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "Progress Updated (" + fileInfo + ") cd: " + currentDecodedSize
+                                    + " fd: " + fullDownloadSize, Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void onStateUpdated(DownloadRequest request, FileInfo fileInfo,
+                        @MbmsDownloadSession.DownloadStatus int state) {
+                    Toast.makeText(EmbmsTestDownloadApp.this,
+                            "State Updated (" + fileInfo + ") state: " + state,
+                            Toast.LENGTH_SHORT).show();
+                }
+            }, sInstance.getMainThreadHandler());
+        });
     }
 
     @Override
