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 b52efde..b6c0002 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
@@ -553,4 +553,7 @@
     // Data Channel call information
     public static final String EXTRA_DATA_CHANNEL_MODEM_CALL_ID = "modemCallId";
     public static final String EXTRA_IS_DATA_CHANNEL_CALL = "isDcCall";
+
+    // Video online service
+    public static final String EXTRA_VIDEO_ONLINE_SERVICE_SUPPORTED = "isVosSupported";
 }
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 6f482ee..cb7505a 100755
--- 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
@@ -846,4 +846,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);
+    }
 }
