diff --git a/extphone/src/com/qti/extphone/ExtPhoneCallbackBase.java b/extphone/src/com/qti/extphone/ExtPhoneCallbackBase.java
index 934887b..791579c 100644
--- a/extphone/src/com/qti/extphone/ExtPhoneCallbackBase.java
+++ b/extphone/src/com/qti/extphone/ExtPhoneCallbackBase.java
@@ -165,4 +165,8 @@
             RemoteException {
         Log.d(TAG, "setSmartDdsSwitchToggleResponse: token = " + token +  " result = " + result);
     }
+
+    @Override
+    public void onImeiTypeChanged(QtiImeiInfo[] imeiInfo) throws RemoteException {
+    }
 }
diff --git a/extphone/src/com/qti/extphone/ExtTelephonyManager.java b/extphone/src/com/qti/extphone/ExtTelephonyManager.java
index b5a992c..9d74c74 100644
--- a/extphone/src/com/qti/extphone/ExtTelephonyManager.java
+++ b/extphone/src/com/qti/extphone/ExtTelephonyManager.java
@@ -754,6 +754,26 @@
         }
     }
 
+   /**
+    * To get the IMEI information of all slots on device.
+    * @return
+    *        QtiImeiInfo[], contains array of imeiInfo(i.e slotId, IMEI string and IMEI type).
+    *
+    * The calling application should not assume returned array index as slotId, instead the
+    * application has to use the slotId that present in QtiImeiInfo object to know the IMEI
+    * corresponds to a slot.
+    *
+    * Requires Permission: android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
+    */
+    public QtiImeiInfo[] getImeiInfo() {
+        try {
+            return mExtTelephonyService.getImeiInfo();
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "getImeiInfo ended in remote exception");
+            e.printStackTrace();
+        }
+        return null;
+    }
 
     public boolean isSmartDdsSwitchFeatureAvailable() throws RemoteException {
         try {
diff --git a/extphone/src/com/qti/extphone/IExtPhone.aidl b/extphone/src/com/qti/extphone/IExtPhone.aidl
index 0a0f20a..e5e901f 100644
--- a/extphone/src/com/qti/extphone/IExtPhone.aidl
+++ b/extphone/src/com/qti/extphone/IExtPhone.aidl
@@ -36,6 +36,7 @@
 import com.qti.extphone.IDepersoResCallback;
 import com.qti.extphone.IExtPhoneCallback;
 import com.qti.extphone.NrConfig;
+import com.qti.extphone.QtiImeiInfo;
 
 interface IExtPhone {
 
@@ -340,4 +341,12 @@
     void setSmartDdsSwitchToggle(boolean isEnabled, in Client client);
 
     boolean isFeatureSupported(int feature);
+
+   /**
+    * To get the IMEI information of all slots on device
+    * @return
+    *        QtiImeiInfo[], contains array imeiInfo(i.e slotId, IMEI string and type)
+    * Requires Permission: android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
+    */
+    QtiImeiInfo[] getImeiInfo();
 }
diff --git a/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl b/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
index 483c57b..5923db5 100644
--- a/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
+++ b/extphone/src/com/qti/extphone/IExtPhoneCallback.aidl
@@ -36,6 +36,7 @@
 import com.qti.extphone.NrIconType;
 import com.qti.extphone.QtiCallForwardInfo;
 import com.qti.extphone.QRadioResponseInfo;
+import com.qti.extphone.QtiImeiInfo;
 import com.qti.extphone.SignalStrength;
 import com.qti.extphone.SmsResult;
 import com.qti.extphone.Status;
@@ -167,4 +168,15 @@
     * @param - result SUCCESS/FAILURE based on the CnE HAL response
     */
     void setSmartDdsSwitchToggleResponse(in Token token, boolean result);
+
+   /**
+    * Indication would be sent whenever Primary IMEI mapping changes
+    * @param - imeiInfo, array of imeiInfo object which contains
+    *          slotId, IMEI string and type
+    *
+    * The calling application should not assume received array index as slotId, instead the
+    * application has to use the slotId that present in QtiImeiInfo object to know the IMEI
+    * corresponds to a slot.
+    */
+    void onImeiTypeChanged(in QtiImeiInfo[] imeiInfo);
 }
diff --git a/extphone/src/com/qti/extphone/QtiImeiInfo.aidl b/extphone/src/com/qti/extphone/QtiImeiInfo.aidl
new file mode 100644
index 0000000..cc66fe1
--- /dev/null
+++ b/extphone/src/com/qti/extphone/QtiImeiInfo.aidl
@@ -0,0 +1,32 @@
+/*
+ * 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 com.qti.extphone;
+
+parcelable QtiImeiInfo;
diff --git a/extphone/src/com/qti/extphone/QtiImeiInfo.java b/extphone/src/com/qti/extphone/QtiImeiInfo.java
new file mode 100644
index 0000000..5bfc78e
--- /dev/null
+++ b/extphone/src/com/qti/extphone/QtiImeiInfo.java
@@ -0,0 +1,114 @@
+/*
+ * 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 com.qti.extphone;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+public class QtiImeiInfo implements Parcelable {
+    private static final String TAG = "QtiImeiInfo";
+
+    public static final int IMEI_TYPE_INVALID = -1;
+    public static final int IMEI_TYPE_PRIMARY = 0;
+    public static final int IMEI_TYPE_SECONDARY = 1;
+
+    private int mSlotId;
+    private String mImei;
+    private int mImeiType;
+
+    public QtiImeiInfo(int slotId, String imei, int imeiType) {
+        mSlotId = slotId;
+        mImei = imei;
+        mImeiType = imeiType;
+    }
+
+    public QtiImeiInfo(Parcel in) {
+        mSlotId = in.readInt();
+        mImei = in.readString();
+        mImeiType = in.readInt();
+    }
+
+    public int getSlotId() {
+        return mSlotId;
+    }
+
+    public String getImei() {
+        return mImei;
+    }
+
+    public int getImeiType() {
+        return mImeiType;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeInt(mSlotId);
+        out.writeString(mImei);
+        out.writeInt(mImeiType);
+    }
+
+    public static final Parcelable.Creator<QtiImeiInfo> CREATOR = new Parcelable.Creator() {
+        public QtiImeiInfo createFromParcel(Parcel in) {
+            return new QtiImeiInfo(in);
+        }
+
+        public QtiImeiInfo[] newArray(int size) {
+            return new QtiImeiInfo[size];
+        }
+    };
+
+    public void readFromParcel(Parcel in) {
+        mSlotId = in.readInt();
+        mImei = in.readString();
+        mImeiType = in.readInt();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QtiImeiInfo imeiInfo = (QtiImeiInfo) o;
+
+        return this.mSlotId == imeiInfo.mSlotId &&
+                this.mImeiType == imeiInfo.mImeiType &&
+                Objects.equals(this.mImei, imeiInfo.mImei);
+    }
+
+    @Override
+    public String toString() {
+        return "QtiImeiInfo{" + " slotId=" + mSlotId + " mImeiType=" + getImeiType() +  "}";
+    }
+}
