diff --git a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
index 8ea3fbe..17a4d90 100644
--- a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
@@ -27,6 +27,7 @@
 import org.mockito.Mockito;
 
 import android.content.ComponentName;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.IInterface;
@@ -41,6 +42,7 @@
 import android.telecom.ParcelableConnection;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
 
 import java.lang.Override;
 import java.util.ArrayList;
@@ -55,28 +57,33 @@
  * to the Telecom framework.
  */
 public class ConnectionServiceFixture implements TestFixture<IConnectionService> {
+    static int INVALID_VIDEO_STATE = -1;
 
     /**
      * Implementation of ConnectionService that performs no-ops for tasks normally meant for
      * Telephony and reports success back to Telecom
      */
     public class FakeConnectionServiceDelegate extends ConnectionService {
+        int mVideoState = INVALID_VIDEO_STATE;
+
         @Override
         public Connection onCreateUnknownConnection(
                 PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
-            return new FakeConnection(request.getVideoState());
+            return new FakeConnection(request.getVideoState(), request.getAddress());
         }
 
         @Override
         public Connection onCreateIncomingConnection(
                 PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
-            return new FakeConnection(request.getVideoState());
+            return new FakeConnection(
+                    mVideoState == INVALID_VIDEO_STATE ? request.getVideoState() : mVideoState,
+                    request.getAddress());
         }
 
         @Override
         public Connection onCreateOutgoingConnection(
                 PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
-            return new FakeConnection(request.getVideoState());
+            return new FakeConnection(request.getVideoState(), request.getAddress());
         }
 
         @Override
@@ -92,7 +99,7 @@
     }
 
     public class FakeConnection extends Connection {
-        public FakeConnection(int videoState) {
+        public FakeConnection(int videoState, Uri address) {
             super();
             int capabilities = getConnectionCapabilities();
             capabilities |= CAPABILITY_MUTE;
@@ -101,6 +108,7 @@
             setVideoState(videoState);
             setConnectionCapabilities(capabilities);
             setActive();
+            setAddress(address, TelecomManager.PRESENTATION_ALLOWED);
         }
     }
 
@@ -232,7 +240,7 @@
         }
     }
 
-    private FakeConnectionServiceDelegate mConnectionServiceDelegate =
+    FakeConnectionServiceDelegate mConnectionServiceDelegate =
             new FakeConnectionServiceDelegate();
     private IConnectionService mConnectionServiceDelegateAdapter =
             IConnectionService.Stub.asInterface(mConnectionServiceDelegate.onBind(null));
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index d3c3ff4..20f62f2 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -52,6 +52,7 @@
 
 import com.android.internal.telecom.IInCallAdapter;
 import com.android.server.telecom.BluetoothPhoneServiceImpl;
+import com.android.server.telecom.CallAudioManager;
 import com.android.server.telecom.CallerInfoAsyncQueryFactory;
 import com.android.server.telecom.CallsManager;
 import com.android.server.telecom.CallsManagerListenerBase;
@@ -61,13 +62,11 @@
 import com.android.server.telecom.InCallWakeLockController;
 import com.android.server.telecom.InCallWakeLockControllerFactory;
 import com.android.server.telecom.MissedCallNotifier;
-import com.android.server.telecom.CallAudioManager;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.ProximitySensorManager;
 import com.android.server.telecom.ProximitySensorManagerFactory;
 import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.components.UserCallIntentProcessor;
-import com.android.server.telecom.ui.MissedCallNotifierImpl;
 import com.android.server.telecom.ui.MissedCallNotifierImpl.MissedCallNotifierImplFactory;
 
 import com.google.common.base.Predicate;
@@ -486,6 +485,7 @@
         final int startingNumConnections = connectionServiceFixture.mConnectionById.size();
         final int startingNumCalls = mInCallServiceFixtureX.mCallById.size();
         boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null;
+        connectionServiceFixture.mConnectionServiceDelegate.mVideoState = videoState;
 
         Bundle extras = new Bundle();
         extras.putParcelable(
@@ -498,13 +498,12 @@
                 .createConnection(any(PhoneAccountHandle.class), anyString(),
                         any(ConnectionRequest.class), eq(true), eq(false));
 
-        mConnectionServiceFixtureA.mConnectionById.get(
-                connectionServiceFixture.mLatestConnectionId).videoState = videoState;
-
-        connectionServiceFixture.sendHandleCreateConnectionComplete(
-                connectionServiceFixture.mLatestConnectionId);
         connectionServiceFixture.sendSetRinging(connectionServiceFixture.mLatestConnectionId);
-        connectionServiceFixture.sendSetVideoState(connectionServiceFixture.mLatestConnectionId);
+
+        for (CallerInfoAsyncQueryFactoryFixture.Request request :
+                mCallerInfoAsyncQueryFactoryFixture.mRequests) {
+            request.reply();
+        }
 
         // For the case of incoming calls, Telecom connecting the InCall services and adding the
         // Call is triggered by the async completion of the CallerInfoAsyncQuery. Once the Call
