diff --git a/acts/tests/google/tel/live/TelLiveVoiceTest.py b/acts/tests/google/tel/live/TelLiveVoiceTest.py
index a955cc6..90f3b43 100644
--- a/acts/tests/google/tel/live/TelLiveVoiceTest.py
+++ b/acts/tests/google/tel/live/TelLiveVoiceTest.py
@@ -42,6 +42,10 @@
 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_subscription_utils import \
+    get_incoming_voice_sub_id
+from acts.test_utils.tel.tel_subscription_utils import \
+    get_outgoing_voice_sub_id
 from acts.test_utils.tel.tel_test_utils import call_setup_teardown
 from acts.test_utils.tel.tel_test_utils import \
     call_voicemail_erase_all_pending_voicemail
@@ -50,6 +54,7 @@
 from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected
 from acts.test_utils.tel.tel_test_utils import get_phone_number
 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_droid_in_rat_family
 from acts.test_utils.tel.tel_test_utils import multithread_func
 from acts.test_utils.tel.tel_test_utils import num_active_calls
@@ -60,6 +65,7 @@
 from acts.test_utils.tel.tel_test_utils import setup_sim
 from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode
 from acts.test_utils.tel.tel_test_utils import verify_incall_state
+from acts.test_utils.tel.tel_test_utils import wait_for_ringing_call
 from acts.test_utils.tel.tel_test_utils import wait_for_not_network_rat
 from acts.test_utils.tel.tel_test_utils import WifiUtils
 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_1x
@@ -88,7 +94,8 @@
 from acts.test_utils.tel.tel_voice_utils import two_phone_call_long_seq
 from acts.test_utils.tel.tel_voice_utils import two_phone_call_short_seq
 
-DEFAULT_LONG_DURATION_CALL_TOTAL_DURATION = 1 * 60 * 60 # default value 1 hour
+DEFAULT_LONG_DURATION_CALL_TOTAL_DURATION = 1 * 60 * 60  # default value 1 hour
+
 
 class TelLiveVoiceTest(TelephonyBaseTest):
     def __init__(self, controllers):
@@ -183,8 +190,7 @@
             # long duration voice call (to measure drop rate)
             "test_call_long_duration_volte",
             "test_call_long_duration_wfc",
-            "test_call_long_duration_3g"
-            )
+            "test_call_long_duration_3g")
 
         self.stress_test_number = int(self.user_params["stress_test_number"])
         self.wifi_network_ssid = self.user_params["wifi_network_ssid"]
@@ -222,8 +228,8 @@
             self.log.error("Phone Failed to Set Up Properly.")
             return False
 
-        return two_phone_call_short_seq(
-            self.log, ads[0], None, None, ads[1], None, None)
+        return two_phone_call_short_seq(self.log, ads[0], None, None, ads[1],
+                                        None, None)
 
     @TelephonyBaseTest.tel_test_wrap
     def test_call_mt_voice_general(self):
@@ -245,8 +251,8 @@
             self.log.error("Phone Failed to Set Up Properly.")
             return False
 
-        return two_phone_call_short_seq(
-            self.log, ads[1], None, None, ads[0], None, None)
+        return two_phone_call_short_seq(self.log, ads[1], None, None, ads[0],
+                                        None, None)
 
     @TelephonyBaseTest.tel_test_wrap
     def test_call_volte_to_volte(self):
@@ -529,8 +535,8 @@
         """
         ads = self.android_devices
 
-        tasks = [(phone_setup_volte, (self.log, ads[0])), (phone_setup_voice_3g,
-                                                           (self.log, ads[1]))]
+        tasks = [(phone_setup_volte, (self.log, ads[0])),
+                 (phone_setup_voice_3g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -559,8 +565,8 @@
             self.log.error("PhoneB not cdma phone, can not 3g 1x. Stop test.")
             return False
 
-        tasks = [(phone_setup_volte, (self.log, ads[0])), (phone_setup_voice_3g,
-                                                           (self.log, ads[1]))]
+        tasks = [(phone_setup_volte, (self.log, ads[0])),
+                 (phone_setup_voice_3g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -590,8 +596,8 @@
                 "PhoneB not gsm phone, can not 3g wcdma. Stop test.")
             return False
 
-        tasks = [(phone_setup_volte, (self.log, ads[0])), (phone_setup_voice_3g,
-                                                           (self.log, ads[1]))]
+        tasks = [(phone_setup_volte, (self.log, ads[0])),
+                 (phone_setup_voice_3g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -614,8 +620,8 @@
         """
         ads = self.android_devices
 
-        tasks = [(phone_setup_volte, (self.log, ads[0])), (phone_setup_voice_2g,
-                                                           (self.log, ads[1]))]
+        tasks = [(phone_setup_volte, (self.log, ads[0])),
+                 (phone_setup_voice_2g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -706,8 +712,9 @@
             True if pass; False if fail.
         """
         ads = [self.android_devices[0], self.android_devices[1]]
-        tasks = [(phone_setup_iwlan_cellular_preferred, (
-            self.log, ads[0], self.wifi_network_ssid, self.wifi_network_pass)),
+        tasks = [(phone_setup_iwlan_cellular_preferred,
+                  (self.log, ads[0], self.wifi_network_ssid,
+                   self.wifi_network_pass)),
                  (phone_setup_iwlan_cellular_preferred,
                   (self.log, ads[1], self.wifi_network_ssid,
                    self.wifi_network_pass))]
@@ -1121,8 +1128,8 @@
         """
         ads = self.android_devices
 
-        tasks = [(phone_setup_voice_3g, (self.log, ads[0])), (phone_setup_voice_3g,
-                                                        (self.log, ads[1]))]
+        tasks = [(phone_setup_voice_3g, (self.log, ads[0])),
+                 (phone_setup_voice_3g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -1324,8 +1331,8 @@
         """
         ads = self.android_devices
 
-        tasks = [(phone_setup_voice_3g, (self.log, ads[0])), (phone_setup_voice_3g,
-                                                        (self.log, ads[1]))]
+        tasks = [(phone_setup_voice_3g, (self.log, ads[0])),
+                 (phone_setup_voice_3g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -1692,8 +1699,8 @@
         MINIMUM_SUCCESS_RATE = .95
         ads = self.android_devices
 
-        tasks = [(phone_setup_voice_3g, (self.log, ads[0])), (phone_setup_voice_3g,
-                                                        (self.log, ads[1]))]
+        tasks = [(phone_setup_voice_3g, (self.log, ads[0])),
+                 (phone_setup_voice_3g, (self.log, ads[1]))]
         if not multithread_func(self.log, tasks):
             self.log.error("Phone Failed to Set Up Properly.")
             return False
@@ -2771,14 +2778,16 @@
 
         return True
 
-    def _test_call_long_duration(self, dut_incall_check_func,
-                                 total_duration):
+    def _test_call_long_duration(self, dut_incall_check_func, total_duration):
         ads = self.android_devices
-        self.log.info("Long Duration Call Test. Total duration = {}".
-            format(total_duration))
-        return call_setup_teardown(self.log, ads[0], ads[1], ads[0],
-            verify_caller_func=dut_incall_check_func,
-            wait_time_in_call=total_duration)
+        self.log.info("Long Duration Call Test. Total duration = {}".format(
+            total_duration))
+        return call_setup_teardown(self.log,
+                                   ads[0],
+                                   ads[1],
+                                   ads[0],
+                                   verify_caller_func=dut_incall_check_func,
+                                   wait_time_in_call=total_duration)
 
     @TelephonyBaseTest.tel_test_wrap
     def test_call_long_duration_volte(self):
@@ -2804,8 +2813,8 @@
             self.log.error("Phone Failed to Set Up Properly.")
             return False
 
-        return self._test_call_long_duration(is_phone_in_call_volte,
-            self.long_duration_call_total_duration)
+        return self._test_call_long_duration(
+            is_phone_in_call_volte, self.long_duration_call_total_duration)
 
     @TelephonyBaseTest.tel_test_wrap
     def test_call_long_duration_wfc(self):
@@ -2833,8 +2842,8 @@
             self.log.error("Phone Failed to Set Up Properly.")
             return False
 
-        return self._test_call_long_duration(is_phone_in_call_iwlan,
-            self.long_duration_call_total_duration)
+        return self._test_call_long_duration(
+            is_phone_in_call_iwlan, self.long_duration_call_total_duration)
 
     @TelephonyBaseTest.tel_test_wrap
     def test_call_long_duration_3g(self):
@@ -2860,6 +2869,81 @@
             self.log.error("Phone Failed to Set Up Properly.")
             return False
 
-        return self._test_call_long_duration(is_phone_in_call_3g,
-            self.long_duration_call_total_duration)
+        return self._test_call_long_duration(
+            is_phone_in_call_3g, self.long_duration_call_total_duration)
+
+    def _test_call_hangup_while_ringing(self, ad_caller, ad_callee):
+        """ Call a phone and verify ringing, then hangup from the originator
+
+        1. Setup PhoneA and PhoneB to ensure voice service.
+        2. Call from PhoneA to PhoneB and wait for ringing.
+        3. End the call on PhoneA.
+
+        Returns:
+            True if pass; False if fail.
+        """
+
+        caller_number = ad_caller.cfg['subscription'][
+            get_outgoing_voice_sub_id(ad_caller)]['phone_num']
+        callee_number = ad_callee.cfg['subscription'][
+            get_incoming_voice_sub_id(ad_callee)]['phone_num']
+
+        tasks = [(phone_setup_voice_general, (self.log, ad_caller)),
+                 (phone_setup_voice_general, (self.log, ad_callee))]
+        if not multithread_func(self.log, tasks):
+            self.log.error("Phone Failed to Set Up Properly.")
+            return False
+
+        ad_caller.droid.telecomCallClearCallList()
+        if num_active_calls(self.log, ad_caller) != 0:
+            self.log.error("Phone {} has ongoing calls.".format(
+                ad_caller.serial))
+            return False
+
+        if not initiate_call(self.log, ad_caller, callee_number):
+            self.log.error("Phone was {} unable to initate a call".format(ads[
+                0].serial))
+            return False
+
+        if not wait_for_ringing_call(self.log, ad_callee, caller_number):
+            self.log.error("Phone {} never rang.".format(ad_callee.serial))
+            return False
+
+        if not hangup_call(self.log, ad_caller):
+            self.log.error("Unable to hang up the call")
+            return False
+
+        return True
+
+    @TelephonyBaseTest.tel_test_wrap
+    def test_call_mo_hangup_while_ringing(self):
+        """ Call a phone and verify ringing, then hangup from the originator
+
+        1. Setup PhoneA and PhoneB to ensure voice service.
+        2. Call from PhoneA to PhoneB and wait for ringing.
+        3. End the call on PhoneA.
+
+        Returns:
+            True if pass; False if fail.
+        """
+
+        return self._test_call_hangup_while_ringing(self.android_devices[0],
+                                                    self.android_devices[1])
+
+    @TelephonyBaseTest.tel_test_wrap
+    def test_call_mt_hangup_while_ringing(self):
+        """ Call a phone and verify ringing, then hangup from the originator
+
+        1. Setup PhoneA and PhoneB to ensure voice service.
+        2. Call from PhoneB to PhoneA and wait for ringing.
+        3. End the call on PhoneB.
+
+        Returns:
+            True if pass; False if fail.
+        """
+
+        return self._test_call_hangup_while_ringing(self.android_devices[1],
+                                                    self.android_devices[0])
+
+
 """ Tests End """
