Merge "Revert "Enhance test environment""
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 0e638ac..a9a2123 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,11 +1,10 @@
 [Hook Scripts]
 yapf_hook = ./tools/yapf_checker.py
+proto_check = ./tools/proto_check.py
 create_virtualenv = ./tools/create_virtualenv.sh
 acts_unittests = /tmp/acts_preupload_virtualenv/bin/python3 ./acts/tests/meta/ActsUnitTest.py
 destroy_virtualenv = rm -rf /tmp/acts_preupload_virtualenv/
 
-proto_check = ./tools/proto_check.py
-
 [Builtin Hooks]
 commit_msg_bug_field = true
 jsonlint = true
diff --git a/acts/framework/acts/bin/act.py b/acts/framework/acts/bin/act.py
index fd86c0c..72cb0c3 100755
--- a/acts/framework/acts/bin/act.py
+++ b/acts/framework/acts/bin/act.py
@@ -15,6 +15,7 @@
 #   limitations under the License.
 
 import argparse
+import os
 import re
 import signal
 import sys
@@ -211,12 +212,16 @@
             ti_key = keys.Config.key_test_case_iterations.value
             test_run_config.user_params[ti_key] = args.test_case_iterations
 
+        # Sets the --testpaths flag to the default test directory if left unset.
+        testpath_key = keys.Config.key_test_paths.value
+        if (testpath_key not in test_run_config.controller_configs
+                or test_run_config.controller_configs[testpath_key] is None):
+            test_run_config.controller_configs[testpath_key] = utils.abs_path(
+                utils.os.path.join(os.path.dirname(__file__),
+                                   '../../../tests/'))
+
         # TODO(markdr): Find a way to merge this with the validation done in
         # Mobly's load_test_config_file.
-        if (keys.Config.key_test_paths.value not in
-                test_run_config.controller_configs):
-            raise ActsConfigError("Required key %s missing in test config." %
-                                  keys.Config.key_test_paths.value)
         if not test_run_config.log_path:
             raise ActsConfigError("Required key %s missing in test config." %
                                   keys.Config.key_log_path.value)
diff --git a/acts/framework/acts/config_parser.py b/acts/framework/acts/config_parser.py
index 8942baa..549ebed 100755
--- a/acts/framework/acts/config_parser.py
+++ b/acts/framework/acts/config_parser.py
@@ -241,11 +241,9 @@
         test_run_config.testbed_name = testbed[
             keys.Config.key_testbed_name.value]
         test_run_config.controller_configs = testbed
-        if keys.Config.key_test_paths.value in configs:
-            test_run_config.controller_configs[
-                keys.Config.key_test_paths.value] = configs[
-                    keys.Config.key_test_paths.value]
-
+        test_run_config.controller_configs[
+            keys.Config.key_test_paths.value] = configs.get(
+                keys.Config.key_test_paths.value, None)
         test_run_config.log_path = configs.get(keys.Config.key_log_path.value,
                                                None)
         if test_run_config.log_path is not None:
diff --git a/acts/framework/acts/controllers/access_point.py b/acts/framework/acts/controllers/access_point.py
index 4b89de6..38db6a7 100755
--- a/acts/framework/acts/controllers/access_point.py
+++ b/acts/framework/acts/controllers/access_point.py
@@ -150,6 +150,7 @@
         self.lan = self.interfaces.get_lan_interface()
         self.__initial_ap()
         self.scapy_install_path = None
+        self.setup_bridge = False
 
     def __initial_ap(self):
         """Initial AP interfaces.
@@ -179,7 +180,10 @@
                 self.ssh.run(BRIDGE_DOWN)
                 self.ssh.run(BRIDGE_DEL)
 
-    def start_ap(self, hostapd_config, additional_parameters=None):
+    def start_ap(self,
+                 hostapd_config,
+                 setup_bridge=False,
+                 additional_parameters=None):
         """Starts as an ap using a set of configurations.
 
         This will start an ap on this host. To start an ap the controller
@@ -190,11 +194,13 @@
 
         Args:
             hostapd_config: hostapd_config.HostapdConfig, The configurations
-                            to use when starting up the ap.
+                to use when starting up the ap.
+            setup_bridge: Whether to bridge the LAN interface WLAN interface.
+                Only one WLAN interface can be bridged with the LAN interface
+                and none of the guest networks can be bridged.
             additional_parameters: A dictionary of parameters that can sent
-                                   directly into the hostapd config file.  This
-                                   can be used for debugging and or adding one
-                                   off parameters into the config.
+                directly into the hostapd config file.  This can be used for
+                debugging and or adding one off parameters into the config.
 
         Returns:
             An identifier for each ssid being started. These identifiers can be
@@ -203,7 +209,6 @@
         Raises:
             Error: When the ap can't be brought up.
         """
-
         if hostapd_config.frequency < 5000:
             interface = self.wlan_2g
             subnet = self._AP_2G_SUBNET
@@ -275,7 +280,12 @@
         # the server will come up.
         interface_ip = ipaddress.ip_interface(
             '%s/%s' % (subnet.router, subnet.network.netmask))
-        self._ip_cmd.set_ipv4_address(interface, interface_ip)
+        if setup_bridge is True:
+            bridge_interface_name = 'br_lan'
+            self.create_bridge(bridge_interface_name, [interface, self.lan])
+            self._ip_cmd.set_ipv4_address(bridge_interface_name, interface_ip)
+        else:
+            self._ip_cmd.set_ipv4_address(interface, interface_ip)
         if hostapd_config.bss_lookup:
             # This loop goes through each interface that was setup for
             # hostapd and assigns the DHCP scopes that were defined but
@@ -442,6 +452,13 @@
         del self._aps[identifier]
         if configured_subnets:
             self.start_dhcp(subnets=configured_subnets)
+        bridge_interfaces = self.interfaces.get_bridge_interface()
+        if bridge_interfaces:
+            for iface in bridge_interfaces:
+                BRIDGE_DOWN = 'ifconfig {} down'.format(iface)
+                BRIDGE_DEL = 'brctl delbr {}'.format(iface)
+                self.ssh.run(BRIDGE_DOWN)
+                self.ssh.run(BRIDGE_DEL)
 
     def stop_all_aps(self):
         """Stops all running aps on this device."""
diff --git a/acts/framework/acts/controllers/ap_lib/hostapd_config.py b/acts/framework/acts/controllers/ap_lib/hostapd_config.py
index a6d71c2..47afb2e 100644
--- a/acts/framework/acts/controllers/ap_lib/hostapd_config.py
+++ b/acts/framework/acts/controllers/ap_lib/hostapd_config.py
@@ -463,11 +463,13 @@
                 logging.warning(
                     'No channel bandwidth specified.  Using 80MHz for 11ac.')
                 self._vht_oper_chwidth = 1
-            if not vht_channel_width == 20 and vht_center_channel is None:
+            if vht_center_channel is not None:
+                self._vht_oper_centr_freq_seg0_idx = vht_center_channel
+            elif vht_channel_width == 20:
+                self._vht_oper_centr_freq_seg0_idx = channel
+            else:
                 self._vht_oper_centr_freq_seg0_idx = self._get_11ac_center_channel_from_channel(
                     self.channel)
-            else:
-                self._vht_oper_centr_freq_seg0_idx = vht_center_channel
             self._ac_capabilities = set(ac_capabilities)
         self._beacon_footer = beacon_footer
         self._spectrum_mgmt_required = spectrum_mgmt_required
diff --git a/acts/framework/acts/controllers/ap_lib/hostapd_constants.py b/acts/framework/acts/controllers/ap_lib/hostapd_constants.py
index 7f70dfe..588fbc2 100755
--- a/acts/framework/acts/controllers/ap_lib/hostapd_constants.py
+++ b/acts/framework/acts/controllers/ap_lib/hostapd_constants.py
@@ -270,11 +270,11 @@
 HT40_ALLOW_MAP = {
     N_CAPABILITY_HT40_MINUS_CHANNELS:
     tuple(
-        itertools.chain(range(6, 14), range(40, 65, 8), range(104, 137, 8),
+        itertools.chain(range(6, 14), range(40, 65, 8), range(104, 145, 8),
                         [153, 161])),
     N_CAPABILITY_HT40_PLUS_CHANNELS:
     tuple(
-        itertools.chain(range(1, 8), range(36, 61, 8), range(100, 133, 8),
+        itertools.chain(range(1, 8), range(36, 61, 8), range(100, 141, 8),
                         [149, 157]))
 }
 
diff --git a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/asus.py b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/asus.py
index af489d6..bb13118 100644
--- a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/asus.py
+++ b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/asus.py
@@ -87,6 +87,7 @@
 
     # Common Parameters
     rates = hostapd_constants.CCK_AND_OFDM_DATA_RATES
+    vht_channel_width = 20
     n_capabilities = [
         hostapd_constants.N_CAPABILITY_LDPC,
         hostapd_constants.N_CAPABILITY_TX_STBC,
@@ -110,8 +111,6 @@
         rates.update(hostapd_constants.CCK_AND_OFDM_BASIC_RATES)
         mode = hostapd_constants.MODE_11N_MIXED
         ac_capabilities = None
-        vht_channel_width = None
-        vht_center_channel = None
 
     # 5GHz
     else:
@@ -126,8 +125,6 @@
             hostapd_constants.AC_CAPABILITY_MAX_MPDU_11454,
             hostapd_constants.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7
         ]
-        vht_channel_width = 40
-        vht_center_channel = 36
 
     additional_params = utils.merge_dicts(rates, vendor_elements,
                                           hostapd_constants.UAPSD_ENABLED)
@@ -146,7 +143,6 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         additional_parameters=additional_params)
 
     return config
@@ -313,6 +309,7 @@
 
     # Common Parameters
     rates = hostapd_constants.CCK_AND_OFDM_DATA_RATES
+    vht_channel_width = 20
     qbss = {'bss_load_update_period': 50, 'chan_util_avg_period': 600}
     n_capabilities = [
         hostapd_constants.N_CAPABILITY_LDPC,
@@ -320,6 +317,7 @@
         hostapd_constants.N_CAPABILITY_RX_STBC1,
         hostapd_constants.N_CAPABILITY_SGI20
     ]
+
     # Broadcom IE
     vendor_elements = {'vendor_elements': 'dd090010180200009c0000'}
 
@@ -334,8 +332,6 @@
         '2fd437509c30b3d7f5cf5754fb125aed3b8507045aed3b85' \
         'dd1e00904c0418bf0cb2798b0faaff0000aaff0000c0050001000000c3020002'
         ac_capabilities = None
-        vht_channel_width = None
-        vht_center_channel = None
 
     # 5GHz
     else:
@@ -352,8 +348,6 @@
             hostapd_constants.AC_CAPABILITY_MAX_MPDU_11454,
             hostapd_constants.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7
         ]
-        vht_channel_width = 40
-        vht_center_channel = 36
 
     additional_params = utils.merge_dicts(rates, qbss, vendor_elements,
                                           hostapd_constants.UAPSD_ENABLED)
@@ -372,7 +366,6 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         additional_parameters=additional_params)
     return config
 
diff --git a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/linksys.py b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/linksys.py
index 1ee4869..8bb2841 100644
--- a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/linksys.py
+++ b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/linksys.py
@@ -258,8 +258,7 @@
         hostapd_constants.AC_CAPABILITY_TX_ANTENNA_PATTERN,
         hostapd_constants.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7
     ]
-    vht_channel_width = 40
-    vht_center_channel = 0
+    vht_channel_width = 20
     # Epigram, Inc. HT Capabilities IE
     # Epigram, Inc. HT Additional Capabilities IE
     # Marvell Semiconductor IE
@@ -308,7 +307,6 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         spectrum_mgmt_required=spectrum_mgmt,
         additional_parameters=additional_params)
     return config
diff --git a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/netgear.py b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/netgear.py
index 331dcdf..922d51a 100644
--- a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/netgear.py
+++ b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/netgear.py
@@ -91,6 +91,7 @@
 
     # Common Parameters
     rates = hostapd_constants.CCK_AND_OFDM_DATA_RATES
+    vht_channel_width = 80
     n_capabilities = [
         hostapd_constants.N_CAPABILITY_LDPC,
         hostapd_constants.N_CAPABILITY_TX_STBC,
@@ -119,8 +120,6 @@
         mode = hostapd_constants.MODE_11N_MIXED
         obss_interval = 300
         ac_capabilities = None
-        vht_channel_width = None
-        vht_center_channel = None
 
     # 5GHz
     else:
@@ -129,8 +128,13 @@
         mode = hostapd_constants.MODE_11AC_MIXED
         n_capabilities += [
             hostapd_constants.N_CAPABILITY_SGI40,
-            hostapd_constants.N_CAPABILITY_HT40_PLUS
         ]
+
+        if hostapd_config.ht40_plus_allowed(channel):
+            n_capabilities.append(hostapd_constants.N_CAPABILITY_HT40_PLUS)
+        elif hostapd_config.ht40_minus_allowed(channel):
+            n_capabilities.append(hostapd_constants.N_CAPABILITY_HT40_MINUS)
+
         obss_interval = None
         ac_capabilities = [
             hostapd_constants.AC_CAPABILITY_RXLDPC,
@@ -140,8 +144,6 @@
             hostapd_constants.AC_CAPABILITY_MAX_MPDU_11454,
             hostapd_constants.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7
         ]
-        vht_channel_width = 80
-        vht_center_channel = 42
 
     additional_params = utils.merge_dicts(
         rates, vendor_elements, qbss,
@@ -164,7 +166,6 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         additional_parameters=additional_params)
     return config
 
diff --git a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/tplink.py b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/tplink.py
index 15961ba..e3e9894 100644
--- a/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/tplink.py
+++ b/acts/framework/acts/controllers/ap_lib/third_party_ap_profiles/tplink.py
@@ -85,6 +85,7 @@
 
     # Common Parameters
     rates = hostapd_constants.CCK_AND_OFDM_DATA_RATES
+    vht_channel_width = 20
     n_capabilities = [
         hostapd_constants.N_CAPABILITY_SGI20,
         hostapd_constants.N_CAPABILITY_TX_STBC,
@@ -109,8 +110,6 @@
         mode = hostapd_constants.MODE_11N_MIXED
         n_capabilities.append(hostapd_constants.N_CAPABILITY_DSSS_CCK_40)
         ac_capabilities = None
-        vht_channel_width = None
-        vht_center_channel = None
 
     # 5GHz
     else:
@@ -127,8 +126,6 @@
             hostapd_constants.AC_CAPABILITY_RX_STBC_1,
             hostapd_constants.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7,
         ]
-        vht_channel_width = 40
-        vht_center_channel = 36
 
     additional_params = utils.merge_dicts(
         rates, vendor_elements, qbss,
@@ -150,7 +147,6 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         additional_parameters=additional_params)
     return config
 
@@ -199,6 +195,7 @@
 
     # Common Parameters
     rates = hostapd_constants.CCK_AND_OFDM_DATA_RATES
+    vht_channel_width = 80
     n_capabilities = [
         hostapd_constants.N_CAPABILITY_LDPC,
         hostapd_constants.N_CAPABILITY_SGI20,
@@ -223,7 +220,6 @@
         pwr_constraint = {}
         ac_capabilities = None
         vht_channel_width = None
-        vht_center_channel = None
 
     # 5GHz
     else:
@@ -239,10 +235,15 @@
             '8801178c011795011e99011e9d011ea1011ea5011e')
         pwr_constraint = {'local_pwr_constraint': 3}
         n_capabilities += [
-            hostapd_constants.N_CAPABILITY_HT40_PLUS,
             hostapd_constants.N_CAPABILITY_SGI40,
             hostapd_constants.N_CAPABILITY_MAX_AMSDU_7935
         ]
+
+        if hostapd_config.ht40_plus_allowed(channel):
+            n_capabilities.append(hostapd_constants.N_CAPABILITY_HT40_PLUS)
+        elif hostapd_config.ht40_minus_allowed(channel):
+            n_capabilities.append(hostapd_constants.N_CAPABILITY_HT40_MINUS)
+
         ac_capabilities = [
             hostapd_constants.AC_CAPABILITY_MAX_MPDU_11454,
             hostapd_constants.AC_CAPABILITY_RXLDPC,
@@ -253,8 +254,6 @@
             hostapd_constants.AC_CAPABILITY_RX_ANTENNA_PATTERN,
             hostapd_constants.AC_CAPABILITY_TX_ANTENNA_PATTERN
         ]
-        vht_channel_width = 80
-        vht_center_channel = 42
 
     additional_params = utils.merge_dicts(rates, vendor_elements,
                                           hostapd_constants.UAPSD_ENABLED,
@@ -274,7 +273,6 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         spectrum_mgmt_required=spectrum_mgmt,
         additional_parameters=additional_params)
     return config
@@ -334,6 +332,7 @@
 
     # Common Parameters
     rates = hostapd_constants.CCK_AND_OFDM_DATA_RATES
+    vht_channel_width = 20
     n_capabilities = [
         hostapd_constants.N_CAPABILITY_SGI20,
         hostapd_constants.N_CAPABILITY_TX_STBC,
@@ -356,8 +355,6 @@
         short_preamble = True
         mode = hostapd_constants.MODE_11N_MIXED
         ac_capabilities = None
-        vht_channel_width = None
-        vht_center_channel = None
 
     # 5GHz
     else:
@@ -374,8 +371,6 @@
             hostapd_constants.AC_CAPABILITY_RX_STBC_1,
             hostapd_constants.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7,
         ]
-        vht_channel_width = 40
-        vht_center_channel = 36
 
     additional_params = utils.merge_dicts(
         rates, vendor_elements, hostapd_constants.ENABLE_RRM_BEACON_REPORT,
@@ -396,12 +391,13 @@
         n_capabilities=n_capabilities,
         ac_capabilities=ac_capabilities,
         vht_channel_width=vht_channel_width,
-        vht_center_channel=vht_center_channel,
         additional_parameters=additional_params)
     return config
 
 
-def tplink_tlwr940n(iface_wlan_2g=None, channel=None, security=None,
+def tplink_tlwr940n(iface_wlan_2g=None,
+                    channel=None,
+                    security=None,
                     ssid=None):
     # TODO(b/143104825): Permit RIFS once it is supported
     """A simulated implementation of an TPLink TLWR940N AP.
diff --git a/acts/framework/acts/controllers/attenuator.py b/acts/framework/acts/controllers/attenuator.py
index aa84801..9d99c2d 100644
--- a/acts/framework/acts/controllers/attenuator.py
+++ b/acts/framework/acts/controllers/attenuator.py
@@ -48,17 +48,16 @@
                 logging.error('Attempt %s to open connection to attenuator '
                               'failed: %s' % (attempt_number, e))
                 if attempt_number == _ATTENUATOR_OPEN_RETRIES:
-                    ping_output = job.run(
-                        'ping %s -c 1 -w 1' % ip_address, ignore_status=True)
+                    ping_output = job.run('ping %s -c 1 -w 1' % ip_address,
+                                          ignore_status=True)
                     if ping_output.exit_status == 1:
-                        logging.error(
-                            'Unable to ping attenuator at %s' % ip_address)
+                        logging.error('Unable to ping attenuator at %s' %
+                                      ip_address)
                     else:
-                        logging.error(
-                            'Able to ping attenuator at %s' % ip_address)
-                        job.run(
-                            'echo "q" | telnet %s %s' % (ip_address, port),
-                            ignore_status=True)
+                        logging.error('Able to ping attenuator at %s' %
+                                      ip_address)
+                        job.run('echo "q" | telnet %s %s' % (ip_address, port),
+                                ignore_status=True)
                     raise
         for i in range(inst_cnt):
             attn = Attenuator(attn_inst, idx=i)
@@ -72,13 +71,31 @@
     return objs
 
 
+def get_info(attenuators):
+    """Get information on a list of Attenuator objects.
+
+    Args:
+        attenuators: A list of Attenuator objects.
+
+    Returns:
+        A list of dict, each representing info for Attenuator objects.
+    """
+    device_info = []
+    for attenuator in attenuators:
+        info = {
+            "Address": attenuator.instrument.address,
+            "Attenuator_Port": attenuator.idx
+        }
+        device_info.append(info)
+    return device_info
+
+
 def destroy(objs):
     for attn in objs:
         attn.instrument.close()
 
 
-def get_attenuators_for_device(device_attenuator_configs,
-                               attenuators,
+def get_attenuators_for_device(device_attenuator_configs, attenuators,
                                attenuator_key):
     """Gets the list of attenuators associated to a specified device and builds
     a list of the attenuator objects associated to the ip address in the
@@ -139,11 +156,12 @@
         for attenuator_port in device_attenuator_config[attenuator_key]:
             for attenuator in attenuators:
                 if (attenuator.instrument.address ==
-                        device_attenuator_config['Address'] and
-                        attenuator.idx is attenuator_port):
+                        device_attenuator_config['Address']
+                        and attenuator.idx is attenuator_port):
                     attenuator_list.append(attenuator)
     return attenuator_list
 
+
 """Classes for accessing, managing, and manipulating attenuators.
 
 Users will instantiate a specific child class, but almost all operation should
@@ -244,7 +262,6 @@
     the physical implementation and allows the user to think only of attenuators
     regardless of their location.
     """
-
     def __init__(self, instrument, idx=0, offset=0):
         """This is the constructor for Attenuator
 
@@ -313,7 +330,6 @@
     convenience to the user and avoid re-implementation of helper functions and
     small loops scattered throughout user code.
     """
-
     def __init__(self, name=''):
         """This constructor for AttenuatorGroup
 
diff --git a/acts/framework/acts/controllers/fuchsia_device.py b/acts/framework/acts/controllers/fuchsia_device.py
index fd4aecd..998927d 100644
--- a/acts/framework/acts/controllers/fuchsia_device.py
+++ b/acts/framework/acts/controllers/fuchsia_device.py
@@ -14,6 +14,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+import backoff
 import json
 import logging
 import platform
@@ -22,6 +23,7 @@
 import re
 import requests
 import subprocess
+import socket
 import time
 
 from acts import context
@@ -146,7 +148,6 @@
         log: A logger object.
         port: The TCP port number of the Fuchsia device.
     """
-
     def __init__(self, fd_conf_data):
         """
         Args:
@@ -230,13 +231,13 @@
         # Init server
         self.init_server_connection()
 
-    def init_server_connection(self, retry_count=3):
-        """Initializes HTTP connection with SL4F server.
-
-        Args:
-            retry_count: How many time to retry connecting assuming a
-                known error.
-        """
+    @backoff.on_exception(
+        backoff.constant,
+        (ConnectionRefusedError, requests.exceptions.ConnectionError),
+        interval=1.5,
+        max_tries=4)
+    def init_server_connection(self):
+        """Initializes HTTP connection with SL4F server."""
         self.log.debug("Initialziing server connection")
         init_data = json.dumps({
             "jsonrpc": "2.0",
@@ -246,28 +247,8 @@
                 "client_id": self.client_id
             }
         })
-        retry_counter = 0
-        while retry_counter < retry_count:
-            try:
-                requests.get(url=self.init_address, data=init_data)
-                retry_counter = retry_count + 1
-            except ConnectionRefusedError:
-                self.log.info('Connection Refused Error.  '
-                              'Retrying in 1 second.')
-                e = ConnectionRefusedError('Connection Refused Error.')
-                retry_counter += 1
-                time.sleep(1)
-            except requests.exceptions.ConnectionError:
-                self.log.info('Requests ConnectionError.  '
-                              'Retrying in 1 second.')
-                e = requests.exceptions.ConnectionError('Requests '
-                                                        'ConnectionError')
-                retry_counter += 1
-                time.sleep(1)
-            except Exception as e:
-                raise e
-        if retry_counter is retry_count:
-            raise e
+
+        requests.get(url=self.init_address, data=init_data)
         self.test_counter += 1
 
     def build_id(self, test_id):
@@ -315,7 +296,8 @@
         elif os_type == 'Linux':
             timeout_flag = '-W'
         else:
-            raise ValueError('Invalid OS.  Only Linux and MacOS are supported.')
+            raise ValueError(
+                'Invalid OS.  Only Linux and MacOS are supported.')
         ping_command = ['ping', '%s' % timeout_flag, '1', '-c', '1', self.ip]
         self.clean_up()
         self.log.info('Rebooting FuchsiaDevice %s' % self.ip)
@@ -331,7 +313,7 @@
         self.log.info('Waiting for FuchsiaDevice %s to come back up.' %
                       self.ip)
         self.log.debug('Waiting for FuchsiaDevice %s to stop responding'
-                      ' to pings.' % self.ip)
+                       ' to pings.' % self.ip)
         while True:
             initial_ping_status_code = subprocess.call(
                 ping_command,
@@ -340,28 +322,26 @@
             if initial_ping_status_code != 1:
                 break
             else:
-                initial_ping_elapsed_time = (
-                        time.time() - initial_ping_start_time)
+                initial_ping_elapsed_time = (time.time() -
+                                             initial_ping_start_time)
                 if initial_ping_elapsed_time > timeout:
                     try:
                         uptime = (int(
                             self.send_command_ssh(
                                 'clock --monotonic',
-                                timeout=
-                                FUCHSIA_RECONNECT_AFTER_REBOOT_TIME).stdout)
-                                / FUCHSIA_TIME_IN_NANOSECONDS)
+                                timeout=FUCHSIA_RECONNECT_AFTER_REBOOT_TIME).
+                            stdout) / FUCHSIA_TIME_IN_NANOSECONDS)
                     except Exception as e:
-                        self.log.debug('Unable to retrieve uptime from device.')
+                        self.log.info('Unable to retrieve uptime from device.')
                     # Device failed to restart within the specified period.
                     # Restart the services so other tests can continue.
                     self.start_services()
                     self.init_server_connection()
-                    raise TimeoutError('Waited %s seconds, and FuchsiaDevice %s'
-                                       ' never stopped responding to pings.'
-                                       ' Uptime reported as %s' %
-                                       (initial_ping_elapsed_time,
-                                        self.ip,
-                                        str(uptime)))
+                    raise TimeoutError(
+                        'Waited %s seconds, and FuchsiaDevice %s'
+                        ' never stopped responding to pings.'
+                        ' Uptime reported as %s' %
+                        (initial_ping_elapsed_time, self.ip, str(uptime)))
 
         start_time = time.time()
         self.log.debug('Waiting for FuchsiaDevice %s to start responding '
@@ -377,8 +357,8 @@
                 raise TimeoutError('Waited %s seconds, and FuchsiaDevice %s'
                                    'did not repond to a ping.' %
                                    (elapsed_time, self.ip))
-        self.log.debug('Received a ping back in %s seconds.'
-                       % str(time.time() - start_time))
+        self.log.debug('Received a ping back in %s seconds.' %
+                       str(time.time() - start_time))
         # Wait 5 seconds after receiving a ping packet to just to let
         # the OS get everything up and running.
         time.sleep(10)
@@ -656,15 +636,17 @@
                            disconnect_response.get("error"))
             return False
 
-    def start_services(self, skip_sl4f=False, retry_count=3):
+    @backoff.on_exception(backoff.constant,
+                          (FuchsiaSyslogError, socket.timeout),
+                          interval=1.5,
+                          max_tries=4)
+    def start_services(self, skip_sl4f=False):
         """Starts long running services on the Fuchsia device.
 
         1. Start SL4F if not skipped.
 
         Args:
             skip_sl4f: Does not attempt to start SL4F if True.
-            retry_count: How many time to retry connecting assuming a
-                known error.
         """
         self.log.debug("Attempting to start Fuchsia device services on %s." %
                        self.ip)
@@ -672,24 +654,9 @@
             self.log_process = start_syslog(self.serial, self.log_path,
                                             self.ip, self.ssh_username,
                                             self.ssh_config)
-            retry_counter = 0
-            while retry_counter < retry_count:
-                if ENABLE_LOG_LISTENER:
-                    try:
-                        self.log_process.start()
-                        retry_counter = retry_count + 1
-                    except FuchsiaSyslogError:
-                        self.log.info('Fuchsia Syslog Error.  '
-                                      'Retrying in 1 second.')
-                        e = FuchsiaSyslogError('Fuchsia Syslog Error')
-                        retry_counter += 1
-                        time.sleep(1)
-                    except Exception as e:
-                        raise e
-                else:
-                    retry_counter = retry_count + 1
-            if retry_counter is retry_count:
-                raise e
+
+            if ENABLE_LOG_LISTENER:
+                self.log_process.start()
 
             if not skip_sl4f:
                 self.control_daemon("sl4f.cmx", "start")
diff --git a/acts/framework/acts/controllers/fuchsia_lib/utils_lib.py b/acts/framework/acts/controllers/fuchsia_lib/utils_lib.py
index 6456a08..56fd4c2 100644
--- a/acts/framework/acts/controllers/fuchsia_lib/utils_lib.py
+++ b/acts/framework/acts/controllers/fuchsia_lib/utils_lib.py
@@ -14,9 +14,11 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+import backoff
 import os
 import logging
 import paramiko
+import socket
 import time
 
 logging.getLogger("paramiko").setLevel(logging.WARNING)
@@ -51,11 +53,17 @@
     raise Exception('No valid ssh key type found', exceptions)
 
 
+@backoff.on_exception(
+    backoff.constant,
+    (paramiko.ssh_exception.SSHException,
+     paramiko.ssh_exception.AuthenticationException, socket.timeout,
+     socket.error, ConnectionRefusedError, ConnectionResetError),
+    interval=1.5,
+    max_tries=4)
 def create_ssh_connection(ip_address,
                           ssh_username,
                           ssh_config,
-                          connect_timeout=30,
-                          retry_count=3):
+                          connect_timeout=30):
     """Creates and ssh connection to a Fuchsia device
 
     Args:
@@ -63,8 +71,6 @@
         ssh_username: Username for ssh server.
         ssh_config: ssh_config location for the ssh server.
         connect_timeout: Timeout value for connecting to ssh_server.
-        retry_count: How many time to retry connecting assuming a
-            known error.
 
     Returns:
         A paramiko ssh object
@@ -72,31 +78,12 @@
     ssh_key = get_private_key(ip_address=ip_address, ssh_config=ssh_config)
     ssh_client = paramiko.SSHClient()
     ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
-    retry_counter = 0
-    while retry_counter < retry_count:
-        try:
-            ssh_client.connect(hostname=ip_address,
-                               username=ssh_username,
-                               allow_agent=False,
-                               pkey=ssh_key,
-                               timeout=connect_timeout,
-                               banner_timeout=200)
-            retry_counter = retry_count + 1
-        except paramiko.ssh_exception.SSHException:
-            logging.info('Paramiko SSHException.  Retrying in 1 second.')
-            e = paramiko.ssh_exception.SSHException('Paramiko SSHException')
-            time.sleep(1)
-            retry_counter =+ 1
-        except ConnectionRefusedError:
-            logging.info('Connection Refused Error.  Retrying in 1 second.')
-            e = ConnectionRefusedError('Connection Refused Error')
-            time.sleep(1)
-            retry_counter =+ 1
-        except Exception as e:
-            raise e
-    if retry_counter is retry_count:
-        raise e
-
+    ssh_client.connect(hostname=ip_address,
+                       username=ssh_username,
+                       allow_agent=False,
+                       pkey=ssh_key,
+                       timeout=connect_timeout,
+                       banner_timeout=200)
     return ssh_client
 
 
diff --git a/acts/framework/acts/controllers/iperf_client.py b/acts/framework/acts/controllers/iperf_client.py
index 40c6993..6993925 100644
--- a/acts/framework/acts/controllers/iperf_client.py
+++ b/acts/framework/acts/controllers/iperf_client.py
@@ -23,6 +23,8 @@
 from acts import utils
 from acts.controllers.android_device import AndroidDevice
 from acts.controllers.iperf_server import _AndroidDeviceBridge
+from acts.controllers.fuchsia_lib.utils_lib import create_ssh_connection
+from acts.controllers.fuchsia_lib.utils_lib import SshResults
 from acts.controllers.utils_lib.ssh import connection
 from acts.controllers.utils_lib.ssh import settings
 from acts.event import event_bus
@@ -51,12 +53,24 @@
         if type(c) is dict and 'AndroidDevice' in c:
             results.append(IPerfClientOverAdb(c['AndroidDevice']))
         elif type(c) is dict and 'ssh_config' in c:
-            results.append(IPerfClientOverSsh(c['ssh_config']))
+            results.append(
+                IPerfClientOverSsh(c['ssh_config'],
+                                   use_paramiko=c.get('use_paramiko'),
+                                   test_interface=c.get('test_interface')))
         else:
             results.append(IPerfClient())
     return results
 
 
+def get_info(iperf_clients):
+    """Placeholder for info about iperf clients
+
+    Returns:
+        None
+    """
+    return None
+
+
 def destroy(_):
     # No cleanup needed.
     pass
@@ -98,7 +112,7 @@
 
         return os.path.join(full_out_dir, out_file_name)
 
-    def start(self, ip, iperf_args, tag, timeout=3600):
+    def start(self, ip, iperf_args, tag, timeout=3600, iperf_binary=None):
         """Starts iperf client, and waits for completion.
 
         Args:
@@ -107,6 +121,8 @@
                 client. Eg: iperf_args = "-t 10 -p 5001 -w 512k/-u -b 200M -J".
             tag: A string to further identify iperf results file
             timeout: the maximum amount of time the iperf client can run.
+            iperf_binary: Location of iperf3 binary. If none, it is assumed the
+                the binary is in the path.
 
         Returns:
             full_out_path: iperf result path.
@@ -116,8 +132,7 @@
 
 class IPerfClient(IPerfClientBase):
     """Class that handles iperf3 client operations."""
-
-    def start(self, ip, iperf_args, tag, timeout=3600):
+    def start(self, ip, iperf_args, tag, timeout=3600, iperf_binary=None):
         """Starts iperf client, and waits for completion.
 
         Args:
@@ -126,11 +141,19 @@
             client. Eg: iperf_args = "-t 10 -p 5001 -w 512k/-u -b 200M -J".
             tag: tag to further identify iperf results file
             timeout: unused.
+            iperf_binary: Location of iperf3 binary. If none, it is assumed the
+                the binary is in the path.
 
         Returns:
             full_out_path: iperf result path.
         """
-        iperf_cmd = ['iperf3', '-c', ip] + iperf_args.split(' ')
+        if not iperf_binary:
+            logging.debug('No iperf3 binary specified.  '
+                          'Assuming iperf3 is in the path.')
+            iperf_binary = 'iperf3'
+        else:
+            logging.debug('Using iperf3 binary located at %s' % iperf_binary)
+        iperf_cmd = [str(iperf_binary), '-c', ip] + iperf_args.split(' ')
         full_out_path = self._get_full_file_path(tag)
 
         with open(full_out_path, 'w') as out_file:
@@ -141,12 +164,21 @@
 
 class IPerfClientOverSsh(IPerfClientBase):
     """Class that handles iperf3 client operations on remote machines."""
-
-    def __init__(self, ssh_config):
+    def __init__(self, ssh_config, use_paramiko=False, test_interface=None):
         self._ssh_settings = settings.from_config(ssh_config)
-        self._ssh_session = connection.SshConnection(self._ssh_settings)
+        self._use_paramiko = use_paramiko
+        if str(self._use_paramiko) == 'True':
+            self._ssh_session = create_ssh_connection(
+                ip_address=ssh_config['host'],
+                ssh_username=ssh_config['user'],
+                ssh_config=ssh_config['ssh_config'])
+        else:
+            self._ssh_session = connection.SshConnection(self._ssh_settings)
 
-    def start(self, ip, iperf_args, tag, timeout=3600):
+        self.hostname = self._ssh_settings.hostname
+        self.test_interface = test_interface
+
+    def start(self, ip, iperf_args, tag, timeout=3600, iperf_binary=None):
         """Starts iperf client, and waits for completion.
 
         Args:
@@ -155,15 +187,33 @@
             client. Eg: iperf_args = "-t 10 -p 5001 -w 512k/-u -b 200M -J".
             tag: tag to further identify iperf results file
             timeout: the maximum amount of time to allow the iperf client to run
+            iperf_binary: Location of iperf3 binary. If none, it is assumed the
+                the binary is in the path.
 
         Returns:
             full_out_path: iperf result path.
         """
-        iperf_cmd = 'iperf3 -c {} {}'.format(ip, iperf_args)
+        if not iperf_binary:
+            logging.debug('No iperf3 binary specified.  '
+                          'Assuming iperf3 is in the path.')
+            iperf_binary = 'iperf3'
+        else:
+            logging.debug('Using iperf3 binary located at %s' % iperf_binary)
+        iperf_cmd = '{} -c {} {}'.format(iperf_binary, ip, iperf_args)
         full_out_path = self._get_full_file_path(tag)
 
         try:
-            iperf_process = self._ssh_session.run(iperf_cmd, timeout=timeout)
+            if self._use_paramiko:
+                cmd_result_stdin, cmd_result_stdout, cmd_result_stderr = (
+                    self._ssh_session.exec_command(iperf_cmd, timeout=timeout))
+                cmd_result_exit_status = (
+                    cmd_result_stdout.channel.recv_exit_status())
+                iperf_process = SshResults(cmd_result_stdin, cmd_result_stdout,
+                                           cmd_result_stderr,
+                                           cmd_result_exit_status)
+            else:
+                iperf_process = self._ssh_session.run(iperf_cmd,
+                                                      timeout=timeout)
             iperf_output = iperf_process.stdout
             with open(full_out_path, 'w') as out_file:
                 out_file.write(iperf_output)
@@ -175,7 +225,6 @@
 
 class IPerfClientOverAdb(IPerfClientBase):
     """Class that handles iperf3 operations over ADB devices."""
-
     def __init__(self, android_device_or_serial):
         """Creates a new IPerfClientOverAdb object.
 
@@ -195,7 +244,7 @@
             return _AndroidDeviceBridge.android_devices()[
                 self._android_device_or_serial]
 
-    def start(self, ip, iperf_args, tag, timeout=3600):
+    def start(self, ip, iperf_args, tag, timeout=3600, iperf_binary=None):
         """Starts iperf client, and waits for completion.
 
         Args:
@@ -204,19 +253,32 @@
             client. Eg: iperf_args = "-t 10 -p 5001 -w 512k/-u -b 200M -J".
             tag: tag to further identify iperf results file
             timeout: the maximum amount of time to allow the iperf client to run
+            iperf_binary: Location of iperf3 binary. If none, it is assumed the
+                the binary is in the path.
 
         Returns:
             The iperf result file path.
         """
-        iperf_output = ''
+        clean_out = ''
         try:
-            iperf_status, iperf_output = self._android_device.run_iperf_client(
-                ip, iperf_args, timeout=timeout)
+            if not iperf_binary:
+                logging.debug('No iperf3 binary specified.  '
+                              'Assuming iperf3 is in the path.')
+                iperf_binary = 'iperf3'
+            else:
+                logging.debug('Using iperf3 binary located at %s' %
+                              iperf_binary)
+            iperf_cmd = '{} -c {} {}'.format(iperf_binary, ip, iperf_args)
+            out = self._android_device.adb.shell(str(iperf_cmd),
+                                                 timeout=timeout)
+            clean_out = out.split('\n')
+            if "error" in clean_out[0].lower():
+                raise Exception('clean_out')
         except job.TimeoutError:
             logging.warning('TimeoutError: Iperf measurement timed out.')
 
         full_out_path = self._get_full_file_path(tag)
         with open(full_out_path, 'w') as out_file:
-            out_file.write('\n'.join(iperf_output))
+            out_file.write('\n'.join(clean_out))
 
         return full_out_path
diff --git a/acts/framework/acts/controllers/iperf_server.py b/acts/framework/acts/controllers/iperf_server.py
index 039f143..d2ac30b 100755
--- a/acts/framework/acts/controllers/iperf_server.py
+++ b/acts/framework/acts/controllers/iperf_server.py
@@ -17,6 +17,7 @@
 import json
 import logging
 import math
+import IPy
 import os
 import shlex
 import subprocess
@@ -36,6 +37,10 @@
 
 ACTS_CONTROLLER_CONFIG_NAME = 'IPerfServer'
 ACTS_CONTROLLER_REFERENCE_NAME = 'iperf_servers'
+KILOBITS = 1024
+MEGABITS = KILOBITS * 1024
+GIGABITS = MEGABITS * 1024
+BITS_IN_BYTE = 8
 
 
 def create(configs):
@@ -56,7 +61,10 @@
         elif type(c) is dict and 'AndroidDevice' in c and 'port' in c:
             results.append(IPerfServerOverAdb(c['AndroidDevice'], c['port']))
         elif type(c) is dict and 'ssh_config' in c and 'port' in c:
-            results.append(IPerfServerOverSsh(c['ssh_config'], c['port']))
+            results.append(
+                IPerfServerOverSsh(c['ssh_config'],
+                                   c['port'],
+                                   test_interface=c.get('test_interface')))
         else:
             raise ValueError(
                 'Config entry %s in %s is not a valid IPerfServer '
@@ -64,6 +72,15 @@
     return results
 
 
+def get_info(iperf_servers):
+    """Placeholder for info about iperf servers
+
+    Returns:
+        None
+    """
+    return None
+
+
 def destroy(iperf_server_list):
     for iperf_server in iperf_server_list:
         try:
@@ -73,7 +90,7 @@
 
 
 class IPerfResult(object):
-    def __init__(self, result_path):
+    def __init__(self, result_path, reporting_speed_units='Mbytes'):
         """Loads iperf result from file.
 
         Loads iperf result from JSON formatted server log. File can be accessed
@@ -82,6 +99,7 @@
         containing multiple iperf client runs.
         """
         # if result_path isn't a path, treat it as JSON
+        self.reporting_speed_units = reporting_speed_units
         if not os.path.exists(result_path):
             self.result = json.loads(result_path)
         else:
@@ -89,8 +107,8 @@
                 with open(result_path, 'r') as f:
                     iperf_output = f.readlines()
                     if '}\n' in iperf_output:
-                        iperf_output = iperf_output[:iperf_output.index('}\n')
-                                                    + 1]
+                        iperf_output = iperf_output[:iperf_output.index('}\n'
+                                                                        ) + 1]
                     iperf_string = ''.join(iperf_output)
                     iperf_string = iperf_string.replace('nan', '0')
                     self.result = json.loads(iperf_string)
@@ -110,6 +128,32 @@
         return ('end' in self.result) and ('sum_received' in self.result['end']
                                            or 'sum' in self.result['end'])
 
+    def _get_reporting_speed(self, network_speed_in_bits_per_second):
+        """Sets the units for the network speed reporting based on how the
+        object was initiated.  Defaults to Megabytes per second.  Currently
+        supported, bits per second (bits), kilobits per second (kbits), megabits
+        per second (mbits), gigabits per second (gbits), bytes per second
+        (bytes), kilobits per second (kbytes), megabits per second (mbytes),
+        gigabytes per second (gbytes).
+
+        Args:
+            network_speed_in_bits_per_second: The network speed from iperf in
+                bits per second.
+
+        Returns:
+            The value of the throughput in the appropriate units.
+        """
+        speed_divisor = 1
+        if self.reporting_speed_units[1:].lower() == 'bytes':
+            speed_divisor = speed_divisor * BITS_IN_BYTE
+        if self.reporting_speed_units[0:1].lower() == 'k':
+            speed_divisor = speed_divisor * KILOBITS
+        if self.reporting_speed_units[0:1].lower() == 'm':
+            speed_divisor = speed_divisor * MEGABITS
+        if self.reporting_speed_units[0:1].lower() == 'g':
+            speed_divisor = speed_divisor * GIGABITS
+        return network_speed_in_bits_per_second / speed_divisor
+
     def get_json(self):
         """Returns the raw json output from iPerf."""
         return self.result
@@ -131,7 +175,7 @@
         if not self._has_data() or 'sum' not in self.result['end']:
             return None
         bps = self.result['end']['sum']['bits_per_second']
-        return bps / 8 / 1024 / 1024
+        return self._get_reporting_speed(bps)
 
     @property
     def avg_receive_rate(self):
@@ -143,7 +187,7 @@
         if not self._has_data() or 'sum_received' not in self.result['end']:
             return None
         bps = self.result['end']['sum_received']['bits_per_second']
-        return bps / 8 / 1024 / 1024
+        return self._get_reporting_speed(bps)
 
     @property
     def avg_send_rate(self):
@@ -155,7 +199,7 @@
         if not self._has_data() or 'sum_sent' not in self.result['end']:
             return None
         bps = self.result['end']['sum_sent']['bits_per_second']
-        return bps / 8 / 1024 / 1024
+        return self._get_reporting_speed(bps)
 
     @property
     def instantaneous_rates(self):
@@ -167,7 +211,7 @@
         if not self._has_data():
             return None
         intervals = [
-            interval['sum']['bits_per_second'] / 8 / 1024 / 1024
+            self._get_reporting_speed(interval['sum']['bits_per_second'])
             for interval in self.result['intervals']
         ]
         return intervals
@@ -202,7 +246,8 @@
         instantaneous_rates = self.instantaneous_rates[iperf_ignored_interval:
                                                        -1]
         avg_rate = math.fsum(instantaneous_rates) / len(instantaneous_rates)
-        sqd_deviations = [(rate - avg_rate) ** 2 for rate in instantaneous_rates]
+        sqd_deviations = ([(rate - avg_rate)**2
+                           for rate in instantaneous_rates])
         std_dev = math.sqrt(
             math.fsum(sqd_deviations) / (len(sqd_deviations) - 1))
         return std_dev
@@ -297,7 +342,6 @@
 
 class IPerfServer(IPerfServerBase):
     """Class that handles iperf server commands on localhost."""
-
     def __init__(self, port=5201):
         super().__init__(port)
         self._hinted_port = port
@@ -335,8 +379,9 @@
         if self._last_opened_file:
             self._last_opened_file.close()
         self._last_opened_file = open(self._current_log_file, 'w')
-        self._iperf_process = subprocess.Popen(
-            command, stdout=self._last_opened_file, stderr=subprocess.DEVNULL)
+        self._iperf_process = subprocess.Popen(command,
+                                               stdout=self._last_opened_file,
+                                               stderr=subprocess.DEVNULL)
         for attempts_left in reversed(range(3)):
             try:
                 self._port = int(
@@ -374,15 +419,22 @@
 
 class IPerfServerOverSsh(IPerfServerBase):
     """Class that handles iperf3 operations on remote machines."""
-
-    def __init__(self, ssh_config, port):
+    def __init__(self, ssh_config, port, test_interface=None):
         super().__init__(port)
         ssh_settings = settings.from_config(ssh_config)
         self._ssh_session = connection.SshConnection(ssh_settings)
 
-        self._iperf_command = 'iperf3 -s -J -p {}'.format(self.port)
         self._iperf_pid = None
         self._current_tag = None
+        self.hostname = ssh_settings.hostname
+        try:
+            # A test interface can only be found if an ip address is specified.
+            # A fully qualified hostname will return None for the
+            # test_interface.
+            self.test_interface = self._get_test_interface_based_on_ip(
+                test_interface)
+        except Exception:
+            self.test_interface = None
 
     @property
     def port(self):
@@ -395,7 +447,46 @@
     def _get_remote_log_path(self):
         return 'iperf_server_port%s.log' % self.port
 
-    def start(self, extra_args='', tag=''):
+    def _get_test_interface_based_on_ip(self, test_interface):
+        """Gets the test interface for a particular IP if the test interface
+            passed in test_interface is None
+
+        Args:
+            test_interface: Either a interface name, ie eth0, or None
+
+        Returns:
+            The name of the test interface.
+        """
+        if test_interface:
+            return test_interface
+        return utils.get_interface_based_on_ip(self._ssh_session,
+                                               self.hostname)
+
+    def get_interface_ip_addresses(self, interface):
+        """Gets all of the ip addresses, ipv4 and ipv6, associated with a
+           particular interface name.
+
+        Args:
+            interface: The interface name on the device, ie eth0
+
+    Returns:
+        A list of dictionaries of the the various IP addresses:
+            ipv4_private_local_addresses: Any 192.168, 172.16, or 10
+                addresses
+            ipv4_public_addresses: Any IPv4 public addresses
+            ipv6_link_local_addresses: Any fe80:: addresses
+            ipv6_private_local_addresses: Any fd00:: addresses
+            ipv6_public_addresses: Any publicly routable addresses
+    """
+        return utils.get_interface_ip_addresses(self._ssh_session, interface)
+
+    def renew_test_interface_ip_address(self):
+        """Renews the test interface's IP address.  Necessary for changing
+           DHCP scopes during a test.
+        """
+        utils.renew_linux_ip_address(self._ssh_session, self.test_interface)
+
+    def start(self, extra_args='', tag='', iperf_binary=None):
         """Starts iperf server on specified machine and port.
 
         Args:
@@ -403,12 +494,22 @@
                 server with.
             tag: Appended to log file name to identify logs from different
                 iperf runs.
+            iperf_binary: Location of iperf3 binary. If none, it is assumed the
+                the binary is in the path.
         """
         if self.started:
             return
 
+        if not iperf_binary:
+            logging.debug('No iperf3 binary specified.  '
+                          'Assuming iperf3 is in the path.')
+            iperf_binary = 'iperf3'
+        else:
+            logging.debug('Using iperf3 binary located at %s' % iperf_binary)
+        iperf_command = '{} -s -J -p {}'.format(iperf_binary, self.port)
+
         cmd = '{cmd} {extra_flags} > {log_file}'.format(
-            cmd=self._iperf_command,
+            cmd=iperf_command,
             extra_flags=extra_args,
             log_file=self._get_remote_log_path())
 
@@ -463,8 +564,10 @@
         """
         if not _AndroidDeviceBridge._test_class:
             return {}
-        return {device.serial: device
-                for device in _AndroidDeviceBridge._test_class.android_devices}
+        return {
+            device.serial: device
+            for device in _AndroidDeviceBridge._test_class.android_devices
+        }
 
 
 event_bus.register_subscription(
@@ -474,7 +577,6 @@
 
 class IPerfServerOverAdb(IPerfServerBase):
     """Class that handles iperf3 operations over ADB devices."""
-
     def __init__(self, android_device_or_serial, port):
         """Creates a new IPerfServerOverAdb object.
 
@@ -488,7 +590,6 @@
         super().__init__(port)
         self._android_device_or_serial = android_device_or_serial
 
-        self._iperf_command = 'iperf3 -s -J -p {}'.format(self.port)
         self._iperf_process = None
         self._current_tag = ''
 
@@ -511,7 +612,7 @@
     def _get_device_log_path(self):
         return '~/data/iperf_server_port%s.log' % self.port
 
-    def start(self, extra_args='', tag=''):
+    def start(self, extra_args='', tag='', iperf_binary=None):
         """Starts iperf server on an ADB device.
 
         Args:
@@ -519,13 +620,23 @@
                 server with.
             tag: Appended to log file name to identify logs from different
                 iperf runs.
+            iperf_binary: Location of iperf3 binary. If none, it is assumed the
+                the binary is in the path.
         """
         if self._iperf_process is not None:
             return
 
+        if not iperf_binary:
+            logging.debug('No iperf3 binary specified.  '
+                          'Assuming iperf3 is in the path.')
+            iperf_binary = 'iperf3'
+        else:
+            logging.debug('Using iperf3 binary located at %s' % iperf_binary)
+        iperf_command = '{} -s -J -p {}'.format(iperf_binary, self.port)
+
         self._iperf_process = self._android_device.adb.shell_nb(
             '{cmd} {extra_flags} > {log_file}'.format(
-                cmd=self._iperf_command,
+                cmd=iperf_command,
                 extra_flags=extra_args,
                 log_file=self._get_device_log_path()))
         self._iperf_process_adb_pid = ''
diff --git a/acts/framework/acts/test_utils/abstract_devices/utils_lib/wlan_utils.py b/acts/framework/acts/test_utils/abstract_devices/utils_lib/wlan_utils.py
index 745d35f..d4af3c3 100644
--- a/acts/framework/acts/test_utils/abstract_devices/utils_lib/wlan_utils.py
+++ b/acts/framework/acts/test_utils/abstract_devices/utils_lib/wlan_utils.py
@@ -25,8 +25,8 @@
 
        Args: Args match setup_ap_and_associate
     """
-    asserts.assert_true(
-        setup_ap_and_associate(*args, **kwargs), 'Failed to associate.')
+    asserts.assert_true(setup_ap_and_associate(*args, **kwargs),
+                        'Failed to associate.')
     asserts.explicit_pass('Successfully associated.')
 
 
@@ -49,7 +49,8 @@
                            check_connectivity=False,
                            n_capabilities=None,
                            ac_capabilities=None,
-                           vht_bandwidth=None):
+                           vht_bandwidth=None,
+                           setup_bridge=False):
     """Sets up the AP and associates a client.
 
     Args:
@@ -73,14 +74,13 @@
              beacon_interval, dtim_period, frag_threshold, rts_threshold,
              force_wmm, hidden, security, additional_ap_parameters, password,
              check_connectivity, n_capabilities, ac_capabilities,
-             vht_bandwidth)
+             vht_bandwidth, setup_bridge)
 
-    return associate(
-        client,
-        ssid,
-        password,
-        check_connectivity=check_connectivity,
-        hidden=hidden)
+    return associate(client,
+                     ssid,
+                     password,
+                     check_connectivity=check_connectivity,
+                     hidden=hidden)
 
 
 def setup_ap(access_point,
@@ -101,7 +101,8 @@
              check_connectivity=False,
              n_capabilities=None,
              ac_capabilities=None,
-             vht_bandwidth=None):
+             vht_bandwidth=None,
+             setup_bridge=False):
     """Sets up the AP.
 
     Args:
@@ -120,27 +121,27 @@
         password: Password to connect to WLAN if necessary.
         check_connectivity: Whether to check for internet connectivity.
     """
-    ap = hostapd_ap_preset.create_ap_preset(
-        profile_name=profile_name,
-        iface_wlan_2g=access_point.wlan_2g,
-        iface_wlan_5g=access_point.wlan_5g,
-        channel=channel,
-        ssid=ssid,
-        mode=mode,
-        short_preamble=preamble,
-        beacon_interval=beacon_interval,
-        dtim_period=dtim_period,
-        frag_threshold=frag_threshold,
-        rts_threshold=rts_threshold,
-        force_wmm=force_wmm,
-        hidden=hidden,
-        bss_settings=[],
-        security=security,
-        n_capabilities=n_capabilities,
-        ac_capabilities=ac_capabilities,
-        vht_bandwidth=vht_bandwidth)
-    access_point.start_ap(
-        hostapd_config=ap, additional_parameters=additional_ap_parameters)
+    ap = hostapd_ap_preset.create_ap_preset(profile_name=profile_name,
+                                            iface_wlan_2g=access_point.wlan_2g,
+                                            iface_wlan_5g=access_point.wlan_5g,
+                                            channel=channel,
+                                            ssid=ssid,
+                                            mode=mode,
+                                            short_preamble=preamble,
+                                            beacon_interval=beacon_interval,
+                                            dtim_period=dtim_period,
+                                            frag_threshold=frag_threshold,
+                                            rts_threshold=rts_threshold,
+                                            force_wmm=force_wmm,
+                                            hidden=hidden,
+                                            bss_settings=[],
+                                            security=security,
+                                            n_capabilities=n_capabilities,
+                                            ac_capabilities=ac_capabilities,
+                                            vht_bandwidth=vht_bandwidth)
+    access_point.start_ap(hostapd_config=ap,
+                          setup_bridge=setup_bridge,
+                          additional_parameters=additional_ap_parameters)
 
 
 def associate(client,
@@ -157,8 +158,10 @@
         check_connectivity: Whether to check internet connectivity.
         hidden: If the WLAN is hidden or not.
     """
-    return client.associate(
-        ssid, password, check_connectivity=check_connectivity, hidden=hidden)
+    return client.associate(ssid,
+                            password,
+                            check_connectivity=check_connectivity,
+                            hidden=hidden)
 
 
 def status(client):
diff --git a/acts/framework/acts/test_utils/bt/bt_test_utils.py b/acts/framework/acts/test_utils/bt/bt_test_utils.py
index aea9fb2..83b74e1 100644
--- a/acts/framework/acts/test_utils/bt/bt_test_utils.py
+++ b/acts/framework/acts/test_utils/bt/bt_test_utils.py
@@ -24,6 +24,7 @@
 from queue import Empty
 from subprocess import call
 
+from acts import asserts
 from acts.test_utils.bt.bt_constants import adv_fail
 from acts.test_utils.bt.bt_constants import adv_succ
 from acts.test_utils.bt.bt_constants import batch_scan_not_supported_list
@@ -58,7 +59,6 @@
 from acts.test_utils.tel.tel_test_utils import verify_http_connection
 from acts.utils import exe_cmd
 
-from acts import context
 from acts import utils
 
 log = logging
@@ -1745,3 +1745,55 @@
         log.error("Mismatch! Read: {}, Expected: {}".format(read_msg, msg))
         return False
     return True
+
+
+class MediaControlOverSl4a(object):
+    """Media control using sl4a facade for general purpose.
+
+    """
+    def __init__(self, android_device, music_file):
+        """Initialize the media_control class.
+
+        Args:
+            android_dut: android_device object
+            music_file: location of the music file
+        """
+        self.android_device = android_device
+        self.music_file = music_file
+
+    def play(self):
+        """Play media.
+
+        """
+        self.android_device.droid.mediaPlayOpen('file://%s' % self.music_file,
+                                                'default', True)
+        playing = self.android_device.droid.mediaIsPlaying()
+        asserts.assert_true(playing,
+                            'Failed to play music %s' % self.music_file)
+
+    def pause(self):
+        """Pause media.
+
+        """
+        self.android_device.droid.mediaPlayPause('default')
+        paused = not self.android_device.droid.mediaIsPlaying()
+        asserts.assert_true(paused,
+                            'Failed to pause music %s' % self.music_file)
+
+    def resume(self):
+        """Resume media.
+
+        """
+        self.android_device.droid.mediaPlayStart('default')
+        playing = self.android_device.droid.mediaIsPlaying()
+        asserts.assert_true(playing,
+                            'Failed to play music %s' % self.music_file)
+
+    def stop(self):
+        """Stop media.
+
+        """
+        self.android_device.droid.mediaPlayStop('default')
+        stopped = not self.android_device.droid.mediaIsPlaying()
+        asserts.assert_true(stopped,
+                            'Failed to stop music %s' % self.music_file)
diff --git a/acts/framework/acts/test_utils/coex/CoexPerformanceBaseTest.py b/acts/framework/acts/test_utils/coex/CoexPerformanceBaseTest.py
index cc8bde9..9624602 100644
--- a/acts/framework/acts/test_utils/coex/CoexPerformanceBaseTest.py
+++ b/acts/framework/acts/test_utils/coex/CoexPerformanceBaseTest.py
@@ -21,6 +21,8 @@
 
 from acts.metrics.loggers.blackbox import BlackboxMetricLogger
 from acts.test_utils.bt.bt_test_utils import disable_bluetooth
+from acts.test_utils.coex.audio_test_utils import AudioCaptureResult
+from acts.test_utils.coex.audio_test_utils import get_audio_capture_device
 from acts.test_utils.coex.CoexBaseTest import CoexBaseTest
 from acts.test_utils.coex.coex_test_utils import bokeh_chart_plot
 from acts.test_utils.coex.coex_test_utils import collect_bluetooth_manager_dumpsys_logs
@@ -30,8 +32,8 @@
 from acts.test_utils.wifi.wifi_test_utils import wifi_test_device_init
 from acts.utils import get_current_epoch_time
 
-RSSI_POLL_RESULTS = "Monitoring , Handle: 0x0003, POLL"
-RSSI_RESULTS = "Monitoring , Handle: 0x0003, "
+RSSI_POLL_RESULTS = 'Monitoring , Handle: 0x0003, POLL'
+RSSI_RESULTS = 'Monitoring , Handle: 0x0003, '
 
 
 def get_atten_range(start, stop, step):
@@ -70,12 +72,13 @@
             metric_name='wifi_range_metric')
 
     def setup_class(self):
-        req_params = ["test_params", "Attenuator"]
-        self.unpack_userparams(req_params)
-        if hasattr(self, "Attenuator"):
+        req_params = ['test_params', 'Attenuator']
+        opt_params = ['audio_params']
+        self.unpack_userparams(req_params, opt_params)
+        if hasattr(self, 'Attenuator'):
             self.num_atten = self.attenuators[0].instrument.num_atten
         else:
-            self.log.error("Attenuator should be connected to run tests.")
+            self.log.error('Attenuator should be connected to run tests.')
             return False
         for i in range(self.num_atten):
             self.attenuators[i].set_atten(0)
@@ -97,7 +100,9 @@
                             self.test_params["attenuation_step"]))
 
     def setup_test(self):
-        if "a2dp_streaming" in self.current_test_name:
+        if ('a2dp_streaming' in self.current_test_name and
+                hasattr(self, 'audio_params')):
+            self.audio = get_audio_capture_device(self.sec_ad, self.audio_params)
             self.a2dp_streaming = True
         for i in range(self.num_atten):
             self.attenuators[i].set_atten(0)
@@ -212,6 +217,8 @@
                 return self.iperf_received, self.a2dp_dropped_list, False
             time.sleep(5)  # Time for attenuation to set.
             begin_time = get_current_epoch_time()
+            if self.a2dp_streaming:
+                self.audio.start()
             if called_func:
                 if not multithread_func(self.log, called_func):
                     self.iperf_received.append(float(str(
@@ -230,7 +237,9 @@
                 self.log.info('Android device: {}'.format((
                     adb_rssi_results[-1]['log_message']).split(',')[5]))
             if self.a2dp_streaming:
-                analysis_path = self.audio.audio_quality_analysis(self.log_path)
+                self.path = self.audio.stop()
+                analysis_path = AudioCaptureResult(
+                    self.path).audio_quality_analysis(self.audio_params)
                 with open(analysis_path) as f:
                     self.rvr[bt_atten]["audio_artifacts"][atten] = f.readline()
                 content = json.loads(self.rvr[bt_atten]["audio_artifacts"][atten])
diff --git a/acts/framework/acts/test_utils/coex/audio_test_utils.py b/acts/framework/acts/test_utils/coex/audio_test_utils.py
index 02b99ca..f4dc403 100644
--- a/acts/framework/acts/test_utils/coex/audio_test_utils.py
+++ b/acts/framework/acts/test_utils/coex/audio_test_utils.py
@@ -15,7 +15,9 @@
 # the License.
 
 import logging
+import numpy
 import os
+import scipy.io.wavfile as sciwav
 
 from acts.test_utils.coex.audio_capture_device import AudioCaptureBase
 from acts.test_utils.coex.audio_capture_device import CaptureAudioOverAdb
@@ -65,8 +67,7 @@
 
 
 class AudioCaptureResult(AudioCaptureBase):
-
-    def __init__(self, path):
+    def __init__(self, path, audio_params=None):
         """Initializes Audio Capture Result class.
 
         Args:
@@ -74,7 +75,11 @@
         """
         super().__init__()
         self.path = path
-        self.analysis_path = os.path.join(self.log_path, ANALYSIS_FILE_TEMPLATE)
+        self.audio_params = audio_params
+        self.analysis_path = os.path.join(self.log_path,
+                                          ANALYSIS_FILE_TEMPLATE)
+        if self.audio_params:
+            self._trim_wave_file()
 
     def THDN(self, win_size=None, step_size=None, q=1, freq=None):
         """Calculate THD+N value for most recently recorded file.
@@ -104,7 +109,8 @@
                                                     q=q,
                                                     freq=freq)
 
-    def detect_anomalies(self, freq=None,
+    def detect_anomalies(self,
+                         freq=None,
                          block_size=ANOMALY_DETECTION_BLOCK_SIZE,
                          threshold=PATTERN_MATCHING_THRESHOLD,
                          tolerance=ANOMALY_GROUPING_TOLERANCE):
@@ -127,12 +133,11 @@
             channel_results (list): anomaly durations for each channel's signal.
                 List index corresponds to channel index.
         """
-        return audio_analysis.get_file_anomaly_durations(
-            filename=self.path,
-            freq=freq,
-            block_size=block_size,
-            threshold=threshold,
-            tolerance=tolerance)
+        return audio_analysis.get_file_anomaly_durations(filename=self.path,
+                                                         freq=freq,
+                                                         block_size=block_size,
+                                                         threshold=threshold,
+                                                         tolerance=tolerance)
 
     @property
     def analysis_fileno(self):
@@ -142,12 +147,9 @@
             counter += 1
         return counter
 
-    def audio_quality_analysis(self, audio_params):
+    def audio_quality_analysis(self):
         """Measures audio quality based on the audio file given as input.
 
-        Args:
-            path: Log path
-
         Returns:
             analysis_path on success.
         """
@@ -155,14 +157,35 @@
         if not os.path.exists(self.path):
             raise FileNotFound("Recorded file not found")
         try:
-            quality_analysis(
-                filename=self.path,
-                output_file=analysis_path,
-                bit_width=bits_per_sample,
-                rate=audio_params["sample_rate"],
-                channel=audio_params["channel"],
-                spectral_only=False)
+            quality_analysis(filename=self.path,
+                             output_file=analysis_path,
+                             bit_width=bits_per_sample,
+                             rate=self.audio_params["sample_rate"],
+                             channel=self.audio_params["channel"],
+                             spectral_only=False)
         except Exception as err:
             logging.exception("Failed to analyze raw audio: %s" % err)
         return analysis_path
 
+    def _trim_wave_file(self):
+        """Trim wave files.
+
+        """
+        original_record_file_name = 'original_' + os.path.basename(self.path)
+        original_record_file_path = os.path.join(os.path.dirname(self.path),
+                                                 original_record_file_name)
+        os.rename(self.path, original_record_file_path)
+        fs, data = sciwav.read(original_record_file_path)
+        trim_start = self.audio_params['trim_start']
+        trim_end = self.audio_params['trim_end']
+        trim = numpy.array([[trim_start, trim_end]])
+        trim = trim * fs
+        new_wave_file_list = []
+        for elem in trim:
+            # To check start and end doesn't exceed raw data dimension
+            start_read = min(elem[0], data.shape[0] - 1)
+            end_read = min(elem[1], data.shape[0] - 1)
+            new_wave_file_list.extend(data[start_read:end_read])
+        new_wave_file = numpy.array(new_wave_file_list)
+
+        sciwav.write(self.path, fs, new_wave_file)
diff --git a/acts/framework/acts/test_utils/coex/coex_test_utils.py b/acts/framework/acts/test_utils/coex/coex_test_utils.py
index ae4c399..27b1584 100644
--- a/acts/framework/acts/test_utils/coex/coex_test_utils.py
+++ b/acts/framework/acts/test_utils/coex/coex_test_utils.py
@@ -73,41 +73,38 @@
 AVRCP_WAIT_TIME = 3
 
 
-def avrcp_actions(pri_ad, audio_receiver):
+def avrcp_actions(pri_ad, bt_device):
     """Performs avrcp controls like volume up, volume down, skip next and
     skip previous.
 
     Args:
         pri_ad: Android device.
-        audio_receiver: Relay instance.
+        bt_device: bt device instance.
 
     Returns:
         True if successful, otherwise False.
     """
-    if "Volume_up" and "Volume_down" in (audio_receiver.relays.keys()):
-        current_volume = pri_ad.droid.getMediaVolume()
-        audio_receiver.press_volume_up()
+    current_volume = pri_ad.droid.getMediaVolume()
+    for _ in range(5):
+        bt_device.volume_up()
         time.sleep(AVRCP_WAIT_TIME)
-        if current_volume == pri_ad.droid.getMediaVolume():
-            pri_ad.log.error("Increase volume failed")
-            return False
+    if current_volume == pri_ad.droid.getMediaVolume():
+        pri_ad.log.error("Increase volume failed")
+        return False
+    time.sleep(AVRCP_WAIT_TIME)
+    current_volume = pri_ad.droid.getMediaVolume()
+    for _ in range(5):
+        bt_device.volume_down()
         time.sleep(AVRCP_WAIT_TIME)
-        current_volume = pri_ad.droid.getMediaVolume()
-        audio_receiver.press_volume_down()
-        time.sleep(AVRCP_WAIT_TIME)
-        if current_volume == pri_ad.droid.getMediaVolume():
-            pri_ad.log.error("Decrease volume failed")
-            return False
-    else:
-        pri_ad.log.warning("No volume control pins specfied in relay config.")
+    if current_volume == pri_ad.droid.getMediaVolume():
+        pri_ad.log.error("Decrease volume failed")
+        return False
 
-    if "Next" and "Previous" in audio_receiver.relays.keys():
-        audio_receiver.press_next()
-        time.sleep(AVRCP_WAIT_TIME)
-        audio_receiver.press_previous()
-        time.sleep(AVRCP_WAIT_TIME)
-    else:
-        pri_ad.log.warning("No track change pins specfied in relay config.")
+    #TODO: (sairamganesh) validate next and previous calls.
+    bt_device.next()
+    time.sleep(AVRCP_WAIT_TIME)
+    bt_device.previous()
+    time.sleep(AVRCP_WAIT_TIME)
     return True
 
 
diff --git a/acts/framework/acts/test_utils/gnss/gnss_test_utils.py b/acts/framework/acts/test_utils/gnss/gnss_test_utils.py
index fadfa4d..443cbfd 100644
--- a/acts/framework/acts/test_utils/gnss/gnss_test_utils.py
+++ b/acts/framework/acts/test_utils/gnss/gnss_test_utils.py
@@ -228,7 +228,9 @@
         network: Dictionary with network info.
     """
     SSID = network[WifiEnums.SSID_KEY]
-    wutils.start_wifi_connection_scan_and_return_status(ad)
+    ad.ed.clear_all_events()
+    wutils.reset_wifi(ad)
+    wutils.start_wifi_connection_scan_and_ensure_network_found(ad, SSID)
     wutils.wifi_connect(ad, network, num_of_tries=5)
 
 
diff --git a/acts/framework/acts/test_utils/instrumentation/app_installer.py b/acts/framework/acts/test_utils/instrumentation/app_installer.py
index c27d7e7..5c74f8c 100644
--- a/acts/framework/acts/test_utils/instrumentation/app_installer.py
+++ b/acts/framework/acts/test_utils/instrumentation/app_installer.py
@@ -24,81 +24,96 @@
 
 
 class AppInstaller(object):
-    """Class for installing apps on an Android device."""
-    def __init__(self, device):
-        self.ad = device
-        self._pkgs = {}
-
-    def install(self, apk_path, *extra_args):
-        """Installs an apk on the device.
+    """Class that represents an app on an Android device. Includes methods
+    for install, uninstall, and getting info.
+    """
+    def __init__(self, ad, apk_path):
+        """Initializes an AppInstaller.
 
         Args:
-            apk_path: Path to the apk to install
+            ad: device to install the apk
+            apk_path: path to the apk
+        """
+        self._ad = ad
+        self._apk_path = apk_path
+        self._pkg_name = None
+
+    @staticmethod
+    def pull_from_device(ad, pkg_name, dest):
+        """Initializes an AppInstaller by pulling the apk file from the device,
+        given the package name
+
+        Args:
+            ad: device on which the apk is installed
+            pkg_name: package name
+            dest: destination directory
+                (Note: If path represents a directory, it must already exist as
+                 a directory)
+
+        Returns: AppInstaller object representing the pulled apk, or None if
+            package not installed
+        """
+        if not ad.is_apk_installed(pkg_name):
+            ad.log.warning('Unable to find package %s on device. Pull aborted.'
+                           % pkg_name)
+            return None
+        path_on_device = re.compile(PM_PATH_PATTERN).search(
+            ad.adb.shell('pm path %s' % pkg_name)).group('apk_path')
+        ad.pull_files(path_on_device, dest)
+        if os.path.isdir(dest):
+            dest = os.path.join(dest, os.path.basename(path_on_device))
+        return AppInstaller(ad, dest)
+
+    @property
+    def apk_path(self):
+        return self._apk_path
+
+    @property
+    def pkg_name(self):
+        """Get the package name corresponding to the apk from aapt
+
+        Returns: The package name, or empty string if not found.
+        """
+        if self._pkg_name is None:
+            dump = job.run(
+                'aapt dump badging %s' % self.apk_path,
+                ignore_status=True).stdout
+            match = re.compile(PKG_NAME_PATTERN).search(dump)
+            self._pkg_name = match.group('pkg_name') if match else ''
+        return self._pkg_name
+
+    def install(self, *extra_args):
+        """Installs the apk on the device.
+
+        Args:
             extra_args: Additional flags to the ADB install command.
                 Note that '-r' is included by default.
         """
-        self.ad.log.info('Installing app %s' % apk_path)
-        self.ad.ensure_screen_on()
+        self._ad.log.info('Installing app %s' % self.apk_path)
+        self._ad.ensure_screen_on()
         args = '-r %s' % ' '.join(extra_args)
-        self.ad.adb.install('%s %s' % (args, apk_path))
+        self._ad.adb.install('%s %s' % (args, self.apk_path))
 
-    def uninstall(self, apk_path, *extra_args):
-        """Finds the package corresponding to the apk and uninstalls it from the
-        device.
+    def uninstall(self, *extra_args):
+        """Uninstalls the apk from the device.
 
         Args:
-            apk_path: Path to the apk
             extra_args: Additional flags to the uninstall command.
         """
-        if self.is_installed(apk_path):
-            pkg_name = self.get_package_name(apk_path)
-            self.ad.log.info('Uninstalling app %s' % pkg_name)
-            self.ad.adb.shell(
-                'pm uninstall %s %s' % (' '.join(extra_args), pkg_name))
+        self._ad.log.info('Uninstalling app %s' % self.pkg_name)
+        if not self.is_installed():
+            self._ad.log.warning('Unable to uninstall app %s. App is not '
+                                 'installed.' % self.pkg_name)
+            return
+        self._ad.adb.shell(
+            'pm uninstall %s %s' % (' '.join(extra_args), self.pkg_name))
 
-    def is_installed(self, apk_path):
-        """Verifies that an apk is installed on the device.
-
-        Args:
-            apk_path: Path to the apk
+    def is_installed(self):
+        """Verifies that the apk is installed on the device.
 
         Returns: True if the apk is installed on the device.
         """
-        pkg_name = self.get_package_name(apk_path)
-        if not pkg_name:
-            self.ad.log.warning('No package name found for %s' % apk_path)
+        if not self.pkg_name:
+            self._ad.log.warning('No package name found for %s' % self.apk_path)
             return False
-        return self.ad.is_apk_installed(pkg_name)
-
-    def get_package_name(self, apk_path):
-        """Get the package name corresponding to the apk from aapt
-
-        Args:
-            apk_path: Path to the apk
-
-        Returns: The package name
-        """
-        if apk_path not in self._pkgs:
-            dump = job.run(
-                'aapt dump badging %s' % apk_path, ignore_status=True).stdout
-            match = re.compile(PKG_NAME_PATTERN).search(dump)
-            self._pkgs[apk_path] = match.group('pkg_name') if match else ''
-        return self._pkgs[apk_path]
-
-    def pull_apk(self, package_name, dest):
-        """Pull the corresponding apk file from device given the package name
-
-        Args:
-            package_name: Package name
-            dest: Destination directory
-
-        Returns: Path to the pulled apk, or None if package not installed
-        """
-        if not self.ad.is_apk_installed(package_name):
-            self.ad.log.warning('Unable to find package %s on device. Pull '
-                                'aborted.' % package_name)
-            return None
-        apk_path = re.compile(PM_PATH_PATTERN).search(
-            self.ad.adb.shell('pm path %s' % package_name)).group('apk_path')
-        self.ad.pull_files(apk_path, dest)
-        return os.path.join(dest, os.path.basename(apk_path))
+        return self._ad.is_apk_installed(self.pkg_name)
diff --git a/acts/framework/acts/test_utils/instrumentation/instrumentation_base_test.py b/acts/framework/acts/test_utils/instrumentation/instrumentation_base_test.py
index dbf8360..6b85a87 100644
--- a/acts/framework/acts/test_utils/instrumentation/instrumentation_base_test.py
+++ b/acts/framework/acts/test_utils/instrumentation/instrumentation_base_test.py
@@ -22,10 +22,10 @@
 from acts import context
 from acts import utils
 from acts.keys import Config
-from acts.test_utils.instrumentation import app_installer
 from acts.test_utils.instrumentation import instrumentation_proto_parser \
     as proto_parser
 from acts.test_utils.instrumentation.adb_commands import common
+from acts.test_utils.instrumentation.app_installer import AppInstaller
 from acts.test_utils.instrumentation.config_wrapper import ConfigWrapper
 from acts.test_utils.instrumentation.instrumentation_command_builder import \
     InstrumentationCommandBuilder
@@ -126,7 +126,6 @@
     def setup_class(self):
         """Class setup"""
         self.ad_dut = self.android_devices[0]
-        self.ad_apps = app_installer.AppInstaller(self.ad_dut)
         self._prepare_device()
 
     def teardown_class(self):
@@ -274,15 +273,15 @@
         # Install PermissionUtils.apk
         permissions_apk_path = self._instrumentation_config.get_file(
             'permissions_apk')
-        self.ad_apps.install(permissions_apk_path)
-        if not self.ad_apps.is_installed(permissions_apk_path):
+        permission_utils = AppInstaller(self.ad_dut, permissions_apk_path)
+        permission_utils.install()
+        if not permission_utils.is_installed():
             raise InstrumentationTestError(
                 'Failed to install PermissionUtils.apk, abort!')
-        package_name = self.ad_apps.get_package_name(permissions_apk_path)
 
         # Run the instrumentation command
         cmd_builder = InstrumentationCommandBuilder()
-        cmd_builder.set_manifest_package(package_name)
+        cmd_builder.set_manifest_package(permission_utils.pkg_name)
         cmd_builder.set_runner('.PermissionInstrumentation')
         cmd_builder.add_flag('-w')
         cmd_builder.add_flag('-r')
@@ -292,4 +291,4 @@
         self.adb_run(cmd)
 
         # Uninstall PermissionUtils.apk
-        self.ad_apps.uninstall(permissions_apk_path)
+        permission_utils.uninstall()
diff --git a/acts/framework/acts/test_utils/power/PowerBTBaseTest.py b/acts/framework/acts/test_utils/power/PowerBTBaseTest.py
index bd7dcfb..8979822 100644
--- a/acts/framework/acts/test_utils/power/PowerBTBaseTest.py
+++ b/acts/framework/acts/test_utils/power/PowerBTBaseTest.py
@@ -37,14 +37,14 @@
         obj_atten: attenuator object, a single port attenuator
         attenuation_target: target attenuation level to reach to.
     """
-    attenuation_step_max = 5
+    attenuation_step_max = 20
     sign = lambda x: copysign(1, x)
     attenuation_delta = obj_atten.get_atten() - attenuation_target
     while abs(attenuation_delta) > attenuation_step_max:
         attenuation_intermediate = obj_atten.get_atten(
         ) - sign(attenuation_delta) * attenuation_step_max
         obj_atten.set_atten(attenuation_intermediate)
-        time.sleep(2)
+        time.sleep(5)
         attenuation_delta = obj_atten.get_atten() - attenuation_target
     obj_atten.set_atten(attenuation_target)
 
diff --git a/acts/framework/acts/test_utils/power/PowerBaseTest.py b/acts/framework/acts/test_utils/power/PowerBaseTest.py
index 53fbc7a..300c027 100644
--- a/acts/framework/acts/test_utils/power/PowerBaseTest.py
+++ b/acts/framework/acts/test_utils/power/PowerBaseTest.py
@@ -189,9 +189,9 @@
         self.power_logger.set_avg_power(self.power_result.metric_value)
         self.power_logger.set_testbed(self.testbed_name)
 
-        build_id = self.dut.build_info.get('incremental_build_id')
-        branch = self.user_params.get('branch')
-        target = self.dut.device_info.get('flavor')
+        build_id = self.dut.build_info.get('incremental_build_id', '')
+        branch = self.user_params.get('branch', '')
+        target = self.dut.device_info.get('flavor', '')
 
         self.power_logger.set_branch(branch)
         self.power_logger.set_build_id(build_id)
diff --git a/acts/framework/acts/test_utils/tel/tel_data_utils.py b/acts/framework/acts/test_utils/tel/tel_data_utils.py
index 4ff6550..0daea65 100644
--- a/acts/framework/acts/test_utils/tel/tel_data_utils.py
+++ b/acts/framework/acts/test_utils/tel/tel_data_utils.py
@@ -15,6 +15,8 @@
 #   limitations under the License.
 
 import time
+import random
+import re
 
 from acts.utils import rand_ascii_str
 from acts.test_utils.tel.tel_subscription_utils import \
@@ -46,7 +48,9 @@
 from acts.test_utils.tel.tel_test_utils import WIFI_CONFIG_APBAND_5G
 from acts.test_utils.tel.tel_test_utils import get_service_state_by_adb
 from acts.test_utils.tel.tel_test_utils import wait_for_state
-
+from acts.test_utils.tel.tel_test_utils import get_mobile_data_usage
+from acts.test_utils.tel.tel_test_utils import get_wifi_usage
+from acts.test_utils.tel.tel_test_utils import check_is_wifi_connected
 
 def wifi_tethering_cleanup(log, provider, client_list):
     """Clean up steps for WiFi Tethering.
@@ -495,3 +499,104 @@
         ad.log.error("No Internet access after changing Data SIM.")
         return False
     return True
+
+def browsing_test(log, ad, wifi_ssid=None, pass_threshold_in_mb = 1.0):
+    """ Ramdomly browse 6 among 23 selected web sites. The idle time is used to
+    simulate visit duration and normally distributed with the mean 35 seconds
+    and std dev 15 seconds, which means 95% of visit duration will be between
+    5 and 65 seconds. DUT will enter suspend mode when idle time is greater than
+    35 seconds.
+
+    Args:
+        log: log object.
+        ad: android object.
+        pass_threshold_in_mb: minimum traffic of browsing 6 web sites in MB for
+            test pass
+
+    Returns:
+        True if the total traffic of Chrome for browsing 6 web sites is greater
+        than pass_threshold_in_mb. Otherwise False.
+    """
+    web_sites = [
+        "http://tw.yahoo.com",
+        "http://24h.pchome.com.tw",
+        "http://www.mobile01.com",
+        "https://www.android.com/phones/",
+        "http://www.books.com.tw",
+        "http://www.udn.com.tw",
+        "http://news.baidu.com",
+        "http://www.google.com",
+        "http://www.cnn.com",
+        "http://www.nytimes.com",
+        "http://www.amazon.com",
+        "http://www.wikipedia.com",
+        "http://www.ebay.com",
+        "http://www.youtube.com",
+        "http://espn.go.com",
+        "http://www.sueddeutsche.de",
+        "http://www.bild.de",
+        "http://www.welt.de",
+        "http://www.lefigaro.fr",
+        "http://www.accuweather.com",
+        "https://www.flickr.com",
+        "http://world.taobao.com",
+        "http://www.theguardian.com"]
+
+    wifi_connected = False
+    if wifi_ssid and check_is_wifi_connected(ad.log, ad, wifi_ssid):
+        wifi_connected = True
+        usage_level_at_start = get_wifi_usage(ad, apk="com.android.chrome")
+    else:
+        usage_level_at_start = get_mobile_data_usage(ad, apk="com.android.chrome")
+
+    for web_site in random.sample(web_sites, 6):
+        ad.log.info("Browsing %s..." % web_site)
+        ad.adb.shell(
+            "am start -a android.intent.action.VIEW -d %s --es "
+            "com.android.browser.application_id com.android.browser" % web_site)
+
+        idle_time = round(random.normalvariate(35, 15))
+        if idle_time < 2:
+            idle_time = 2
+        elif idle_time > 90:
+            idle_time = 90
+
+        ad.log.info(
+            "Idle time before browsing next web site: %s sec." % idle_time)
+
+        if idle_time > 35:
+            time.sleep(35)
+            rest_idle_time = idle_time-35
+            if rest_idle_time < 3:
+                rest_idle_time = 3
+            ad.log.info("Let device go to sleep for %s sec." % rest_idle_time)
+            ad.droid.wakeLockRelease()
+            ad.droid.goToSleepNow()
+            time.sleep(rest_idle_time)
+            ad.log.info("Wake up device.")
+            ad.droid.wakeLockAcquireBright()
+            ad.droid.wakeUpNow()
+            time.sleep(3)
+        else:
+            time.sleep(idle_time)
+
+    if wifi_connected:
+        usage_level = get_wifi_usage(ad, apk="com.android.chrome")
+    else:
+        usage_level = get_mobile_data_usage(ad, apk="com.android.chrome")
+
+    try:
+        usage = round((usage_level - usage_level_at_start)/1024/1024, 2)
+        if usage < pass_threshold_in_mb:
+            ad.log.error(
+                "Usage of browsing '%s MB' is smaller than %s " % (
+                    usage, pass_threshold_in_mb))
+            return False
+        else:
+            ad.log.info("Usage of browsing: %s MB" % usage)
+            return True
+    except Exception as e:
+        ad.log.error(e)
+        usage = "unknown"
+        ad.log.info("Usage of browsing: %s MB" % usage)
+        return False
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 1a94e51..bd5997c 100644
--- a/acts/framework/acts/test_utils/tel/tel_test_utils.py
+++ b/acts/framework/acts/test_utils/tel/tel_test_utils.py
@@ -3722,6 +3722,37 @@
             ad.adb.shell("rm %s" % file_path, ignore_status=True)
 
 
+def get_wifi_usage(ad, sid=None, apk=None):
+    if not sid:
+        sid = ad.droid.subscriptionGetDefaultDataSubId()
+    current_time = int(time.time() * 1000)
+    begin_time = current_time - 10 * 24 * 60 * 60 * 1000
+    end_time = current_time + 10 * 24 * 60 * 60 * 1000
+
+    if apk:
+        uid = ad.get_apk_uid(apk)
+        ad.log.debug("apk %s uid = %s", apk, uid)
+        try:
+            return ad.droid.connectivityQueryDetailsForUid(
+                TYPE_WIFI,
+                ad.droid.telephonyGetSubscriberIdForSubscription(sid),
+                begin_time, end_time, uid)
+        except:
+            return ad.droid.connectivityQueryDetailsForUid(
+                ad.droid.telephonyGetSubscriberIdForSubscription(sid),
+                begin_time, end_time, uid)
+    else:
+        try:
+            return ad.droid.connectivityQuerySummaryForDevice(
+                TYPE_WIFI,
+                ad.droid.telephonyGetSubscriberIdForSubscription(sid),
+                begin_time, end_time)
+        except:
+            return ad.droid.connectivityQuerySummaryForDevice(
+                ad.droid.telephonyGetSubscriberIdForSubscription(sid),
+                begin_time, end_time)
+
+
 def get_mobile_data_usage(ad, sid=None, apk=None):
     if not sid:
         sid = ad.droid.subscriptionGetDefaultDataSubId()
diff --git a/acts/framework/acts/test_utils/wifi/WifiBaseTest.py b/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
index cb7ab80..82d655f 100644
--- a/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
+++ b/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
@@ -24,6 +24,7 @@
 import acts.controllers.access_point as ap
 
 from acts import asserts
+from acts import signals
 from acts import utils
 from acts.base_test import BaseTestClass
 from acts.signals import TestSignal
@@ -608,3 +609,46 @@
             hostapd_constants.BAND_5G, channel_5g)
         if not result:
             raise ValueError("Failed to configure channel for 5G band.")
+
+    @staticmethod
+    def wifi_test_wrap(fn):
+        def _safe_wrap_test_case(self, *args, **kwargs):
+            test_id = "%s:%s:%s" % (self.__class__.__name__, self.test_name,
+                                    self.log_begin_time.replace(' ', '-'))
+            self.test_id = test_id
+            self.result_detail = ""
+            tries = int(self.user_params.get("wifi_auto_rerun", 3))
+            for ad in self.android_devices:
+                ad.log_path = self.log_path
+            for i in range(tries + 1):
+                result = True
+                if i > 0:
+                    log_string = "[Test Case] RETRY:%s %s" % (i, self.test_name)
+                    self.log.info(log_string)
+                    self._teardown_test(self.test_name)
+                    self._setup_test(self.test_name)
+                try:
+                    result = fn(self, *args, **kwargs)
+                except signals.TestFailure as e:
+                    self.log.warn("Error msg: %s" % e)
+                    if self.result_detail:
+                        signal.details = self.result_detail
+                    result = False
+                except signals.TestSignal:
+                    if self.result_detail:
+                        signal.details = self.result_detail
+                    raise
+                except Exception as e:
+                    self.log.exception(e)
+                    asserts.fail(self.result_detail)
+                if result is False:
+                    if i < tries:
+                        continue
+                else:
+                    break
+            if result is not False:
+                asserts.explicit_pass(self.result_detail)
+            else:
+                asserts.fail(self.result_detail)
+
+        return _safe_wrap_test_case
diff --git a/acts/framework/acts/test_utils/wifi/wifi_performance_test_utils.py b/acts/framework/acts/test_utils/wifi/wifi_performance_test_utils.py
index 7d1f3ab..461c45e 100644
--- a/acts/framework/acts/test_utils/wifi/wifi_performance_test_utils.py
+++ b/acts/framework/acts/test_utils/wifi/wifi_performance_test_utils.py
@@ -1041,7 +1041,7 @@
     Returns:
         temperature: device temperature. 0 if temperature could not be read
     """
-    candidate_zones = ['sdm-therm-monitor', 'sdm-therm-adc', 'back_therm']
+    candidate_zones = ['skin-therm', 'sdm-therm-monitor', 'sdm-therm-adc', 'back_therm']
     for zone in candidate_zones:
         try:
             temperature = int(
diff --git a/acts/framework/acts/utils.py b/acts/framework/acts/utils.py
index 99c961a..b42ea21 100755
--- a/acts/framework/acts/utils.py
+++ b/acts/framework/acts/utils.py
@@ -19,6 +19,7 @@
 import copy
 import datetime
 import functools
+import IPy
 import json
 import logging
 import os
@@ -1381,3 +1382,97 @@
 def ascii_string(uc_string):
     """Converts unicode string to ascii"""
     return str(uc_string).encode('ASCII')
+
+
+def get_interface_ip_addresses(comm_channel, interface):
+    """Gets all of the ip addresses, ipv4 and ipv6, associated with a
+       particular interface name.
+
+    Args:
+        comm_channel: How to send commands to a device.  Can be ssh, adb serial,
+            etc.  Must have the run function implemented.
+        interface: The interface name on the device, ie eth0
+
+    Returns:
+        A list of dictionaries of the the various IP addresses:
+            ipv4_private_local_addresses: Any 192.168, 172.16, or 10
+                addresses
+            ipv4_public_addresses: Any IPv4 public addresses
+            ipv6_link_local_addresses: Any fe80:: addresses
+            ipv6_private_local_addresses: Any fd00:: addresses
+            ipv6_public_addresses: Any publicly routable addresses
+    """
+    ipv4_private_local_addresses = []
+    ipv4_public_addresses = []
+    ipv6_link_local_addresses = []
+    ipv6_private_local_addresses = []
+    ipv6_public_addresses = []
+    all_interfaces_and_addresses = comm_channel.run(
+        'ip -o addr | awk \'!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); '
+        'print $2" "$4}\'').stdout
+    ifconfig_output = comm_channel.run('ifconfig %s' % interface).stdout
+    for interface_line in all_interfaces_and_addresses.split('\n'):
+        if interface != interface_line.split()[0]:
+            continue
+        on_device_ip = IPy.IP(interface_line.split()[1])
+        if on_device_ip.version() is 4:
+            if on_device_ip.iptype() == 'PRIVATE':
+                if str(on_device_ip) in ifconfig_output:
+                    ipv4_private_local_addresses.append(
+                        on_device_ip.strNormal())
+            elif on_device_ip.iptype() == 'PUBLIC':
+                if str(on_device_ip) in ifconfig_output:
+                    ipv4_public_addresses.append(on_device_ip.strNormal())
+        elif on_device_ip.version() is 6:
+            if on_device_ip.iptype() == 'LINKLOCAL':
+                if str(on_device_ip) in ifconfig_output:
+                    ipv6_link_local_addresses.append(on_device_ip.strNormal())
+            elif on_device_ip.iptype() == 'ULA':
+                if str(on_device_ip) in ifconfig_output:
+                    ipv6_private_local_addresses.append(
+                        on_device_ip.strNormal())
+            elif 'ALLOCATED' in on_device_ip.iptype():
+                if str(on_device_ip) in ifconfig_output:
+                    ipv6_public_addresses.append(on_device_ip.strNormal())
+    return {
+        'ipv4_private': ipv4_private_local_addresses,
+        'ipv4_public': ipv4_public_addresses,
+        'ipv6_link_local': ipv6_link_local_addresses,
+        'ipv6_private_local': ipv6_private_local_addresses,
+        'ipv6_public': ipv6_public_addresses
+    }
+
+
+def get_interface_based_on_ip(comm_channel, desired_ip_address):
+    """Gets the interface for a particular IP
+
+    Args:
+        comm_channel: How to send commands to a device.  Can be ssh, adb serial,
+            etc.  Must have the run function implemented.
+        desired_ip_address: The IP address that is being looked for on a device.
+
+    Returns:
+        The name of the test interface.
+    """
+
+    desired_ip_address = desired_ip_address.split('%', 1)[0]
+    all_ips_and_interfaces = comm_channel.run(
+        '(ip -o -4 addr show; ip -o -6 addr show) | '
+        'awk \'{print $2" "$4}\'').stdout
+    #ipv4_addresses = comm_channel.run(
+    #    'ip -o -4 addr show| awk \'{print $2": "$4}\'').stdout
+    #ipv6_addresses = comm_channel._ssh_session.run(
+    #    'ip -o -6 addr show| awk \'{print $2": "$4}\'').stdout
+    #if desired_ip_address in ipv4_addresses:
+    #    ip_addresses_to_search = ipv4_addresses
+    #elif desired_ip_address in ipv6_addresses:
+    #    ip_addresses_to_search = ipv6_addresses
+    for ip_address_and_interface in all_ips_and_interfaces.split('\n'):
+        if desired_ip_address in ip_address_and_interface:
+            return ip_address_and_interface.split()[1][:-1]
+    return None
+
+
+def renew_linux_ip_address(comm_channel, interface):
+    comm_channel.run('sudo dhclient -r %s' % interface)
+    comm_channel.run('sudo dhclient %s' % interface)
diff --git a/acts/framework/setup.py b/acts/framework/setup.py
index 32b8a93..2aa136c 100755
--- a/acts/framework/setup.py
+++ b/acts/framework/setup.py
@@ -23,6 +23,7 @@
 import sys
 
 install_requires = [
+    'backoff',
     # Future needs to have a newer version that contains urllib.
     'future>=0.16.0',
     'mock',
@@ -39,6 +40,7 @@
     'xlsxwriter',
     'mobly',
     'grpcio',
+    'IPy',
     'Monsoon',
     # paramiko-ng is needed vs paramiko as currently paramiko does not support
     # ed25519 ssh keys, which is what Fuchsia uses.
@@ -58,16 +60,20 @@
     """Class used to execute unit tests using PyTest. This allows us to execute
     unit tests without having to install the package.
     """
-
     def finalize_options(self):
         test.test.finalize_options(self)
         self.test_args = ['-x', "tests"]
         self.test_suite = True
 
     def run_tests(self):
-        import pytest
-        errno = pytest.main(self.test_args)
-        sys.exit(errno)
+        test_path = os.path.join(os.path.dirname(__file__),
+                                 '../tests/meta/ActsUnitTest.py')
+        result = subprocess.Popen('python3 %s' % test_path,
+                                  stdout=sys.stdout,
+                                  stderr=sys.stderr,
+                                  shell=True)
+        result.communicate()
+        sys.exit(result.returncode)
 
 
 class ActsInstallDependencies(cmd.Command):
@@ -143,9 +149,8 @@
         try:
             import acts as acts_module
         except ImportError:
-            self.announce(
-                'Acts is not installed, nothing to uninstall.',
-                level=log.ERROR)
+            self.announce('Acts is not installed, nothing to uninstall.',
+                          level=log.ERROR)
             return
 
         while acts_module:
@@ -166,22 +171,21 @@
         os.path.join(framework_dir, 'acts', 'bin', 'monsoon.py')
     ]
 
-    setuptools.setup(
-        name='acts',
-        version='0.9',
-        description='Android Comms Test Suite',
-        license='Apache2.0',
-        packages=setuptools.find_packages(),
-        include_package_data=False,
-        tests_require=['pytest'],
-        install_requires=install_requires,
-        scripts=scripts,
-        cmdclass={
-            'test': PyTest,
-            'install_deps': ActsInstallDependencies,
-            'uninstall': ActsUninstall
-        },
-        url="http://www.android.com/")
+    setuptools.setup(name='acts',
+                     version='0.9',
+                     description='Android Comms Test Suite',
+                     license='Apache2.0',
+                     packages=setuptools.find_packages(),
+                     include_package_data=False,
+                     tests_require=['pytest'],
+                     install_requires=install_requires,
+                     scripts=scripts,
+                     cmdclass={
+                         'test': PyTest,
+                         'install_deps': ActsInstallDependencies,
+                         'uninstall': ActsUninstall
+                     },
+                     url="http://www.android.com/")
 
     if {'-u', '--uninstall', 'uninstall'}.intersection(sys.argv):
         installed_scripts = [
diff --git a/acts/tests/google/coex/apollo_tests/ApolloBasicPerformanceTest.py b/acts/tests/google/coex/apollo_tests/ApolloBasicPerformanceTest.py
deleted file mode 100755
index 9ae508f..0000000
--- a/acts/tests/google/coex/apollo_tests/ApolloBasicPerformanceTest.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (C) 2018 The Android Open Source Project
-#
-# 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.
-
-from acts.controllers.buds_lib.apollo_utils import get_serial_object
-from acts.test_utils.bt import BtEnum
-from acts.test_utils.coex.CoexPerformanceBaseTest import CoexPerformanceBaseTest
-from acts.test_utils.coex.coex_test_utils import perform_classic_discovery
-from acts.test_utils.coex.coex_test_utils import pair_and_connect_headset
-
-
-class ApolloBasicPerformanceTest(CoexPerformanceBaseTest):
-    """Test suite to check A2DP Functionality with Wlan.
-
-        Test Setup:
-
-            Two Android device.
-            One apollo board.
-    """
-    def setup_class(self):
-        super().setup_class()
-        req_params = ["serial_device"]
-        self.unpack_userparams(req_params)
-        self.buds_device = get_serial_object(self.pri_ad, self.serial_device)
-        self.headset_mac_address = self.buds_device.bluetooth_address
-
-    def perform_classic_discovery_with_iperf(self):
-        """Wrapper function to start iperf traffic and classic discovery.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        tasks = [(perform_classic_discovery, (self.pri_ad,
-                                              self.iperf['duration'],
-                                              self.json_file,
-                                              self.dev_list)),
-                 (self.run_iperf_and_get_result, ())]
-        return self.set_attenuation_and_run_iperf(tasks)
-
-    def connect_headset(self):
-        """Connect to apollo headset.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        self.buds_device.send("ResetPair\n")
-        self.buds_device.set_pairing_mode()
-        if not pair_and_connect_headset(
-                self.pri_ad, self.headset_mac_address,
-                set([BtEnum.BluetoothProfile.A2DP.value])):
-            self.log.error("Failed to pair and connect to headset")
-            return False
-        self.buds_device.set_stay_connected(1)
-
-    def test_performance_with_bluetooth_discovery_tcp_ul(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start TCP-uplink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_performance_with_bluetooth_discovery_tcp_dl(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start TCP-downlink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_performance_with_bluetooth_discovery_udp_ul(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start UDP-uplink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_performance_with_bluetooth_discovery_udp_dl(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start UDP-downlink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_inquiry_after_headset_connection_with_tcp_ul(self):
-        """Starts TCP-uplink traffic, start inquiry after bluetooth connection.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test functional behaviour of bluetooth discovery
-        after connecting to headset.
-
-        Steps:
-        1. Run TCP-uplink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        self.connect_headset()
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_tcp_dl(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run TCP-downlink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        self.connect_headset()
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_udp_ul(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run UDP-uplink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        self.connect_headset()
-        return self.perform_classic_discovery_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_udp_dl(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run UDP-downlink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        self.connect_headset()
-        return self.perform_classic_discovery_with_iperf()
diff --git a/acts/tests/google/coex/apollo_tests/ApolloWithA2dpPerformanceTest.py b/acts/tests/google/coex/apollo_tests/ApolloWithA2dpPerformanceTest.py
deleted file mode 100755
index 87f56bf..0000000
--- a/acts/tests/google/coex/apollo_tests/ApolloWithA2dpPerformanceTest.py
+++ /dev/null
@@ -1,288 +0,0 @@
-# /usr/bin/env python3
-#
-# Copyright (C) 2018 The Android Open Source Project
-#
-# 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.
-
-from acts.controllers.buds_lib.apollo_utils import avrcp_actions
-from acts.controllers.buds_lib.apollo_utils import get_serial_object
-from acts.test_utils.bt import BtEnum
-from acts.test_utils.bt.bt_test_utils import clear_bonded_devices
-from acts.test_utils.coex.audio_test_utils import SshAudioCapture
-from acts.test_utils.coex.CoexPerformanceBaseTest import CoexPerformanceBaseTest
-from acts.test_utils.coex.coex_test_utils import music_play_and_check
-from acts.test_utils.coex.coex_test_utils import pair_and_connect_headset
-from acts.test_utils.coex.coex_test_utils import perform_classic_discovery
-from acts.test_utils.coex.coex_test_utils import push_music_to_android_device
-
-AVRCP_WAIT_TIME = 5
-
-
-class ApolloWithA2dpPerformanceTest(CoexPerformanceBaseTest):
-
-    def setup_class(self):
-        super().setup_class()
-        req_params = ["serial_device", "audio_params"]
-        self.unpack_userparams(req_params)
-        self.buds_device = get_serial_object(self.pri_ad, self.serial_device)
-        self.headset_mac_address = self.buds_device.bluetooth_address
-        self.music_file_to_play = push_music_to_android_device(
-            self.pri_ad, self.audio_params)
-
-    def setup_test(self):
-        super().setup_test()
-        if "a2dp_streaming" in self.current_test_name:
-            self.audio = SshAudioCapture(self.audio_params, self.log_path)
-        self.buds_device.send("ResetPair\n")
-        self.buds_device.set_pairing_mode()
-        if not pair_and_connect_headset(
-                self.pri_ad, self.headset_mac_address,
-                set([BtEnum.BluetoothProfile.A2DP.value])):
-            self.log.error("Failed to pair and connect to headset")
-            return False
-        self.buds_device.set_stay_connected(1)
-
-    def teardown_test(self):
-        if "a2dp_streaming" in self.current_test_name:
-            self.audio.terminate_and_store_audio_results()
-        clear_bonded_devices(self.pri_ad)
-        super().teardown_test()
-
-    def teardown_class(self):
-        super().teardown_class()
-
-    def initiate_music_streaming_to_headset_with_iperf(self):
-        """Initiate music streaming to headset and start iperf traffic."""
-        tasks = [(self.audio.capture_audio, ()),
-                 (music_play_and_check, (self.pri_ad,
-                                         self.headset_mac_address,
-                                         self.music_file_to_play,
-                                         self.audio_params[
-                                             'music_play_time'])),
-                 (self.run_iperf_and_get_result, ())]
-        return self.set_attenuation_and_run_iperf(tasks)
-
-    def perform_discovery_with_iperf(self):
-        """Starts iperf traffic based on test and perform bluetooth classic
-        discovery.
-        """
-        tasks = [(self.run_iperf_and_get_result, ()),
-                 (perform_classic_discovery, (self.pri_ad,
-                                              self.iperf['duration'],
-                                              self.json_file,
-                                              self.dev_list))]
-        return self.set_attenuation_and_run_iperf(tasks)
-
-    def music_streaming_and_avrcp_controls_with_iperf(self):
-        """Starts iperf traffic based on test and initiate music streaming and
-        check for avrcp controls.
-        """
-        tasks = [(self.audio.capture_audio, ()),
-                 (music_play_and_check, (self.pri_ad,
-                                         self.headset_mac_address,
-                                         self.music_file_to_play,
-                                         self.iperf['duration'])),
-                 (self.run_iperf_and_get_result, ()),
-                 (avrcp_actions, (self.pri_ad,
-                                  self.buds_device))]
-        return self.set_attenuation_and_run_iperf(tasks)
-
-    def test_performance_a2dp_streaming_tcp_ul(self):
-        """Performance test to check throughput when streaming music.
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start TCP-uplink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.initiate_music_streaming_to_headset_with_iperf()
-
-    def test_performance_a2dp_streaming_tcp_dl(self):
-        """Performance test to check throughput when streaming music.
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start TCP-downlink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.initiate_music_streaming_to_headset_with_iperf()
-
-    def test_performance_a2dp_streaming_udp_ul(self):
-        """Performance test to check throughput when streaming music.
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.initiate_music_streaming_to_headset_with_iperf()
-
-    def test_performance_a2dp_streaming_udp_dl(self):
-        """Performance test to check throughput when streaming music.
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start UDP-downlink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.initiate_music_streaming_to_headset_with_iperf()
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_tcp_ul(self):
-        """Performance test to check throughput when music streaming.
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start TCP-uplink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.music_streaming_and_avrcp_controls_with_iperf()
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_tcp_dl(self):
-        """Performance test to check throughput when music streaming.
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start TCP-downlink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.music_streaming_and_avrcp_controls_with_iperf()
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_udp_ul(self):
-        """Performance test to check throughput when music streaming.
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.music_streaming_and_avrcp_controls_with_iperf()
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_udp_dl(self):
-        """Performance test to check throughput when music streaming.
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start UDP-downlink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.music_streaming_and_avrcp_controls_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_tcp_ul(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run TCP-uplink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_discovery_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_tcp_dl(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run TCP-downlink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_030
-        """
-        return self.perform_discovery_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_udp_ul(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run UDP-uplink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_discovery_with_iperf()
-
-    def test_performance_inquiry_after_headset_connection_with_udp_dl(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run UDP-downlink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-        """
-        return self.perform_discovery_with_iperf()
diff --git a/acts/tests/google/coex/performance_tests/CoexBasicPerformanceTest.py b/acts/tests/google/coex/performance_tests/CoexBasicPerformanceTest.py
index 00cb735..c5c1879 100644
--- a/acts/tests/google/coex/performance_tests/CoexBasicPerformanceTest.py
+++ b/acts/tests/google/coex/performance_tests/CoexBasicPerformanceTest.py
@@ -14,153 +14,60 @@
 # License for the specific language governing permissions and limitations under
 # the License.
 
+import itertools
+
+from acts.test_utils.bt.bt_test_utils import enable_bluetooth
 from acts.test_utils.coex.CoexPerformanceBaseTest import CoexPerformanceBaseTest
 from acts.test_utils.coex.coex_test_utils import perform_classic_discovery
 
 
 class CoexBasicPerformanceTest(CoexPerformanceBaseTest):
 
-    def setup_class(self):
-        super().setup_class()
+    def __init__(self, controllers):
+        super().__init__(controllers)
+        req_params = [
+            # A dict containing:
+            #     protocol: A list containing TCP/UDP. Ex: protocol: ['tcp'].
+            #     stream: A list containing ul/dl. Ex: stream: ['ul']
+            'standalone_params'
+        ]
+        self.unpack_userparams(req_params)
+        self.tests = self.generated_test_cases(['bt_on', 'perform_discovery'])
 
-    def run_iperf_and_perform_discovery(self):
-        """Starts iperf client on host machine and bluetooth discovery
+    def perform_discovery(self):
+        """ Starts iperf client on host machine and bluetooth discovery
         simultaneously.
 
         Returns:
             True if successful, False otherwise.
         """
         tasks = [(perform_classic_discovery,
-                  (self.pri_ad, self.iperf["duration"], self.json_file,
-                   self.dev_list)), (self.run_iperf_and_get_result, ())]
-        if not self.set_attenuation_and_run_iperf(tasks):
-            return False
-        return self.teardown_result()
+                  (self.pri_ad, self.iperf['duration'], self.json_file,
+                   self.dev_list)),
+                 (self.run_iperf_and_get_result, ())]
+        return self.set_attenuation_and_run_iperf(tasks)
 
-    def test_performance_with_bt_on_tcp_ul(self):
-        """Check throughput when bluetooth on.
-
-        This test is to start TCP-Uplink traffic between host machine and
-        android device and check the throughput when bluetooth is on.
-
-        Steps:
-        1. Start TCP-uplink traffic when bluetooth is on.
-
-        Test Id: Bt_CoEx_kpi_005
-        """
-        self.set_attenuation_and_run_iperf()
-        return self.teardown_result()
-
-    def test_performance_with_bt_on_tcp_dl(self):
-        """Check throughput when bluetooth on.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and check the throughput when bluetooth is on.
-
-        Steps:
-        1. Start TCP-downlink traffic when bluetooth is on.
-
-        Test Id: Bt_CoEx_kpi_006
-        """
-        self.set_attenuation_and_run_iperf()
-        return self.teardown_result()
-
-    def test_performance_with_bt_on_udp_ul(self):
-        """Check throughput when bluetooth on.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and check the throughput when bluetooth is on.
-
-        Steps:
-        1. Start UDP-uplink traffic when bluetooth is on.
-
-        Test Id: Bt_CoEx_kpi_007
-        """
-        self.set_attenuation_and_run_iperf()
-        return self.teardown_result()
-
-    def test_performance_with_bt_on_udp_dl(self):
-        """Check throughput when bluetooth on.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and check the throughput when bluetooth is on.
-
-        Steps:
-        1. Start UDP-downlink traffic when bluetooth is on.
-
-        Test Id: Bt_CoEx_kpi_008
-        """
-        self.set_attenuation_and_run_iperf()
-        return self.teardown_result()
-
-    def test_performance_with_bluetooth_discovery_tcp_ul(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start TCP-uplink traffic and bluetooth discovery parallelly.
+    def bt_on(self):
+        """ Turns on bluetooth and runs iperf.
 
         Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_kpi_009
+            True on success, False otherwise.
         """
-        if not self.run_iperf_and_perform_discovery():
+        if not enable_bluetooth(self.pri_ad.droid, self.pri_ad.ed):
             return False
-        return True
+        return self.set_attenuation_and_run_iperf()
 
-    def test_performance_with_bluetooth_discovery_tcp_dl(self):
-        """Check throughput when bluetooth discovery is ongoing.
+    def generated_test_cases(self, test_types):
+        """ Auto generates tests for basic coex tests. """
+        test_cases = []
+        for protocol, stream, test_type in itertools.product(
+                self.standalone_params['protocol'],
+                self.standalone_params['stream'], test_types):
 
-        This test is to start TCP-downlink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
+            test_name = 'test_performance_with_{}_{}_{}'.format(
+                test_type, protocol, stream)
 
-        Steps:
-        1. Start TCP-downlink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_kpi_010
-        """
-        if not self.run_iperf_and_perform_discovery():
-            return False
-        return True
-
-    def test_performance_with_bluetooth_discovery_udp_ul(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start UDP-uplink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_kpi_011
-        """
-        if not self.run_iperf_and_perform_discovery():
-            return False
-        return True
-
-    def test_performance_with_bluetooth_discovery_udp_dl(self):
-        """Check throughput when bluetooth discovery is ongoing.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and bluetooth discovery and checks throughput.
-
-        Steps:
-        1. Start UDP-downlink traffic and bluetooth discovery parallelly.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_kpi_012
-        """
-        if not self.run_iperf_and_perform_discovery():
-            return False
-        return True
+            test_function = getattr(self, test_type)
+            setattr(self, test_name, test_function)
+            test_cases.append(test_name)
+        return test_cases
diff --git a/acts/tests/google/coex/performance_tests/WlanWithA2dpPerformanceTest.py b/acts/tests/google/coex/performance_tests/WlanWithA2dpPerformanceTest.py
index f3f838d..e06b4c6 100644
--- a/acts/tests/google/coex/performance_tests/WlanWithA2dpPerformanceTest.py
+++ b/acts/tests/google/coex/performance_tests/WlanWithA2dpPerformanceTest.py
@@ -13,83 +13,66 @@
 # 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 suite to check Wlan performance with A2DP.
 
-Test Setup:
+import itertools
 
-One Android deivce.
-One A2DP Headset connected to Relay.
-"""
-import time
-
-from acts import asserts
+from acts.test_utils.abstract_devices.bluetooth_handsfree_abstract_device import BluetoothHandsfreeAbstractDeviceFactory as bf
 from acts.test_utils.bt import BtEnum
 from acts.test_utils.bt.bt_test_utils import clear_bonded_devices
 from acts.test_utils.coex.CoexPerformanceBaseTest import CoexPerformanceBaseTest
-from acts.test_utils.coex.audio_test_utils import SshAudioCapture
 from acts.test_utils.coex.coex_test_utils import avrcp_actions
 from acts.test_utils.coex.coex_test_utils import music_play_and_check
 from acts.test_utils.coex.coex_test_utils import pair_and_connect_headset
 from acts.test_utils.coex.coex_test_utils import perform_classic_discovery
 from acts.test_utils.coex.coex_test_utils import push_music_to_android_device
 
+
 class WlanWithA2dpPerformanceTest(CoexPerformanceBaseTest):
 
+    def __init__(self, controllers):
+        super().__init__(controllers)
+        req_params = ['standalone_params', 'dut', 'music_file']
+        self.unpack_userparams(req_params)
+        self.tests = self.generate_test_cases([
+            'a2dp_streaming_on_bt', 'perform_discovery_with_headset_connected',
+            'a2dp_streaming_and_avrcp'])
+
     def setup_class(self):
         super().setup_class()
-
-        req_params = ["iterations", "fping_params", "headset_mac_address",
-                      "audio_params"]
-        self.unpack_userparams(req_params)
-        if hasattr(self, "audio_params"):
-            if self.audio_params["music_file"]:
-                self.music_file_to_play = push_music_to_android_device(
-                    self.pri_ad, self.audio_params)
-                if not self.music_file_to_play:
-                    self.log.error("Music file push failed.")
-                    return False
-        else:
-            self.log.warning("No Music files pushed to play.")
+        self.music_file_to_play = push_music_to_android_device(
+            self.pri_ad, self.music_file)
+        attr, idx = self.dut.split(':')
+        self.dut_controller = getattr(self, attr)[int(idx)]
+        self.bt_device = bf().generate(self.dut_controller)
 
     def setup_test(self):
-        if hasattr(self, "RelayDevice"):
-            self.audio_receiver.enter_pairing_mode()
-            time.sleep(5)  # Wait until device goes into pairing mode.
-        elif (not hasattr(self, "RelayDevice") and
-                          "avrcp" in self.current_test_name):
-            asserts.skip("Relay device not connected,"
-                         "Hence avrcp tests can't be run")
         super().setup_test()
-        if "a2dp_streaming" in self.current_test_name:
-            self.audio = SshAudioCapture(self.audio_params, self.log_path)
+        self.bt_device.power_on()
+        self.headset_mac_address = self.bt_device.mac_address
+        self.bt_device.enter_pairing_mode()
+        self.pri_ad.droid.bluetoothStartPairingHelper(True)
+        self.pri_ad.droid.bluetoothMakeDiscoverable()
         if not pair_and_connect_headset(
                 self.pri_ad, self.headset_mac_address,
                 set([BtEnum.BluetoothProfile.A2DP.value])):
-            self.log.error("Failed to pair and connect to headset")
+            self.log.error('Failed to pair and connect to headset')
             return False
 
     def teardown_test(self):
-        if "a2dp_streaming" in self.current_test_name:
-            self.audio.terminate_and_store_audio_results()
         clear_bonded_devices(self.pri_ad)
-        if hasattr(self, "RelayDevice"):
-            self.audio_receiver.clean_up()
         super().teardown_test()
 
-    def initiate_music_streaming_to_headset_with_iperf(self):
+    def a2dp_streaming_on_bt(self):
         """Initiate music streaming to headset and start iperf traffic."""
-        tasks = [(self.audio.capture_audio, ()),
+        tasks = [
                  (music_play_and_check,
                   (self.pri_ad, self.headset_mac_address,
                    self.music_file_to_play,
                    self.audio_params["music_play_time"])),
                  (self.run_iperf_and_get_result, ())]
-        if not self.set_attenuation_and_run_iperf(tasks):
-            return False
-        return self.teardown_result()
+        return self.set_attenuation_and_run_iperf(tasks)
 
-    def perform_discovery_with_iperf(self):
+    def perform_discovery_with_headset_connected(self):
         """Starts iperf traffic based on test and perform bluetooth classic
         discovery.
         """
@@ -97,265 +80,30 @@
                  (perform_classic_discovery,
                   (self.pri_ad, self.iperf["duration"], self.json_file,
                    self.dev_list))]
-        if not self.set_attenuation_and_run_iperf(tasks):
-            return False
-        return self.teardown_result()
+        return self.set_attenuation_and_run_iperf(tasks)
 
-    def music_streaming_and_avrcp_controls_with_iperf(self):
+    def a2dp_streaming_and_avrcp(self):
         """Starts iperf traffic based on test and initiate music streaming and
         check for avrcp controls.
         """
-        tasks = [(self.audio.capture_audio, ()),
-                 (music_play_and_check,
+        tasks = [(music_play_and_check,
                   (self.pri_ad, self.headset_mac_address,
                    self.music_file_to_play,
                    self.audio_params["music_play_time"])),
                  (self.run_iperf_and_get_result, ()),
-                 (avrcp_actions, (self.pri_ad, self.audio_receiver))]
-        if not self.set_attenuation_and_run_iperf(tasks):
-            return False
-        return self.teardown_result()
+                 (avrcp_actions, (self.pri_ad, self.bt_device))]
+        return self.set_attenuation_and_run_iperf(tasks)
 
-    def test_performance_a2dp_streaming_tcp_ul(self):
-        """Performance test to check throughput when streaming music.
+    def generate_test_cases(self, test_types):
+        test_cases = []
+        for protocol, stream, test_type in itertools.product(
+                self.standalone_params['protocol'],
+                self.standalone_params['stream'], test_types):
 
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
+            test_name = 'test_performance_with_{}_{}_{}'.format(
+                test_type, protocol, stream)
 
-        Steps:
-        1. Start TCP-uplink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_013
-        """
-        if not self.initiate_music_streaming_to_headset_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_tcp_dl(self):
-        """Performance test to check throughput when streaming music.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start TCP-downlink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_014
-        """
-        if not self.initiate_music_streaming_to_headset_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_udp_ul(self):
-        """Performance test to check throughput when streaming music.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_015
-        """
-        if not self.initiate_music_streaming_to_headset_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_udp_dl(self):
-        """Performance test to check throughput when streaming music.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the performance when music streamed to a2dp
-        headset.
-
-        Steps:
-        1. Start UDP-downlink traffic.
-        2. Start music streaming to a2dp headset.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_016
-        """
-        if not self.initiate_music_streaming_to_headset_with_iperf():
-            return False
-        return True
-
-    def test_performance_discovery_after_headset_connection_with_tcp_ul(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run TCP-uplink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_029
-        """
-        if not self.perform_discovery_with_iperf():
-            return False
-        return True
-
-    def test_performance_discovery_after_headset_connection_with_tcp_dl(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run TCP-downlink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_030
-        """
-        if not self.perform_discovery_with_iperf():
-            return False
-        return True
-
-    def test_performance_discovery_after_headset_connection_with_udp_ul(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run UDP-uplink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_031
-        """
-        if not self.perform_discovery_with_iperf():
-            return False
-        return True
-
-    def test_performance_discovery_after_headset_connection_with_udp_dl(self):
-        """Performance test to check throughput when bluetooth discovery.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the performance when bluetooth discovery is
-        performed after connecting to headset.
-
-        Steps:
-        1. Run UDP-downlink traffic.
-        2. Start bluetooth discovery when headset is connected.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_032
-        """
-        if not self.perform_discovery_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_tcp_ul(self):
-        """Performance test to check throughput when music streaming.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start TCP-uplink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_033
-        """
-        if not self.music_streaming_and_avrcp_controls_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_tcp_dl(self):
-        """Performance test to check throughput when music streaming.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start TCP-downlink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_034
-        """
-        if not self.music_streaming_and_avrcp_controls_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_udp_ul(self):
-        """Performance test to check throughput when music streaming.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_035
-        """
-        if not self.music_streaming_and_avrcp_controls_with_iperf():
-            return False
-        return True
-
-    def test_performance_a2dp_streaming_avrcp_controls_with_udp_dl(self):
-        """Performance test to check throughput when music streaming.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the wlan throughput when perfroming a2dp music
-        streaming and avrcp controls.
-
-        Steps:
-        1. Start UDP-downlink traffic.
-        2. Start media streaming to a2dp headset.
-        3. Check all avrcp related controls.
-
-        Returns:
-            True if successful, False otherwise.
-
-        Test Id: Bt_CoEx_036
-        """
-        if not self.music_streaming_and_avrcp_controls_with_iperf():
-            return False
-        return True
+            test_function = getattr(self, test_type)
+            setattr(self, test_name, test_function)
+            test_cases.append(test_name)
+        return test_cases
diff --git a/acts/tests/google/coex/performance_tests/WlanWithBlePerformanceTest.py b/acts/tests/google/coex/performance_tests/WlanWithBlePerformanceTest.py
index 50825c9..23d7423 100644
--- a/acts/tests/google/coex/performance_tests/WlanWithBlePerformanceTest.py
+++ b/acts/tests/google/coex/performance_tests/WlanWithBlePerformanceTest.py
@@ -14,6 +14,7 @@
 # License for the specific language governing permissions and limitations under
 # the License.
 
+import itertools
 import time
 
 from acts.test_utils.bt.bt_gatt_utils import close_gatt_client
@@ -30,9 +31,17 @@
     bluetooth_gatt_list = []
     gatt_server_list = []
 
-    def setup_class(self):
-        super().setup_class()
-
+    def __init__(self, controllers):
+        super().__init__(controllers)
+        req_params = [
+            # A dict containing:
+            #     protocol: A list containing TCP/UDP. Ex: protocol: ['tcp'].
+            #     stream: A list containing ul/dl. Ex: stream: ['ul']
+            'standalone_params'
+        ]
+        self.unpack_userparams(req_params)
+        self.tests = self.generate_test_cases(['start_stop_ble_scan',
+                                               'ble_gatt_connection'])
 
     def setup_test(self):
         super().setup_test()
@@ -118,12 +127,12 @@
             True if successful, False otherwise.
         """
         start_time = time.time()
-        while((time.time()) < (start_time + self.iperf["duration"])):
+        while(time.time()) < (start_time + self.iperf["duration"]):
             self.pri_ad.droid.bluetoothEnableBLE()
-            gatt_server_cb = \
-                self.sec_ad.droid.gattServerCreateGattServerCallback()
-            gatt_server = \
-                self.sec_ad.droid.gattServerOpenGattServer(gatt_server_cb)
+            gatt_server_cb = (
+                self.sec_ad.droid.gattServerCreateGattServerCallback())
+            gatt_server = (
+                self.sec_ad.droid.gattServerOpenGattServer(gatt_server_cb))
             self.gatt_server_list.append(gatt_server)
             try:
                 bluetooth_gatt, gatt_callback, adv_callback = (
@@ -135,174 +144,27 @@
                 return False
             self.adv_instances.append(adv_callback)
             return self._orchestrate_gatt_disconnection(bluetooth_gatt,
-                                                    gatt_callback)
+                                                        gatt_callback)
 
-    def ble_start_stop_scan_with_iperf(self):
+    def start_stop_ble_scan(self):
         tasks = [(self.ble_start_stop_scan, ()),
                  (self.run_iperf_and_get_result, ())]
-        if not self.set_attenuation_and_run_iperf(tasks):
-            return False
-        return self.teardown_result()
+        return self.set_attenuation_and_run_iperf(tasks)
 
-    def ble_gatt_connection_with_iperf(self):
+    def ble_gatt_connection(self):
         tasks = [(self.initiate_ble_gatt_connection, ()),
                  (self.run_iperf_and_get_result, ())]
-        if not self.set_attenuation_and_run_iperf(tasks):
-            return False
-        return self.teardown_result()
+        return self.set_attenuation_and_run_iperf(tasks)
 
-    def test_performance_ble_scan_tcp_ul(self):
-        """Test performance with ble scan.
+    def generate_test_cases(self, test_types):
+        test_cases = []
+        for protocol, stream, test_type in itertools.product(
+                self.standalone_params['protocol'],
+                self.standalone_params['stream'], test_types):
+            test_name = 'test_performance_with_{}_{}_{}'.format(
+                test_type, protocol, stream)
 
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the wlan throughput when performing ble scan.
-
-        Steps:
-        1. Start TCP-uplink traffic.
-        2. Start and stop BLE scan.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_021
-        """
-        if not self.ble_start_stop_scan_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_scan_tcp_dl(self):
-        """Test performance with ble scan.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the wlan throughput when performing ble scan.
-
-        Steps:
-        1. Start TCP-downlink traffic.
-        2. Start and stop BLE scan.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_022
-        """
-        if not self.ble_start_stop_scan_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_scan_udp_ul(self):
-        """Test performance with ble scan.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the wlan throughput when performing ble scan.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Start and stop BLE scan.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_023
-        """
-        if not self.ble_start_stop_scan_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_scan_udp_dl(self):
-        """Test performance with ble scan.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the wlan throughput when performing ble scan.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Start and stop BLE scan.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_024
-        """
-        if not self.ble_start_stop_scan_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_connect_tcp_ul(self):
-        """Test performance with ble gatt connection.
-
-        This test is to start TCP-uplink traffic between host machine and
-        android device and test the wlan throughput when ble gatt connection
-        is established.
-
-        Steps:
-        1. Start TCP-uplink traffic.
-        2. Initiate gatt connection.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_025
-        """
-        if not self.ble_gatt_connection_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_connect_tcp_dl(self):
-        """Test performance with ble gatt connection.
-
-        This test is to start TCP-downlink traffic between host machine and
-        android device and test the wlan throughput when ble gatt connection
-        is established.
-
-        Steps:
-        1. Start TCP-downlink traffic.
-        2. Initiate gatt connection.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_026
-        """
-        if not self.ble_gatt_connection_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_connect_udp_ul(self):
-        """Test performance with ble gatt connection.
-
-        This test is to start UDP-uplink traffic between host machine and
-        android device and test the wlan throughput when ble gatt connection
-        is established.
-
-        Steps:
-        1. Start UDP-uplink traffic.
-        2. Initiate gatt connection.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_027
-        """
-        if not self.ble_gatt_connection_with_iperf():
-            return False
-        return True
-
-    def test_performance_ble_connect_udp_dl(self):
-        """Test performance with ble gatt connection.
-
-        This test is to start UDP-downlink traffic between host machine and
-        android device and test the wlan throughput when ble gatt connection
-        is established.
-
-        Steps:
-        1. Start UDP-downlink traffic.
-        2. Initiate gatt connection.
-
-        Returns:
-            True if pass, False otherwise.
-
-        Test Id: Bt_CoEx_Kpi_028
-        """
-        if not self.ble_gatt_connection_with_iperf():
-            return False
-        return True
+            test_function = getattr(self, test_type)
+            setattr(self, test_name, test_function)
+            test_cases.append(test_name)
+        return test_cases
diff --git a/acts/tests/google/net/DataCostTest.py b/acts/tests/google/net/DataCostTest.py
index 88ededa..d8c8944 100644
--- a/acts/tests/google/net/DataCostTest.py
+++ b/acts/tests/google/net/DataCostTest.py
@@ -51,6 +51,8 @@
         for ad in self.android_devices:
             nutils.verify_lte_data_and_tethering_supported(ad)
 
+        self.tcpdump_pid = None
+
     def teardown_class(self):
         """ Reset settings to default """
         for ad in self.android_devices:
@@ -59,6 +61,12 @@
             ad.droid.connectivitySetDataWarningLimit(sub_id, -1)
             wutils.reset_wifi(ad)
 
+
+    def teardown_test(self):
+        if self.tcpdump_pid:
+            nutils.stop_tcpdump(self.dut, self.tcpdump_pid, self.test_name)
+            self.tcpdump_pid = None
+
     def on_fail(self, test_name, begin_time):
         for ad in self.android_devices:
             ad.take_bug_report(test_name, begin_time)
@@ -77,7 +85,7 @@
                              "Fail to clear netstats.")
         ad.reboot()
         time.sleep(10)
-        self.check_multipath_preference_from_dumpsys(ad)
+        self._check_multipath_preference_from_dumpsys(ad)
 
     def _check_multipath_preference_from_dumpsys(self, ad):
         """ Check cell multipath_preference from dumpsys
@@ -168,6 +176,9 @@
         ad = self.android_devices[0]
         self._clear_netstats(ad)
 
+        self.dut = ad
+        self.tcpdump_pid = nutils.start_tcpdump(ad, self.test_name)
+
         sub_id = str(ad.droid.telephonyGetSubscriberId())
         cell_network = ad.droid.connectivityGetActiveNetwork()
         self.log.info("cell network %s" % cell_network)
@@ -214,6 +225,9 @@
         ad = self.android_devices[1]
         self._clear_netstats(ad)
 
+        self.dut = ad
+        self.tcpdump_pid = nutils.start_tcpdump(ad, self.test_name)
+
         cell_network = ad.droid.connectivityGetActiveNetwork()
         self.log.info("cell network %s" % cell_network)
         wutils.wifi_connect(ad, self.wifi_network)
diff --git a/acts/tests/google/tel/live/TelLiveDataTest.py b/acts/tests/google/tel/live/TelLiveDataTest.py
index e1a6910..46fb618 100644
--- a/acts/tests/google/tel/live/TelLiveDataTest.py
+++ b/acts/tests/google/tel/live/TelLiveDataTest.py
@@ -56,6 +56,7 @@
     WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING
 from acts.test_utils.tel.tel_defines import WAIT_TIME_TETHERING_AFTER_REBOOT
 from acts.test_utils.tel.tel_data_utils import airplane_mode_test
+from acts.test_utils.tel.tel_data_utils import browsing_test
 from acts.test_utils.tel.tel_data_utils import change_data_sim_and_verify_data
 from acts.test_utils.tel.tel_data_utils import data_connectivity_single_bearer
 from acts.test_utils.tel.tel_data_utils import tethering_check_internet_connection
@@ -119,6 +120,7 @@
 from acts.test_utils.tel.tel_voice_utils import phone_setup_csfb
 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_4g
 from acts.utils import disable_doze
 from acts.utils import enable_doze
 from acts.utils import rand_ascii_str
@@ -3305,4 +3307,31 @@
         return self._test_data_stall_detection_recovery(nw_type="cellular",
                                                 validation_type="recovery")
 
-        """ Tests End """
+    @test_tracker_info(uuid="d705d653-c810-42eb-bd07-3313f99be2fa")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_browsing_4g(self):
+        ad = self.android_devices[0]
+        self.log.info("Connect to LTE and verify internet connection.")
+        if not phone_setup_4g(self.log, ad):
+            return False
+        if not verify_internet_connection(self.log, ad):
+            return False
+
+        return browsing_test(self.log, self.android_devices[0])
+
+    @test_tracker_info(uuid="71088cb1-5ccb-4d3a-8e6a-03fac9bf31cc")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_browsing_wifi(self):
+        ad = self.android_devices[0]
+        self.log.info("Connect to Wi-Fi and verify internet connection.")
+        if not ensure_wifi_connected(self.log, ad, self.wifi_network_ssid,
+                                     self.wifi_network_pass):
+            return False
+        if not wait_for_wifi_data_connection(self.log, ad, True):
+            return False
+        if not verify_internet_connection(self.log, ad):
+            return False
+
+        return browsing_test(self.log, self.android_devices[0], wifi_ssid=self.wifi_network_ssid)
+
+    """ Tests End """
diff --git a/acts/tests/google/tel/live/TelLiveStressTest.py b/acts/tests/google/tel/live/TelLiveStressTest.py
index 5d55883..c7cd31a 100644
--- a/acts/tests/google/tel/live/TelLiveStressTest.py
+++ b/acts/tests/google/tel/live/TelLiveStressTest.py
@@ -1111,8 +1111,6 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_lte_volte_parallel_stress(self):
         """ VoLTE on stress test"""
-        if CAPABILITY_VOLTE not in self.dut_capabilities:
-            raise signals.TestAbortClass("VoLTE is not supported")
         return self.parallel_tests(
             setup_func=self._setup_lte_volte_enabled,
             call_verification_func=is_phone_in_call_volte)
@@ -1129,8 +1127,6 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_wfc_parallel_stress(self):
         """ Wifi calling APM mode off stress test"""
-        if CAPABILITY_WFC not in self.dut_capabilities:
-            raise signals.TestAbortClass("WFC is not supported")
         if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
             raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
         return self.parallel_tests(
@@ -1141,8 +1137,6 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_wfc_apm_parallel_stress(self):
         """ Wifi calling in APM mode on stress test"""
-        if CAPABILITY_WFC not in self.dut_capabilities:
-            raise signals.TestAbortClass("WFC is not supported")
         return self.parallel_tests(
             setup_func=self._setup_wfc_apm,
             call_verification_func=is_phone_in_call_iwlan)
@@ -1167,8 +1161,6 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_volte_modeprefchange_parallel_stress(self):
         """ VoLTE Mode Pref call stress test"""
-        if CAPABILITY_VOLTE not in self.dut_capabilities:
-            raise signals.TestAbortClass("VoLTE is not supported")
         return self.parallel_with_network_change_tests(
             setup_func=self._setup_lte_volte_enabled)
 
diff --git a/acts/tests/google/tel/live/TelLiveVoiceConfTest.py b/acts/tests/google/tel/live/TelLiveVoiceConfTest.py
index 8488b9c..a719aa1 100644
--- a/acts/tests/google/tel/live/TelLiveVoiceConfTest.py
+++ b/acts/tests/google/tel/live/TelLiveVoiceConfTest.py
@@ -1341,85 +1341,12 @@
 
         return call_ab_id, call_ac_id
 
-    def _test_ims_conference_merge_drop_second_call_no_cep(
-            self, call_ab_id, call_ac_id):
-        """Test conference merge and drop in VoLTE call.
+    def _merge_ims_conference_call(self, call_ab_id, call_ac_id):
+        """Merge IMS conference call for both cases of CEP enabled and disabled.
 
         PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneB.
         PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneC.
         Merge calls to conference on PhoneA.
-        Hangup on PhoneC, check call continues between AB.
-        Hangup on PhoneB, check A ends.
-
-        Args:
-            call_ab_id: call id for call_AB on PhoneA.
-            call_ac_id: call id for call_AC on PhoneA.
-
-        Returns:
-            True if succeed;
-            False if failed.
-        """
-        ads = self.android_devices
-
-        self.log.info("Step4: Merge to Conf Call and verify Conf Call.")
-        ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id)
-        time.sleep(WAIT_TIME_IN_CALL)
-        calls = ads[0].droid.telecomCallGetCallIds()
-        ads[0].log.info("Calls in PhoneA %s", calls)
-        if num_active_calls(self.log, ads[0]) != 1:
-            ads[0].log.error("Total number of call lists is not 1.")
-            if get_cep_conference_call_id(ads[0]) is not None:
-                self.log.error("CEP enabled.")
-            else:
-                self.log.error("Merge failed.")
-            return False
-        call_conf_id = None
-        for call_id in calls:
-            if call_id != call_ab_id and call_id != call_ac_id:
-                call_conf_id = call_id
-        if not call_conf_id:
-            self.log.error("Merge call fail, no new conference call id.")
-            return False
-        if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
-            return False
-
-        # Check if Conf Call is currently active
-        if ads[0].droid.telecomCallGetCallState(
-                call_conf_id) != CALL_STATE_ACTIVE:
-            ads[0].log.error(
-                "Call_id:%s, state:%s, expected: STATE_ACTIVE", call_conf_id,
-                ads[0].droid.telecomCallGetCallState(call_conf_id))
-            return False
-
-        self.log.info("Step5: End call on PhoneC and verify call continues.")
-        if not self._hangup_call(ads[2], "PhoneC"):
-            return False
-        time.sleep(WAIT_TIME_IN_CALL)
-        calls = ads[0].droid.telecomCallGetCallIds()
-        ads[0].log.info("Calls in PhoneA %s", calls)
-        if not verify_incall_state(self.log, [ads[0], ads[1]], True):
-            return False
-        if not verify_incall_state(self.log, [ads[2]], False):
-            return False
-
-        # Because of b/18413009, VZW VoLTE conference host will not drop call
-        # even if all participants drop. The reason is VZW network is not
-        # providing such information to DUT.
-        # So this test probably will fail on the last step for VZW.
-        self.log.info("Step6: End call on PhoneB and verify PhoneA end.")
-        if not self._hangup_call(ads[1], "PhoneB"):
-            return False
-        time.sleep(WAIT_TIME_IN_CALL)
-        if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
-            return False
-        return True
-
-    def _merge_cep_conference_call(self, call_ab_id, call_ac_id):
-        """Merge CEP conference call.
-
-        PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneB.
-        PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneC.
-        Merge calls to conference on PhoneA (CEP enabled IMS conference).
 
         Args:
             call_ab_id: call id for call_AB on PhoneA.
@@ -1429,48 +1356,58 @@
             call_id for conference
         """
         ads = self.android_devices
-
         self.log.info("Step4: Merge to Conf Call and verify Conf Call.")
         ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id)
         time.sleep(WAIT_TIME_IN_CALL)
         calls = ads[0].droid.telecomCallGetCallIds()
         ads[0].log.info("Calls in PhoneA %s", calls)
 
-        call_conf_id = get_cep_conference_call_id(ads[0])
-        if call_conf_id is None:
-            self.log.error(
-                "No call with children. Probably CEP not enabled or merge failed."
-            )
-            return None
-        calls.remove(call_conf_id)
-        if (set(ads[0].droid.telecomCallGetCallChildren(call_conf_id)) !=
-                set(calls)):
-            ads[0].log.error(
-                "Children list %s for conference call is not correct.",
-                ads[0].droid.telecomCallGetCallChildren(call_conf_id))
-            return None
+        call_conf_id = None
+        if num_active_calls(self.log, ads[0]) != 1:
+            ads[0].log.info("Total number of call ids is not 1.")
+            call_conf_id = get_cep_conference_call_id(ads[0])
+            if call_conf_id is not None:
+                self.log.info("New conference call id is found. CEP enabled.")
+                calls.remove(call_conf_id)
+                if (set(ads[0].droid.telecomCallGetCallChildren(
+                    call_conf_id)) != set(calls)):
+                    ads[0].log.error(
+                        "Children list %s for conference call is not correct.",
+                        ads[0].droid.telecomCallGetCallChildren(call_conf_id))
+                    return None
 
-        if (CALL_PROPERTY_CONFERENCE not in ads[0]
-                .droid.telecomCallGetProperties(call_conf_id)):
-            ads[0].log.error(
-                "Conf call id % properties wrong: %s", call_conf_id,
-                ads[0].droid.telecomCallGetProperties(call_conf_id))
-            return None
+                if (CALL_PROPERTY_CONFERENCE not in ads[0]
+                        .droid.telecomCallGetProperties(call_conf_id)):
+                    ads[0].log.error(
+                        "Conf call id % properties wrong: %s", call_conf_id,
+                        ads[0].droid.telecomCallGetProperties(call_conf_id))
+                    return None
 
-        if (CALL_CAPABILITY_MANAGE_CONFERENCE not in ads[0]
-                .droid.telecomCallGetCapabilities(call_conf_id)):
-            ads[0].log.error(
-                "Conf call id %s capabilities wrong: %s", call_conf_id,
-                ads[0].droid.telecomCallGetCapabilities(call_conf_id))
-            return None
+                if (CALL_CAPABILITY_MANAGE_CONFERENCE not in ads[0]
+                        .droid.telecomCallGetCapabilities(call_conf_id)):
+                    ads[0].log.error(
+                        "Conf call id %s capabilities wrong: %s", call_conf_id,
+                        ads[0].droid.telecomCallGetCapabilities(call_conf_id))
+                    return None
 
-        if (call_ab_id in calls) or (call_ac_id in calls):
-            self.log.error(
-                "Previous call ids should not in new call list after merge.")
-            return None
+                if (call_ab_id in calls) or (call_ac_id in calls):
+                    self.log.error("Previous call ids should not in new call"
+                    " list after merge.")
+                    return None
+        else:
+            for call_id in calls:
+                if call_id != call_ab_id and call_id != call_ac_id:
+                    call_conf_id = call_id
+                    self.log.info("CEP not enabled.")
 
+        if not call_conf_id:
+            self.log.error("Merge call fail, no new conference call id.")
+            raise signals.TestFailure(
+                "Calls were not merged. Failed to merge calls.",
+                extras={"fail_reason": "Calls were not merged."
+                    " Failed to merge calls."})
         if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
-            return None
+            return False
 
         # Check if Conf Call is currently active
         if ads[0].droid.telecomCallGetCallState(
@@ -1482,7 +1419,7 @@
 
         return call_conf_id
 
-    def _test_ims_conference_merge_drop_second_call_from_participant_cep(
+    def _test_ims_conference_merge_drop_second_call_from_participant(
             self, call_ab_id, call_ac_id):
         """Test conference merge and drop in IMS (VoLTE or WiFi Calling) call.
         (CEP enabled).
@@ -1503,7 +1440,7 @@
         """
         ads = self.android_devices
 
-        call_conf_id = self._merge_cep_conference_call(call_ab_id, call_ac_id)
+        call_conf_id = self._merge_ims_conference_call(call_ab_id, call_ac_id)
         if call_conf_id is None:
             return False
 
@@ -1526,7 +1463,7 @@
             return False
         return True
 
-    def _test_ims_conference_merge_drop_first_call_from_participant_cep(
+    def _test_ims_conference_merge_drop_first_call_from_participant(
             self, call_ab_id, call_ac_id):
         """Test conference merge and drop in IMS (VoLTE or WiFi Calling) call.
         (CEP enabled).
@@ -1547,7 +1484,7 @@
         """
         ads = self.android_devices
 
-        call_conf_id = self._merge_cep_conference_call(call_ab_id, call_ac_id)
+        call_conf_id = self._merge_ims_conference_call(call_ab_id, call_ac_id)
         if call_conf_id is None:
             return False
 
@@ -1568,7 +1505,7 @@
             return False
         return True
 
-    def _test_ims_conference_merge_drop_second_call_from_host_cep(
+    def _test_ims_conference_merge_drop_second_call_from_host(
             self, call_ab_id, call_ac_id):
         """Test conference merge and drop in IMS (VoLTE or WiFi Calling) call.
         (CEP enabled).
@@ -1592,7 +1529,7 @@
         call_ab_uri = get_call_uri(ads[0], call_ab_id)
         call_ac_uri = get_call_uri(ads[0], call_ac_id)
 
-        call_conf_id = self._merge_cep_conference_call(call_ab_id, call_ac_id)
+        call_conf_id = self._merge_ims_conference_call(call_ab_id, call_ac_id)
         if call_conf_id is None:
             return False
 
@@ -1636,7 +1573,7 @@
             return False
         return True
 
-    def _test_ims_conference_merge_drop_first_call_from_host_cep(
+    def _test_ims_conference_merge_drop_first_call_from_host(
             self, call_ab_id, call_ac_id):
         """Test conference merge and drop in IMS (VoLTE or WiFi Calling) call.
         (CEP enabled).
@@ -1660,7 +1597,7 @@
         call_ab_uri = get_call_uri(ads[0], call_ab_id)
         call_ac_uri = get_call_uri(ads[0], call_ac_id)
 
-        call_conf_id = self._merge_cep_conference_call(call_ab_id, call_ac_id)
+        call_conf_id = self._merge_ims_conference_call(call_ab_id, call_ac_id)
         if call_conf_id is None:
             return False
 
@@ -2409,103 +2346,6 @@
 
         return call_ab_id, call_ac_id
 
-    def _test_epdg_conference_merge_drop(self, call_ab_id, call_ac_id):
-        """Test conference merge and drop in epdg call.
-
-        PhoneA in epdg call with PhoneB.
-        PhoneA in epdg call with PhoneC.
-        Merge calls to conference on PhoneA.
-        Hangup on PhoneC, check call continues between AB.
-        Hangup on PhoneB, check A ends.
-
-        Args:
-            call_ab_id: call id for call_AB on PhoneA.
-            call_ac_id: call id for call_AC on PhoneA.
-
-        Returns:
-            True if succeed;
-            False if failed.
-        """
-        ads = self.android_devices
-        self.log.info("Step4: Merge to Conf Call and verify Conf Call.")
-        ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id)
-        time.sleep(WAIT_TIME_IN_CALL)
-        calls = ads[0].droid.telecomCallGetCallIds()
-        ads[0].log.info("Calls in PhoneA %s", calls)
-
-        call_conf_id = None
-        if num_active_calls(self.log, ads[0]) != 1:
-            ads[0].log.info("Total number of call ids is not 1.")
-            call_conf_id = get_cep_conference_call_id(ads[0])
-            if call_conf_id is not None:
-                self.log.info("New conference call id is found. CEP enabled.")
-
-                calls.remove(call_conf_id)
-                if (set(ads[0].droid.telecomCallGetCallChildren(
-                    call_conf_id)) != set(calls)):
-                    ads[0].log.error(
-                        "Children list %s for conference call is not correct.",
-                        ads[0].droid.telecomCallGetCallChildren(call_conf_id))
-                    return False
-
-                if (CALL_PROPERTY_CONFERENCE not in ads[0]
-                        .droid.telecomCallGetProperties(call_conf_id)):
-                    ads[0].log.error(
-                        "Conf call id % properties wrong: %s", call_conf_id,
-                        ads[0].droid.telecomCallGetProperties(call_conf_id))
-                    return False
-
-                if (CALL_CAPABILITY_MANAGE_CONFERENCE not in ads[0]
-                        .droid.telecomCallGetCapabilities(call_conf_id)):
-                    ads[0].log.error(
-                        "Conf call id %s capabilities wrong: %s", call_conf_id,
-                        ads[0].droid.telecomCallGetCapabilities(call_conf_id))
-                    return False
-
-                if (call_ab_id in calls) or (call_ac_id in calls):
-                    self.log.error(
-                        "Previous call ids should not in new call list after "
-                        "merge.")
-                    return False
-        else:
-            for call_id in calls:
-                if call_id != call_ab_id and call_id != call_ac_id:
-                    call_conf_id = call_id
-                    self.log.info("CEP not enabled.")
-
-        if not call_conf_id:
-            self.log.error("Merge call fail, no new conference call id.")
-            return False
-        if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True):
-            return False
-
-        # Check if Conf Call is currently active
-        if ads[0].droid.telecomCallGetCallState(
-                call_conf_id) != CALL_STATE_ACTIVE:
-            ads[0].log.error(
-                "Call_id: %s, state: %s, expected: STATE_ACTIVE", call_conf_id,
-                ads[0].droid.telecomCallGetCallState(call_conf_id))
-            return False
-
-        self.log.info("Step5: End call on PhoneC and verify call continues.")
-        if not self._hangup_call(ads[2], "PhoneC"):
-            return False
-        time.sleep(WAIT_TIME_IN_CALL)
-        calls = ads[0].droid.telecomCallGetCallIds()
-        ads[0].log.info("Calls in PhoneA %s", calls)
-        if not verify_incall_state(self.log, [ads[0], ads[1]], True):
-            return False
-        if not verify_incall_state(self.log, [ads[2]], False):
-            return False
-
-        self.log.info("Step6: End call on PhoneB and verify PhoneA end.")
-        if not self._hangup_call(ads[1], "PhoneB"):
-            return False
-        time.sleep(WAIT_TIME_IN_CALL)
-        if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False):
-            return False
-        return True
-
     """ Tests Begin """
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3338,7 +3178,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3360,7 +3200,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3381,7 +3221,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3403,7 +3243,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3424,7 +3264,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3446,7 +3286,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3468,7 +3308,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3489,7 +3329,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3511,7 +3351,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3532,7 +3372,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3554,7 +3394,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3576,7 +3416,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3597,7 +3437,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3619,7 +3459,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3640,7 +3480,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3662,7 +3502,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3684,7 +3524,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3705,7 +3545,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3727,7 +3567,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3748,7 +3588,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3770,7 +3610,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3792,7 +3632,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3813,7 +3653,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3835,7 +3675,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3856,7 +3696,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3878,7 +3718,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3900,7 +3740,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3921,7 +3761,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3943,7 +3783,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3964,7 +3804,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -3986,7 +3826,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4008,7 +3848,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4029,7 +3869,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4051,7 +3891,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4072,7 +3912,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4094,7 +3934,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4116,7 +3956,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4137,7 +3977,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4159,7 +3999,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4180,7 +4020,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4202,7 +4042,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4224,7 +4064,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4245,7 +4085,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4267,7 +4107,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4288,7 +4128,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4899,7 +4739,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4922,7 +4762,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4945,7 +4785,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4968,7 +4808,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -4991,7 +4831,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5015,7 +4855,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5039,7 +4879,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5063,7 +4903,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5087,7 +4927,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5111,7 +4951,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5134,7 +4974,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5157,7 +4997,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5180,7 +5020,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5203,7 +5043,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5226,7 +5066,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5250,7 +5090,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5274,7 +5114,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5298,7 +5138,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5322,7 +5162,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5346,7 +5186,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5369,7 +5209,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5392,7 +5232,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5415,7 +5255,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5438,7 +5278,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5461,7 +5301,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5485,7 +5325,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5509,7 +5349,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5533,7 +5373,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5557,7 +5397,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5581,7 +5421,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5604,7 +5444,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5627,7 +5467,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5650,7 +5490,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5673,7 +5513,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5696,7 +5536,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5720,7 +5560,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5744,7 +5584,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5768,7 +5608,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5792,7 +5632,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5816,7 +5656,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5839,7 +5679,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5862,7 +5702,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5885,7 +5725,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5908,7 +5748,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5931,7 +5771,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5955,7 +5795,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -5979,7 +5819,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6003,7 +5843,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6027,7 +5867,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6051,7 +5891,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6074,7 +5914,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6097,7 +5937,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6120,7 +5960,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6143,7 +5983,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6166,7 +6006,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6190,7 +6030,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6214,7 +6054,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6238,7 +6078,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6262,7 +6102,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6286,7 +6126,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6309,7 +6149,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6332,7 +6172,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6355,7 +6195,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6378,7 +6218,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6401,7 +6241,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6425,7 +6265,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6449,7 +6289,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6473,7 +6313,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6497,7 +6337,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6521,7 +6361,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6544,7 +6384,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6567,7 +6407,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6590,7 +6430,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6613,7 +6453,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6636,7 +6476,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6660,7 +6500,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6684,7 +6524,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6708,7 +6548,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6732,7 +6572,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6756,7 +6596,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6779,7 +6619,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6802,7 +6642,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6825,7 +6665,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6848,7 +6688,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6871,7 +6711,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6895,7 +6735,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6919,7 +6759,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6943,7 +6783,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6967,7 +6807,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -6991,7 +6831,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -7318,7 +7158,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="89b9f228-97a6-4e5c-96b9-a7f87d847c22")
@@ -7353,7 +7193,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="2c6dc281-59b0-4ea4-b811-e4c3a4d654ab")
@@ -7388,7 +7229,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="f6727241-b727-4eb8-8c0d-f61d3a14a635")
@@ -7423,7 +7265,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="c9e54db0-2b0b-428b-ba63-619ad0b8637b")
@@ -7458,7 +7301,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="a478cc82-d95c-43fc-9735-d8333b8937e2")
@@ -7493,7 +7337,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="b1acb263-1481-44a5-b18e-58bdeff7bc1e")
@@ -7524,7 +7369,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="03b8a0d2-80dd-465a-ad14-5db94cdbcc53")
@@ -7555,7 +7401,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="9eb1a816-1e2c-41da-b083-2026163a3893")
@@ -7586,7 +7433,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="3d66a1b6-916f-4221-bd99-21ff4d40ebb8")
@@ -7617,7 +7465,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="9d8e8b2f-e2b9-4607-8c54-6233b3096123")
@@ -7648,7 +7497,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="0884206b-2471-4a7e-95aa-228379416ff8")
@@ -7679,7 +7529,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="c7706af6-dc77-4002-b295-66c60aeace6b")
@@ -7710,7 +7561,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="b079618f-e32b-4ba0-9009-06e013805c39")
@@ -7741,7 +7593,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="571fe98b-354f-4038-8441-0e4b1840eb7a")
@@ -7772,7 +7625,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="8f531f3c-493e-43d6-9d6d-f4990b5feba4")
@@ -7803,7 +7657,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="00e1194b-3c06-46c4-8764-0339c0aa9f9e")
@@ -7834,7 +7689,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="c94f6444-d265-4277-9555-57041e3c4ff4")
@@ -7865,7 +7721,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="0980745e-dcdc-4c56-84e3-e2ee076059ee")
@@ -7899,7 +7756,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="6bf0b152-fb1c-4edc-9525-b39e8640b967")
@@ -7933,7 +7791,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="e3013df6-98ca-4318-85ba-04011ba0a24f")
@@ -7968,7 +7827,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="e88bf042-8799-44c7-bc50-66ac1e1fb2ac")
@@ -8004,7 +7864,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="a8302e73-82a4-4409-b038-5c604fb4c66c")
@@ -8038,7 +7899,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="80f69baf-1649-4858-b35c-b25baf79b42c")
@@ -8072,7 +7934,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="1ac0c067-49fb-41d9-8649-cc709bdd8926")
@@ -8107,7 +7970,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="b20b1a94-048c-4f10-9261-dde79e1edb00")
@@ -8143,7 +8007,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="402b175f-1510-4e2a-97c2-7c9ea5ce40f6")
@@ -8173,7 +8038,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="7c710fbf-4b77-4b46-9719-e17b3d047cfc")
@@ -8204,7 +8070,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="642afbac-30c1-4dbf-bf3e-758ab6c3a306")
@@ -8235,7 +8102,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="a4ae1e39-ed6d-412e-b821-321c715a5d47")
@@ -8267,7 +8135,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="7b8431f2-8a49-4aa9-b84d-77f16a6a2c30")
@@ -8297,7 +8166,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="5b4d7444-32a1-4e82-8847-1c4ae002edca")
@@ -8328,7 +8198,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="88c6c179-0b56-4d03-b5e4-76a147a40995")
@@ -8359,7 +8230,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="7f744ab3-f919-4a7a-83ce-e38487d619cc")
@@ -8391,7 +8263,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="5c861a99-a1b8-45fc-ba67-f8fde4575efc")
@@ -8421,7 +8294,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="fdb32a13-302c-4c1c-a77e-f78ed7e90911")
@@ -8452,7 +8326,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="a2cf3366-ae66-4e8f-a682-df506173f282")
@@ -8483,7 +8358,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="fc5f0f1c-9610-4d0f-adce-9c8db351e7da")
@@ -8515,7 +8391,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="05332b1e-c36b-4874-b13b-f8e49d0d9bca")
@@ -8545,7 +8422,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="2421d340-f9cb-47e7-ac3e-8581e141a6d0")
@@ -8576,7 +8454,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="7c1f6008-cf59-4e63-9285-3cf1c26bc0aa")
@@ -8607,7 +8486,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="be153f3d-0707-45d0-9ddd-4aa696e0e536")
@@ -8639,7 +8519,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="7235c917-a2d4-4561-bda5-630171053f8f")
@@ -8669,7 +8550,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="8e52b9a4-c0d1-4dcd-9359-746354124763")
@@ -8699,7 +8581,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="49a4440f-40a1-4518-810a-6ba9f1fbc243")
@@ -8730,7 +8613,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="9d05bde3-50ac-4a49-a0db-2181c9b5a10f")
@@ -8761,7 +8645,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="5c44eb64-b184-417a-97c9-8c22c48fb731")
@@ -8791,7 +8676,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="e16e2e81-1b59-4b02-b601-bb27b62d6468")
@@ -8821,7 +8707,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="fd4c3b72-ea2d-4cd4-af79-b93635eda8b8")
@@ -8852,7 +8739,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="a33d7b2b-cc22-40c3-9689-a2a14642396d")
@@ -8883,7 +8771,8 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_epdg_conference_merge_drop(call_ab_id, call_ac_id)
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
+            call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
     @test_tracker_info(uuid="7839c6a3-6797-4cd0-a918-c7d317881e3d")
@@ -9900,7 +9789,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -9946,7 +9835,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -9992,7 +9881,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10038,7 +9927,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10084,7 +9973,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10130,7 +10019,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10176,7 +10065,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10222,7 +10111,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10268,7 +10157,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10314,7 +10203,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10360,7 +10249,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10406,7 +10295,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10452,7 +10341,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10498,7 +10387,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10544,7 +10433,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_first_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_first_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10592,7 +10481,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_no_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10640,7 +10529,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_host_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_host(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
@@ -10688,7 +10577,7 @@
         if call_ab_id is None or call_ac_id is None:
             return False
 
-        return self._test_ims_conference_merge_drop_second_call_from_participant_cep(
+        return self._test_ims_conference_merge_drop_second_call_from_participant(
             call_ab_id, call_ac_id)
 
     @TelephonyBaseTest.tel_test_wrap
diff --git a/acts/tests/google/wifi/WifiDppTest.py b/acts/tests/google/wifi/WifiDppTest.py
index d7788db..42591b0 100644
--- a/acts/tests/google/wifi/WifiDppTest.py
+++ b/acts/tests/google/wifi/WifiDppTest.py
@@ -19,14 +19,14 @@
 import time
 
 from acts import asserts
-from acts import base_test
 from acts import utils
 from acts.test_decorators import test_tracker_info
 from acts.test_utils.wifi import wifi_constants
 from acts.test_utils.wifi import wifi_test_utils as wutils
+from acts.test_utils.wifi.WifiBaseTest import WifiBaseTest
 from acts.test_utils.wifi.aware import aware_test_utils as autils
 
-class WifiDppTest(base_test.BaseTestClass):
+class WifiDppTest(WifiBaseTest):
   """This class tests the DPP API surface.
 
      Attributes: The tests in this class require one DUT and one helper phone
@@ -84,8 +84,8 @@
     wutils.reset_wifi(self.dut)
 
   def on_fail(self, test_name, begin_time):
-        self.dut.take_bug_report(test_name, begin_time)
-        self.dut.cat_adb_log(test_name, begin_time)
+    self.dut.take_bug_report(test_name, begin_time)
+    self.dut.cat_adb_log(test_name, begin_time)
 
   def create_and_save_wifi_network_config(self, security):
     """ Create a config with random SSID and password.
@@ -625,6 +625,7 @@
   """ Tests Begin """
 
   @test_tracker_info(uuid="30893d51-2069-4e1c-8917-c8a840f91b59")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_5G(self):
     asserts.skip_if(not self.dut.droid.wifiIs5GHzBandSupported() or
             not self.helper_dev.droid.wifiIs5GHzBandSupported(),
@@ -634,6 +635,7 @@
       use_mac=True)
 
   @test_tracker_info(uuid="54d1d19a-aece-459c-b819-9d4b1ae63f77")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_5G_broadcast(self):
     asserts.skip_if(not self.dut.droid.wifiIs5GHzBandSupported() or
                     not self.helper_dev.droid.wifiIs5GHzBandSupported(),
@@ -643,6 +645,7 @@
       use_mac=False)
 
   @test_tracker_info(uuid="18270a69-300c-4f54-87fd-c19073a2854e ")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_no_chan_in_uri_listen_on_5745_broadcast(self):
     asserts.skip_if(not self.dut.droid.wifiIs5GHzBandSupported() or
                     not self.helper_dev.droid.wifiIs5GHzBandSupported(),
@@ -651,6 +654,7 @@
       security=self.DPP_TEST_SECURITY_PSK, responder_chan=None, responder_freq=5745, use_mac=False)
 
   @test_tracker_info(uuid="fbdd687c-954a-400b-9da3-2d17e28b0798")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_no_chan_in_uri_listen_on_5745(self):
     asserts.skip_if(not self.dut.droid.wifiIs5GHzBandSupported() or
                     not self.helper_dev.droid.wifiIs5GHzBandSupported(),
@@ -658,42 +662,50 @@
     self.start_dpp_as_initiator_configurator(
       security=self.DPP_TEST_SECURITY_PSK, responder_chan=None, responder_freq=5745, use_mac=True)
 
-  @test_tracker_info(uuid="570f499f-ab12-4405-af14-c9ed36da2e01 ")
+  @test_tracker_info(uuid="570f499f-ab12-4405-af14-c9ed36da2e01")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_no_chan_in_uri_listen_on_2462_broadcast(self):
     self.start_dpp_as_initiator_configurator(
       security=self.DPP_TEST_SECURITY_PSK, responder_chan=None, responder_freq=2462, use_mac=False)
 
   @test_tracker_info(uuid="e1f083e0-0878-4c49-8ac5-d7c6bba24625")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_no_chan_in_uri_listen_on_2462(self):
     self.start_dpp_as_initiator_configurator(
       security=self.DPP_TEST_SECURITY_PSK, responder_chan=None, responder_freq=2462, use_mac=True)
 
   @test_tracker_info(uuid="d2a526f5-4269-493d-bd79-4e6d1b7b00f0")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK, use_mac=True)
 
   @test_tracker_info(uuid="6ead218c-222b-45b8-8aad-fe7d883ed631")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_sae(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_SAE, use_mac=True)
 
   @test_tracker_info(uuid="1686adb5-1b3c-4e6d-a969-6b007bdd990d")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_passphrase(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE, use_mac=True)
 
   @test_tracker_info(uuid="3958feb5-1a0c-4487-9741-ac06f04c55a2")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_sae_broadcast(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_SAE, use_mac=False)
 
   @test_tracker_info(uuid="fe6d66f5-73a1-46e9-8f49-73b8f332cc8c")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_passphrase_broadcast(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE, use_mac=False)
 
   @test_tracker_info(uuid="9edd372d-e2f1-4545-8d04-6a1636fcbc4b")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_sae_for_ap(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_SAE,
@@ -701,6 +713,7 @@
         net_role=self.DPP_TEST_NETWORK_ROLE_AP)
 
   @test_tracker_info(uuid="e9eec912-d665-4926-beac-859cb13dc17b")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_with_psk_passphrase_for_ap(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
@@ -708,26 +721,31 @@
         net_role=self.DPP_TEST_NETWORK_ROLE_AP)
 
   @test_tracker_info(uuid="8055694f-606f-41dd-9826-3ea1e9b007f8")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_enrollee_with_sae(self):
     self.start_dpp_as_initiator_enrollee(
         security=self.DPP_TEST_SECURITY_SAE, use_mac=True)
 
   @test_tracker_info(uuid="c1e9f605-b5c0-4e53-8a08-1b0087a667fa")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_enrollee_with_psk_passphrase(self):
     self.start_dpp_as_initiator_enrollee(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE, use_mac=True)
 
   @test_tracker_info(uuid="1d7f30ad-2f9a-427a-8059-651dc8827ae2")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_enrollee_with_sae_broadcast(self):
     self.start_dpp_as_initiator_enrollee(
         security=self.DPP_TEST_SECURITY_SAE, use_mac=False)
 
   @test_tracker_info(uuid="0cfc2645-600e-4f2b-ab5c-fcee6d363a9a")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_enrollee_with_psk_passphrase_broadcast(self):
     self.start_dpp_as_initiator_enrollee(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE, use_mac=False)
 
   @test_tracker_info(uuid="2e26b248-65dd-41f6-977b-e223d72b2de9")
+  @WifiBaseTest.wifi_test_wrap
   def test_start_dpp_as_initiator_enrollee_receive_invalid_config(self):
     self.start_dpp_as_initiator_enrollee(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
@@ -735,6 +753,7 @@
         invalid_config=True)
 
   @test_tracker_info(uuid="ed189661-d1c1-4626-9f01-3b7bb8a417fe")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_fail_authentication(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
@@ -742,6 +761,7 @@
         fail_authentication=True)
 
   @test_tracker_info(uuid="5a8c6587-fbb4-4a27-9cba-af6f8935833a")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_fail_unicast_timeout(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
@@ -749,6 +769,7 @@
         cause_timeout=True)
 
   @test_tracker_info(uuid="b12353ac-1a04-4036-81a4-2d2d0c653dbb")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_fail_broadcast_timeout(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
@@ -756,6 +777,7 @@
         cause_timeout=True)
 
   @test_tracker_info(uuid="eeff91be-09ce-4a33-8b4f-ece40eb51c76")
+  @WifiBaseTest.wifi_test_wrap
   def test_dpp_as_initiator_configurator_invalid_uri(self):
     self.start_dpp_as_initiator_configurator(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
@@ -763,6 +785,7 @@
         invalid_uri=True)
 
   @test_tracker_info(uuid="1fa25f58-0d0e-40bd-8714-ab78957514d9")
+  @WifiBaseTest.wifi_test_wrap
   def test_start_dpp_as_initiator_enrollee_fail_timeout(self):
     self.start_dpp_as_initiator_enrollee(
         security=self.DPP_TEST_SECURITY_PSK_PASSPHRASE,
diff --git a/acts/tests/google/wifi/WifiTetheringTest.py b/acts/tests/google/wifi/WifiTetheringTest.py
index c968b66..d5d197a 100644
--- a/acts/tests/google/wifi/WifiTetheringTest.py
+++ b/acts/tests/google/wifi/WifiTetheringTest.py
@@ -50,14 +50,23 @@
         self.network = {"SSID": "hotspot_%s" % utils.rand_ascii_str(6),
                         "password": "pass_%s" % utils.rand_ascii_str(6)}
         self.new_ssid = "wifi_tethering_test2"
+        self.tcpdump_pid=[]
 
         nutils.verify_lte_data_and_tethering_supported(self.hotspot_device)
         for ad in self.tethered_devices:
             wutils.wifi_test_device_init(ad)
 
+    def setup_test(self):
+        for ad in self.android_devices:
+            self.tcpdump_pid.append(nutils.start_tcpdump(ad, self.test_name))
+
     def teardown_test(self):
         if self.hotspot_device.droid.wifiIsApEnabled():
             wutils.stop_wifi_tethering(self.hotspot_device)
+        for ad, pid in zip(self.android_devices, self.tcpdump_pid):
+            nutils.stop_tcpdump(ad, pid, self.test_name)
+        self.tcpdump_pid = []
+
 
     def teardown_class(self):
         """ Reset devices """