diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtControllerBase.java b/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtControllerBase.java
new file mode 100644
index 0000000..ab75505
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtControllerBase.java
@@ -0,0 +1,93 @@
+/* Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.codeaurora.ims;
+
+import android.content.Context;
+import android.os.RemoteException;
+import org.codeaurora.ims.internal.ICrsCrbtListener;
+import org.codeaurora.ims.internal.ICrsCrbtController;
+
+public abstract class CrsCrbtControllerBase {
+    public final class CrsCrbtBinder extends ICrsCrbtController.Stub {
+
+        @Override
+        public void setCrsCrbtListener(ICrsCrbtListener listener)
+            throws RemoteException{
+            CrsCrbtControllerBase.this.onSetCrsCrbtListener(listener);
+        }
+
+        @Override
+        public void removeCrsCrbtListener(ICrsCrbtListener listener)
+            throws RemoteException{
+            CrsCrbtControllerBase.this.onRemoveCrsCrbtListener(listener);
+        }
+
+        @Override
+        public boolean isPreparatorySession(String callId)
+            throws RemoteException {
+            return CrsCrbtControllerBase.this.onIsPreparatorySession(callId);
+        }
+
+        @Override
+        public void sendSipDtmf(String requestCode)
+            throws RemoteException {
+            CrsCrbtControllerBase.this.onSendSipDtmf(requestCode);
+        }
+    }
+
+    private ICrsCrbtController mBinder;
+
+    public ICrsCrbtController getBinder() {
+        if (mBinder == null) {
+            mBinder = new CrsCrbtBinder();
+        }
+        return mBinder;
+    }
+
+    protected void onSetCrsCrbtListener(ICrsCrbtListener listener)
+        throws RemoteException {
+        //no-op
+    }
+
+    protected void onRemoveCrsCrbtListener(ICrsCrbtListener listener)
+        throws RemoteException {
+        //no-op
+    }
+
+    protected boolean onIsPreparatorySession(String callId)
+        throws RemoteException {
+        //no-op
+        return false;
+    }
+
+    protected void onSendSipDtmf(String requestCode)
+        throws RemoteException {
+        //no-op
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtListenerBase.java b/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtListenerBase.java
new file mode 100644
index 0000000..7cb3381
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtListenerBase.java
@@ -0,0 +1,65 @@
+/* Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.codeaurora.ims;
+
+import org.codeaurora.ims.internal.ICrsCrbtListener;
+
+public abstract class CrsCrbtListenerBase {
+
+    private final class CrsCrbtListener extends ICrsCrbtListener.Stub {
+
+        public void onCrsDataUpdated(int phoneId, int crsType,
+                boolean isPreparatory) {
+            CrsCrbtListenerBase.this.onCrsDataUpdated(phoneId, crsType,
+                    isPreparatory);
+        }
+
+        public void onSipDtmfReceived(int phoneId, String configCode) {
+            CrsCrbtListenerBase.this.onSipDtmfReceived(phoneId, configCode);
+        }
+    }
+
+    private CrsCrbtListener mListener;
+
+    public ICrsCrbtListener getBinder() {
+        if (mListener == null) {
+            mListener = new CrsCrbtListener();
+        }
+        return mListener;
+    }
+
+    protected void onCrsDataUpdated(int phoneId, int crsType,
+            boolean isPreparatory) {
+        // no-op
+    }
+
+    protected void onSipDtmfReceived(int phoneId, String configCode) {
+        // no-op
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtManager.java b/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtManager.java
new file mode 100644
index 0000000..d1c3296
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/CrsCrbtManager.java
@@ -0,0 +1,133 @@
+/* Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.RemoteException;
+import org.codeaurora.ims.internal.ICrsCrbtController;
+import org.codeaurora.ims.internal.ICrsCrbtListener;
+import android.util.Log;
+
+public class CrsCrbtManager {
+    private static final String LOG_TAG = "CrsCrbtManager";
+
+    private QtiImsExtManager mQtiImsExtMgr;
+    private volatile ICrsCrbtController mInterface;
+    private int mPhoneId;
+
+    CrsCrbtManager(int phoneId, QtiImsExtManager imsExtMgr) {
+        mPhoneId = phoneId;
+        mQtiImsExtMgr = imsExtMgr;
+        mQtiImsExtMgr.addCleanupListener(()->{mInterface = null;});
+    }
+
+    private ICrsCrbtController getBinder() throws QtiImsException{
+        ICrsCrbtController intf = mInterface;
+        if (intf != null) {
+            return intf;
+        }
+        mQtiImsExtMgr.validateInvariants(mPhoneId);
+        intf = mQtiImsExtMgr.getCrsCrbtController(mPhoneId);
+        if (intf == null) {
+            Log.e(LOG_TAG, "mInterface is NULL");
+            throw new QtiImsException("Remote Interface is NULL");
+        }
+        mInterface = intf;
+        return intf;
+    }
+
+    /**
+     * Used by client to register call back listener with vendor for CRS
+     * type/silencUi/SipDtmf state
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param listener, to get notified for CRS type or silenceUi or SipDtmf change.
+     * @return void
+     *
+     */
+    public void setCrsCrbtListener(CrsCrbtListenerBase listener)
+        throws QtiImsException {
+      mQtiImsExtMgr.validateInvariants(mPhoneId);
+      try {
+          getBinder().setCrsCrbtListener(listener == null ? null : listener.getBinder());
+      } catch(RemoteException e) {
+          throw new QtiImsException("Remote ImsService setCrsCrbtListener: " + e);
+      }
+    }
+
+    /**
+     * Used by client to unregister call back listener with vendor for CRS
+     * type/silencUi/SipDtmf state
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param listener, to unregister.
+     * @return void
+     *
+     */
+    public void removeCrsCrbtListener(CrsCrbtListenerBase listener)
+        throws QtiImsException {
+      mQtiImsExtMgr.validateInvariants(mPhoneId);
+      try {
+          getBinder().removeCrsCrbtListener(listener == null ? null : listener.getBinder());
+      } catch(RemoteException e) {
+          throw new QtiImsException("Remote ImsService removeCrsCrbtListener: " + e);
+      }
+    }
+
+    /**
+     * isPreparatorySession
+     * whether show Video CRS Ui
+     *
+     * @param callId
+     * @return boolean
+     */
+    public boolean isPreparatorySession(String callId)
+        throws QtiImsException{
+        mQtiImsExtMgr.validateInvariants(mPhoneId);
+        try {
+            return getBinder().isPreparatorySession(callId);
+        }
+        catch (RemoteException e) {
+            throw new QtiImsException("Remote ImsService isPreparatorySession : " + e);
+        }
+    }
+
+    /**
+     * Used by client to send dtmf string to RIL
+     */
+    public void sendSipDtmf(String requestCode)
+        throws QtiImsException {
+        mQtiImsExtMgr.validateInvariants(mPhoneId);
+        try {
+            getBinder().sendSipDtmf(requestCode);
+        }
+        catch (RemoteException e) {
+            throw new QtiImsException("Remote ImsService sendSipDtmf : " + e);
+        }
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
index 80e119a..0e7e853 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015, 2019-2020 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015, 2019-2021 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -402,5 +402,30 @@
     public static final int REG_ERROR_GEO_LOCATION_STATUS_ENGINE_LOCK = 2002;
     // This is success case, received when all the GPS errors are resolved.
     public static final int REG_ERROR_GEO_LOCATION_STATUS_RESOLVED = 2003;
-}
 
+    /* CRS type extra key */
+    public static final String EXTRA_CRS_TYPE = "crsType";
+    /* Original call type extra key */
+    public static final String EXTRA_ORIGINAL_CALL_TYPE = "originalCallType";
+    /* Slience UI before CRS RTP come extra key */
+    public static final String EXTRA_IS_PREPARATORY = "isPreparatory";
+    //INVALID if CrsData is invalid, play local ring.
+    public static final int CRS_TYPE_INVALID = 0;
+    //AUDIO if only audio will be played.
+    public static final int CRS_TYPE_AUDIO = 1 << 0;
+    //VIDEO if only video will be played.
+    public static final int CRS_TYPE_VIDEO = 1 << 1;
+
+    //Call progress info constants.
+    public static final int CALL_PROGRESS_INFO_TYPE_INVALID = -1;
+    public static final int CALL_PROGRESS_INFO_TYPE_CALL_REJ_Q850 = 0;
+    public static final int CALL_PROGRESS_INFO_TYPE_CALL_WAITING = 1;
+    public static final int CALL_PROGRESS_INFO_TYPE_CALL_FORWARDING = 2;
+    public static final int CALL_PROGRESS_INFO_TYPE_REMOTE_AVAILABLE = 3;
+    //Call progress info call rejection code
+    public static final int CALL_REJECTION_CODE_INVALID = -1;
+    //Call progress info extras
+    public static final String EXTRAS_CALL_PROGRESS_INFO_TYPE = "CallProgInfoType";
+    public static final String EXTRAS_CALL_PROGRESS_REASON_CODE = "CallProgReasonCode";
+    public static final String EXTRAS_CALL_PROGRESS_REASON_TEXT = "CallProgReasonText";
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
index 052ab9c..32a2a06 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, 2020 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016, 2020-2021 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -115,4 +115,22 @@
      */
     public static final String KEY_CARRIER_CALL_COMPOSER_SUPPORTED =
             "carrier_call_composer_supported_bool";
+
+    /* Config to determine if Carrier supports video CRS
+     * true - if video CRS is support else false
+     */
+    public static final String KEY_CARRIER_VIDEO_CRS_SUPPORTED =
+            "carrier_video_crs_supported_bool";
+
+    /* Config to determine if Carrier supports video CRBT
+     * true - if video CRBT is support else false
+     */
+    public static final String KEY_CARRIER_VIDEO_CRBT_SUPPORTED =
+            "config_enable_video_crbt";
+
+    /* Config to determine if Carrier supports showing call progress notiication during alerting.
+     * true - if call progress notification is supported else false
+     */
+    public static final String KEY_CARRIER_CALL_PROGRESS_NOTIFICATION_SUPPORTED =
+            "carrier_call_progress_notification";
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
index 8192712..9cb5381 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016, 2017, 2019-2020 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016, 2017, 2019-2021 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -30,6 +30,7 @@
 import android.os.Bundle;
 import android.telephony.ims.feature.ImsFeature;
 
+import org.codeaurora.ims.internal.ICrsCrbtController;
 import org.codeaurora.ims.internal.IQtiImsExt;
 import org.codeaurora.ims.internal.IQtiImsExtListener;
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
@@ -156,6 +157,11 @@
         public boolean isCallComposerEnabled(int phoneId) {
             return onIsCallComposerEnabled(phoneId);
         }
+
+        @Override
+        public ICrsCrbtController getCrsCrbtController(int phoneId) {
+            return onGetCrsCrbtController(phoneId);
+        }
     };
 
     private QtiImsExtBinder mQtiImsExtBinder;
@@ -249,4 +255,8 @@
         // no-op
         return false;
     }
+    protected ICrsCrbtController onGetCrsCrbtController(int phoneId) {
+        //no-op
+        return null;
+    }
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
index 186e94e..4314eb9 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -38,6 +38,7 @@
 
 import java.util.ArrayList;
 
+import org.codeaurora.ims.internal.ICrsCrbtController;
 import org.codeaurora.ims.internal.IQtiImsExt;
 import org.codeaurora.ims.internal.IQtiImsExtListener;
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
@@ -363,4 +364,21 @@
         checkPhoneId(phoneId);
         checkFeatureStatus(phoneId);
     }
+
+    public CrsCrbtManager createCrsCrbtManager(int phoneId)
+            throws QtiImsException {
+        validateInvariants(phoneId);
+        return new CrsCrbtManager(phoneId, this);
+    }
+
+    /*package private*/
+    ICrsCrbtController getCrsCrbtController(int phoneId)
+            throws QtiImsException {
+        validateInvariants(phoneId);
+        try {
+            return mQtiImsExt.getCrsCrbtController(phoneId);
+        } catch(RemoteException e) {
+            throw new QtiImsException("Failed to retrieve CrsCrbtInterface : " + e);
+        }
+    }
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/internal/ICrsCrbtController.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/internal/ICrsCrbtController.aidl
new file mode 100644
index 0000000..4f2deac
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/internal/ICrsCrbtController.aidl
@@ -0,0 +1,71 @@
+/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.codeaurora.ims.internal;
+
+import org.codeaurora.ims.internal.ICrsCrbtListener;
+
+/**
+ * Used by client application to communicate with vendor code
+ * {@hide}
+ */
+interface ICrsCrbtController {
+    /**
+     * Used by client to register call back listener with vendor for CRS
+     * type/silencUi state
+     *
+     * @param listener, to get notified for CRS type or silenceUi change.
+     * @return void
+     *
+     */
+    oneway void setCrsCrbtListener(ICrsCrbtListener listener);
+
+    /**
+     * Used by client to unregister call back listener with vendor for CRS
+     * type/silencUi state
+     *
+     * @param listener, to be unregister.
+     * @return void
+     *
+     */
+    oneway void removeCrsCrbtListener(ICrsCrbtListener listener);
+
+    /**
+     * isPreparatorySession
+     * whether show Video CRS Ui
+     *
+     * @param callId indicates the phone instance which triggered the request
+     * @return boolean
+     */
+    boolean isPreparatorySession(String callId);
+
+    /**
+     * Used by client for sending sip dtmf for video CRS/CRBT
+     */
+    oneway void sendSipDtmf(String requestCode);
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/internal/ICrsCrbtListener.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/internal/ICrsCrbtListener.aidl
new file mode 100644
index 0000000..3ed02c5
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/internal/ICrsCrbtListener.aidl
@@ -0,0 +1,58 @@
+/* Copyright (c) 2021, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.codeaurora.ims.internal;
+
+
+/**
+ * Used by client application to get the result from lower layer by
+ * communicating with vendor.
+ * {@hide}
+ */
+oneway interface ICrsCrbtListener {
+
+   /**
+    * Notifies client when crsType/hideInCallUi is changed from vendor.
+    *
+    * @param  phoneId indicates the phone instance which triggered the request
+    * @param  crsType/isPreparatory – update crs type and silenceUi from vendor.
+    *
+    * @return void.
+    */
+   void onCrsDataUpdated(int phoneId, int crsType, boolean isPreparatory);
+
+    /**
+     * Notifies client when SIP DTMF config string is received
+     *
+     * @param  phoneId indicates the phone instance which triggered the request
+     * @param  configCode - SIP DTMP config string that be parsed from xml by modem.
+     *
+     * @return void.
+     */
+    void onSipDtmfReceived(int phoneId, String configCode);
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl
index c138583..abda8cf 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExt.aidl
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2017, 2019-2020 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2017, 2019-2021 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -29,6 +29,7 @@
 package org.codeaurora.ims.internal;
 
 import android.os.Bundle;
+import org.codeaurora.ims.internal.ICrsCrbtController;
 import org.codeaurora.ims.internal.IQtiImsExtListener;
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
 import org.codeaurora.ims.internal.IImsScreenShareController;
@@ -282,4 +283,9 @@
      *@throws RemoteException if calling the IMS service results in an error.
      */
     boolean isCallComposerEnabled(int phoneId);
+
+   /**
+    * Returns the ICrsCrbtnterface IBinder
+    */
+    ICrsCrbtController getCrsCrbtController(int phoneId);
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java b/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java
index 65c8dd4..03ba272 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/utils/QtiImsExtUtils.java
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2015-2017, 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2017, 2020-2021 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -636,4 +636,22 @@
                 QtiCallConstants.IMS_CALL_COMPOSER + phoneId,
                 QtiCallConstants.CALL_COMPOSER_DISABLED);
     }
+
+    // Returns true if Carrier supports video CRS
+    public static boolean isVideoCrsSupported(int phoneId, Context context) {
+        return isCarrierConfigEnabled(phoneId, context,
+                QtiCarrierConfigs.KEY_CARRIER_VIDEO_CRS_SUPPORTED);
+    }
+
+    // Returns true if Carrier supports video CRBT
+    public static boolean isVideoCrbtSupported(int phoneId, Context context) {
+        return isCarrierConfigEnabled(phoneId, context,
+                QtiCarrierConfigs.KEY_CARRIER_VIDEO_CRBT_SUPPORTED);
+    }
+
+    // Returns true if carrier supports call progress notification.
+    public static boolean isCallProgressNotificationSupported(int phoneId, Context context) {
+        return isCarrierConfigEnabled(phoneId, context,
+                QtiCarrierConfigs.KEY_CARRIER_CALL_PROGRESS_NOTIFICATION_SUPPORTED);
+    }
 }
