diff --git a/extphone/src/com/qti/extphone/CiwlanConfig.aidl b/extphone/src/com/qti/extphone/CiwlanConfig.aidl
new file mode 100644
index 0000000..c0d5380
--- /dev/null
+++ b/extphone/src/com/qti/extphone/CiwlanConfig.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+parcelable CiwlanConfig;
diff --git a/extphone/src/com/qti/extphone/CiwlanConfig.java b/extphone/src/com/qti/extphone/CiwlanConfig.java
new file mode 100644
index 0000000..6bd5ea0
--- /dev/null
+++ b/extphone/src/com/qti/extphone/CiwlanConfig.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class CiwlanConfig implements Parcelable {
+
+    private static final String TAG = "CiwlanConfig";
+
+    public static final int INVALID = -1;
+    public static final int ONLY = 0;
+    public static final int PREFERRED = 1;
+
+    private int mHomeMode = INVALID;
+    private int mRoamMode = INVALID;
+
+    public CiwlanConfig(int homeMode, int roamMode) {
+        mHomeMode = homeMode;
+        mRoamMode = roamMode;
+    }
+
+    public CiwlanConfig(Parcel in) {
+        mHomeMode = in.readInt();
+        mRoamMode = in.readInt();
+    }
+
+    public String getHomeCiwlanMode() {
+        switch (mHomeMode) {
+            case ONLY:
+                return "ONLY";
+            case PREFERRED:
+                return "PREFERRED";
+            default:
+                return "INVALID";
+        }
+    }
+
+    public String getRoamCiwlanMode() {
+        switch (mRoamMode) {
+            case ONLY:
+                return "ONLY";
+            case PREFERRED:
+                return "PREFERRED";
+            default:
+                return "INVALID";
+        }
+    }
+
+    public boolean isCiwlanOnlyInHome() {
+        return mHomeMode == ONLY;
+    }
+
+    public boolean isCiwlanOnlyInRoam() {
+        return mRoamMode == ONLY;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mHomeMode);
+        out.writeInt(mRoamMode);
+    }
+
+    public static final Parcelable.Creator<CiwlanConfig> CREATOR = new Parcelable.Creator() {
+        @Override
+        public CiwlanConfig createFromParcel(Parcel in) {
+            return new CiwlanConfig(in);
+        }
+
+        @Override
+        public CiwlanConfig[] newArray(int size) {
+            return new CiwlanConfig[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return TAG + " homeMode = " + getHomeCiwlanMode() + ", roamMode = " + getRoamCiwlanMode();
+    }
+}
diff --git a/extphone/src/com/qti/extphone/DualDataRecommendation.aidl b/extphone/src/com/qti/extphone/DualDataRecommendation.aidl
new file mode 100644
index 0000000..5c3d8f9
--- /dev/null
+++ b/extphone/src/com/qti/extphone/DualDataRecommendation.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+parcelable DualDataRecommendation;
diff --git a/extphone/src/com/qti/extphone/DualDataRecommendation.java b/extphone/src/com/qti/extphone/DualDataRecommendation.java
new file mode 100644
index 0000000..c39282b
--- /dev/null
+++ b/extphone/src/com/qti/extphone/DualDataRecommendation.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear
+ */
+
+package com.qti.extphone;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class DualDataRecommendation implements Parcelable {
+
+    private static final String TAG = "DualDataRecommendation";
+
+    // Recommended SUB
+    public static final int DDS = 1;
+    public static final int NON_DDS = 2;
+
+    // Action
+    public static final int ACTION_DATA_NOT_ALLOW = 0;
+    public static final int ACTION_DATA_ALLOW = 1;
+
+    private int mSub;
+    private int mAction;
+
+    public DualDataRecommendation(int sub, int action) {
+        mSub = sub;
+        mAction = action;
+    }
+
+    public DualDataRecommendation(Parcel in) {
+        mSub = in.readInt();
+        mAction = in.readInt();
+    }
+
+    public int getRecommendedSub() {
+        return mSub;
+    }
+
+    public int getAction() {
+        return mAction;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mSub);
+        out.writeInt(mAction);
+    }
+
+    public static final Parcelable.Creator<DualDataRecommendation> CREATOR
+            = new Parcelable.Creator() {
+        public DualDataRecommendation createFromParcel(Parcel in) {
+            return new DualDataRecommendation(in);
+        }
+
+        public DualDataRecommendation[] newArray(int size) {
+            return new DualDataRecommendation[size];
+        }
+    };
+
+    @Override
+    public String toString() {
+        return TAG + ": getRecommendedSub(): " + getRecommendedSub()
+                + " getAction: " + getAction();
+    }
+}
diff --git a/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java b/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java
index 3f1eb65..c27237c 100644
--- a/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java
+++ b/extphone/src/com/qti/extphone/ExtPhoneCallbackListener.java
@@ -71,6 +71,7 @@
     public static final int EVENT_SET_SMART_DDS_SWITCH_TOGGLE_RESPONSE = 35;
     public static final int EVENT_START_NETWORK_SCAN_RESPONSE = 36;
     public static final int EVENT_STOP_NETWORK_SCAN_RESPONSE = 37;
+    public static final int EVENT_ON_CIWLAN_CAPABILITY_CHANGE = 38;
 
     private Handler mHandler;
     IExtPhoneCallback mCallback = new IExtPhoneCallbackStub(this);
diff --git a/extphone/src/com/qti/extphone/ExtTelephonyManager.java b/extphone/src/com/qti/extphone/ExtTelephonyManager.java
index 49084bc..fc90c6a 100644
--- a/extphone/src/com/qti/extphone/ExtTelephonyManager.java
+++ b/extphone/src/com/qti/extphone/ExtTelephonyManager.java
@@ -1085,6 +1085,20 @@
         return null;
     }
 
+    public CiwlanConfig getCiwlanConfig(int slotId) throws RemoteException {
+        CiwlanConfig config = null;
+        if (!isServiceConnected()) {
+            Log.e(LOG_TAG, "service not connected!");
+            return config;
+        }
+        try {
+            config = mExtTelephonyService.getCiwlanConfig(slotId);
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "getCiwlanConfig ended in remote exception", e);
+        }
+        return config;
+    }
+
     public Client registerCallback(String packageName, IExtPhoneCallback callback) {
         Client client = null;
         if (!isServiceConnected()) {
diff --git a/extphone/src/com/qti/extphone/IExtPhone.aidl b/extphone/src/com/qti/extphone/IExtPhone.aidl
index 0f4964c..444f2c6 100644
--- a/extphone/src/com/qti/extphone/IExtPhone.aidl
+++ b/extphone/src/com/qti/extphone/IExtPhone.aidl
@@ -38,7 +38,7 @@
 
 import android.telephony.ImsiEncryptionInfo;
 
-import com.qti.extphone.Token;
+import com.qti.extphone.CiwlanConfig;
 import com.qti.extphone.Client;
 import com.qti.extphone.IDepersoResCallback;
 import com.qti.extphone.IExtPhoneCallback;
@@ -47,6 +47,7 @@
 import com.qti.extphone.QtiImeiInfo;
 import com.qti.extphone.QtiSetNetworkSelectionMode;
 import com.qti.extphone.QtiSimType;
+import com.qti.extphone.Token;
 
 interface IExtPhone {
 
@@ -584,4 +585,12 @@
      * @return - Integer Token can be used to compare with the response.
      */
     Token setSimType(in Client client, in QtiSimType[] simType);
+
+    /**
+     * Query the C_IWLAN mode
+     *
+     * @param - slotId slot ID
+     * @return - The C_IWLAN configuration (only vs preferred) for home and roaming
+     */
+    CiwlanConfig getCiwlanConfig(int slotId);
 }
diff --git a/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl b/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
index 484cedd..a068c52 100644
--- a/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
+++ b/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
@@ -30,7 +30,7 @@
 /*
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  * SPDX-License-Identifier: BSD-3-Clause-Clear
  */
 
@@ -270,7 +270,7 @@
 
     /**
      * Response to getSecureModeStatus
-     * @param - token is the same token which is received in setSmartDdsSwitchToggle
+     * @param - token is the same token which is passed in from getSecureModeStatus
      * @param - status SUCCESS/FAILURE based on RIL data module response
      * @param - enableStatus Secure Mode status - true: enabled, false: disabled
      */
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.aidl
new file mode 100644
index 0000000..8ffc0c4
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable Coordinate2D;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.java b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.java
new file mode 100644
index 0000000..251366a
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/Coordinate2D.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Parcelable object to handle Coordinate2D info
+ * @hide
+ */
+
+public class Coordinate2D implements Parcelable {
+
+    private int mX;
+    private int mY;
+
+    public Coordinate2D(int x, int y) {
+        mX = x;
+        mY = y;
+    }
+
+    public Coordinate2D(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public int getX() {
+        return mX;
+    }
+
+    public int getY() {
+        return mY;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeInt(mX);
+        dest.writeInt(mY);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mX = in.readInt();
+        mY = in.readInt();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<Coordinate2D> CREATOR =
+            new Creator<Coordinate2D>() {
+        @Override
+        public Coordinate2D createFromParcel(Parcel in) {
+            return new Coordinate2D(in);
+        }
+
+        @Override
+        public Coordinate2D[] newArray(int size) {
+            return new Coordinate2D[size];
+        }
+    };
+
+    public String toString() {
+        return ("{Coordinate2D: " + "x = " + mX + " , y = " + mY + "}");
+    }
+}
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 9b92a80..b107e2d 100755
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCallConstants.java
@@ -27,7 +27,7 @@
  *
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted (subject to the limitations in the
@@ -143,6 +143,15 @@
      * CODE_CONCURRENT_CALLS_NOT_POSSIBLE} */
     public static final int CODE_CONCURRENT_CALLS_NOT_POSSIBLE = 3002;
 
+    /* Call fail error code to EPSFB failure */
+    public static final int CODE_EPSFB_FAILURE = 3003;
+
+    /* Call fail error code to TWAIT_EXPIRED */
+    public static final int CODE_TWAIT_EXPIRED = 3004;
+
+    /* Call fail error code to TCP_CONNECTION_REQ */
+    public static final int CODE_TCP_CONNECTION_REQ = 3005;
+
     // Default code to use for additional call info code.
     public static final int CODE_UNSPECIFIED = -1;
 
@@ -558,4 +567,17 @@
     // requires permission "com.qti.permission.RECEIVE_ESSENTIAL_RECORDS_LOADED".
     public static final String ACTION_ESSENTIAL_RECORDS_LOADED =
         "org.codeaurora.intent.action.ESSENTIAL_RECORDS_LOADED";
+
+    // Video online service
+    public static final String EXTRA_VIDEO_ONLINE_SERVICE_SUPPORTED = "isVosSupported";
+
+    /**
+     * The value of voice/video/text is defined according to the SRTP categories
+     * and the name in the extra is defined by QC IMS service.
+     */
+    public static final String EXTRAS_SRTP_ENCRYPTION_CATEGORY = "srtpEncryptionCategory";
+    public static final int SRTP_CATEGORY_UNENCRYPTED = 0;
+    public static final int SRTP_CATEGORY_VOICE = 1 << 0;
+    public static final int SRTP_CATEGORY_VIDEO = 1 << 1;
+    public static final int SRTP_CATEGORY_TEXT = 1 << 2;
 }
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 ebdc1b6..543aaab 100755
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiCarrierConfigs.java
@@ -27,7 +27,7 @@
  *
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted (subject to the limitations in the
@@ -145,25 +145,25 @@
             "allow_one_way_accept_video_call";
 
     /* Config to determine if Carrier supports call composer
-     * true - if call composer is support else false
+     * true - if call composer is supported else false
      */
     public static final String KEY_CARRIER_CALL_COMPOSER_SUPPORTED =
             "carrier_call_composer_supported_bool";
 
     /* Config to determine if Carrier supports b2c enriched calling
-     * true - if b2c enriched calling is support else false
+     * true - if b2c enriched calling is supported else false
      */
     public static final String KEY_CARRIER_B2C_ENRICHED_CALLING_SUPPORTED =
             "carrier_b2c_enriched_calling_supported_bool";
 
     /* Config to determine if Carrier supports video CRS
-     * true - if video CRS is support else false
+     * true - if video CRS is supported 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
+     * true - if video CRBT is supported else false
      */
     public static final String KEY_CARRIER_VIDEO_CRBT_SUPPORTED =
             "config_enable_video_crbt";
@@ -199,8 +199,14 @@
         "is_private_network";
 
     /* Config to determine if Carrier supports ims data channel
-     * true - if data channel is support else false
+     * true - if data channel is supported else false
      */
      public static final String KEY_CARRIER_DATA_CHANNEL_SUPPORTED =
          "carrier_data_channel_supported_bool";
+
+    /* Config to determine if Carrier supports video online service
+     * true - if video online service is supported else false
+     */
+    public static final String KEY_CARRIER_VIDEO_ONLINE_SERVICE_SUPPORTED =
+        "carrier_video_online_service_supported_bool";
 }
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 c63c29d..dee1a72 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtBase.java
@@ -24,6 +24,10 @@
  * 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 package org.codeaurora.ims;
 
@@ -36,6 +40,7 @@
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
 import org.codeaurora.ims.internal.IImsScreenShareController;
 import org.codeaurora.ims.QtiCallConstants;
+import org.codeaurora.ims.VosActionInfo;
 /**
  * Base implementation for IQtiImsExt.
  */
@@ -196,6 +201,18 @@
         public boolean isDataChannelEnabled(int phoneId) {
             return onIsDataChannelEnabled(phoneId);
         }
+
+        @Override
+        public void sendVosSupportStatus(int phoneId, boolean isVosSupported,
+                IQtiImsExtListener listener) {
+            onSendVosSupportStatus(phoneId, isVosSupported, listener);
+        }
+
+        @Override
+        public void sendVosActionInfo(int phoneId, VosActionInfo vosActionInfo,
+                IQtiImsExtListener listener) {
+            onSendVosActionInfo(phoneId, vosActionInfo, listener);
+        }
     };
 
     private QtiImsExtBinder mQtiImsExtBinder;
@@ -319,4 +336,14 @@
         // no-op
         return false;
     }
+
+    protected void onSendVosSupportStatus(int phoneId, boolean isVosSupported,
+            IQtiImsExtListener listener) {
+        // no-op
+    }
+
+    protected void onSendVosActionInfo(int phoneId, VosActionInfo vosActionInfo,
+            IQtiImsExtListener listener) {
+        // no-op
+    }
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java
index 0dac915..e0507fa 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtListenerBaseImpl.java
@@ -24,6 +24,10 @@
  * 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 
 package org.codeaurora.ims;
@@ -110,5 +114,13 @@
     @Override
     public void notifyDataChannelCapability(int phoneId, boolean dcCapability) {
     }
+
+    @Override
+    public void handleSendVosSupportStatusResponse(int phoneId, int result) {
+    }
+
+    @Override
+    public void handleSendVosActionInfoResponse(int phoneId, int result) {
+    }
 }
 
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 42eae0d..8e70265 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/QtiImsExtManager.java
@@ -24,6 +24,10 @@
  * 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 package org.codeaurora.ims;
 
@@ -451,4 +455,24 @@
             throw new QtiImsException("Remote ImsService isDataChannelEnabled: " + e);
         }
     }
+
+    public void sendVosSupportStatus(int phoneId, boolean isVosSupported,
+            IQtiImsExtListener listener) throws QtiImsException {
+        validateInvariants(phoneId);
+        try {
+            mQtiImsExt.sendVosSupportStatus(phoneId, isVosSupported, listener);
+        } catch (RemoteException e) {
+            throw new QtiImsException("Remote ImsService sendVosSupportStatus: " + e);
+        }
+    }
+
+    public void sendVosActionInfo(int phoneId, VosActionInfo vosActionInfo,
+            IQtiImsExtListener listener) throws QtiImsException {
+        validateInvariants(phoneId);
+        try {
+            mQtiImsExt.sendVosActionInfo(phoneId, vosActionInfo, listener);
+        } catch (RemoteException e) {
+            throw new QtiImsException("Remote ImsService sendVosActionInfo: " + e);
+        }
+    }
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.aidl
new file mode 100644
index 0000000..27fac40
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable VosActionInfo;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.java b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.java
new file mode 100644
index 0000000..18e3648
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosActionInfo.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.codeaurora.ims.VosMoveInfo;
+import org.codeaurora.ims.VosTouchInfo;
+
+/**
+ * Parcelable object to handle VosActionInfo info
+ * @hide
+ */
+
+public class VosActionInfo implements Parcelable {
+    public static final VosMoveInfo INVALID_MOVEINFO = null;
+    public static final VosTouchInfo INVALID_TOUCHINFO = null;
+
+    private VosMoveInfo mVosMoveInfo;
+    private VosTouchInfo mVosTouchInfo;
+
+    public VosActionInfo(VosMoveInfo vosMoveInfo, VosTouchInfo vosTouchInfo) {
+        mVosMoveInfo = vosMoveInfo;
+        mVosTouchInfo = vosTouchInfo;
+    }
+
+    public VosActionInfo(VosTouchInfo vosTouchInfo) {
+        this(INVALID_MOVEINFO, vosTouchInfo);
+    }
+
+    public VosActionInfo(VosMoveInfo vosMoveInfo) {
+        this(vosMoveInfo, INVALID_TOUCHINFO);
+    }
+
+    public VosActionInfo(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public VosMoveInfo getVosMoveInfo() {
+        return mVosMoveInfo;
+    }
+
+    public VosTouchInfo getVosTouchInfo() {
+        return mVosTouchInfo;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeParcelable(mVosMoveInfo, flag);
+        dest.writeParcelable(mVosTouchInfo, flag);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mVosMoveInfo = in.readParcelable(VosMoveInfo.class.getClassLoader());
+        mVosTouchInfo = in.readParcelable(VosTouchInfo.class.getClassLoader());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<VosActionInfo> CREATOR =
+            new Creator<VosActionInfo>() {
+        @Override
+        public VosActionInfo createFromParcel(Parcel in) {
+            return new VosActionInfo(in);
+        }
+
+        @Override
+        public VosActionInfo[] newArray(int size) {
+            return new VosActionInfo[size];
+        }
+    };
+
+    public String toString() {
+        return ("{VosActionInfo: " + "vosMoveInfo = " +
+                mVosMoveInfo + " , vosTouchInfo = " + mVosTouchInfo + "}");
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.aidl
new file mode 100644
index 0000000..db84d92
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable VosMoveInfo;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.java b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.java
new file mode 100644
index 0000000..ae4316a
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosMoveInfo.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.codeaurora.ims.Coordinate2D;
+
+/**
+ * Parcelable object to handle VosMoveInfo info
+ * @hide
+ */
+
+public class VosMoveInfo implements Parcelable {
+
+    private Coordinate2D mStart;
+    private Coordinate2D mEnd;
+
+    public VosMoveInfo(Coordinate2D start, Coordinate2D end) {
+        mStart = start;
+        mEnd = end;
+    }
+
+    public VosMoveInfo(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public Coordinate2D getStart() {
+        return mStart;
+    }
+
+    public Coordinate2D getEnd() {
+        return mEnd;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeParcelable(mStart, flag);
+        dest.writeParcelable(mEnd, flag);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mStart = in.readParcelable(Coordinate2D.class.getClassLoader());
+        mEnd = in.readParcelable(Coordinate2D.class.getClassLoader());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<VosMoveInfo> CREATOR =
+            new Creator<VosMoveInfo>() {
+        @Override
+        public VosMoveInfo createFromParcel(Parcel in) {
+            return new VosMoveInfo(in);
+        }
+
+        @Override
+        public VosMoveInfo[] newArray(int size) {
+            return new VosMoveInfo[size];
+        }
+    };
+
+    public String toString() {
+        return ("{VosMoveInfo: " + "start = " + mStart + " , end = " + mEnd + "}");
+    }
+}
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.aidl
new file mode 100644
index 0000000..1807cab
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.aidl
@@ -0,0 +1,8 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
+ */
+
+package org.codeaurora.ims;
+
+parcelable VosTouchInfo;
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.java b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.java
new file mode 100644
index 0000000..46e518c
--- /dev/null
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/VosTouchInfo.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.nd
+ */
+
+package org.codeaurora.ims;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import org.codeaurora.ims.Coordinate2D;
+
+/**
+ * Parcelable object to handle VosTouchInfo info
+ * @hide
+ */
+
+public class VosTouchInfo implements Parcelable {
+
+    private Coordinate2D mTouch;
+    // Milliseconds
+    private int mTouchDuration;
+
+    public VosTouchInfo(Coordinate2D touch, int touchDuration) {
+        mTouch = touch;
+        mTouchDuration = touchDuration;
+    }
+
+    public VosTouchInfo(Parcel in) {
+        readFromParcel(in);
+    }
+
+    public Coordinate2D getTouch() {
+        return mTouch;
+    }
+
+    public int getTouchDuration() {
+        return mTouchDuration;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flag) {
+        dest.writeParcelable(mTouch, flag);
+        dest.writeInt(mTouchDuration);
+    }
+
+    public void readFromParcel(Parcel in) {
+        mTouch = in.readParcelable(Coordinate2D.class.getClassLoader());
+        mTouchDuration = in.readInt();
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+
+    public static final Creator<VosTouchInfo> CREATOR =
+            new Creator<VosTouchInfo>() {
+        @Override
+        public VosTouchInfo createFromParcel(Parcel in) {
+            return new VosTouchInfo(in);
+        }
+
+        @Override
+        public VosTouchInfo[] newArray(int size) {
+            return new VosTouchInfo[size];
+        }
+    };
+
+    public String toString() {
+        return ("{VosTouchInfo: " + "touch = " +
+                mTouch + " , touchDuration = " + mTouchDuration + "}");
+    }
+}
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 8e960a2..12caa31 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
@@ -24,6 +24,10 @@
  * 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 
 package org.codeaurora.ims.internal;
@@ -33,6 +37,7 @@
 import org.codeaurora.ims.internal.IQtiImsExtListener;
 import org.codeaurora.ims.internal.IImsMultiIdentityInterface;
 import org.codeaurora.ims.internal.IImsScreenShareController;
+import org.codeaurora.ims.VosActionInfo;
 
 /**
  * Interface through which APP and vendor communicates.
@@ -362,4 +367,28 @@
      *@throws RemoteException if calling the IMS service results in an error.
      */
     boolean isDataChannelEnabled(int phoneId);
+
+    /**
+     * sendVosSupportStatus
+     * Send video online service status supported
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param isVosSupported sends whether device supports video online service to lower layer
+     * @param listener an IQtiImsExtListener instance to indicate the response
+     * @return void
+     */
+    oneway void sendVosSupportStatus(int phoneId, boolean isVosSupported,
+        IQtiImsExtListener listener);
+
+    /**
+     * sendVosActionInfo
+     * Send user's action info like touch or move
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param vosActionInfo sends user's touch or move info to lower layer
+     * @param listener an IQtiImsExtListener instance to indicate the response
+     * @return void
+     */
+    oneway void sendVosActionInfo(int phoneId, in VosActionInfo vosActionInfo,
+        IQtiImsExtListener listener);
 }
diff --git a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl
index 3d3c73c..55f7359 100644
--- a/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl
+++ b/ims/ims-ext-common/src/org/codeaurora/ims/internal/IQtiImsExtListener.aidl
@@ -24,6 +24,10 @@
  * 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.
+ *
+ * Changes from Qualcomm Innovation Center are provided under the following license:
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * SPDX-License-Identifier: BSD-3-Clause-Clear.
  */
 
 package org.codeaurora.ims.internal;
@@ -205,4 +209,24 @@
      * @return void.
      */
    void notifyDataChannelCapability(int phoneId, boolean dcCapability);
+
+    /**
+     * Notifies client the result of send vos support status
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param <result> is one of the values QTI_IMS_REQUEST_*, as defined in
+     *        <code>org.codeaurora.ims.utils.QtiImsExtUtils.</code>
+     * @return void.
+     */
+    void handleSendVosSupportStatusResponse(int phoneId, int result);
+
+    /**
+     * Notifies client the result of send vos action info
+     *
+     * @param phoneId indicates the phone instance which triggered the request
+     * @param <result> is one of the values QTI_IMS_REQUEST_*, as defined in
+     *        <code>org.codeaurora.ims.utils.QtiImsExtUtils.</code>
+     * @return void.
+     */
+    void handleSendVosActionInfoResponse(int phoneId, int result);
 }
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 eff1fad..cf5d2a5 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
@@ -28,7 +28,7 @@
  *
  * Changes from Qualcomm Innovation Center are provided under the following license:
  *
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted (subject to the limitations in the
@@ -854,4 +854,10 @@
                 QtiCallConstants.DATA_CHANNEL + phoneId,
                 QtiCallConstants.DATA_CHANNEL_DISABLED);
     }
+
+    // Returns true if Carrier supports video online service
+    public static boolean isVosSupported(int phoneId, Context context) {
+        return isCarrierConfigEnabled(phoneId, context,
+                QtiCarrierConfigs.KEY_CARRIER_VIDEO_ONLINE_SERVICE_SUPPORTED);
+    }
 }
