diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 1dc150d..5e08c69 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -268,7 +268,6 @@
 
   private SpeakEasyCallManager speakEasyCallManager;
 
-  private boolean shouldStartInBubbleMode;
   private boolean audioRouteSetForBubbleMode;
 
   /** Inaccessible constructor. Must use getRunningInstance() to get this singleton. */
@@ -336,8 +335,7 @@
       ContactInfoCache contactInfoCache,
       ProximitySensor proximitySensor,
       FilteredNumberAsyncQueryHandler filteredNumberQueryHandler,
-      @NonNull SpeakEasyCallManager speakEasyCallManager,
-      Intent intent) {
+      @NonNull SpeakEasyCallManager speakEasyCallManager) {
     Trace.beginSection("InCallPresenter.setUp");
     if (serviceConnected) {
       LogUtil.i("InCallPresenter.setUp", "New service connection replacing existing one.");
@@ -403,8 +401,6 @@
     addInCallUiListener(motorolaInCallUiNotifier);
     addListener(motorolaInCallUiNotifier);
 
-    this.shouldStartInBubbleMode = shouldStartInBubbleMode(intent);
-
     LogUtil.d("InCallPresenter.setUp", "Finished InCallPresenter.setUp");
     Trace.endSection();
   }
@@ -413,15 +409,33 @@
    * Return whether we should start call in bubble mode and not show InCallActivity. The call mode
    * should be set in CallConfiguration in EXTRA_OUTGOING_CALL_EXTRAS when starting a call intent.
    */
-  private boolean shouldStartInBubbleMode(Intent intent) {
+  private boolean shouldStartInBubbleMode() {
     if (!ReturnToCallController.isEnabled(context)) {
       return false;
     }
-    if (!intent.hasExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS)) {
+
+    // We only start in Bubble mode for outgoing call
+    DialerCall dialerCall = callList.getPendingOutgoingCall();
+    if (dialerCall == null) {
+      dialerCall = callList.getOutgoingCall();
+    }
+    if (dialerCall == null) {
       return false;
     }
-    Bundle extras = intent.getParcelableExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
-    byte[] callConfigurationByteArray = extras.getByteArray(CALL_CONFIGURATION_EXTRA);
+
+    Bundle extras = dialerCall.getIntentExtras();
+    return shouldStartInBubbleModeWithExtras(extras);
+  }
+
+  private boolean shouldStartInBubbleModeWithExtras(Bundle outgoingExtras) {
+    if (!ReturnToCallController.isEnabled(context)) {
+      return false;
+    }
+
+    if (outgoingExtras == null) {
+      return false;
+    }
+    byte[] callConfigurationByteArray = outgoingExtras.getByteArray(CALL_CONFIGURATION_EXTRA);
     if (callConfigurationByteArray == null) {
       return false;
     }
@@ -1493,7 +1507,7 @@
       inCallActivity.dismissPendingDialogs();
     }
 
-    if ((showCallUi || showAccountPicker) && !shouldStartInBubbleMode) {
+    if ((showCallUi || showAccountPicker) && !shouldStartInBubbleMode()) {
       LogUtil.i("InCallPresenter.startOrFinishUi", "Start in call UI");
       showInCall(false /* showDialpad */, !showAccountPicker /* newOutgoingCall */);
     } else if (newState == InCallState.NO_CALLS) {
@@ -1554,7 +1568,6 @@
 
       isChangingConfigurations = false;
 
-      shouldStartInBubbleMode = false;
       audioRouteSetForBubbleMode = false;
 
       // blow away stale contact info so that we get fresh data on
@@ -1647,7 +1660,7 @@
 
     setBoundAndWaitingForOutgoingCall(true, accountHandle);
 
-    if (shouldStartInBubbleMode) {
+    if (shouldStartInBubbleModeWithExtras(extras)) {
       LogUtil.i("InCallPresenter.maybeStartRevealAnimation", "shouldStartInBubbleMode");
       // Show bubble instead of in call UI
       return;
@@ -1838,8 +1851,9 @@
   public void onAudioStateChanged(CallAudioState audioState) {
     // Set sensible audio route for bubble mode when we get real audio state for the first time
     // During the first time this function is called, supportedRouteMask is set to
-    // SUPPORTED_AUDIO_ROUTE_ALL, but it's OK since shouldStartInBubbleMode is not set at that time.
-    if (!audioRouteSetForBubbleMode && shouldStartInBubbleMode) {
+    // SUPPORTED_AUDIO_ROUTE_ALL, but it's OK since shouldStartInBubbleMode() is false at that time
+    // (callList not updated yet).
+    if (!audioRouteSetForBubbleMode && shouldStartInBubbleMode()) {
       setAudioRouteForBubbleMode(audioState);
       audioRouteSetForBubbleMode = true;
     }
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java
index 29a65b9..d803956 100644
--- a/java/com/android/incallui/InCallServiceImpl.java
+++ b/java/com/android/incallui/InCallServiceImpl.java
@@ -110,8 +110,7 @@
             new ProximitySensor(
                 context, AudioModeProvider.getInstance(), new AccelerometerListener(context)),
             new FilteredNumberAsyncQueryHandler(context),
-            speakEasyCallManager,
-            intent);
+            speakEasyCallManager);
     InCallPresenter.getInstance().onServiceBind();
     InCallPresenter.getInstance().maybeStartRevealAnimation(intent);
     TelecomAdapter.getInstance().setInCallService(this);
diff --git a/java/com/android/incallui/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
index fcb6fe0..4a7b3fb 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -191,6 +191,9 @@
         && !InCallPresenter.getInstance().isShowingInCallUi()) {
       LogUtil.i("ReturnToCallController.onCallListChange", "going to show bubble");
       show();
+    } else {
+      // The call to display might be different for the existing bubble
+      startContactInfoSearch();
     }
   }
 
