diff --git a/acts/framework/acts/test_utils/tel/TelephonyBaseTest.py b/acts/framework/acts/test_utils/tel/TelephonyBaseTest.py
index 9cebbee..ad2bfcb 100644
--- a/acts/framework/acts/test_utils/tel/TelephonyBaseTest.py
+++ b/acts/framework/acts/test_utils/tel/TelephonyBaseTest.py
@@ -34,6 +34,8 @@
 
 from acts.test_utils.tel.tel_subscription_utils import \
     initial_set_up_for_subid_infomation
+from acts.test_utils.tel.tel_subscription_utils import \
+    set_default_sub_for_all_services
 from acts.test_utils.tel.tel_test_utils import build_id_override
 from acts.test_utils.tel.tel_test_utils import disable_qxdm_logger
 from acts.test_utils.tel.tel_test_utils import enable_connectivity_metrics
@@ -72,6 +74,7 @@
 from acts.test_utils.tel.tel_test_utils import activate_google_fi_account
 from acts.test_utils.tel.tel_test_utils import check_google_fi_activated
 from acts.test_utils.tel.tel_test_utils import check_fi_apk_installed
+from acts.test_utils.tel.tel_test_utils import phone_switch_to_msim_mode
 from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_BACKGROUND
 from acts.test_utils.tel.tel_defines import SINGLE_SIM_CONFIG, MULTI_SIM_CONFIG
 from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_FOREGROUND
@@ -264,6 +267,16 @@
                 if not activate_google_fi_account(ad):
                     return False
                 check_google_fi_activated(ad)
+            if hasattr(ad, "dsds"):
+                sim_mode = ad.droid.telephonyGetPhoneCount()
+                if sim_mode == 1:
+                    ad.log.info("Phone in Single SIM Mode")
+                    if not phone_switch_to_msim_mode(ad):
+                        ad.log.error("Failed to switch to Dual SIM Mode")
+                        return False
+                elif sim_mode == 2:
+                    ad.log.info("Phone already in Dual SIM Mode")
+                set_default_sub_for_all_services(ad)
         if get_sim_state(ad) in (SIM_STATE_ABSENT, SIM_STATE_UNKNOWN):
             ad.log.info("Device has no or unknown SIM in it")
             ensure_phone_idle(self.log, ad)
diff --git a/acts/framework/acts/test_utils/tel/tel_defines.py b/acts/framework/acts/test_utils/tel/tel_defines.py
index 7fa5aa3..d409ec0 100644
--- a/acts/framework/acts/test_utils/tel/tel_defines.py
+++ b/acts/framework/acts/test_utils/tel/tel_defines.py
@@ -119,7 +119,7 @@
 
 # Time to wait after call setup before declaring
 # that the call is actually successful
-WAIT_TIME_IN_CALL = 15
+WAIT_TIME_IN_CALL = 30
 
 # (For IMS, e.g. VoLTE-VoLTE, WFC-WFC, VoLTE-WFC test only)
 # Time to wait after call setup before declaring
diff --git a/acts/framework/acts/test_utils/tel/tel_subscription_utils.py b/acts/framework/acts/test_utils/tel/tel_subscription_utils.py
index d4dd106..6007854 100644
--- a/acts/framework/acts/test_utils/tel/tel_subscription_utils.py
+++ b/acts/framework/acts/test_utils/tel/tel_subscription_utils.py
@@ -214,3 +214,37 @@
     ad.droid.telecomSetUserSelectedOutgoingPhoneAccountBySubId(sub_id)
     if hasattr(ad, "outgoing_voice_sub_id"):
         ad.outgoing_voice_sub_id = sub_id
+
+
+def set_incoming_voice_sub_id(ad, sub_id):
+    """Set default subId for voice calls
+
+    Args:
+        ad: android device object.
+        sub_id: subscription id (integer)
+
+    Returns:
+        None
+    """
+    ad.droid.subscriptionSetDefaultVoiceSubId(sub_id)
+    if hasattr(ad, "incoming_voice_sub_id"):
+        ad.incoming_voice_sub_id = sub_id
+
+
+def set_default_sub_for_all_services(ad, slot_id=0):
+    """Set subId for all services
+
+    Args:
+        ad: android device object.
+        slot_id: 0 or 1 (integer)
+
+    Returns:
+        None
+    """
+    sub_id = get_subid_from_slot_index(ad.log, ad, slot_id)
+    ad.log.info("Subid is %s", sub_id)
+    set_subid_for_outgoing_call(ad, sub_id)
+    set_incoming_voice_sub_id(ad, sub_id)
+    set_subid_for_data(ad, sub_id)
+    set_subid_for_message(ad, sub_id)
+    ad.droid.telephonyToggleDataConnection(True)
diff --git a/acts/framework/acts/test_utils/tel/tel_test_utils.py b/acts/framework/acts/test_utils/tel/tel_test_utils.py
index 9ac4069..7bd9e42 100644
--- a/acts/framework/acts/test_utils/tel/tel_test_utils.py
+++ b/acts/framework/acts/test_utils/tel/tel_test_utils.py
@@ -3071,6 +3071,12 @@
 
 def phone_switch_to_msim_mode(ad, retries=3, timeout=60):
     result = False
+    if not ad.is_apk_installed("com.google.mdstest"):
+        raise signals.TestSkipClass("mdstest is not installed")
+    mode = ad.droid.telephonyGetPhoneCount()
+    if mode == 2:
+        ad.log.info("Device already in MSIM mode")
+        return True
     for i in range(retries):
         ad.adb.shell(
         "setprop persist.vendor.sys.modem.diag.mdlog false", ignore_status=True)
@@ -3087,8 +3093,8 @@
         ad.adb.shell("setprop persist.radio.multisim.config dsds")
         reboot_device(ad)
         # Verify if device is really in msim mode
-        rat = ad.adb.getprop("gsm.network.type")
-        if "," in rat:
+        mode = ad.droid.telephonyGetPhoneCount()
+        if mode == 2:
             ad.log.info("Device correctly switched to MSIM mode")
             result = True
             break
@@ -3099,6 +3105,12 @@
 
 def phone_switch_to_ssim_mode(ad, retries=3, timeout=30):
     result = False
+    if not ad.is_apk_installed("com.google.mdstest"):
+        raise signals.TestSkipClass("mdstest is not installed")
+    mode = ad.droid.telephonyGetPhoneCount()
+    if mode == 1:
+        ad.log.info("Device already in SSIM mode")
+        return True
     for i in range(retries):
         ad.adb.shell(
         "setprop persist.vendor.sys.modem.diag.mdlog false", ignore_status=True)
@@ -3120,8 +3132,8 @@
         ad.adb.shell("setprop persist.radio.multisim.config ssss")
         reboot_device(ad)
         # Verify if device is really in ssim mode
-        rat = ad.adb.getprop("gsm.network.type")
-        if "," not in rat:
+        mode = ad.droid.telephonyGetPhoneCount()
+        if mode == 1:
             ad.log.info("Device correctly switched to SSIM mode")
             result = True
             break
@@ -4966,6 +4978,10 @@
                                            network_preference):
         return False
 
+    if hasattr(ad, "dsds") and voice_or_data == "data" and sub_id != get_default_data_sub_id(ad):
+        ad.log.info("MSIM - Non DDS, ignore data RAT")
+        return True
+
     if is_droid_in_network_generation_for_subscription(
             log, ad, sub_id, generation, voice_or_data):
         return True
diff --git a/acts/tests/google/tel/live/TelLiveDSDSVoiceTest.py b/acts/tests/google/tel/live/TelLiveDSDSVoiceTest.py
new file mode 100644
index 0000000..a44e723
--- /dev/null
+++ b/acts/tests/google/tel/live/TelLiveDSDSVoiceTest.py
@@ -0,0 +1,504 @@
+#!/usr/bin/env python3.4
+#
+#   Copyright 2019 - Google
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+"""
+    Test Script for DSDS devices
+"""
+
+import time
+from queue import Empty
+from acts.test_decorators import test_tracker_info
+from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
+from acts.test_utils.tel.tel_defines import DIRECTION_MOBILE_ORIGINATED
+from acts.test_utils.tel.tel_defines import DIRECTION_MOBILE_TERMINATED
+from acts.test_utils.tel.tel_defines import GEN_3G
+from acts.test_utils.tel.tel_defines import GEN_4G
+from acts.test_utils.tel.tel_defines import INVALID_WIFI_RSSI
+from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_CALL_DROP
+from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_NW_SELECTION
+from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_DATA
+from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_VOICE
+from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_BACKGROUND
+from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_FOREGROUND
+from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_RINGING
+from acts.test_utils.tel.tel_defines import RAT_LTE
+from acts.test_utils.tel.tel_defines import RAT_IWLAN
+from acts.test_utils.tel.tel_defines import RAT_WCDMA
+from acts.test_utils.tel.tel_defines import WAIT_TIME_BETWEEN_REG_AND_CALL
+from acts.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL
+from acts.test_utils.tel.tel_defines import WAIT_TIME_WIFI_RSSI_CALIBRATION_SCREEN_ON
+from acts.test_utils.tel.tel_defines import WAIT_TIME_WIFI_RSSI_CALIBRATION_WIFI_CONNECTED
+from acts.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED
+from acts.test_utils.tel.tel_defines import WFC_MODE_DISABLED
+from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_ONLY
+from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
+from acts.test_utils.tel.tel_defines import WIFI_WEAK_RSSI_VALUE
+from acts.test_utils.tel.tel_defines import EventNetworkCallback
+from acts.test_utils.tel.tel_defines import NetworkCallbackAvailable
+from acts.test_utils.tel.tel_defines import NetworkCallbackLost
+from acts.test_utils.tel.tel_defines import SignalStrengthContainer
+from acts.test_utils.tel.tel_test_utils import wifi_toggle_state
+from acts.test_utils.tel.tel_test_utils import ensure_network_generation
+from acts.test_utils.tel.tel_test_utils import ensure_phones_default_state
+from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected
+from acts.test_utils.tel.tel_test_utils import get_network_rat
+from acts.test_utils.tel.tel_test_utils import get_phone_number
+from acts.test_utils.tel.tel_test_utils import get_phone_number_for_subscription
+from acts.test_utils.tel.tel_test_utils import hangup_call
+from acts.test_utils.tel.tel_test_utils import initiate_call
+from acts.test_utils.tel.tel_test_utils import is_network_call_back_event_match
+from acts.test_utils.tel.tel_test_utils import is_phone_in_call
+from acts.test_utils.tel.tel_test_utils import is_phone_not_in_call
+from acts.test_utils.tel.tel_test_utils import set_wfc_mode
+from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode
+from acts.test_utils.tel.tel_test_utils import toggle_volte
+from acts.test_utils.tel.tel_test_utils import wait_and_answer_call
+from acts.test_utils.tel.tel_test_utils import wait_for_cell_data_connection
+from acts.test_utils.tel.tel_test_utils import wait_for_droid_not_in_call
+from acts.test_utils.tel.tel_test_utils import wait_for_wfc_disabled
+from acts.test_utils.tel.tel_test_utils import wait_for_wfc_enabled
+from acts.test_utils.tel.tel_test_utils import wait_for_wifi_data_connection
+from acts.test_utils.tel.tel_test_utils import verify_http_connection
+from acts.test_utils.tel.tel_test_utils import get_telephony_signal_strength
+from acts.test_utils.tel.tel_test_utils import get_wifi_signal_strength
+from acts.test_utils.tel.tel_test_utils import wait_for_state
+from acts.test_utils.tel.tel_test_utils import is_phone_in_call
+from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_3g
+from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_2g
+from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_csfb
+from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan
+from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_not_iwlan
+from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
+from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_general
+from acts.test_utils.tel.tel_voice_utils import phone_setup_volte
+from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_3g
+from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_2g
+from acts.test_utils.tel.tel_voice_utils import phone_idle_3g
+from acts.test_utils.tel.tel_voice_utils import phone_idle_2g
+from acts.test_utils.tel.tel_voice_utils import phone_idle_csfb
+from acts.test_utils.tel.tel_voice_utils import phone_idle_iwlan
+from acts.test_utils.tel.tel_voice_utils import phone_idle_not_iwlan
+from acts.test_utils.tel.tel_voice_utils import phone_idle_volte
+from acts.test_utils.tel.tel_subscription_utils import set_subid_for_outgoing_call
+from acts.test_utils.tel.tel_subscription_utils import set_incoming_voice_sub_id
+from acts.test_utils.tel.tel_subscription_utils import get_subid_from_slot_index
+
+
+DEFAULT_LONG_DURATION_CALL_TOTAL_DURATION = 1 * 60 * 60  # default value 1 hour
+DEFAULT_PING_DURATION = 120  # in seconds
+
+
+class TelLiveDSDSVoiceTest(TelephonyBaseTest):
+    def __init__(self, controllers):
+        TelephonyBaseTest.__init__(self, controllers)
+        self.number_of_devices = 2
+        self.stress_test_number = self.get_stress_test_number()
+
+
+    def _msim_call_sequence(self, ads, mo_mt, slot_id,
+                            msim_phone_setup_func,
+                            verify_msim_initial_idle_func,
+                            verify_msim_in_call_state_func,
+                            incall_msim_setting_check_func, expected_result):
+        """_msim_call_sequence
+
+        Args:
+            ads: list of android devices. This list should have 2 ad.
+            mo_mt: indicating this call sequence is MO or MT.
+                Valid input: DIRECTION_MOBILE_ORIGINATED and
+                DIRECTION_MOBILE_TERMINATED.
+            slot_id: either 0 or 1
+
+        Returns:
+            if expected_result is True,
+                Return True if call sequence finish without exception.
+            if expected_result is string,
+                Return True if expected exception happened. Otherwise False.
+
+        """
+
+        class _MSIMCallSequenceException(Exception):
+            pass
+
+        if (len(ads) != 2) or (mo_mt not in [
+                DIRECTION_MOBILE_ORIGINATED, DIRECTION_MOBILE_TERMINATED
+        ]):
+            self.log.error("Invalid parameters.")
+            return False
+
+        sub_id = get_subid_from_slot_index(ads[0].log, ads[0], slot_id)
+        if mo_mt == DIRECTION_MOBILE_ORIGINATED:
+            ad_caller = ads[0]
+            ad_callee = ads[1]
+            set_subid_for_outgoing_call(ads[0], sub_id)
+            caller_number = get_phone_number(self.log, ad_caller)
+            callee_number = get_phone_number(self.log, ad_callee)
+        else:
+            ad_caller = ads[1]
+            ad_callee = ads[0]
+            caller_number = get_phone_number(self.log, ad_caller)
+            callee_number = get_phone_number_for_subscription(ads[0].log,
+                                                          ads[0], sub_id)
+            setattr(ads[0], "incoming_voice_sub_id", sub_id)
+
+        self.log.info("-->Begin msim_call_sequence: %s to %s<--",
+                      caller_number, callee_number)
+
+        try:
+            # Setup
+            if msim_phone_setup_func and not msim_phone_setup_func():
+                raise _MSIMCallSequenceException("msim_phone_setup_func fail.")
+            if not phone_setup_voice_general(self.log, ads[1]):
+                raise _MSIMCallSequenceException(
+                    "phone_setup_voice_general fail.")
+            time.sleep(WAIT_TIME_BETWEEN_REG_AND_CALL)
+
+            # Ensure idle status correct
+            if verify_msim_initial_idle_func and not \
+                verify_msim_initial_idle_func():
+                raise _MSIMCallSequenceException(
+                    "verify_msim_initial_idle_func fail.")
+
+            # Make MO/MT call.
+            if not initiate_call(self.log, ad_caller, callee_number):
+                raise _MSIMCallSequenceException("initiate_call fail.")
+            if not wait_and_answer_call(self.log, ad_callee, caller_number):
+                raise _MSIMCallSequenceException("wait_and_answer_call fail.")
+            time.sleep(1)
+
+            # Check state, wait 30 seconds, check again.
+            if (verify_msim_in_call_state_func and not
+                    verify_msim_in_call_state_func()):
+                raise _MSIMCallSequenceException(
+                    "verify_msim_in_call_state_func fail.")
+
+            if is_phone_not_in_call(self.log, ads[1]):
+                raise _MSIMCallSequenceException("PhoneB not in call.")
+            time.sleep(WAIT_TIME_IN_CALL)
+
+            if (verify_msim_in_call_state_func and not
+                    verify_msim_in_call_state_func()):
+                raise _MSIMCallSequenceException(
+                    "verify_msim_in_call_state_func fail after 30 seconds.")
+            if is_phone_not_in_call(self.log, ads[1]):
+                raise _MSIMCallSequenceException(
+                    "PhoneB not in call after 30 seconds.")
+
+            # in call change setting and check
+            if (incall_msim_setting_check_func and not
+                    incall_msim_setting_check_func()):
+                raise _MSIMCallSequenceException(
+                    "incall_msim_setting_check_func fail.")
+
+            # Hangup call
+            if is_phone_in_call(self.log, ads[0]):
+                if not hangup_call(self.log, ads[0]):
+                    raise _MSIMCallSequenceException("hangup_call fail.")
+            else:
+                if incall_msim_setting_check_func is None:
+                    raise _MSIMCallSequenceException("Unexpected call drop.")
+
+        except _MSIMCallSequenceException as e:
+            if str(e) == expected_result:
+                self.log.info("Expected exception: <%s>, return True.", e)
+                return True
+            else:
+                self.log.info("Unexpected exception: <%s>, return False.", e)
+                return False
+
+        self.log.info("msim_call_sequence finished, return %s",
+                      expected_result is True)
+        return (expected_result is True)
+
+    def _phone_idle_iwlan(self):
+        return phone_idle_iwlan(self.log, self.android_devices[0])
+
+    def _phone_idle_not_iwlan(self):
+        return phone_idle_not_iwlan(self.log, self.android_devices[0])
+
+    def _phone_idle_volte(self):
+        return phone_idle_volte(self.log, self.android_devices[0])
+
+    def _phone_idle_csfb(self):
+        return phone_idle_csfb(self.log, self.android_devices[0])
+
+    def _phone_idle_3g(self):
+        return phone_idle_3g(self.log, self.android_devices[0])
+
+    def _phone_idle_2g(self):
+        return phone_idle_2g(self.log, self.android_devices[0])
+
+    def _is_phone_in_call_iwlan(self):
+        return is_phone_in_call_iwlan(self.log, self.android_devices[0])
+
+    def _is_phone_in_call_not_iwlan(self):
+        return is_phone_in_call_not_iwlan(self.log, self.android_devices[0])
+
+    def _is_phone_not_in_call(self):
+        if is_phone_in_call(self.log, self.android_devices[0]):
+            self.log.info("{} in call.".format(self.android_devices[0].serial))
+            return False
+        self.log.info("{} not in call.".format(self.android_devices[0].serial))
+        return True
+
+    def _is_phone_in_call_volte(self):
+        return is_phone_in_call_volte(self.log, self.android_devices[0])
+
+    def _is_phone_in_call_3g(self):
+        return is_phone_in_call_3g(self.log, self.android_devices[0])
+
+    def _is_phone_in_call_2g(self):
+        return is_phone_in_call_2g(self.log, self.android_devices[0])
+
+    def _is_phone_in_call_csfb(self):
+        return is_phone_in_call_csfb(self.log, self.android_devices[0])
+
+    def _is_phone_in_call(self):
+        return is_phone_in_call(self.log, self.android_devices[0])
+
+    def _phone_setup_voice_general(self):
+        return phone_setup_voice_general(self.log, self.android_devices[0])
+
+    def _phone_setup_volte(self):
+        return phone_setup_volte(self.log, self.android_devices[0])
+
+    def _phone_setup_3g(self):
+        return phone_setup_voice_3g(self.log, self.android_devices[0])
+
+    def _phone_setup_2g(self):
+        return phone_setup_voice_2g(self.log, self.android_devices[0])
+
+
+    """ Tests Begin """
+
+
+    @test_tracker_info(uuid="5a3ff3c0-5956-4b18-86a1-61ac60546330")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mo_to_ssim_voice_general(self):
+        """ Test MSIM to SSIM MO Voice General
+
+        Make Sure PhoneA Slot0 is attached to Voice
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneA to PhoneB, call should succeed
+        Make Sure PhoneA Slot1 is attached to Voice
+        Call from PhoneA to PhoneB, call should succeed
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mo_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 0,
+            self._phone_setup_voice_general, None, self._is_phone_in_call,
+            None, True)
+
+        mo_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 1,
+            self._phone_setup_voice_general, None, self._is_phone_in_call,
+            None, True)
+
+        self.log.info("MO Slot0: %s, MO Slot1: %s", mo_result_0, mo_result_1)
+        return ((mo_result_0 is True) and (mo_result_1 is True))
+
+
+    @test_tracker_info(uuid="5adc17d4-8258-42aa-82ab-0ef92ac7b660")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mt_to_ssim_voice_general(self):
+        """ Test SSIM to MSIM MT Voice General
+
+        Make Sure PhoneA Slot0 is attached to Voice
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneB to PhoneA, call should succeed
+        Make Sure PhoneA Slot1 is attached to Voice
+        Call from PhoneB to PhoneA, call should succeed
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mt_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 0,
+            self._phone_setup_voice_general, None, self._is_phone_in_call,
+            None, True)
+
+        mt_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 1,
+            self._phone_setup_voice_general, None, self._is_phone_in_call,
+            None, True)
+
+        self.log.info("MT Slot0: %s, MT Slot1: %s", mt_result_0, mt_result_1)
+        return ((mt_result_0 is True) and (mt_result_1 is True))
+
+
+    @test_tracker_info(uuid="3988e411-b9f8-4798-b3a6-dd3bf0d2035c")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mo_to_ssim_volte(self):
+        """ Test MSIM to SSIM MO VoLTE
+
+        Make Sure PhoneA Slot0 is on VoLTE
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneA to PhoneB, call should succeed on VoLTE
+        Make Sure PhoneA Slot1 is on VoLTE
+        Call from PhoneA to PhoneB, call should succeed on VoLTE
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mo_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 0, self._phone_setup_volte,
+            self._phone_idle_volte, self._is_phone_in_call_volte, None, True)
+
+        mo_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 1, self._phone_setup_volte,
+            self._phone_idle_volte, self._is_phone_in_call_volte, None, True)
+
+        self.log.info("MO Slot0: %s, MO Slot1: %s", mo_result_0, mo_result_1)
+        return ((mo_result_0 is True) and (mo_result_1 is True))
+
+
+    @test_tracker_info(uuid="4fe74a11-6f13-4305-becd-ad77e13a3193")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mt_to_ssim_volte(self):
+        """ Test SSIM to MSIM MT VoLTE
+
+        Make Sure PhoneA Slot0 is on VoLTE
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneB to PhoneA, call should succeed on VoLTE
+        Make Sure PhoneA Slot1 is on VoLTE
+        Call from PhoneB to PhoneA, call should succeed on VoLTE
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mt_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 0, self._phone_setup_volte,
+            self._phone_idle_volte, self._is_phone_in_call_volte, None, True)
+
+        mt_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 1, self._phone_setup_volte,
+            self._phone_idle_volte, self._is_phone_in_call_volte, None, True)
+
+        self.log.info("MT Slot0: %s, MT Slot1: %s", mt_result_0, mt_result_1)
+        return ((mt_result_0 is True) and (mt_result_1 is True))
+
+
+    @test_tracker_info(uuid="ffc7a414-8ec3-4bf4-a509-0bec59f2a3b9")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mo_to_ssim_3g(self):
+        """ Test MSIM to SSIM MO 3G
+
+        Make Sure PhoneA Slot0 is on 3G
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneA to PhoneB, call should succeed on 3G
+        Make Sure PhoneA Slot1 is on 3G
+        Call from PhoneA to PhoneB, call should succeed on 3G
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mo_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 0, self._phone_setup_3g,
+            self._phone_idle_3g, self._is_phone_in_call_3g, None, True)
+
+        mo_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 1, self._phone_setup_3g,
+            self._phone_idle_3g, self._is_phone_in_call_3g, None, True)
+
+        self.log.info("MO Slot0: %s, MO Slot1: %s", mo_result_0, mo_result_1)
+        return ((mo_result_0 is True) and (mo_result_1 is True))
+
+
+    @test_tracker_info(uuid="21221072-01f2-4951-ad55-fe1f4fe1b044")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mt_to_ssim_3g(self):
+        """ Test SSIM to MSIM MT 3G
+
+        Make Sure PhoneA Slot0 is on 3G
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneB to PhoneA, call should succeed on 3G
+        Make Sure PhoneA Slot1 is on 3G
+        Call from PhoneB to PhoneA, call should succeed on 3G
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mt_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 0, self._phone_setup_3g,
+            self._phone_idle_3g, self._is_phone_in_call_3g, None, True)
+
+        mt_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 1, self._phone_setup_3g,
+            self._phone_idle_3g, self._is_phone_in_call_3g, None, True)
+
+        self.log.info("MT Slot0: %s, MT Slot1: %s", mt_result_0, mt_result_1)
+        return ((mt_result_0 is True) and (mt_result_1 is True))
+
+
+    @test_tracker_info(uuid="65448385-42fe-429c-ad8e-6c75be93f83e")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mo_to_ssim_2g(self):
+        """ Test MSIM to SSIM MO 2G
+
+        Make Sure PhoneA Slot0 is on 2G
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneA to PhoneB, call should succeed on 2G
+        Make Sure PhoneA Slot1 is on 2G
+        Call from PhoneA to PhoneB, call should succeed on 2G
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mo_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 0, self._phone_setup_2g,
+            self._phone_idle_2g, self._is_phone_in_call_2g, None, True)
+
+        mo_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_ORIGINATED, 1, self._phone_setup_2g,
+            self._phone_idle_2g, self._is_phone_in_call_2g, None, True)
+
+        self.log.info("MO Slot0: %s, MO Slot1: %s", mo_result_0, mo_result_1)
+        return ((mo_result_0 is True) and (mo_result_1 is True))
+
+
+    @test_tracker_info(uuid="44d1ef0a-c981-4db1-958c-0af06eb0c503")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_mt_to_ssim_2g(self):
+        """ Test SSIM to MSIM MT 2G
+
+        Make Sure PhoneA Slot0 is on 2G
+        Make Sure PhoneB is able to make MO/MT call
+        Call from PhoneB to PhoneA, call should succeed on 2G
+        Make Sure PhoneA Slot1 is on 2G
+        Call from PhoneB to PhoneA, call should succeed on 2G
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = [self.android_devices[0], self.android_devices[1]]
+        mt_result_0 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 0, self._phone_setup_2g,
+            self._phone_idle_2g, self._is_phone_in_call_2g, None, True)
+
+        mt_result_1 = self._msim_call_sequence(
+            ads, DIRECTION_MOBILE_TERMINATED, 1, self._phone_setup_2g,
+            self._phone_idle_2g, self._is_phone_in_call_2g, None, True)
+
+        self.log.info("MT Slot0: %s, MT Slot1: %s", mt_result_0, mt_result_1)
+        return ((mt_result_0 is True) and (mt_result_1 is True))
