diff --git a/Android.mk b/Android.mk
index 2cd7477..b2eba17 100644
--- a/Android.mk
+++ b/Android.mk
@@ -9,6 +9,7 @@
 #      $ protoc --plugin=protoc-gen-grpc-java=prebuilts/tools/common/m2/repository/io/grpc/protoc-gen-grpc-java/1.0.3/protoc-gen-grpc-java-1.0.3-linux-x86_64.exe \
 #               --grpc-java_out=lite:"packages/apps/Dialer/java/com/android/voicemail/impl/" \
 #               --proto_path="packages/apps/Dialer/java/com/android/voicemail/impl/transcribe/grpc/" "packages/apps/Dialer/java/com/android/voicemail/impl/transcribe/grpc/voicemail_transcription.proto"
+ifneq ($(TARGET_NO_TELEPHONY), true)
 ifeq ($(TARGET_FWK_SUPPORTS_FULL_VALUEADDS), true)
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
@@ -501,3 +502,4 @@
 
 include $(CLEAR_VARS)
 endif
+endif # TARGET_NO_TELEPHONY
\ No newline at end of file
diff --git a/java/com/android/incallui/BottomSheetHelper.java b/java/com/android/incallui/BottomSheetHelper.java
index 3f94a9d..6402b51 100755
--- a/java/com/android/incallui/BottomSheetHelper.java
+++ b/java/com/android/incallui/BottomSheetHelper.java
@@ -87,7 +87,6 @@
    private static final int BLIND_TRANSFER = 0;
    private static final int ASSURED_TRANSFER = 1;
    private static final int CONSULTATIVE_TRANSFER = 2;
-   private boolean mShowStaticImageUiConfig = false;
 
    private QtiImsExtListenerBaseImpl imsInterfaceListener =
       new QtiImsExtListenerBaseImpl() {
@@ -159,7 +158,6 @@
        mPrimaryCallTracker = null;
      }
      mIsHideMe = false;
-     mShowStaticImageUiConfig = false;
      if (mQtiImsExtConnector != null) {
        mQtiImsExtConnector.disconnect();
        mQtiImsExtConnector = null;
@@ -390,14 +388,8 @@
      }
    }
 
-   private void notifyStaticImageStateChanged(boolean staticImageState) {
-     LogUtil.v("BottomSheetHelper.notifyStaticImageStateChanged",
-         " notifying static image changed = " + staticImageState);
-     InCallPresenter.getInstance().notifyStaticImageStateChanged(staticImageState);
-   }
-
    private boolean isHideMeOptionVisible() {
-     if (!mShowStaticImageUiConfig ||
+     if (!QtiImsExtUtils.shallShowStaticImageUi(getPhoneId(), mContext) ||
          !VideoUtils.hasCameraPermissionAndShownPrivacyToast(mContext)) {
        return false;
      }
@@ -407,12 +399,6 @@
 
    private void maybeUpdateHideMeInMap() {
      LogUtil.v("BottomSheetHelper.maybeUpdateHideMeInMap", " mIsHideMe = " + mIsHideMe);
-     boolean showStaticImageUiConfig = QtiImsExtUtils.shallShowStaticImageUi(getPhoneId(),
-         mContext);
-     if(mShowStaticImageUiConfig != showStaticImageUiConfig) {
-       mShowStaticImageUiConfig = showStaticImageUiConfig;
-       notifyStaticImageStateChanged(mShowStaticImageUiConfig && mIsHideMe);
-     }
      String hideMeText = mIsHideMe ? mResources.getString(R.string.qti_ims_hideMeText_selected) :
          mResources.getString(R.string.qti_ims_hideMeText_unselected);
      moreOptionsMap.put(hideMeText, isHideMeOptionVisible());
@@ -438,17 +424,20 @@
      /* Click on hideme shall change the static image state i.e. decision
         is made in VideoCallPresenter whether to replace preview video with
         static image or whether to resume preview video streaming */
-       notifyStaticImageStateChanged(isHideMe);
+     InCallPresenter.getInstance().notifyHideMeUiModeChanged();
    }
 
    // Returns TRUE if UE is in hide me mode else returns FALSE
-   public boolean isInHideMeMode() {
-     LogUtil.v("BottomSheetHelper.isInHideMeMode", "mIsHideMe: " + mIsHideMe +
-         " mShowStaticImageUiConfig: " + mShowStaticImageUiConfig);
-     return mIsHideMe && mShowStaticImageUiConfig;
+   public boolean isInHideMeMode(DialerCall call) {
+     LogUtil.v("BottomSheetHelper.isInHideMeMode", "mIsHideMe: " + mIsHideMe);
+     return mIsHideMe &&
+         QtiImsExtUtils.shallShowStaticImageUi(getPhoneIdExtra(call), mContext);
    }
 
    private int getPhoneIdExtra(DialerCall call) {
+     if (call == null) {
+       return QtiCallConstants.INVALID_PHONE_ID;
+     }
      final Bundle extras = call.getExtras();
      return ((extras == null) ? QtiCallConstants.INVALID_PHONE_ID :
          extras.getInt(QtiImsExtUtils.QTI_IMS_PHONE_ID_EXTRA_KEY,
@@ -477,7 +466,7 @@
    }
 
     @Override
-    public void onSendStaticImageStateChanged(boolean isEnabled) {
+    public void onHideMeUiModeChanged() {
       //No-op
     }
 
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index 1cf2250..5fd9244 100755
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -563,7 +563,7 @@
     inCallButtonUi.showButton(
         InCallButtonIds.BUTTON_SWITCH_CAMERA,
         isVideo && hasCameraPermission && call.getVideoTech().isTransmitting()
-        && !BottomSheetHelper.getInstance().isInHideMeMode()
+        && !BottomSheetHelper.getInstance().isInHideMeMode(call)
         && !ScreenShareHelper.screenShareRequested());
     inCallButtonUi.showButton(InCallButtonIds.BUTTON_PAUSE_VIDEO, showPauseVideo);
     if (isVideo) {
@@ -598,12 +598,9 @@
 
   /**
    * Handles a change to the video call hide me selection
-   *
-   * @param shallTransmitStaticImage {@code true} if the app should show static image in preview,
-   * {@code false} otherwise.
    */
   @Override
-  public void onSendStaticImageStateChanged(boolean shallTransmitStaticImage) {
+  public void onHideMeUiModeChanged() {
     if (call == null) {
        return;
      }
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index f4c47af..73193de 100755
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -1087,7 +1087,7 @@
   }
 
   @Override
-  public void onSendStaticImageStateChanged(boolean isEnabled) {
+  public void onHideMeUiModeChanged() {
     //No-op
   }
 
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index e35393c..97ca973 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -1381,7 +1381,6 @@
   public void addInCallEventListener(InCallEventListener listener) {
     Objects.requireNonNull(listener);
     inCallEventListeners.add(listener);
-    listener.onSendStaticImageStateChanged(BottomSheetHelper.getInstance().isInHideMeMode());
   }
 
   public void removeInCallEventListener(InCallEventListener listener) {
@@ -1709,12 +1708,10 @@
 
   /**
    * Called by the {@link BottomSheetHelper} to inform of a change in hide me selection.
-   *
-   * @param isEnabled {@code True} if entering hide me mode.
    */
-  public void notifyStaticImageStateChanged(boolean isEnabled) {
+  public void notifyHideMeUiModeChanged() {
     for (InCallEventListener listener : inCallEventListeners) {
-      listener.onSendStaticImageStateChanged(isEnabled);
+      listener.onHideMeUiModeChanged();
     }
   }
 
@@ -2247,7 +2244,7 @@
   public interface InCallEventListener {
     void onSessionModificationStateChange(DialerCall call);
     void onFullscreenModeChanged(boolean isFullscreenMode);
-    void onSendStaticImageStateChanged(boolean isEnabled);
+    void onHideMeUiModeChanged();
     void onOutgoingVideoSourceChanged(int videoSource);
     void onSipDtmfChanged(int bitMask);
   }
diff --git a/java/com/android/incallui/OrientationModeHandler.java b/java/com/android/incallui/OrientationModeHandler.java
index 54b87d0..e689565 100644
--- a/java/com/android/incallui/OrientationModeHandler.java
+++ b/java/com/android/incallui/OrientationModeHandler.java
@@ -205,7 +205,8 @@
         // When VT call is put on hold, user is presented with VoLTE UI.
         // Hence, restricting held VT call to change orientation.
         if (isVideoOrUpgrade(call) && (call.getNonConferenceState() != DialerCallState.ONHOLD)
-                && (call.getNonConferenceState() != DialerCallState.DISCONNECTED)) {
+                && (call.getNonConferenceState() != DialerCallState.DISCONNECTED)
+                && !QtiCallUtils.isVideoCrs(call)) {
             return (mOrientationMode == QtiCallConstants.ORIENTATION_MODE_UNSPECIFIED) ?
                     InCallOrientationEventListener.ACTIVITY_PREFERENCE_ALLOW_ROTATION :
                     QtiCallUtils.toScreenOrientation(mOrientationMode);
@@ -259,7 +260,7 @@
     public void onFullscreenModeChanged(boolean isFullscreenMode) {}
 
     @Override
-    public void onSendStaticImageStateChanged(boolean isEnabled) {}
+    public void onHideMeUiModeChanged() {}
 
     @Override
     public void onOutgoingVideoSourceChanged(int videoSource) {}
diff --git a/java/com/android/incallui/VideoCallPresenter.java b/java/com/android/incallui/VideoCallPresenter.java
index e0b2f66..460572a 100644
--- a/java/com/android/incallui/VideoCallPresenter.java
+++ b/java/com/android/incallui/VideoCallPresenter.java
@@ -62,6 +62,7 @@
 
 import org.codeaurora.ims.ImsScreenShareListenerBase;
 import org.codeaurora.ims.ImsScreenShareManager;
+import org.codeaurora.ims.QtiCallConstants;
 import org.codeaurora.ims.QtiImsException;
 import org.codeaurora.ims.QtiImsExtConnector;
 import org.codeaurora.ims.QtiImsExtManager;
@@ -780,25 +781,23 @@
 
   /**
    * Handles a change to the video call hide me selection
-   *
-   * @param shallTransmitStaticImage {@code true} if the app should show static image in preview,
-   * {@code false} otherwise.
    */
    @Override
-   public void onSendStaticImageStateChanged(boolean shallTransmitStaticImage) {
-    LogUtil.d("VideoCallPresenter.onSendStaticImageStateChanged"," shallTransmitStaticImage: "
-        + shallTransmitStaticImage + " primaryCall: " + primaryCall);
+   public void onHideMeUiModeChanged() {
 
-    sShallTransmitStaticImage = shallTransmitStaticImage;
+    maybeUpdateTransmitStaticImageState(primaryCall);
+
+    LogUtil.d("VideoCallPresenter.onHideMeUiModeChanged"," shallTransmitStaticImage: "
+        + sShallTransmitStaticImage + " primaryCall: " + primaryCall);
 
     if (!isActiveVideoCall(primaryCall)) {
-      LogUtil.w("VideoCallPresenter.onSendStaticImageStateChanged",
+      LogUtil.w("VideoCallPresenter.onHideMeUiModeChanged",
           " received for non-active video call");
       return;
     }
 
     if (videoCall == null || videoCallScreen == null) {
-      LogUtil.w("VideoCallPresenter.onSendStaticImageStateChanged",
+      LogUtil.w("VideoCallPresenter.onHideMeUiModeChanged",
           " mVideoCall/mVideoCallScreen is null");
       return;
     }
@@ -806,7 +805,7 @@
     enableCamera(primaryCall, isCameraRequired(currentVideoState,
         SessionModificationState.NO_REQUEST));
 
-    if (shallTransmitStaticImage) {
+    if (sShallTransmitStaticImage) {
       // Handle showing static image in preview based on external storage permissions
       videoCallScreen.onRequestReadStoragePermission();
     } else {
@@ -1027,12 +1026,14 @@
   private void onPrimaryCallChanged(DialerCall newPrimaryCall) {
     final boolean shouldShowVideoUi = shouldShowVideoUiForCall(newPrimaryCall);
     final boolean isVideoMode = isVideoMode();
-
-    LogUtil.v(
+    // Get the hide me mode for the new call
+    maybeUpdateTransmitStaticImageState(newPrimaryCall);
+    LogUtil.i(
         "VideoCallPresenter.onPrimaryCallChanged",
-        "shouldShowVideoUi: %b, isVideoMode: %b",
+        "shouldShowVideoUi: %b, isVideoMode: %b, shallTransmitStaticImage: %b",
         shouldShowVideoUi,
-        isVideoMode);
+        isVideoMode,
+        sShallTransmitStaticImage);
 
     if (!shouldShowVideoUi && isVideoMode) {
       // Terminate video mode if new primary call is not a video call
@@ -1111,6 +1112,7 @@
   }
 
   private void updateVideoCall(DialerCall call) {
+    maybeUpdateTransmitStaticImageState(call);
     checkForVideoCallChange(call);
     checkForVideoStateChange(call);
     checkForCallStateChange(call);
@@ -1119,6 +1121,15 @@
         call.getState(), call.getVideoTech().getSessionModificationState());
   }
 
+  private void maybeUpdateTransmitStaticImageState(DialerCall call) {
+    // Phone id extra is not updated at the time a dialing call is created.
+    // Update the static image mode only when we are sure about the phoneid
+    if (QtiCallUtils.getPhoneId(call) != QtiCallConstants.INVALID_PHONE_ID) {
+      sShallTransmitStaticImage = BottomSheetHelper.getInstance()
+          .isInHideMeMode(call);
+    }
+  }
+
   private void checkForOrientationAllowedChange(@Nullable DialerCall call) {
     LogUtil.d("VideoCallPresenter.checkForOrientationAllowedChange","call : "+ call +
         " currentOrientationMode = " + currentOrientationMode);
