diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 6a14e88..d5ff043 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -44,10 +44,9 @@
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection.Capability;
 import com.android.internal.telephony.Connection.PostDialListener;
+import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.gsm.SuppServiceNotification;
-
-import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.imsphone.ImsPhone;
 import com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
 import com.android.internal.telephony.imsphone.ImsPhoneConnection;
@@ -56,9 +55,8 @@
 import com.android.phone.PhoneUtils;
 import com.android.phone.R;
 
-import java.lang.Override;
-import java.util.Arrays;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -160,14 +158,20 @@
                     if (msg.obj != null && ((AsyncResult) msg.obj).result != null) {
                         mSsNotification =
                                 (SuppServiceNotification)((AsyncResult) msg.obj).result;
-                        if (mOriginalConnection != null && mSsNotification.history != null) {
-                            Bundle lastForwardedNumber = new Bundle();
-                            Log.v(TelephonyConnection.this,
-                                    "Updating call history info in extras.");
-                            lastForwardedNumber.putStringArrayList(
-                                Connection.EXTRA_LAST_FORWARDED_NUMBER,
-                                new ArrayList(Arrays.asList(mSsNotification.history)));
-                            putExtras(lastForwardedNumber);
+                        if (mOriginalConnection != null) {
+                            if (mSsNotification.history != null) {
+                                Bundle lastForwardedNumber = new Bundle();
+                                Log.v(TelephonyConnection.this,
+                                        "Updating call history info in extras.");
+                                lastForwardedNumber.putStringArrayList(
+                                        Connection.EXTRA_LAST_FORWARDED_NUMBER,
+                                        new ArrayList(Arrays.asList(mSsNotification.history)));
+                                putExtras(lastForwardedNumber);
+                            }
+                            if (mSsNotification.code
+                                    == SuppServiceNotification.MO_CODE_CALL_FORWARDED) {
+                                sendConnectionEvent(TelephonyManager.EVENT_CALL_FORWARDED, null);
+                            }
                         }
                     }
                     break;
@@ -972,6 +976,9 @@
     }
 
     private boolean shouldSetDisableAddCallExtra() {
+        if (mOriginalConnection == null) {
+            return false;
+        }
         boolean carrierShouldAllowAddCall = mOriginalConnection.shouldAllowAddCallDuringVideoCall();
         if (carrierShouldAllowAddCall) {
             return false;
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 8c87071..128793f 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(request.getSourceUri())
                 .setSubscriptionId(request.getSubscriptionId())
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 496f9e9..4083f67 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
